aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore47
-rwxr-xr-x.travis/install3
-rw-r--r--.tx/config2
-rw-r--r--CONTRIBUTING.md43
-rw-r--r--README.md66
-rwxr-xr-xVagrantfile11
-rw-r--r--app.psgi8
-rwxr-xr-xbin/cpanm420
-rwxr-xr-xbin/fiksgatami/load-norwegian-contacts4
-rwxr-xr-xbin/fixmystreet.com/import-categories2
-rwxr-xr-xbin/fixmystreet.com/load-contacts2
-rwxr-xr-xbin/fixmystreet.com/showcouncilrates1
-rwxr-xr-xbin/geocode50
-rwxr-xr-xbin/gettext-extract5
-rwxr-xr-xbin/install_perl_modules11
-rwxr-xr-xbin/make_css8
-rwxr-xr-xbin/make_css_watch4
-rwxr-xr-xbin/problem-creation-graph8
-rwxr-xr-xbin/problems-filed-graph8
-rwxr-xr-xbin/send-comments4
-rwxr-xr-xbin/setup-contacts204
-rw-r--r--bin/site-specific-install.sh2
-rwxr-xr-xbin/update-all-reports3
-rwxr-xr-xbin/update-schema22
-rw-r--r--conf/general.yml-example4
-rw-r--r--cpanfile7
-rw-r--r--cpanfile.snapshot87
-rw-r--r--db/alert_types.sql7
-rw-r--r--db/alert_types_eha.pl28
-rw-r--r--db/alert_types_eha.sql95
-rw-r--r--db/downgrade_0037---0036.sql1
-rw-r--r--db/downgrade_0038---0037.sql2
-rwxr-xr-xdb/rerun_dbic_loader.pl1
-rw-r--r--db/schema.sql91
-rw-r--r--db/schema_0032-moderation.sql4
-rw-r--r--db/schema_0033-speed-up-nearby.sql47
-rw-r--r--db/schema_0034-remove-ms_current_timestamp.sql16
-rw-r--r--db/schema_0035-bodies_str-tidying.sql31
-rw-r--r--db/schema_0036-add-underscore-to-cobrand.sql17
-rw-r--r--db/schema_0037-response-templates.sql8
-rw-r--r--db/schema_0038-time-spent.sql2
-rw-r--r--locale/FixMyStreet.po1111
-rw-r--r--locale/ar.UTF-8/LC_MESSAGES/FixMyStreet.po1876
-rw-r--r--locale/bg_BG.UTF-8/LC_MESSAGES/FixMyStreet.po1683
-rw-r--r--locale/cpanfile1
-rw-r--r--locale/cpanfile.snapshot88
-rw-r--r--locale/cs_CZ.UTF-8/LC_MESSAGES/FixMyStreet.po1746
-rw-r--r--locale/cy.UTF-8/LC_MESSAGES/FixMyStreet.po4274
-rw-r--r--locale/da_DK.UTF-8/LC_MESSAGES/FixMyStreet.po1763
-rw-r--r--locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po1227
-rw-r--r--locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po1612
-rw-r--r--locale/el_GR.UTF-8/LC_MESSAGES/FixMyStreet.po1750
-rw-r--r--locale/es.UTF-8/LC_MESSAGES/FixMyStreet.po2390
-rw-r--r--locale/fr_FR.UTF-8/LC_MESSAGES/FixMyStreet.po1800
-rw-r--r--locale/he_IL.UTF-8/LC_MESSAGES/FixMyStreet.po1517
-rw-r--r--locale/hr.UTF-8/LC_MESSAGES/FixMyStreet.po1700
-rw-r--r--locale/it.UTF-8/LC_MESSAGES/FixMyStreet.po1695
-rw-r--r--locale/lt_LT.UTF-8/LC_MESSAGES/FixMyStreet.po1679
-rw-r--r--locale/ms.UTF-8/LC_MESSAGES/FixMyStreet.po1660
-rw-r--r--locale/my_MM.UTF-8/LC_MESSAGES/FixMyStreet.po1641
-rw-r--r--locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po1809
-rw-r--r--locale/nl_NL.UTF-8/LC_MESSAGES/FixMyStreet.po1676
-rw-r--r--locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po1665
-rw-r--r--locale/pt_CV.UTF-8/LC_MESSAGES/FixMyStreet.po2313
-rw-r--r--locale/ro_RO.UTF-8/LC_MESSAGES/FixMyStreet.po1529
-rw-r--r--locale/ru.UTF-8/LC_MESSAGES/FixMyStreet.po1520
-rw-r--r--locale/sq.UTF-8/LC_MESSAGES/FixMyStreet.po1626
-rw-r--r--locale/sv_SE.UTF-8/LC_MESSAGES/FixMyStreet.po1730
-rw-r--r--locale/tr_TR.UTF-8/LC_MESSAGES/FixMyStreet.po4210
-rw-r--r--locale/uk_UA.UTF-8/LC_MESSAGES/FixMyStreet.po1689
-rw-r--r--locale/zh.UTF-8/LC_MESSAGES/FixMyStreet.po1747
-rw-r--r--notes/cobranding.txt3
-rw-r--r--perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm248
-rw-r--r--perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm64
-rw-r--r--perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm183
-rw-r--r--perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm166
-rw-r--r--perllib/BarnetTypemaps/service.pm103
-rw-r--r--perllib/BarnetTypes/BAPIRET2.pm219
-rw-r--r--perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm165
-rw-r--r--perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm102
-rw-r--r--perllib/BarnetTypes/RfcException/Message.pm111
-rw-r--r--perllib/BarnetTypes/RfcException/Message/Number.pm65
-rw-r--r--perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm117
-rw-r--r--perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm104
-rw-r--r--perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm123
-rw-r--r--perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm65
-rw-r--r--perllib/BarnetTypes/char1.pm65
-rw-r--r--perllib/BarnetTypes/char10.pm65
-rw-r--r--perllib/BarnetTypes/char132.pm65
-rw-r--r--perllib/BarnetTypes/char2.pm65
-rw-r--r--perllib/BarnetTypes/char20.pm65
-rw-r--r--perllib/BarnetTypes/char220.pm65
-rw-r--r--perllib/BarnetTypes/char241.pm65
-rw-r--r--perllib/BarnetTypes/char3.pm65
-rw-r--r--perllib/BarnetTypes/char30.pm65
-rw-r--r--perllib/BarnetTypes/char32.pm65
-rw-r--r--perllib/BarnetTypes/char35.pm65
-rw-r--r--perllib/BarnetTypes/char40.pm65
-rw-r--r--perllib/BarnetTypes/char5.pm65
-rw-r--r--perllib/BarnetTypes/char50.pm65
-rw-r--r--perllib/BarnetTypes/numeric3.pm65
-rw-r--r--perllib/BarnetTypes/numeric6.pm65
-rw-r--r--perllib/Catalyst/Engine.pm738
-rw-r--r--perllib/Catalyst/Log.pm329
-rw-r--r--perllib/Catalyst/Plugin/Session/State/Cookie.pm3
-rw-r--r--perllib/FixMyStreet.pm5
-rw-r--r--perllib/FixMyStreet/App.pm90
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm222
-rw-r--r--perllib/FixMyStreet/App/Controller/Around.pm7
-rw-r--r--perllib/FixMyStreet/App/Controller/Auth.pm13
-rw-r--r--perllib/FixMyStreet/App/Controller/Contact.pm15
-rw-r--r--perllib/FixMyStreet/App/Controller/Dashboard.pm16
-rw-r--r--perllib/FixMyStreet/App/Controller/Moderate.pm4
-rw-r--r--perllib/FixMyStreet/App/Controller/My.pm14
-rw-r--r--perllib/FixMyStreet/App/Controller/Photo.pm163
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Questionnaire.pm14
-rw-r--r--perllib/FixMyStreet/App/Controller/Report.pm19
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/New.pm45
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/Update.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Reports.pm46
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Rss.pm6
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Status.pm70
-rw-r--r--perllib/FixMyStreet/App/Controller/Tokens.pm8
-rw-r--r--perllib/FixMyStreet/App/Model/PhotoSet.pm306
-rw-r--r--perllib/FixMyStreet/App/View/Web.pm20
-rw-r--r--perllib/FixMyStreet/Cobrand/Bromley.pm24
-rw-r--r--perllib/FixMyStreet/Cobrand/Default.pm68
-rw-r--r--perllib/FixMyStreet/Cobrand/EastSussex.pm15
-rw-r--r--perllib/FixMyStreet/Cobrand/Greenwich.pm5
-rw-r--r--perllib/FixMyStreet/Cobrand/Oxfordshire.pm5
-rw-r--r--perllib/FixMyStreet/Cobrand/SeeSomething.pm9
-rw-r--r--perllib/FixMyStreet/Cobrand/Stevenage.pm5
-rw-r--r--perllib/FixMyStreet/Cobrand/UKCouncils.pm32
-rw-r--r--perllib/FixMyStreet/Cobrand/Zurich.pm574
-rw-r--r--perllib/FixMyStreet/DB/Result/AdminLog.pm9
-rw-r--r--perllib/FixMyStreet/DB/Result/Alert.pm9
-rw-r--r--perllib/FixMyStreet/DB/Result/AlertSent.pm7
-rw-r--r--perllib/FixMyStreet/DB/Result/Body.pm22
-rw-r--r--perllib/FixMyStreet/DB/Result/Comment.pm9
-rw-r--r--perllib/FixMyStreet/DB/Result/ModerationOriginalData.pm11
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm92
-rw-r--r--perllib/FixMyStreet/DB/Result/ResponseTemplate.pm49
-rw-r--r--perllib/FixMyStreet/DB/Result/Token.pm12
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Alert.pm4
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/AlertType.pm32
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Comment.pm34
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Contact.pm4
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Nearby.pm18
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Problem.pm57
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm46
-rw-r--r--perllib/FixMyStreet/Email.pm12
-rw-r--r--perllib/FixMyStreet/Geocode/Google.pm28
-rw-r--r--perllib/FixMyStreet/Geocode/Zurich.pm11
-rw-r--r--perllib/FixMyStreet/Map.pm10
-rw-r--r--perllib/FixMyStreet/Map/Zurich.pm174
-rw-r--r--perllib/FixMyStreet/SendReport/Barnet.pm208
-rw-r--r--perllib/FixMyStreet/SendReport/Email.pm14
-rw-r--r--perllib/FixMyStreet/SendReport/Zurich.pm13
-rw-r--r--perllib/FixMyStreet/TestMech.pm34
-rw-r--r--perllib/Open311/GetServiceRequestUpdates.pm12
-rw-r--r--perllib/Open311/GetUpdates.pm3
-rw-r--r--perllib/Open311/PopulateServiceList.pm6
-rw-r--r--perllib/Utils.pm31
-rw-r--r--perllib/Utils/Email.pm37
-rw-r--r--t/MapIt.pm17
-rw-r--r--t/app/controller/admin.t2
-rw-r--r--t/app/controller/alert_new.t12
-rw-r--r--t/app/controller/around.t10
-rw-r--r--t/app/controller/contact.t2
-rw-r--r--t/app/controller/moderate.t10
-rw-r--r--t/app/controller/photo.t75
-rw-r--r--t/app/controller/questionnaire.t16
-rw-r--r--t/app/controller/report_display.t142
-rw-r--r--t/app/controller/report_import.t37
-rw-r--r--t/app/controller/report_new.t11
-rw-r--r--t/app/controller/report_updates.t8
-rw-r--r--t/app/controller/reports.t23
-rw-r--r--t/app/controller/rss.t7
-rw-r--r--t/app/helpers/grey.gifbin0 -> 34 bytes
-rw-r--r--t/app/helpers/send_email.t72
-rw-r--r--t/app/helpers/send_email_sample_mime.txt57
-rw-r--r--t/app/model/alert_type.t2
-rw-r--r--t/app/model/photoset.t76
-rw-r--r--t/app/model/problem.t28
-rw-r--r--t/app/model/questionnaire.t4
-rw-r--r--t/app/model/token.t66
-rw-r--r--t/cobrand/fixamingata.t2
-rw-r--r--t/cobrand/two_tier.t17
-rw-r--r--t/cobrand/zurich-logo_portal.x.jpgbin0 -> 365 bytes
-rw-r--r--t/cobrand/zurich.t661
-rw-r--r--t/cobrand/zurich_attachments.txt40
-rw-r--r--t/open311/getservicerequestupdates.t30
-rw-r--r--t/open311/populate-service-list.t18
-rw-r--r--templates/email/default/problem-confirm-not-sending.txt32
-rw-r--r--templates/email/default/test.txt1
-rw-r--r--templates/email/fixamingata/test.txt15
-rw-r--r--templates/email/zurich/problem-closed.txt4
-rw-r--r--templates/email/zurich/problem-confirm.txt4
-rw-r--r--templates/email/zurich/problem-external.txt8
-rw-r--r--templates/email/zurich/problem-rejected.txt16
-rw-r--r--templates/email/zurich/problem-wish.txt16
-rw-r--r--templates/email/zurich/reply-autoresponse.txt1
-rw-r--r--templates/email/zurich/submit-external-personal.txt15
-rw-r--r--templates/email/zurich/submit-external-wish.txt20
-rw-r--r--templates/email/zurich/submit-external.txt15
-rw-r--r--templates/web/arreglamibarrio/faq/faq-es.html26
-rw-r--r--templates/web/barnet/footer.html4
-rw-r--r--templates/web/barnet/header.html8
-rw-r--r--templates/web/base/admin/category_edit.html3
-rw-r--r--templates/web/base/admin/config_page.html2
-rw-r--r--templates/web/base/admin/footer.html2
-rw-r--r--templates/web/base/admin/header.html2
-rw-r--r--templates/web/base/admin/index.html33
-rw-r--r--templates/web/base/admin/list_updates.html2
-rw-r--r--templates/web/base/admin/problem_row.html2
-rw-r--r--templates/web/base/admin/report_blocks.html30
-rw-r--r--templates/web/base/admin/report_edit.html22
-rw-r--r--templates/web/base/alert/_list.html43
-rw-r--r--templates/web/base/alert/index.html14
-rw-r--r--templates/web/base/around/_error_multiple.html (renamed from templates/web/fixmystreet/around/around_index.html)14
-rw-r--r--templates/web/base/around/_main.html8
-rwxr-xr-xtemplates/web/base/around/_report_banner.html16
-rw-r--r--templates/web/base/around/around_index.html27
-rw-r--r--templates/web/base/around/around_map_list_items.html18
-rwxr-xr-xtemplates/web/base/around/display_location.html2
-rw-r--r--templates/web/base/around/index.html13
-rw-r--r--templates/web/base/around/intro.html (renamed from templates/web/fixmystreet/around/intro.html)0
-rw-r--r--templates/web/base/around/location_error.html2
-rw-r--r--templates/web/base/around/on_map_list_items.html23
-rw-r--r--templates/web/base/around/postcode_form.html39
-rwxr-xr-xtemplates/web/base/around/tabbed_lists.html26
-rw-r--r--templates/web/base/auth/general.html123
-rw-r--r--templates/web/base/auth/token.html26
-rw-r--r--templates/web/base/common_header_tags.html2
-rw-r--r--templates/web/base/contact/blurb.html2
-rw-r--r--templates/web/base/email_sent.html29
-rwxr-xr-xtemplates/web/base/faq/faq-en-gb.html32
-rw-r--r--templates/web/base/footer.html6
-rwxr-xr-xtemplates/web/base/front/_list-entry.html1
-rw-r--r--templates/web/base/front/footer-marketing.html (renamed from templates/web/fixmystreet/front/footer-marketing.html)2
-rw-r--r--templates/web/base/front/javascript.html (renamed from templates/web/fixmystreet/front/javascript.html)0
-rw-r--r--templates/web/base/front/recent.html23
-rw-r--r--templates/web/base/header.html26
-rw-r--r--templates/web/base/header_opengraph.html6
-rw-r--r--templates/web/base/header_opengraph_image.html4
-rw-r--r--templates/web/base/index.html59
-rw-r--r--templates/web/base/maps/google-ol.html4
-rw-r--r--templates/web/base/maps/noscript_map.html64
-rw-r--r--templates/web/base/maps/openlayers.html63
-rw-r--r--templates/web/base/my/_problem-list.html (renamed from templates/web/greenwich/my/_problem-list.html)10
-rw-r--r--templates/web/base/my/my.html53
-rw-r--r--templates/web/base/open311/index.html6
-rw-r--r--templates/web/base/questionnaire/index.html76
-rw-r--r--templates/web/base/report/_item.html (renamed from templates/web/fixmystreet/report/_item.html)14
-rw-r--r--templates/web/base/report/display.html2
-rw-r--r--templates/web/base/report/new/category_extras.html2
-rw-r--r--templates/web/base/report/new/fill_in_details_form.html3
-rw-r--r--templates/web/base/report/photo-js.html (renamed from templates/web/fixmystreet/report/photo-js.html)0
-rw-r--r--templates/web/base/report/photo.html25
-rw-r--r--templates/web/base/report/update-form.html3
-rwxr-xr-xtemplates/web/base/reports/_list-entry.html7
-rw-r--r--templates/web/base/reports/_list-filters.html34
-rw-r--r--templates/web/base/reports/_problem-list.html6
-rwxr-xr-xtemplates/web/base/reports/body.html6
-rwxr-xr-xtemplates/web/base/static/privacy.html8
-rw-r--r--templates/web/base/status/index.html19
-rw-r--r--[-rwxr-xr-x]templates/web/bromley/around/_report_banner.html (renamed from templates/web/fixmystreet/around/_report_banner.html)7
-rw-r--r--templates/web/bromley/around/intro.html2
-rwxr-xr-xtemplates/web/bromley/faq/faq-en-gb.html8
-rw-r--r--templates/web/bromley/footer.html38
-rw-r--r--templates/web/bromley/footer_extra.html41
-rwxr-xr-xtemplates/web/bromley/front/_list-entry.html1
-rw-r--r--templates/web/bromley/front/footer-marketing.html18
-rw-r--r--templates/web/bromley/header.html114
-rw-r--r--templates/web/bromley/header_extra.html1
-rw-r--r--templates/web/bromley/header_logo.html62
-rw-r--r--templates/web/bromley/report/_item.html6
-rw-r--r--templates/web/eastsussex/email_sent.html34
-rw-r--r--templates/web/emptyhomes/header.html6
-rw-r--r--templates/web/fiksgatami/footer.html4
-rw-r--r--templates/web/fiksgatami/header.html8
-rw-r--r--templates/web/fiksgatami/nn/footer.html4
-rw-r--r--templates/web/fixamingata/footer.html2
-rw-r--r--templates/web/fixamingata/front/recent.html2
-rw-r--r--templates/web/fixmindelo/footer.html4
-rw-r--r--templates/web/fixmindelo/static/privacy.html7
-rw-r--r--templates/web/fixmybarangay/around/intro.html2
-rw-r--r--templates/web/fixmybarangay/around/tabbed_lists.html2
-rw-r--r--templates/web/fixmybarangay/footer.html8
-rw-r--r--templates/web/fixmybarangay/header.html8
-rw-r--r--templates/web/fixmybarangay/report/_message_manager.html2
-rw-r--r--templates/web/fixmystreet-uk-councils/report/_item-with-pin.html6
-rw-r--r--templates/web/fixmystreet-uk-councils/static/privacy.html14
-rw-r--r--templates/web/fixmystreet.com/contact/address.html7
-rw-r--r--templates/web/fixmystreet.com/footer_extra.html3
-rw-r--r--templates/web/fixmystreet.com/research/survey_link.html3
-rwxr-xr-xtemplates/web/fixmystreet.com/static/privacy.html14
-rw-r--r--templates/web/fixmystreet.com/tokens/_extras_confirm.html1
-rw-r--r--templates/web/fixmystreet/alert/_list.html93
-rw-r--r--templates/web/fixmystreet/around/_main.html3
-rw-r--r--templates/web/fixmystreet/around/around_map_list_items.html9
-rw-r--r--templates/web/fixmystreet/around/location_error.html1
-rw-r--r--templates/web/fixmystreet/around/on_map_list_items.html7
-rw-r--r--templates/web/fixmystreet/around/postcode_form.html31
-rw-r--r--templates/web/fixmystreet/around/tabbed_lists.html14
-rw-r--r--templates/web/fixmystreet/auth/general.html73
-rw-r--r--templates/web/fixmystreet/contact/blurb.html2
-rw-r--r--templates/web/fixmystreet/contact/index.html6
-rw-r--r--templates/web/fixmystreet/footer.html27
-rw-r--r--templates/web/fixmystreet/front/recent.html24
-rw-r--r--templates/web/fixmystreet/header.html15
-rw-r--r--templates/web/fixmystreet/header_logo.html4
-rw-r--r--templates/web/fixmystreet/header_opengraph.html9
-rw-r--r--templates/web/fixmystreet/index.html20
-rw-r--r--templates/web/fixmystreet/my/_problem-list.html27
-rw-r--r--templates/web/fixmystreet/my/my.html60
-rw-r--r--templates/web/fixmystreet/questionnaire/index.html110
-rw-r--r--templates/web/fixmystreet/report/display.html2
-rw-r--r--templates/web/fixmystreet/report/new/form_user_loggedout.html2
-rw-r--r--templates/web/fixmystreet/report/update-form.html2
-rw-r--r--templates/web/fixmystreet/report/update.html10
-rwxr-xr-xtemplates/web/fixmystreet/reports/_list-entry.html1
-rwxr-xr-xtemplates/web/fixmystreet/reports/_ward-list.html10
-rw-r--r--templates/web/greenwich/around/around_map_list_items.html0
-rw-r--r--templates/web/greenwich/around/on_map_list_items.html11
-rw-r--r--templates/web/greenwich/around/tabbed_lists.html5
-rw-r--r--templates/web/greenwich/footer.html9
-rwxr-xr-xtemplates/web/greenwich/front/_list-entry.html1
-rw-r--r--templates/web/greenwich/header_logo.html2
-rw-r--r--templates/web/greenwich/reports/_list-entry.html7
-rw-r--r--templates/web/greenwich/reports/_list-filters.html32
-rw-r--r--templates/web/greenwich/reports/_problem-list.html19
-rw-r--r--templates/web/harrogate/footer.html15
-rw-r--r--templates/web/harrogate/header.html8
-rwxr-xr-xtemplates/web/harrogate/static/privacy.html2
-rw-r--r--templates/web/hart/footer.html2
-rw-r--r--templates/web/hart/header.html8
-rw-r--r--templates/web/oxfordshire/around/around_map_list_items.html0
-rw-r--r--templates/web/oxfordshire/around/on_map_list_items.html11
-rw-r--r--templates/web/oxfordshire/around/tabbed_lists.html5
-rw-r--r--templates/web/oxfordshire/footer.html4
-rwxr-xr-xtemplates/web/oxfordshire/front/_list-entry.html1
-rw-r--r--templates/web/oxfordshire/header.html8
-rw-r--r--templates/web/oxfordshire/my/_problem-list.html25
-rw-r--r--templates/web/oxfordshire/reports/_list-entry.html7
-rw-r--r--templates/web/oxfordshire/reports/_list-filters.html32
-rw-r--r--templates/web/seesomething/around/index.html (renamed from templates/web/seesomething/around/around_index.html)0
-rw-r--r--templates/web/seesomething/footer.html2
-rw-r--r--templates/web/stevenage/faq/faq-en-gb.html125
-rw-r--r--templates/web/stevenage/footer.html2
-rw-r--r--templates/web/stevenage/header.html8
-rw-r--r--templates/web/trinidadtobago/footer.html4
-rw-r--r--templates/web/trinidadtobago/header_logo.html2
-rw-r--r--templates/web/warwickshire/header.html10
-rw-r--r--templates/web/zerotb/around/around_map_list_items.html9
-rw-r--r--templates/web/zerotb/around/on_map_list_items.html13
-rw-r--r--templates/web/zerotb/around/tabbed_lists.html13
-rw-r--r--templates/web/zerotb/footer.html2
-rw-r--r--templates/web/zerotb/report/_item.html4
-rw-r--r--templates/web/zurich/admin/body-form.html1
-rw-r--r--templates/web/zurich/admin/header.html8
-rw-r--r--templates/web/zurich/admin/list_updates.html86
-rw-r--r--templates/web/zurich/admin/problem_row.html10
-rw-r--r--templates/web/zurich/admin/report_edit-sdm.html171
-rw-r--r--templates/web/zurich/admin/report_edit.html509
-rw-r--r--templates/web/zurich/admin/response_templates_select.html25
-rw-r--r--templates/web/zurich/admin/stats.html4
-rw-r--r--templates/web/zurich/admin/template_edit.html38
-rw-r--r--templates/web/zurich/admin/templates.html28
-rw-r--r--templates/web/zurich/auth/general.html2
-rw-r--r--templates/web/zurich/auth/token.html25
-rw-r--r--templates/web/zurich/email_sent.html11
-rw-r--r--templates/web/zurich/faq/faq-de-ch.html110
-rw-r--r--templates/web/zurich/footer.html5
-rw-r--r--templates/web/zurich/header.html15
-rw-r--r--templates/web/zurich/maps/noscript_map.html70
-rw-r--r--templates/web/zurich/report/_item.html4
-rw-r--r--templates/web/zurich/report/banner.html19
-rw-r--r--templates/web/zurich/report/new/fill_in_details_form.html13
-rw-r--r--templates/web/zurich/report/updates.html12
-rwxr-xr-xtemplates/web/zurich/reports/index.html2
-rwxr-xr-xvendor/bin/carton80534
-rw-r--r--web/cobrands/barnet/_colours.scss2
-rw-r--r--web/cobrands/barnet/base.scss4
-rw-r--r--web/cobrands/barnet/layout.scss2
-rw-r--r--web/cobrands/bromley/_colours.scss13
-rw-r--r--web/cobrands/bromley/_fonts.scss10
-rw-r--r--web/cobrands/bromley/a-z-nav.js22
-rw-r--r--web/cobrands/bromley/base.scss503
-rw-r--r--web/cobrands/bromley/bromley-logo.jpgbin20898 -> 0 bytes
-rw-r--r--web/cobrands/bromley/bromley-logo.pngbin0 -> 28044 bytes
-rw-r--r--web/cobrands/bromley/bromley-logo.s.jpgbin5908 -> 0 bytes
-rw-r--r--web/cobrands/bromley/bromley-logo.s.pngbin0 -> 8754 bytes
-rw-r--r--web/cobrands/bromley/bromley.scss113
-rw-r--r--web/cobrands/bromley/facebook.pngbin0 -> 807 bytes
-rw-r--r--web/cobrands/bromley/flickr.pngbin0 -> 1475 bytes
-rw-r--r--web/cobrands/bromley/fonts/fontawesome-webfont.eotbin0 -> 38205 bytes
-rw-r--r--web/cobrands/bromley/fonts/fontawesome-webfont.svg414
-rw-r--r--web/cobrands/bromley/fonts/fontawesome-webfont.ttfbin0 -> 80652 bytes
-rw-r--r--web/cobrands/bromley/fonts/fontawesome-webfont.woffbin0 -> 44432 bytes
-rw-r--r--web/cobrands/bromley/layout.scss329
-rw-r--r--web/cobrands/bromley/main-menu-hover-home-right.gifbin4299 -> 0 bytes
-rw-r--r--web/cobrands/bromley/main-menu1.gifbin12809 -> 0 bytes
-rw-r--r--web/cobrands/bromley/position_map.js19
-rw-r--r--web/cobrands/bromley/rss.pngbin0 -> 1013 bytes
-rw-r--r--web/cobrands/bromley/search-icon.pngbin0 -> 1403 bytes
-rw-r--r--web/cobrands/bromley/tab-blue.pngbin826 -> 0 bytes
-rw-r--r--web/cobrands/bromley/twitter.pngbin0 -> 940 bytes
-rw-r--r--web/cobrands/bromley/youtube.pngbin0 -> 1127 bytes
-rw-r--r--web/cobrands/default/_colours.scss5
-rw-r--r--web/cobrands/eastsussex/base.scss43
-rw-r--r--web/cobrands/eastsussex/layout.scss54
-rw-r--r--web/cobrands/fixamingata/_colours.scss2
-rw-r--r--web/cobrands/fixamingata/base.scss4
-rw-r--r--web/cobrands/fixmindelo/base.scss2
-rw-r--r--web/cobrands/fixmindelo/layout.scss14
-rw-r--r--web/cobrands/fixmybarangay/base.scss2
-rw-r--r--web/cobrands/fixmybarangay/layout.scss32
-rw-r--r--web/cobrands/fixmystreet.com/base.scss27
-rw-r--r--web/cobrands/fixmystreet.com/layout.scss56
-rw-r--r--web/cobrands/fixmystreet.com/posters.scss23
-rw-r--r--web/cobrands/fixmystreet/dashboard.scss27
-rw-r--r--web/cobrands/fixmystreet/fixmystreet.js105
-rw-r--r--web/cobrands/fixmystreet/fms-og_image.pngbin17387 -> 0 bytes
-rw-r--r--web/cobrands/fixmystreet/images/chevron-grey-left.svg3
-rw-r--r--web/cobrands/fixmystreet/images/chevron-grey-right.svg3
-rw-r--r--web/cobrands/fixmystreet/images/chevron-white-left-on-green.gifbin0 -> 236 bytes
-rw-r--r--web/cobrands/fixmystreet/images/chevron-white-left.svg3
-rw-r--r--web/cobrands/fixmystreet/images/chevron-white-right-on-green.gif (renamed from web/cobrands/fixmystreet/images/ie_green_chevron.gif)bin237 -> 237 bytes
-rw-r--r--web/cobrands/fixmystreet/images/chevron-white-right.svg3
-rw-r--r--web/cobrands/fixmystreet/images/fms-og_image.jpgbin0 -> 74387 bytes
-rw-r--r--web/cobrands/fixmystreet/images/inbox-in-circle-100px.pngbin0 -> 1725 bytes
-rw-r--r--web/cobrands/fixmystreet/images/triangle-grey-left.svg3
-rw-r--r--web/cobrands/fixmystreet/images/triangle-grey-right.svg3
-rw-r--r--web/cobrands/greenwich/base.scss9
-rw-r--r--web/cobrands/greenwich/layout.scss37
-rw-r--r--web/cobrands/harrogate/_colours.scss2
-rw-r--r--web/cobrands/harrogate/base.scss31
-rw-r--r--web/cobrands/harrogate/layout.scss49
-rw-r--r--web/cobrands/hart/base.scss10
-rw-r--r--web/cobrands/hart/hart.scss28
-rw-r--r--web/cobrands/oxfordshire/base.scss2
-rw-r--r--web/cobrands/oxfordshire/layout.scss14
-rw-r--r--web/cobrands/sass/_admin.scss24
-rw-r--r--web/cobrands/sass/_base.scss647
-rw-r--r--web/cobrands/sass/_layout.scss388
-rw-r--r--web/cobrands/sass/_mixins.scss51
-rw-r--r--web/cobrands/sass/_report_list.scss129
-rw-r--r--web/cobrands/sass/_report_list_pins.scss109
-rw-r--r--web/cobrands/stevenage/layout.scss62
-rw-r--r--web/cobrands/trinidadtobago/_colours.scss2
-rw-r--r--web/cobrands/trinidadtobago/base.scss6
-rw-r--r--web/cobrands/warwickshire/base.scss5
-rw-r--r--web/cobrands/zerotb/layout.scss34
-rw-r--r--web/cobrands/zurich/admin-faux-columns.gifbin0 -> 107 bytes
-rw-r--r--web/cobrands/zurich/base.scss205
-rw-r--r--web/cobrands/zurich/layout.scss90
-rw-r--r--web/down.default.html111
-rw-r--r--web/js/fixmystreet.js23
-rw-r--r--web/js/map-OpenLayers.js15
-rw-r--r--web/js/map-google-ol.js24
-rw-r--r--web/js/map-google.js6
-rw-r--r--web/js/map-wmts-zurich.js171
-rw-r--r--web/js/moderate.js12
-rw-r--r--web/js/modernizr.custom.js8
-rw-r--r--web/pngfix.js37
466 files changed, 122478 insertions, 28429 deletions
diff --git a/.gitignore b/.gitignore
index 3241af718..5c77b4b80 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,41 +1,42 @@
-*.ttc
+# General
*.swp
*~
._*
-.prove
-
-.vagrant
-.bundle
.DS_Store
-.carton
-local-lib5
-META.yml
-Makefile
-blib/
-inc/
-.sass-cache
-_Inline/
-lib
-tags
+# Compiled templates
+*.ttc
+
+# Translations
*.mo
FixMyStreet-EmptyHomes.po
FixMyBarangay.po
+# CSS
+.bundle
+.sass-cache
/web/css/core.css
/web/css/main.css
/web/cobrands/*/*.css
/web/cobrands/seesomething
-/web/photo
-/local
-/local-carton
-/web/cobrands/fixmystreet/compass_app_log.txt
+# Photo upload cache
+/web/photo
-phonegap/www/js/config.js
-phonegap/Android/bin/
-phonegap/iPhone/FixMyStreet.xcodeproj/project.xcworkspace/xcuserdata
-phonegap/Android/gen/
+# Installation
+/local
+/local-*
+.prove
+.vagrant
+.carton
+META.yml
+Makefile
+blib/
+inc/
+_Inline/
+# International
/fixmystreet-international
*[Mm]ake[Mm]y[Ii]sland*
+ug_fixmycommunity
+UG_FixMyCommunity.pm
diff --git a/.travis/install b/.travis/install
index b73eef330..a9132ba82 100755
--- a/.travis/install
+++ b/.travis/install
@@ -25,5 +25,4 @@ except IOError:
os.remove(wanted_filename)
print "No cached copy found, running carton install..."
-os.system('cpanm -q Carton')
-os.system('carton install --deployment')
+os.system('vendor/bin/carton install --deployment')
diff --git a/.tx/config b/.tx/config
index f23aac597..b71aac569 100644
--- a/.tx/config
+++ b/.tx/config
@@ -2,7 +2,7 @@
host = https://www.transifex.com
type = PO
-[fixmystreet.v1-5-4]
+[fixmystreet.v1-7]
file_filter = locale/<lang>.UTF-8/LC_MESSAGES/FixMyStreet.po
source_file = locale/FixMyStreet.po
source_lang = en_GB
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..6682044c6
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,43 @@
+# Contributing to FixMyStreet
+
+Thanks for contributing to FixMyStreet! Here is a quick summary of where to
+find information:
+
+* [Documentation](http://fixmystreet.org) – including development installation
+with Vagrant or manually, and information on customisation;
+* [Coding standards](https://mysociety.github.io/coding-standards.html);
+* [Ticket management](https://waffle.io/mysociety/fixmystreet) – please see
+below for details on our workflow;
+* [Community help](http://fixmystreet.org/community/) – if you are having
+trouble, we have a number of places you can ask for assistance.
+
+Workflow
+--------
+
+* Icebox – Untriaged tickets, or those that are on the back burner;
+* Backlog – Tickets we would like to do at some point;
+* Current – Scheduled to be done in the current sprint;
+* In progress – Currently being worked on;
+* Reviewing – Work has been done and is awaiting review or being reviewed;
+* Reviewed – The PR has been reviewed, and so needs either more work (and then
+ put back in Reviewing for further review), or to be merged and deployed;
+* Done – Tickets placed here will be automatically closed.
+
+If you are working on a ticket or reviewing a pull request, try and assign it
+to yourself so others know it is taken.
+
+Workflow tips
+-------------
+
+If you create a new branch that starts with “NNN-†or “NNN_†or has “#NNNâ€
+anywhere in it, where NNN is a GitHub issue number, then pushing that branch
+will automatically move an issue to In progress.
+
+When you create a pull request, if it fixes a current issue put
+“Fixes/closes/resolves #NNN†in the PR title/description, and then the PR will
+be linked with the issue. If it is only linked to an issue, but
+doesn’t fix it, put “connect/connects/connected to #NNN†in the details.
+
+New PRs from collaborators will appear in Reviewing, and new PRs from
+non-collaborators will appear in Current (so that they are hopefully seen and
+triaged quickly).
diff --git a/README.md b/README.md
index e36a5c9d4..001ffee01 100644
--- a/README.md
+++ b/README.md
@@ -26,10 +26,12 @@ for help and documentation in installing the FixMyStreet Platform.
Whilst many contributions come as part of people setting up their own
installation for their area, we of course welcome stand-alone contributions as
-well. The *Suitable for Volunteers* label in our GitHub issues hopefully labels
-some potential tasks that might be suitable for that situation, though please
-do search through the other issues to see if what you're after has been
-suggested or discussed - or feel free to add your own issue if not.
+well. The [*Suitable for
+Volunteers*](https://github.com/mysociety/fixmystreet/labels/Suitable%20for%20Volunteers)
+label in our GitHub issues hopefully labels some potential tasks that might be
+suitable for that situation, though please do search through the other issues
+to see if what you're after has been suggested or discussed - or feel free to
+add your own issue if not.
## Mobile apps
@@ -38,10 +40,66 @@ We've extracted all of the mobile apps from this repository into the
## Releases
+* v1.7 (23rd October 2015)
+ - Front end improvements:
+ - Add right-to-left design option. #1209
+ - Add state/category filters to list pages. #1141
+ - Include last update time in around/my page lists. #1245
+ - Show report details more nicely on a questionnaire page. #1104
+ - Improve email confirmation page (now matches success pages). #577
+ - Update URL hash when mobile menu navigation clicked. #1211
+ - Add public status page showing stats and version. #1251
+ - Accessibility improvements to map pages. #1217
+ - New default OpenGraph image. #1184
+ - Turkish translation.
+ - Performance improvements:
+ - A number of database speed improvements. #1017
+ - Bugfixes:
+ - Translate report states in admin index. #1179
+ - Improve translation string on alert page. #348
+ - Fix location bug fetching category extras.
+ - Workaround DMARC problems. #1070
+ - Fix padding of alert form box. #1211
+ - Pin Google Maps API version to keep it working. #1215
+ - Upgrade Google geocoder to version 3. #1194
+ - Fix script running when CDPATH is set. #1250
+ - Fix retina image size on front page. #838
+ - Process update left as part of questionnaire, to catch empty ones. #1234
+ - Make sure explicit sign in button clicks are honoured. #1091
+ - Adjust email confirmation text when report not being sent. #1210
+ - Fix footer links in admin if behind a proxy. #1206
+ - Use base URL in a cobrand alert for a report without a body. #1198
+ - Fix potential graph script failure in perl 5.16+. #1262
+ - Development improvements:
+ - Error logging should now work consistently. #404
+ - CSS
+ - Streamline navigation menu CSS. #1191
+ - Streamline list item CSS. #1141
+ - make_css now follows symlinks. #1181
+ - Use a sass variable for hamburger menu. #1186
+ - Write progress of make_css_watch to terminal title. #1211
+ - Templates:
+ - Remove final hardcoded "FixMyStreet" from templates. #1205
+ - Combine a number of base/fixmystreet templates. #1245
+ - Installation:
+ - Make sure submodules are checked out by Vagrant. #1197
+ - Remove Module::Pluggable warning in newer perls. #1254
+ - Bundle carton to ease installation step. #1208
+ - Translation:
+ - Improve ease of running gettext-extract. #1202
+ - Add standard app.psgi file.
+ - Add link to volunteer tickets in README. #1259
+ - Use Modernizr to decide whether to show mobile map. #1192
+ - Prevent potential session cookie recursion. #1077
+ - Allow underscore in cobrand name/data. #1236
+ - Add a development URL to see check email pages. #1211
+
* v1.6.1 (31st July 2015)
- Bugfixes:
- Fix bug introduced in last release when setting multiple areas
for a body in the admin. #1158
+ - Don't have default "name >= 5 characters"/"must have space" checks,
+ as Latin-centric #805
- New features:
- Danish translation.
- Front end improvements:
diff --git a/Vagrantfile b/Vagrantfile
index cc6832f9a..4bb173874 100755
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -29,6 +29,17 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provision :shell, :inline => <<-EOS
# To prevent "dpkg-preconfigure: unable to re-open stdin: No such file or directory" warnings
export DEBIAN_FRONTEND=noninteractive
+ # Make sure git submodules are checked out!
+ if [ ! -e fixmystreet/commonlib/.git ]; then
+ echo "Checking out submodules"
+ apt-get -qq install -y git >/dev/null
+ cd fixmystreet
+ git submodule --quiet update --init --recursive
+ cd commonlib
+ git config core.worktree "../../../commonlib"
+ echo "gitdir: ../.git/modules/commonlib" > .git
+ cd ../..
+ fi
# Fetch and run install script
wget -O install-site.sh --no-verbose https://github.com/mysociety/commonlib/raw/master/bin/install-site.sh
sh install-site.sh --dev fixmystreet vagrant 127.0.0.1.xip.io
diff --git a/app.psgi b/app.psgi
new file mode 100644
index 000000000..fcc672647
--- /dev/null
+++ b/app.psgi
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+
+use FixMyStreet::App;
+
+my $app = FixMyStreet::App->apply_default_middlewares(FixMyStreet::App->psgi_app);
+$app;
+
diff --git a/bin/cpanm b/bin/cpanm
index 954aae1bf..9676fae7e 100755
--- a/bin/cpanm
+++ b/bin/cpanm
@@ -1,16 +1,18 @@
#!/usr/bin/env perl
#
-# You want to install cpanminus? Run the following command and it will
-# install itself for you. You might want to run it as a root with sudo
-# if you want to install to places like /usr/local/bin.
+# This is a pre-compiled source code for the cpanm (cpanminus) program.
+# For more details about how to install cpanm, go to the following URL:
#
-# % curl -L http://cpanmin.us | perl - App::cpanminus
+# https://github.com/miyagawa/cpanminus
#
-# If you don't have curl but wget, replace `curl -L` with `wget -O -`.
+# Quickstart: Run the following command and it will install itself for
+# you. You might want to run it as a root with sudo if you want to install
+# to places like /usr/local/bin.
+#
+# % curl -L https://cpanmin.us | perl - App::cpanminus
#
-# For more details about this program, visit http://search.cpan.org/dist/App-cpanminus
+# If you don't have curl but wget, replace `curl -L` with `wget -O -`.
-our $VERSION = "1.6928";
# DO NOT EDIT -- this is an auto generated file
# This chunk of stuff was generated by App::FatPacker. To find the original
@@ -18,50 +20,16 @@ our $VERSION = "1.6928";
BEGIN {
my %fatpacked;
-$fatpacked{"App/cpanminus.pm"} = <<'APP_CPANMINUS';
- package App::cpanminus;our$VERSION="1.7001";1;
+$fatpacked{"App/cpanminus.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS';
+ package App::cpanminus;our$VERSION="1.7039";1;
APP_CPANMINUS
-$fatpacked{"App/cpanminus/CPANVersion.pm"} = <<'APP_CPANMINUS_CPANVERSION';
- package App::cpanminus::CPANVersion;use strict;sub vcmp {my($self,$l,$r)=@_;local($^W)=0;return 0 if$l eq $r;for ($l,$r){s/_//g}for ($l,$r){next unless tr/.// > 1 || /^v/;s/^v?/v/;1 while s/\.0+(\d)/.$1/}if ($l=~/^v/ <=> $r=~/^v/){for ($l,$r){next if /^v/;$_=$self->float2vv($_)}}my$lvstring="v0";my$rvstring="v0";if ($] >= 5.006 && $l =~ /^v/ && $r =~ /^v/){$lvstring=$self->vstring($l);$rvstring=$self->vstring($r)}return (($l ne "undef")<=> ($r ne "undef")|| $lvstring cmp $rvstring || $l <=> $r || $l cmp $r)}sub vgt {my($self,$l,$r)=@_;$self->vcmp($l,$r)> 0}sub vlt {my($self,$l,$r)=@_;$self->vcmp($l,$r)< 0}sub vge {my($self,$l,$r)=@_;$self->vcmp($l,$r)>= 0}sub vle {my($self,$l,$r)=@_;$self->vcmp($l,$r)<= 0}sub vstring {my($self,$n)=@_;$n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]";pack "U*",split /\./,$n}sub float2vv {my($self,$n)=@_;my($rev)=int($n);$rev ||=0;my($mantissa)=$n =~ /\.(\d{1,12})/;$mantissa ||=0;$mantissa .= "0" while length($mantissa)%3;my$ret="v" .$rev;while ($mantissa){$mantissa =~ s/(\d{1,3})// or die "Panic: length>0 but not a digit? mantissa[$mantissa]";$ret .= ".".int($1)}$ret =~ s/(\.0)+/.0/;$ret}sub readable {my($self,$n)=@_;$n =~ /^([\w\-\+\.]+)/;return $1 if defined $1 && length($1)>0;if ($] < 5.006){warn("Suspicious version string seen [$n]\n");return$n}my$better=sprintf "v%vd",$n;return$better}1;
-APP_CPANMINUS_CPANVERSION
-
-$fatpacked{"App/cpanminus/Dependency.pm"} = <<'APP_CPANMINUS_DEPENDENCY';
- package App::cpanminus::Dependency;use strict;use CPAN::Meta::Requirements;sub from_prereqs {my($class,$prereq,$phases,$types)=@_;my@deps;for my$type (@$types){my$req=CPAN::Meta::Requirements->new;$req->add_requirements($prereq->requirements_for($_,$type))for @$phases;push@deps,$class->from_versions($req->as_string_hash,$type)}return@deps}sub from_versions {my($class,$versions,$type)=@_;my@deps;while (my($module,$version)=each %$versions){push@deps,$class->new($module,$version,$type)}@deps}sub new {my($class,$module,$version,$type)=@_;bless {module=>$module,version=>$version,type=>$type || 'requires',},$class}sub module {$_[0]->{module}}sub version {$_[0]->{version}}sub type {$_[0]->{type}}sub is_requirement {$_[0]->{type}eq 'requires'}1;
+$fatpacked{"App/cpanminus/Dependency.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS_DEPENDENCY';
+ package App::cpanminus::Dependency;use strict;use CPAN::Meta::Requirements;sub from_prereqs {my($class,$prereqs,$phases,$types)=@_;my@deps;for my$type (@$types){push@deps,$class->from_versions($prereqs->merged_requirements($phases,[$type])->as_string_hash,$type,)}return@deps}sub from_versions {my($class,$versions,$type)=@_;my@deps;while (my($module,$version)=each %$versions){push@deps,$class->new($module,$version,$type)}@deps}sub merge_with {my($self,$requirements)=@_;$self->{original_version}=$self->version;eval {$requirements->add_string_requirement($self->module,$self->version)};if ($@ =~ /illegal requirements/){warn sprintf("Can't merge requirements for %s: '%s' and '%s'",$self->module,$self->version,$requirements->requirements_for_module($self->module))}$self->{version}=$requirements->requirements_for_module($self->module)}sub new {my($class,$module,$version,$type)=@_;bless {module=>$module,version=>$version,type=>$type || 'requires',},$class}sub module {$_[0]->{module}}sub version {$_[0]->{version}}sub type {$_[0]->{type}}sub requires_version {my$self=shift;if (defined$self->{original_version}){return$self->{original_version}}$self->version}sub is_requirement {$_[0]->{type}eq 'requires'}1;
APP_CPANMINUS_DEPENDENCY
-$fatpacked{"App/cpanminus/ParsePM.pm"} = <<'APP_CPANMINUS_PARSEPM';
- package App::cpanminus::ParsePM;use strict;use warnings;use Safe;use JSON::PP;use Dumpvalue;use version ();use File::Spec ();use File::Temp ();use POSIX ':sys_wait_h';use App::cpanminus::CPANVersion;our$VERSION='0.04';our$VERBOSE=0;our$ALLOW_DEV_VERSION=0;sub new {my ($class,$meta)=@_;bless {META_CONTENT=>$meta},$class}sub parse {my ($self,$pmfile)=@_;$pmfile =~ s|\\|/|g;my($filemtime)=(stat$pmfile)[9];$self->{MTIME}=$filemtime;$self->{PMFILE}=$pmfile;unless ($self->_version_from_meta_ok){$self->{VERSION}=$self->_parse_version;if ($self->{VERSION}=~ /^\{.*\}$/){}elsif ($self->{VERSION}=~ /[_\s]/ &&!$ALLOW_DEV_VERSION){return}}my($ppp)=$self->_packages_per_pmfile;my@keys_ppp=$self->_filter_ppps(sort keys %$ppp);$self->_verbose(1,"Will check keys_ppp[@keys_ppp]\n");my ($package);DBPACK: foreach$package (@keys_ppp){if ($package !~ /^\w[\w\:\']*\w?\z/ || $package !~ /\w\z/ || $package =~ /:/ && $package !~ /::/ || $package =~ /\w:\w/ || $package =~ /:::/){$self->_verbose(1,"Package[$package] did not pass the ultimate sanity check");delete$ppp->{$package};next}my$pp=$ppp->{$package};if ($pp->{version}&& $pp->{version}=~ /^\{.*\}$/){my$err=JSON::PP::decode_json($pp->{version});if ($err->{openerr}){$self->_verbose(1,qq{Parse::PMFile was not able to
- read the file. It issued the following error: C< $err->{r} >},)}else {$self->_verbose(1,qq{Parse::PMFile was not able to
- parse the following line in that file: C< $err->{line} >
-
- Note: the indexer is running in a Safe compartement and cannot
- provide the full functionality of perl in the VERSION line. It
- is trying hard, but sometime it fails. As a workaround, please
- consider writing a META.yml that contains a 'provides'
- attribute or contact the CPAN admins to investigate (yet
- another) workaround against "Safe" limitations.)},)}delete$ppp->{$package};next}for ($package,$pp->{version},){if (!defined || /^\s*$/ || /\s/){delete$ppp->{$package};next}}}return$ppp}sub _parse_version {my$self=shift;use strict;my$pmfile=$self->{PMFILE};my$tmpfile=File::Spec->catfile(File::Spec->tmpdir,"ParsePMFile$$" .rand(1000));my$pmcp=$pmfile;for ($pmcp){s/([^\\](\\\\)*)@/$1\\@/g}my($v);{package main;my$pid=fork();die "Can't fork: $!" unless defined$pid;if ($pid){waitpid($pid,0);if (open my$fh,'<',$tmpfile){$v=<$fh>}}else {my($comp)=Safe->new("_pause::mldistwatch");my$eval=qq{
- local(\$^W) = 0;
- App::cpanminus::ParsePM::_parse_version_safely("$pmcp");
- };$comp->permit("entereval");$comp->share("*App::cpanminus::ParsePM::_parse_version_safely");$comp->share("*version::new");$comp->share("*version::numify");$comp->share_from('main',['*version::','*Exporter::','*DynaLoader::']);$comp->share_from('version',['&qv']);$comp->deny(qw/enteriter iter unstack goto/);{no strict;$v=$comp->reval($eval)}if ($@){my$err=$@;if (ref$err){if ($err->{line}=~ /[\$*]([\w\:\']*)\bVERSION\b.*?\=(.*)/){local*qv=\&version::qv;$v=eval "$2"}if ($@){$self->_verbose(1,sprintf("reval failed: err[%s] for eval[%s]",JSON::PP::encode_json($err),$eval,));$v=JSON::PP::encode_json($err)}}else {$v=JSON::PP::encode_json({openerr=>$err })}}if (defined$v){$v=$v->numify if ref($v)eq 'version'}else {$v=""}open my$fh,'>:utf8',$tmpfile;print$fh $v;exit 0}}unlink$tmpfile if -e $tmpfile;return$self->_normalize_version($v)}sub _packages_per_pmfile {my$self=shift;my$ppp={};my$pmfile=$self->{PMFILE};my$filemtime=$self->{MTIME};my$version=$self->{VERSION};$DB::single++;open my$fh,"<","$pmfile" or return$ppp;local $/="\n";my$inpod=0;PLINE: while (<$fh>){chomp;my($pline)=$_;$inpod=$pline =~ /^=(?!cut)/ ? 1 : $pline =~ /^=cut/ ? 0 : $inpod;next if$inpod;next if substr($pline,0,4)eq "=cut";$pline =~ s/\#.*//;next if$pline =~ /^\s*$/;if ($pline =~ /\b__(?:END|DATA)__\b/ and $pmfile !~ /\.PL$/){last PLINE}my$pkg;my$strict_version;if ($pline =~ m{
- # (.*) # takes too much time if $pline is long
- \bpackage\s+
- ([\w\:\']+)
- \s*
- (?: $ | [\}\;] | \s+($version::STRICT) )
- }x){$pkg=$1;$strict_version=$2;if ($pkg eq "DB"){next PLINE}}if ($pkg){$pkg =~ s/\'/::/;next PLINE unless$pkg =~ /^[A-Za-z]/;next PLINE unless$pkg =~ /\w$/;next PLINE if$pkg eq "main";next PLINE if length($pkg)> 128;$ppp->{$pkg}{parsed}++;$ppp->{$pkg}{infile}=$pmfile;if ($self->_simile($pmfile,$pkg)){$ppp->{$pkg}{simile}=$pmfile;if ($self->_version_from_meta_ok){my$provides=$self->{META_CONTENT}{provides};if (exists$provides->{$pkg}){if (exists$provides->{$pkg}{version}){my$v=$provides->{$pkg}{version};if ($v =~ /[_\s]/ &&!$ALLOW_DEV_VERSION){next PLINE}else {$ppp->{$pkg}{version}=$self->_normalize_version($v)}}else {$ppp->{$pkg}{version}="undef"}}}else {if (defined$strict_version){$ppp->{$pkg}{version}=$strict_version }else {$ppp->{$pkg}{version}=defined$version ? $version : ""}no warnings;if ($version eq 'undef'){$ppp->{$pkg}{version}=$version unless defined$ppp->{$pkg}{version}}else {$ppp->{$pkg}{version}=$version if$version > $ppp->{$pkg}{version}|| $version gt $ppp->{$pkg}{version}}}}else {$ppp->{$pkg}{version}=$version unless defined$ppp->{$pkg}{version}&& length($ppp->{$pkg}{version})}$ppp->{$pkg}{filemtime}=$filemtime}else {}}$fh->close;$ppp}{no strict;sub _parse_version_safely {my($parsefile)=@_;my$result;local*FH;local $/="\n";open(FH,$parsefile)or die "Could not open '$parsefile': $!";my$inpod=0;while (<FH>){$inpod=/^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;next if$inpod || /^\s*#/;chop;next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;my$current_parsed_line=$_;my$eval=qq{
- package #
- ExtUtils::MakeMaker::_version;
-
- local $1$2;
- \$$2=undef; do {
- $_
- }; \$$2
- };local $^W=0;local$SIG{__WARN__}=sub {};$result=eval($eval);if ($@ or!defined$result){die +{eval=>$eval,line=>$current_parsed_line,file=>$parsefile,err=>$@,}}last}close FH;$result="undef" unless defined$result;return$result}}sub _filter_ppps {my($self,@ppps)=@_;my@res;MANI: for my$ppp (@ppps){if ($self->{META_CONTENT}){my$no_index=$self->{META_CONTENT}{no_index}|| $self->{META_CONTENT}{private};if (ref($no_index)eq 'HASH'){my%map=(package=>qr{\z},namespace=>qr{::},);for my$k (qw(package namespace)){next unless my$v=$no_index->{$k};my$rest=$map{$k};if (ref$v eq "ARRAY"){for my$ve (@$v){$ve =~ s|::$||;if ($ppp =~ /^$ve$rest/){$self->_verbose(1,"Skipping ppp[$ppp] due to ve[$ve]");next MANI}else {$self->_verbose(1,"NOT skipping ppp[$ppp] due to ve[$ve]")}}}else {$v =~ s|::$||;if ($ppp =~ /^$v$rest/){$self->_verbose(1,"Skipping ppp[$ppp] due to v[$v]");next MANI}else {$self->_verbose(1,"NOT skipping ppp[$ppp] due to v[$v]")}}}}else {$self->_verbose(1,"No keyword 'no_index' or 'private' in META_CONTENT")}}else {}push@res,$ppp}$self->_verbose(1,"Result of filter_ppps: res[@res]");@res}sub _simile {my($self,$file,$package)=@_;$file =~ s|.*/||;$file =~ s|\.pm(?:\.PL)?||;my$ret=$package =~ m/\b\Q$file\E$/;$ret ||=0;unless ($ret){$ret=1 if lc$file eq 'version'}$self->_verbose(1,"Result of simile(): file[$file] package[$package] ret[$ret]\n");$ret}sub _normalize_version {my($self,$v)=@_;$v="undef" unless defined$v;my$dv=Dumpvalue->new;my$sdv=$dv->stringify($v,1);$self->_verbose(1,"Result of normalize_version: sdv[$sdv]\n");return$v if$v eq "undef";return$v if$v =~ /^\{.*\}$/;$v =~ s/^\s+//;$v =~ s/\s+\z//;if ($v =~ /_/){return$v }my$vv=eval {no warnings;version->new($v)->numify};if ($@){return "undef"}if ($vv eq $v){}else {my$forced=$self->_force_numeric($v);if ($forced eq $vv){}elsif ($forced =~ /^v(.+)/){$vv=version->new($1)->numify}else {if ($forced==$vv){$vv=$forced}}}return$vv}sub _force_numeric {my($self,$v)=@_;$v=App::cpanminus::CPANVersion->readable($v);if ($v =~ /^(\+?)(\d*)(\.(\d*))?/ && (defined $2 && length $2 || defined $4 && length $4)){my$two=defined $2 ? $2 : "";my$three=defined $3 ? $3 : "";$v="$two$three"}$v}sub _version_from_meta_ok {my($self)=@_;return$self->{VERSION_FROM_META_OK}if exists$self->{VERSION_FROM_META_OK};my$c=$self->{META_CONTENT};return($self->{VERSION_FROM_META_OK}=0)unless$c->{provides};my ($mb_v)=(defined$c->{generated_by}? $c->{generated_by}: '')=~ /Module::Build version ([\d\.]+)/;return($self->{VERSION_FROM_META_OK}=1)unless$mb_v;return($self->{VERSION_FROM_META_OK}=1)if$mb_v eq '0.250.0';if ($mb_v >= 0.19 && $mb_v < 0.26 &&!keys %{$c->{provides}}){return($self->{VERSION_FROM_META_OK}=0)}return($self->{VERSION_FROM_META_OK}=1)}sub _verbose {my($self,$level,@what)=@_;warn@what if$level <= $VERBOSE}1;
-APP_CPANMINUS_PARSEPM
-
-$fatpacked{"App/cpanminus/script.pm"} = <<'APP_CPANMINUS_SCRIPT';
- package App::cpanminus::script;use strict;use Config;use Cwd ();use App::cpanminus;use File::Basename ();use File::Find ();use File::Path ();use File::Spec ();use File::Copy ();use File::Temp ();use Getopt::Long ();use Parse::CPAN::Meta;use Symbol ();use String::ShellQuote ();use version ();use aliased 'App::cpanminus::Dependency';use constant WIN32=>$^O eq 'MSWin32';use constant SUNOS=>$^O eq 'solaris';use constant CAN_SYMLINK=>eval {symlink("","");1};our$VERSION=$App::cpanminus::VERSION;if ($INC{"App/FatPacker/Trace.pm"}){require JSON::PP;require CPAN::Meta::YAML;require CPAN::Meta::Prereqs;require version::vpp;require File::pushd}my$quote=WIN32 ? q/"/ : q/'/;sub agent {my$self=shift;my$agent="cpanminus/$VERSION";$agent .= " perl/$]" if$self->{report_perl_version};$agent}sub determine_home {my$class=shift;my$homedir=$ENV{HOME}|| eval {require File::HomeDir;File::HomeDir->my_home}|| join('',@ENV{qw(HOMEDRIVE HOMEPATH)});if (WIN32){require Win32;$homedir=Win32::GetShortPathName($homedir)}return "$homedir/.cpanm"}sub new {my$class=shift;bless {home=>$class->determine_home,cmd=>'install',seen=>{},notest=>undef,test_only=>undef,installdeps=>undef,force=>undef,sudo=>undef,make=>undef,verbose=>undef,quiet=>undef,interactive=>undef,log=>undef,mirrors=>[],mirror_only=>undef,mirror_index=>undef,cpanmetadb=>"http://cpanmetadb.plackperl.org/v1.0/",perl=>$^X,argv=>[],local_lib=>undef,self_contained=>undef,prompt_timeout=>0,prompt=>undef,configure_timeout=>60,build_timeout=>3600,test_timeout=>1800,try_lwp=>1,try_wget=>1,try_curl=>1,uninstall_shadows=>($] < 5.012),skip_installed=>1,skip_satisfied=>0,auto_cleanup=>7,pod2man=>1,installed_dists=>0,install_types=>['requires'],with_develop=>0,showdeps=>0,scandeps=>0,scandeps_tree=>[],format=>'tree',save_dists=>undef,skip_configure=>0,verify=>0,report_perl_version=>1,build_args=>{},features=>{},pure_perl=>0,cpanfile_path=>'cpanfile',@_,},$class}sub env {my($self,$key)=@_;$ENV{"PERL_CPANM_" .$key}}sub install_type_handlers {my$self=shift;my@handlers;for my$type (qw(recommends suggests)){push@handlers,"with-$type"=>sub {my%uniq;$self->{install_types}=[grep!$uniq{$_}++,@{$self->{install_types}},$type ]};push@handlers,"without-$type"=>sub {$self->{install_types}=[grep $_ ne $type,@{$self->{install_types}}]}}@handlers}sub build_args_handlers {my$self=shift;my@handlers;for my$phase (qw(configure build test install)){push@handlers,"$phase-args=s"=>\($self->{build_args}{$phase})}@handlers}sub parse_options {my$self=shift;local@ARGV=@{$self->{argv}};push@ARGV,grep length,split /\s+/,$self->env('OPT');push@ARGV,@_;Getopt::Long::Configure("bundling");Getopt::Long::GetOptions('f|force'=>sub {$self->{skip_installed}=0;$self->{force}=1},'n|notest!'=>\$self->{notest},'test-only'=>sub {$self->{notest}=0;$self->{skip_installed}=0;$self->{test_only}=1},'S|sudo!'=>\$self->{sudo},'v|verbose'=>\$self->{verbose},'verify!'=>\$self->{verify},'q|quiet!'=>\$self->{quiet},'h|help'=>sub {$self->{action}='show_help'},'V|version'=>sub {$self->{action}='show_version'},'perl=s'=>\$self->{perl},'l|local-lib=s'=>sub {$self->{local_lib}=$self->maybe_abs($_[1])},'L|local-lib-contained=s'=>sub {$self->{local_lib}=$self->maybe_abs($_[1]);$self->{self_contained}=1;$self->{pod2man}=undef},'self-contained!'=>\$self->{self_contained},'mirror=s@'=>$self->{mirrors},'mirror-only!'=>\$self->{mirror_only},'mirror-index=s'=>\$self->{mirror_index},'cpanmetadb=s'=>\$self->{cpanmetadb},'cascade-search!'=>\$self->{cascade_search},'prompt!'=>\$self->{prompt},'installdeps'=>\$self->{installdeps},'skip-installed!'=>\$self->{skip_installed},'skip-satisfied!'=>\$self->{skip_satisfied},'reinstall'=>sub {$self->{skip_installed}=0},'interactive!'=>\$self->{interactive},'i|install'=>sub {$self->{cmd}='install'},'info'=>sub {$self->{cmd}='info'},'look'=>sub {$self->{cmd}='look';$self->{skip_installed}=0},'U|uninstall'=>sub {$self->{cmd}='uninstall'},'self-upgrade'=>sub {$self->{action}='self_upgrade'},'uninst-shadows!'=>\$self->{uninstall_shadows},'lwp!'=>\$self->{try_lwp},'wget!'=>\$self->{try_wget},'curl!'=>\$self->{try_curl},'auto-cleanup=s'=>\$self->{auto_cleanup},'man-pages!'=>\$self->{pod2man},'scandeps'=>\$self->{scandeps},'showdeps'=>sub {$self->{showdeps}=1;$self->{skip_installed}=0},'format=s'=>\$self->{format},'save-dists=s'=>sub {$self->{save_dists}=$self->maybe_abs($_[1])},'skip-configure!'=>\$self->{skip_configure},'dev!'=>\$self->{dev_release},'metacpan!'=>\$self->{metacpan},'report-perl-version!'=>\$self->{report_perl_version},'configure-timeout=i'=>\$self->{configure_timeout},'build-timeout=i'=>\$self->{build_timeout},'test-timeout=i'=>\$self->{test_timeout},'with-develop'=>\$self->{with_develop},'without-develop'=>sub {$self->{with_develop}=0},'with-feature=s'=>sub {$self->{features}{$_[1]}=1},'without-feature=s'=>sub {$self->{features}{$_[1]}=0},'with-all-features'=>sub {$self->{features}{__all}=1},'pp|pureperl!'=>\$self->{pure_perl},"cpanfile=s"=>\$self->{cpanfile_path},$self->install_type_handlers,$self->build_args_handlers,);if (!@ARGV && $0 ne '-' &&!-t STDIN){push@ARGV,$self->load_argv_from_fh(\*STDIN);$self->{load_from_stdin}=1}$self->{argv}=\@ARGV}sub check_upgrade {my$self=shift;my$install_base=$ENV{PERL_LOCAL_LIB_ROOT}? $self->local_lib_target($ENV{PERL_LOCAL_LIB_ROOT}): $Config{installsitebin};if ($0 eq '-'){return}elsif ($0 !~ /^$install_base/){if ($0 =~ m!perlbrew/bin!){die <<DIE}else {die <<DIE}}}sub check_libs {my$self=shift;return if$self->{_checked}++;$self->bootstrap_local_lib;if (@{$self->{bootstrap_deps}|| []}){local$self->{notest}=1;local$self->{scandeps}=0;$self->install_deps(Cwd::cwd,0,@{$self->{bootstrap_deps}})}}sub setup_verify {my$self=shift;my$has_modules=eval {require Module::Signature;require Digest::SHA;1};$self->{cpansign}=$self->which('cpansign');unless ($has_modules && $self->{cpansign}){warn "WARNING: Module::Signature and Digest::SHA is required for distribution verifications.\n";$self->{verify}=0}}sub parse_module_args {my($self,$module)=@_;$module =~ s/^([A-Za-z0-9_:]+)@([v\d\._]+)$/$1~== $2/;if ($module =~ /\~[v\d\._,\!<>= ]+$/){return split /\~/,$module,2}else {return$module,undef}}sub _exit {my($self,$code)=@_;die App::cpanminus::CommandExit->new($code)}sub doit {my$self=shift;my$code;eval {$code=($self->_doit==0)};if (my$e=$@){if (ref$e eq 'App::cpanminus::CommandExit'){$code=$e->code}else {warn$e;$code=1}}return$code}sub _doit {my$self=shift;$self->setup_home;$self->init_tools;$self->setup_verify if$self->{verify};if (my$action=$self->{action}){$self->$action()and return 1}$self->show_help(1)unless @{$self->{argv}}or $self->{load_from_stdin};$self->configure_mirrors;my$cwd=Cwd::cwd;my@fail;for my$module (@{$self->{argv}}){if ($module =~ s/\.pm$//i){my ($volume,$dirs,$file)=File::Spec->splitpath($module);$module=join '::',grep {$_}File::Spec->splitdir($dirs),$file}($module,my$version)=$self->parse_module_args($module);$self->chdir($cwd);if ($self->{cmd}eq 'uninstall'){$self->uninstall_module($module)or push@fail,$module}else {$self->install_module($module,0,$version)or push@fail,$module}}if ($self->{base}&& $self->{auto_cleanup}){$self->cleanup_workdirs}if ($self->{installed_dists}){my$dists=$self->{installed_dists}> 1 ? "distributions" : "distribution";$self->diag("$self->{installed_dists} $dists installed\n",1)}if ($self->{scandeps}){$self->dump_scandeps()}$self->chdir($cwd);return!@fail}sub setup_home {my$self=shift;$self->{home}=$self->env('HOME')if$self->env('HOME');unless (_writable($self->{home})){die "Can't write to cpanm home '$self->{home}': You should fix it with chown/chmod first.\n"}$self->{base}="$self->{home}/work/" .time .".$$";File::Path::mkpath([$self->{base}],0,0777);$self->{log}=File::Spec->catfile($self->{base},"build.log");my$final_log="$self->{home}/build.log";{open my$out,">$self->{log}" or die "$self->{log}: $!"}if (CAN_SYMLINK){my$build_link="$self->{home}/latest-build";unlink$build_link;symlink$self->{base},$build_link;unlink$final_log;symlink$self->{log},$final_log}else {my$log=$self->{log};my$home=$self->{home};$self->{at_exit}=sub {my$self=shift;my$temp_log="$home/build.log." .time .".$$";File::Copy::copy($log,$temp_log)&& unlink($final_log)&& rename($temp_log,$final_log)}}$self->chat("cpanm (App::cpanminus) $VERSION on perl $] built for $Config{archname}\n" ."Work directory is $self->{base}\n")}sub package_index_for {my ($self,$mirror)=@_;return$self->source_for($mirror)."/02packages.details.txt"}sub generate_mirror_index {my ($self,$mirror)=@_;my$file=$self->package_index_for($mirror);my$gz_file=$file .'.gz';my$index_mtime=(stat$gz_file)[9];unless (-e $file && (stat$file)[9]>= $index_mtime){$self->chat("Uncompressing index file...\n");if (eval {require Compress::Zlib}){my$gz=Compress::Zlib::gzopen($gz_file,"rb")or do {$self->diag_fail("$Compress::Zlib::gzerrno opening compressed index");return};open my$fh,'>',$file or do {$self->diag_fail("$! opening uncompressed index for write");return};my$buffer;while (my$status=$gz->gzread($buffer)){if ($status < 0){$self->diag_fail($gz->gzerror ." reading compressed index");return}print$fh $buffer}}else {if (system("gunzip -c $gz_file > $file")){$self->diag_fail("Cannot uncompress -- please install gunzip or Compress::Zlib");return}}utime$index_mtime,$index_mtime,$file}return 1}sub search_mirror_index {my ($self,$mirror,$module,$version)=@_;$self->search_mirror_index_file($self->package_index_for($mirror),$module,$version)}sub search_mirror_index_file {my($self,$file,$module,$version)=@_;open my$fh,'<',$file or return;my$found;while (<$fh>){if (m!^\Q$module\E\s+([\w\.]+)\s+(\S*)!m){$found=$self->cpan_module($module,$2,$1);last}}return$found unless$self->{cascade_search};if ($found){if ($self->satisfy_version($module,$found->{module_version},$version)){return$found}else {$self->chat("Found $module $found->{module_version} which doesn't satisfy $version.\n")}}return}sub with_version_range {my($self,$version)=@_;defined($version)&& $version =~ /[<>=]/}sub encode_json {my($self,$data)=@_;require JSON::PP;my$json=JSON::PP::encode_json($data);$json =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;$json}sub version_to_query {my($self,$module,$version)=@_;require CPAN::Meta::Requirements;my$requirements=CPAN::Meta::Requirements->new;$requirements->add_string_requirement($module,$version || '0');my$req=$requirements->requirements_for_module($module);if ($req =~ s/^==\s*//){return {term=>{'module.version'=>$req },}}elsif ($req !~ /\s/){return {range=>{'module.version_numified'=>{'gte'=>$self->numify_ver($req)}},}}else {my%ops=qw(< lt <= lte > gt >= gte);my(%range,@exclusion);my@requirements=split /,\s*/,$req;for my$r (@requirements){if ($r =~ s/^([<>]=?)\s*//){$range{$ops{$1}}=$self->numify_ver($r)}elsif ($r =~ s/\!=\s*//){push@exclusion,$self->numify_ver($r)}}my@filters=({range=>{'module.version_numified'=>\%range }},);if (@exclusion){push@filters,{not=>{or=>[map {+{term=>{'module.version_numified'=>$self->numify_ver($_)}}}@exclusion ]},}}return@filters}}sub numify_ver {my($self,$ver)=@_;version->new($ver)->numify}sub maturity_filter {my($self,$module,$version)=@_;my@filters;if (!$self->with_version_range($version)or $self->{dev_release}){push@filters,{not=>{term=>{status=>'backpan' }}}}unless ($self->{dev_release}or $version =~ /==/){push@filters,{term=>{maturity=>'released' }}}return@filters}sub by_version {my%s=qw(latest 3 cpan 2 backpan 1);$b->{_score}<=> $a->{_score}|| $s{$b->{fields}{status}}<=> $s{$a->{fields}{status}}}sub by_first_come {$a->{fields}{date}cmp $b->{fields}{date}}sub by_date {$b->{fields}{date}cmp $a->{fields}{date}}sub find_best_match {my($self,$match,$version)=@_;return unless$match && @{$match->{hits}{hits}|| []};my@hits=$self->{dev_release}? sort {by_version || by_date}@{$match->{hits}{hits}}: sort {by_version || by_first_come}@{$match->{hits}{hits}};$hits[0]->{fields}}sub search_metacpan {my($self,$module,$version)=@_;require JSON::PP;$self->chat("Searching $module ($version) on metacpan ...\n");my$metacpan_uri='http://api.metacpan.org/v0';my@filter=$self->maturity_filter($module,$version);my$query={filtered=>{(@filter ? (filter=>{and=>\@filter }): ()),query=>{nested=>{score_mode=>'max',path=>'module',query=>{custom_score=>{metacpan_script=>"score_version_numified",query=>{constant_score=>{filter=>{and=>[{term=>{'module.authorized'=>JSON::PP::true()}},{term=>{'module.indexed'=>JSON::PP::true()}},{term=>{'module.name'=>$module }},$self->version_to_query($module,$version),]}}},}},}},}};my$module_uri="$metacpan_uri/file/_search?source=";$module_uri .= $self->encode_json({query=>$query,fields=>['date','release','module','status' ],});my($release,$module_version);my$module_json=$self->get($module_uri);my$module_meta=eval {JSON::PP::decode_json($module_json)};my$match=$self->find_best_match($module_meta);if ($match){$release=$match->{release};my$module_matched=(grep {$_->{name}eq $module}@{$match->{module}})[0];$module_version=$module_matched->{version}}unless ($release){$self->chat("! Could not find a release matching $module ($version) on MetaCPAN.\n");return}my$dist_uri="$metacpan_uri/release/_search?source=";$dist_uri .= $self->encode_json({filter=>{term=>{'release.name'=>$release },},fields=>['download_url','stat','status' ],});my$dist_json=$self->get($dist_uri);my$dist_meta=eval {JSON::PP::decode_json($dist_json)};if ($dist_meta){$dist_meta=$dist_meta->{hits}{hits}[0]{fields}}if ($dist_meta && $dist_meta->{download_url}){(my$distfile=$dist_meta->{download_url})=~ s!.+/authors/id/!!;local$self->{mirrors}=$self->{mirrors};if ($dist_meta->{status}eq 'backpan'){$self->{mirrors}=['http://backpan.perl.org' ]}elsif ($dist_meta->{stat}{mtime}> time()-24*60*60){$self->{mirrors}=['http://cpan.metacpan.org' ]}return$self->cpan_module($module,$distfile,$module_version)}$self->diag_fail("Finding $module on metacpan failed.");return}sub search_database {my($self,$module,$version)=@_;my$found;my$range=($self->with_version_range($version)|| $self->{dev_release});if ($range or $self->{metacpan}){$found=$self->search_metacpan($module,$version)and return$found;$found=$self->search_cpanmetadb($module,$version)and return$found}else {$found=$self->search_cpanmetadb($module,$version)and return$found;$found=$self->search_metacpan($module,$version)and return$found}}sub search_cpanmetadb {my($self,$module,$version)=@_;$self->chat("Searching $module on cpanmetadb ...\n");(my$uri=$self->{cpanmetadb})=~ s{/?$}{/package/$module};my$yaml=$self->get($uri);my$meta=$self->parse_meta_string($yaml);if ($meta && $meta->{distfile}){return$self->cpan_module($module,$meta->{distfile},$meta->{version})}$self->diag_fail("Finding $module on cpanmetadb failed.");return}sub search_module {my($self,$module,$version)=@_;if ($self->{mirror_index}){$self->mask_output(chat=>"Searching $module on mirror index $self->{mirror_index} ...\n");my$pkg=$self->search_mirror_index_file($self->{mirror_index},$module,$version);return$pkg if$pkg;unless ($self->{cascade_search}){$self->mask_output(diag_fail=>"Finding $module ($version) on mirror index $self->{mirror_index} failed.");return}}unless ($self->{mirror_only}){my$found=$self->search_database($module,$version);return$found if$found}MIRROR: for my$mirror (@{$self->{mirrors}}){$self->mask_output(chat=>"Searching $module on mirror $mirror ...\n");my$name='02packages.details.txt.gz';my$uri="$mirror/modules/$name";my$gz_file=$self->package_index_for($mirror).'.gz';unless ($self->{pkgs}{$uri}){$self->mask_output(chat=>"Downloading index file $uri ...\n");$self->mirror($uri,$gz_file);$self->generate_mirror_index($mirror)or next MIRROR;$self->{pkgs}{$uri}="!!retrieved!!"}my$pkg=$self->search_mirror_index($mirror,$module,$version);return$pkg if$pkg;$self->mask_output(diag_fail=>"Finding $module ($version) on mirror $mirror failed.")}return}sub source_for {my($self,$mirror)=@_;$mirror =~ s/[^\w\.\-]+/%/g;my$dir="$self->{home}/sources/$mirror";File::Path::mkpath([$dir ],0,0777);return$dir}sub load_argv_from_fh {my($self,$fh)=@_;my@argv;while(defined(my$line=<$fh>)){chomp$line;$line =~ s/#.+$//;$line =~ s/^\s+//;$line =~ s/\s+$//;push@argv,split ' ',$line if$line}return@argv}sub show_version {my$self=shift;print "cpanm (App::cpanminus) version $VERSION ($0)\n";print "perl version $] ($^X)\n\n";print " \%Config:\n";for my$key (qw(archname installsitelib installsitebin installman1dir installman3dir sitelibexp archlibexp privlibexp)){print " $key=$Config{$key}\n"}print " \%ENV:\n";for my$key (grep /^PERL/,sort keys%ENV){print " $key=$ENV{$key}\n"}print " \@INC:\n";for my$inc (@INC){print " $inc\n" unless ref($inc)eq 'CODE'}return 1}sub show_help {my$self=shift;if ($_[0]){print <<USAGE;$self->_exit(1)}print <<HELP;return 1}sub _writable {my$dir=shift;my@dir=File::Spec->splitdir($dir);while (@dir){$dir=File::Spec->catdir(@dir);if (-e $dir){return -w _}pop@dir}return}sub maybe_abs {my($self,$lib)=@_;if ($lib eq '_' or $lib =~ /^~/ or File::Spec->file_name_is_absolute($lib)){return$lib}else {return File::Spec->canonpath(File::Spec->catdir(Cwd::cwd(),$lib))}}sub local_lib_target {my($self,$root)=@_;(grep {$_ ne ''}split /\Q$Config{path_sep}/,$root)[-1]}sub bootstrap_local_lib {my$self=shift;if ($self->{local_lib}){return$self->setup_local_lib($self->{local_lib})}if ($ENV{PERL_LOCAL_LIB_ROOT}&& $ENV{PERL_MM_OPT}){return$self->setup_local_lib($self->local_lib_target($ENV{PERL_LOCAL_LIB_ROOT}),1)}return if$self->{sudo}or (_writable($Config{installsitelib})and _writable($Config{installsitebin}));if ($ENV{PERL_MM_OPT}and ($ENV{MODULEBUILDRC}or $ENV{PERL_MB_OPT})){$self->bootstrap_local_lib_deps;return}$self->setup_local_lib;$self->diag(<<DIAG,1);sleep 2}sub _core_only_inc {my($self,$base)=@_;require local::lib;(local::lib->resolve_path(local::lib->install_base_perl_path($base)),local::lib->resolve_path(local::lib->install_base_arch_path($base)),@Config{qw(privlibexp archlibexp)},)}sub _diff {my($self,$old,$new)=@_;my@diff;my%old=map {$_=>1}@$old;for my$n (@$new){push@diff,$n unless exists$old{$n}}@diff}sub _setup_local_lib_env {my($self,$base)=@_;$self->diag(<<WARN,1)if$base =~ /\s/;local$SIG{__WARN__}=sub {};local::lib->setup_env_hash_for($base,0)}sub setup_local_lib {my($self,$base,$no_env)=@_;$base=undef if$base eq '_';require local::lib;{local $0='cpanm';$base ||="~/perl5";$base=local::lib->resolve_path($base);if ($self->{self_contained}){my@inc=$self->_core_only_inc($base);$self->{search_inc}=[@inc ]}else {$self->{search_inc}=[local::lib->install_base_arch_path($base),local::lib->install_base_perl_path($base),@INC,]}$self->_setup_local_lib_env($base)unless$no_env;$self->{local_lib}=$base}$self->bootstrap_local_lib_deps}sub bootstrap_local_lib_deps {my$self=shift;push @{$self->{bootstrap_deps}},Dependency->new('ExtUtils::MakeMaker'=>6.31),Dependency->new('ExtUtils::Install'=>1.46)}sub prompt_bool {my($self,$mess,$def)=@_;my$val=$self->prompt($mess,$def);return lc$val eq 'y'}sub prompt {my($self,$mess,$def)=@_;my$isa_tty=-t STDIN && (-t STDOUT ||!(-f STDOUT || -c STDOUT));my$dispdef=defined$def ? "[$def] " : " ";$def=defined$def ? $def : "";if (!$self->{prompt}|| (!$isa_tty && eof STDIN)){return$def}local $|=1;local $\;my$ans;eval {local$SIG{ALRM}=sub {undef$ans;die "alarm\n"};print STDOUT "$mess $dispdef";alarm$self->{prompt_timeout}if$self->{prompt_timeout};$ans=<STDIN>;alarm 0};if (defined$ans){chomp$ans}else {print STDOUT "\n"}return (!defined$ans || $ans eq '')? $def : $ans}sub diag_ok {my($self,$msg)=@_;chomp$msg;$msg ||="OK";if ($self->{in_progress}){$self->_diag("$msg\n");$self->{in_progress}=0}$self->log("-> $msg\n")}sub diag_fail {my($self,$msg,$always)=@_;chomp$msg;if ($self->{in_progress}){$self->_diag("FAIL\n");$self->{in_progress}=0}if ($msg){$self->_diag("! $msg\n",$always,1);$self->log("-> FAIL $msg\n")}}sub diag_progress {my($self,$msg)=@_;chomp$msg;$self->{in_progress}=1;$self->_diag("$msg ... ");$self->log("$msg\n")}sub _diag {my($self,$msg,$always,$error)=@_;my$fh=$error ? *STDERR : *STDOUT;print {$fh}$msg if$always or $self->{verbose}or!$self->{quiet}}sub diag {my($self,$msg,$always)=@_;$self->_diag($msg,$always);$self->log($msg)}sub chat {my$self=shift;print STDERR @_ if$self->{verbose};$self->log(@_)}sub mask_output {my$self=shift;my$method=shift;$self->$method($self->mask_uri_passwords(@_))}sub log {my$self=shift;open my$out,">>$self->{log}";print$out @_}sub run {my($self,$cmd)=@_;if (WIN32){$cmd=$self->shell_quote(@$cmd)if ref$cmd eq 'ARRAY';unless ($self->{verbose}){$cmd .= " >> " .$self->shell_quote($self->{log})." 2>&1"}!system$cmd}else {my$pid=fork;if ($pid){waitpid$pid,0;return!$?}else {$self->run_exec($cmd)}}}sub run_exec {my($self,$cmd)=@_;if (ref$cmd eq 'ARRAY'){unless ($self->{verbose}){open my$logfh,">>",$self->{log};open STDERR,'>&',$logfh;open STDOUT,'>&',$logfh;close$logfh}exec @$cmd}else {unless ($self->{verbose}){$cmd .= " >> " .$self->shell_quote($self->{log})." 2>&1"}exec$cmd}}sub run_timeout {my($self,$cmd,$timeout)=@_;return$self->run($cmd)if WIN32 || $self->{verbose}||!$timeout;my$pid=fork;if ($pid){eval {local$SIG{ALRM}=sub {die "alarm\n"};alarm$timeout;waitpid$pid,0;alarm 0};if ($@ && $@ eq "alarm\n"){$self->diag_fail("Timed out (> ${timeout}s). Use --verbose to retry.");local$SIG{TERM}='IGNORE';kill TERM=>0;waitpid$pid,0;return}return!$?}elsif ($pid==0){$self->run_exec($cmd)}else {$self->chat("! fork failed: falling back to system()\n");$self->run($cmd)}}sub append_args {my($self,$cmd,$phase)=@_;if (my$args=$self->{build_args}{$phase}){$cmd=join ' ',$self->shell_quote(@$cmd),$args}$cmd}sub configure {my($self,$cmd,$depth)=@_;local$ENV{PERL5_CPAN_IS_RUNNING}=local$ENV{PERL5_CPANPLUS_IS_RUNNING}=$$;local$ENV{PERL5_CPANM_IS_RUNNING}=$$;my$use_default=!$self->{interactive};local$ENV{PERL_MM_USE_DEFAULT}=$use_default;local$ENV{PERL_MM_OPT}=$ENV{PERL_MM_OPT};local$ENV{PERL_MB_OPT}=$ENV{PERL_MB_OPT};unless ($self->{pod2man}){$ENV{PERL_MM_OPT}.= " INSTALLMAN1DIR=none INSTALLMAN3DIR=none";$ENV{PERL_MB_OPT}.= " --config installman1dir= --config installsiteman1dir= --config installman3dir= --config installsiteman3dir="}if ($self->{pure_perl}){$ENV{PERL_MM_OPT}.= " PUREPERL_ONLY=1";$ENV{PERL_MB_OPT}.= " --pureperl-only"}$cmd=$self->append_args($cmd,'configure')if$depth==0;local$self->{verbose}=$self->{verbose}|| $self->{interactive};$self->run_timeout($cmd,$self->{configure_timeout})}sub build {my($self,$cmd,$distname,$depth)=@_;local$ENV{PERL_MM_USE_DEFAULT}=!$self->{interactive};$cmd=$self->append_args($cmd,'build')if$depth==0;return 1 if$self->run_timeout($cmd,$self->{build_timeout});while (1){my$ans=lc$self->prompt("Building $distname failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?","s");return if$ans eq 's';return$self->build($cmd,$distname,$depth)if$ans eq 'r';$self->show_build_log if$ans eq 'e';$self->look if$ans eq 'l'}}sub test {my($self,$cmd,$distname,$depth)=@_;return 1 if$self->{notest};local$ENV{PERL_MM_USE_DEFAULT}=!$self->{interactive};local$ENV{NONINTERACTIVE_TESTING}=!$self->{interactive};$cmd=$self->append_args($cmd,'test')if$depth==0;return 1 if$self->run_timeout($cmd,$self->{test_timeout});if ($self->{force}){$self->diag_fail("Testing $distname failed but installing it anyway.");return 1}else {$self->diag_fail;while (1){my$ans=lc$self->prompt("Testing $distname failed.\nYou can s)kip, r)etry, f)orce install, e)xamine build log, or l)ook ?","s");return if$ans eq 's';return$self->test($cmd,$distname,$depth)if$ans eq 'r';return 1 if$ans eq 'f';$self->show_build_log if$ans eq 'e';$self->look if$ans eq 'l'}}}sub install {my($self,$cmd,$uninst_opts,$depth)=@_;if ($depth==0 && $self->{test_only}){return 1}if ($self->{sudo}){unshift @$cmd,"sudo"}if ($self->{uninstall_shadows}&&!$ENV{PERL_MM_OPT}){push @$cmd,@$uninst_opts}$cmd=$self->append_args($cmd,'install')if$depth==0;$self->run($cmd)}sub look {my$self=shift;my$shell=$ENV{SHELL};$shell ||=$ENV{COMSPEC}if WIN32;if ($shell){my$cwd=Cwd::cwd;$self->diag("Entering $cwd with $shell\n");system$shell}else {$self->diag_fail("You don't seem to have a SHELL :/")}}sub show_build_log {my$self=shift;my@pagers=($ENV{PAGER},(WIN32 ? (): ('less')),'more');my$pager;while (@pagers){$pager=shift@pagers;next unless$pager;$pager=$self->which($pager);next unless$pager;last}if ($pager){system("$pager < $self->{log}")}else {$self->diag_fail("You don't seem to have a PAGER :/")}}sub chdir {my$self=shift;Cwd::chdir(File::Spec->canonpath($_[0]))or die "$_[0]: $!"}sub configure_mirrors {my$self=shift;unless (@{$self->{mirrors}}){$self->{mirrors}=['http://www.cpan.org' ]}for (@{$self->{mirrors}}){s!^/!file:///!;s!/$!!}}sub self_upgrade {my$self=shift;$self->check_upgrade;$self->{argv}=['App::cpanminus' ];return}sub install_module {my($self,$module,$depth,$version)=@_;$self->check_libs;if ($self->{seen}{$module}++){$self->chat("Already tried $module. Skipping.\n");return 1}if ($self->{skip_satisfied}){my($ok,$local)=$self->check_module($module,$version || 0);if ($ok){$self->diag("You have $module ($local)\n",1);return 1}}my$dist=$self->resolve_name($module,$version);unless ($dist){my$what=$module .($version ? " ($version)" : "");$self->diag_fail("Couldn't find module or a distribution $what",1);return}if ($dist->{distvname}&& $self->{seen}{$dist->{distvname}}++){$self->chat("Already tried $dist->{distvname}. Skipping.\n");return 1}if ($self->{cmd}eq 'info'){print$self->format_dist($dist),"\n";return 1}$dist->{depth}=$depth;if ($dist->{module}){unless ($self->satisfy_version($dist->{module},$dist->{module_version},$version)){$self->diag("Found $dist->{module} $dist->{module_version} which doesn't satisfy $version.\n",1);return}my$cmp=$version ? "==" : "";my$requirement=$dist->{module_version}? "$cmp$dist->{module_version}" : 0;my($ok,$local)=$self->check_module($dist->{module},$requirement);if ($self->{skip_installed}&& $ok){$self->diag("$dist->{module} is up to date. ($local)\n",1);return 1}}if ($dist->{dist}eq 'perl'){$self->diag("skipping $dist->{pathname}\n");return 1}$self->diag("--> Working on $module\n");$dist->{dir}||=$self->fetch_module($dist);unless ($dist->{dir}){$self->diag_fail("Failed to fetch distribution $dist->{distvname}",1);return}$self->chat("Entering $dist->{dir}\n");$self->chdir($self->{base});$self->chdir($dist->{dir});if ($self->{cmd}eq 'look'){$self->look;return 1}return$self->build_stuff($module,$dist,$depth)}sub uninstall_search_path {my$self=shift;$self->{local_lib}? (local::lib->install_base_arch_path($self->{local_lib}),local::lib->install_base_perl_path($self->{local_lib})): @Config{qw(installsitearch installsitelib)}}sub uninstall_module {my ($self,$module)=@_;$self->check_libs;my@inc=$self->uninstall_search_path;my($metadata,$packlist)=$self->packlists_containing($module,\@inc);unless ($packlist){$self->diag_fail(<<DIAG,1);return}my@uninst_files=$self->uninstall_target($metadata,$packlist);$self->ask_permission($module,\@uninst_files)or return;$self->uninstall_files(@uninst_files,$packlist);$self->diag("Successfully uninstalled $module\n",1);return 1}sub packlists_containing {my($self,$module,$inc)=@_;require Module::Metadata;my$metadata=Module::Metadata->new_from_module($module,inc=>$inc)or return;my$packlist;my$wanted=sub {return unless $_ eq '.packlist' && -f $_;for my$file ($self->unpack_packlist($File::Find::name)){$packlist ||=$File::Find::name if$file eq $metadata->filename}};{require File::pushd;my$pushd=File::pushd::pushd();my@search=grep -d $_,map File::Spec->catdir($_,'auto'),@$inc;File::Find::find($wanted,@search)}return$metadata,$packlist}sub uninstall_target {my($self,$metadata,$packlist)=@_;if ($self->has_shadow_install($metadata)or $self->{local_lib}){grep$self->should_unlink($_),$self->unpack_packlist($packlist)}else {$self->unpack_packlist($packlist)}}sub has_shadow_install {my($self,$metadata)=@_;my@shadow=grep defined,map Module::Metadata->new_from_module($metadata->name,inc=>[$_]),@INC;@shadow >= 2}sub should_unlink {my($self,$file)=@_;if ($self->{local_lib}){$file =~ /^\Q$self->{local_lib}\E/}else {!(grep$file =~ /^\Q$_\E/,@Config{qw(installbin installscript installman1dir installman3dir)})}}sub ask_permission {my ($self,$module,$files)=@_;$self->diag("$module contains the following files:\n\n");for my$file (@$files){$self->diag(" $file\n")}$self->diag("\n");return 'force uninstall' if$self->{force};local$self->{prompt}=1;return$self->prompt_bool("Are you sure you want to uninstall $module?",'y')}sub unpack_packlist {my ($self,$packlist)=@_;open my$fh,'<',$packlist or die "$packlist: $!";map {chomp;$_}<$fh>}sub uninstall_files {my ($self,@files)=@_;$self->diag("\n");for my$file (@files){$self->diag("Unlink: $file\n");unlink$file or $self->diag_fail("$!: $file")}$self->diag("\n");return 1}sub format_dist {my($self,$dist)=@_;return "$dist->{cpanid}/$dist->{filename}"}sub trim {local $_=shift;tr/\n/ /d;s/^\s*|\s*$//g;$_}sub fetch_module {my($self,$dist)=@_;$self->chdir($self->{base});for my$uri (@{$dist->{uris}}){$self->mask_output(diag_progress=>"Fetching $uri");my$filename=$dist->{filename}|| $uri;my$name=File::Basename::basename($filename);my$cancelled;my$fetch=sub {my$file;eval {local$SIG{INT}=sub {$cancelled=1;die "SIGINT\n"};$self->mirror($uri,$name);$file=$name if -e $name};$self->diag("ERROR: " .trim("$@")."\n",1)if $@ && $@ ne "SIGINT\n";return$file};my($try,$file);while ($try++ < 3){$file=$fetch->();last if$cancelled or $file;$self->diag_fail("Download $uri failed. Retrying ... ")}if ($cancelled){$self->diag_fail("Download cancelled.");return}unless ($file){$self->diag_fail("Failed to download $uri");next}$self->diag_ok;$dist->{local_path}=File::Spec->rel2abs($name);my$dir=$self->unpack($file,$uri,$dist);next unless$dir;if (my$save=$self->{save_dists}){my$path=$dist->{pathname}? "$save/authors/id/$dist->{pathname}" : "$save/vendor/$file";$self->chat("Copying $name to $path\n");File::Path::mkpath([File::Basename::dirname($path)],0,0777);File::Copy::copy($file,$path)or warn $!}return$dist,$dir}}sub unpack {my($self,$file,$uri,$dist)=@_;if ($self->{verify}){$self->verify_archive($file,$uri,$dist)or return}$self->chat("Unpacking $file\n");my$dir=$file =~ /\.zip/i ? $self->unzip($file): $self->untar($file);unless ($dir){$self->diag_fail("Failed to unpack $file: no directory")}return$dir}sub verify_checksums_signature {my($self,$chk_file)=@_;require Module::Signature;$self->chat("Verifying the signature of CHECKSUMS\n");my$rv=eval {local$SIG{__WARN__}=sub {};my$v=Module::Signature::_verify($chk_file);$v==Module::Signature::SIGNATURE_OK()};if ($rv){$self->chat("Verified OK!\n")}else {$self->diag_fail("Verifying CHECKSUMS signature failed: $rv\n");return}return 1}sub verify_archive {my($self,$file,$uri,$dist)=@_;unless ($dist->{cpanid}){$self->chat("Archive '$file' does not seem to be from PAUSE. Skip verification.\n")}(my$mirror=$uri)=~ s!/authors/id.*$!!;(my$chksum_uri=$uri)=~ s!/[^/]*$!/CHECKSUMS!;my$chk_file=$self->source_for($mirror)."/$dist->{cpanid}.CHECKSUMS";$self->mask_output(diag_progress=>"Fetching $chksum_uri");$self->mirror($chksum_uri,$chk_file);unless (-e $chk_file){$self->diag_fail("Fetching $chksum_uri failed.\n");return}$self->diag_ok;$self->verify_checksums_signature($chk_file)or return;$self->verify_checksum($file,$chk_file)}sub verify_checksum {my($self,$file,$chk_file)=@_;$self->chat("Verifying the SHA1 for $file\n");open my$fh,"<$chk_file" or die "$chk_file: $!";my$data=join '',<$fh>;$data =~ s/\015?\012/\n/g;require Safe;my$chksum=Safe->new->reval($data);if (!ref$chksum or ref$chksum ne 'HASH'){$self->diag_fail("! Checksum file downloaded from $chk_file is broken.\n");return}if (my$sha=$chksum->{$file}{sha256}){my$hex=$self->sha1_for($file);if ($hex eq $sha){$self->chat("Checksum for $file: Verified!\n")}else {$self->diag_fail("Checksum mismatch for $file\n");return}}else {$self->chat("Checksum for $file not found in CHECKSUMS.\n");return}}sub sha1_for {my($self,$file)=@_;require Digest::SHA;open my$fh,"<",$file or die "$file: $!";my$dg=Digest::SHA->new(256);my($data);while (read($fh,$data,4096)){$dg->add($data)}return$dg->hexdigest}sub verify_signature {my($self,$dist)=@_;$self->diag_progress("Verifying the SIGNATURE file");my$out=`$self->{cpansign} -v --skip 2>&1`;$self->log($out);if ($out =~ /Signature verified OK/){$self->diag_ok("Verified OK");return 1}else {$self->diag_fail("SIGNATURE verificaion for $dist->{filename} failed\n");return}}sub resolve_name {my($self,$module,$version)=@_;if ($module =~ /^(ftp|https?|file):/){if ($module =~ m!authors/id/(.*)!){return$self->cpan_dist($1,$module)}else {return {uris=>[$module ]}}}if ($module =~ m!^[\./]! && -d $module){return {source=>'local',dir=>Cwd::abs_path($module),}}if (-f $module){return {source=>'local',uris=>["file://" .Cwd::abs_path($module)],}}if ($module =~ /(?:^git:|\.git(?:@.+)?$)/){return$self->git_uri($module)}if ($module =~ s!^cpan:///distfile/!!){return$self->cpan_dist($module)}if ($module =~ m!^(?:[A-Z]/[A-Z]{2}/)?([A-Z]{2}[\-A-Z0-9]*/.*)$!){return$self->cpan_dist($1)}return$self->search_module($module,$version)}sub cpan_module {my($self,$module,$dist,$version)=@_;my$dist=$self->cpan_dist($dist);$dist->{module}=$module;$dist->{module_version}=$version if$version && $version ne 'undef';return$dist}sub cpan_dist {my($self,$dist,$url)=@_;$dist =~ s!^([A-Z]{2})!substr($1,0,1)."/".substr($1,0,2)."/".$1!e;require CPAN::DistnameInfo;my$d=CPAN::DistnameInfo->new($dist);if ($url){$url=[$url ]unless ref$url eq 'ARRAY'}else {my$id=$d->cpanid;my$fn=substr($id,0,1)."/" .substr($id,0,2)."/" .$id ."/" .$d->filename;my@mirrors=@{$self->{mirrors}};my@urls=map "$_/authors/id/$fn",@mirrors;$url=\@urls,}return {$d->properties,source=>'cpan',uris=>$url,}}sub git_uri {my ($self,$uri)=@_;($uri,my$commitish)=split /(?<=\.git)@/i,$uri,2;my$dir=File::Temp::tempdir(CLEANUP=>1);$self->mask_output(diag_progress=>"Cloning $uri");$self->run(['git','clone',$uri,$dir ]);unless (-e "$dir/.git"){$self->diag_fail("Failed cloning git repository $uri",1);return}if ($commitish){require File::pushd;my$dir=File::pushd::pushd($dir);unless ($self->run(['git','checkout',$commitish ])){$self->diag_fail("Failed to checkout '$commitish' in git repository $uri\n");return}}$self->diag_ok;return {source=>'local',dir=>$dir,}}sub setup_module_build_patch {my$self=shift;open my$out,">$self->{base}/ModuleBuildSkipMan.pm" or die $!;print$out <<EOF}sub core_version_for {my($self,$module)=@_;require Module::CoreList;unless (exists$Module::CoreList::version{$]+0}){die sprintf("Module::CoreList %s (loaded from %s) doesn't seem to have entries for perl $]. " ."You're strongly recommended to upgrade Module::CoreList from CPAN.\n",$Module::CoreList::VERSION,$INC{"Module/CoreList.pm"})}unless (exists$Module::CoreList::version{$]+0}{$module}){return -1}return$Module::CoreList::version{$]+0}{$module}}sub check_module {my($self,$mod,$want_ver)=@_;require Module::Metadata;my$meta=Module::Metadata->new_from_module($mod,inc=>$self->{search_inc})or return 0,undef;my$version=$meta->version;if ($self->{self_contained}&& $self->loaded_from_perl_lib($meta)){$version=$self->core_version_for($mod);return 0,undef if$version && $version==-1}$self->{local_versions}{$mod}=$version;if ($self->is_deprecated($meta)){return 0,$version}elsif ($self->satisfy_version($mod,$version,$want_ver)){return 1,($version || 'undef')}else {return 0,$version}}sub satisfy_version {my($self,$mod,$version,$want_ver)=@_;$want_ver='0' unless defined($want_ver)&& length($want_ver);require CPAN::Meta::Requirements;my$requirements=CPAN::Meta::Requirements->new;$requirements->add_string_requirement($mod,$want_ver);$requirements->accepts_module($mod,$version)}sub unsatisfy_how {my($self,$ver,$want_ver)=@_;if ($want_ver =~ /^[v0-9\.\_]+$/){return "$ver < $want_ver"}else {return "$ver doesn't satisfy $want_ver"}}sub is_deprecated {my($self,$meta)=@_;my$deprecated=eval {require Module::CoreList;Module::CoreList::is_deprecated($meta->{module})};return$deprecated && $self->loaded_from_perl_lib($meta)}sub loaded_from_perl_lib {my($self,$meta)=@_;require Config;for my$dir (qw(archlibexp privlibexp)){my$confdir=$Config{$dir};if ($confdir eq substr($meta->filename,0,length($confdir))){return 1}}return}sub should_install {my($self,$mod,$ver)=@_;$self->chat("Checking if you have $mod $ver ... ");my($ok,$local)=$self->check_module($mod,$ver);if ($ok){$self->chat("Yes ($local)\n")}elsif ($local){$self->chat("No (" .$self->unsatisfy_how($local,$ver).")\n")}else {$self->chat("No\n")}return$mod unless$ok;return}sub check_perl_version {my($self,$version)=@_;require CPAN::Meta::Requirements;my$req=CPAN::Meta::Requirements->from_string_hash({perl=>$version });$req->accepts_module(perl=>$])}sub install_deps {my($self,$dir,$depth,@deps)=@_;my(@install,%seen,@fail);for my$dep (@deps){next if$seen{$dep->module};if ($dep->module eq 'perl'){if ($dep->is_requirement &&!$self->check_perl_version($dep->version)){$self->diag("Needs perl @{[$dep->version]}, you have $]\n");push@fail,'perl'}}elsif ($self->should_install($dep->module,$dep->version)){push@install,$dep;$seen{$dep->module}=1}}if (@install){$self->diag("==> Found dependencies: " .join(", ",map $_->module,@install)."\n")}for my$dep (@install){$self->install_module($dep->module,$depth + 1,$dep->version)}$self->chdir($self->{base});$self->chdir($dir)if$dir;if ($self->{scandeps}){return 1}my@not_ok=$self->unsatisfied_deps(@deps);if (@not_ok){return 0,\@not_ok}else {return 1}}sub unsatisfied_deps {my($self,@deps)=@_;require CPAN::Meta::Check;require CPAN::Meta::Requirements;my$reqs=CPAN::Meta::Requirements->new;for my$dep (grep $_->is_requirement,@deps){$reqs->add_string_requirement($dep->module=>$dep->version || '0')}my$ret=CPAN::Meta::Check::check_requirements($reqs,'requires',$self->{search_inc});grep defined,values %$ret}sub install_deps_bailout {my($self,$target,$dir,$depth,@deps)=@_;my($ok,$fail)=$self->install_deps($dir,$depth,@deps);if (!$ok){$self->diag_fail("Installing the dependencies failed: " .join(", ",@$fail),1);unless ($self->prompt_bool("Do you want to continue building $target anyway?","n")){$self->diag_fail("Bailing out the installation for $target.",1);return}}return 1}sub build_stuff {my($self,$stuff,$dist,$depth)=@_;if ($self->{verify}&& -e 'SIGNATURE'){$self->verify_signature($dist)or return}require CPAN::Meta;my($meta_file)=grep -f,qw(META.json META.yml);if ($meta_file){$self->chat("Checking configure dependencies from $meta_file\n");$dist->{cpanmeta}=eval {CPAN::Meta->load_file($meta_file)}}elsif ($dist->{dist}&& $dist->{version}){$self->chat("META.yml/json not found. Creating skeleton for it.\n");$dist->{cpanmeta}=CPAN::Meta->new({name=>$dist->{dist},version=>$dist->{version}})}$dist->{meta}=$dist->{cpanmeta}? $dist->{cpanmeta}->as_struct : {};my@config_deps;if ($dist->{cpanmeta}){push@config_deps,Dependency->from_prereqs($dist->{cpanmeta}->effective_prereqs,['configure'],$self->{install_types},)}else {push@config_deps,Dependency->from_versions($dist->{meta}{configure_requires}|| {},'configure',)}if (-e 'Build.PL' &&!$self->should_use_mm($dist->{dist})){push@config_deps,Dependency->from_versions({'Module::Build'=>'0.36' },'configure',)}my$target=$dist->{meta}{name}? "$dist->{meta}{name}-$dist->{meta}{version}" : $dist->{dir};$self->install_deps_bailout($target,$dist->{dir},$depth,@config_deps)or return;$self->diag_progress("Configuring $target");my$configure_state=$self->configure_this($dist,$depth);$self->diag_ok($configure_state->{configured_ok}? "OK" : "N/A");$dist->{provides}=$self->extract_packages($dist->{cpanmeta},".")if$dist->{cpanmeta}&& $dist->{source}eq 'cpan';my$root_target=(($self->{installdeps}or $self->{showdeps})and $depth==0);$dist->{want_phases}=$self->{notest}&&!$root_target ? [qw(build runtime)]: [qw(build test runtime)];push @{$dist->{want_phases}},'develop' if$self->{with_develop}&& $depth==0;my@deps=$self->find_prereqs($dist);my$module_name=$self->find_module_name($configure_state)|| $dist->{meta}{name};$module_name =~ s/-/::/g;if ($self->{showdeps}){for my$dep (@config_deps,@deps){print$dep->module,($dep->version ? ("~".$dep->version): ""),"\n"}return 1}my$distname=$dist->{meta}{name}? "$dist->{meta}{name}-$dist->{meta}{version}" : $stuff;my$walkup;if ($self->{scandeps}){$walkup=$self->scandeps_append_child($dist)}$self->install_deps_bailout($distname,$dist->{dir},$depth,@deps)or return;if ($self->{scandeps}){unless ($configure_state->{configured_ok}){my$diag=<<DIAG;if (@config_deps){my@tree=@{$self->{scandeps_tree}};$diag .= "!\n" .join("",map "! * $_->[0]{module}\n",@tree[0..$#tree-1])if@tree}$self->diag("!\n$diag!\n",1)}$walkup->();return 1}if ($self->{installdeps}&& $depth==0){if ($configure_state->{configured_ok}){$self->diag("<== Installed dependencies for $stuff. Finishing.\n");return 1}else {$self->diag("! Configuring $distname failed. See $self->{log} for details.\n",1);return}}my$installed;if ($configure_state->{use_module_build}&& -e 'Build' && -f _){$self->diag_progress("Building " .($self->{notest}? "" : "and testing ").$distname);$self->build([$self->{perl},"./Build" ],$distname,$depth)&& $self->test([$self->{perl},"./Build","test" ],$distname,$depth)&& $self->install([$self->{perl},"./Build","install" ],["--uninst",1 ],$depth)&& $installed++}elsif ($self->{make}&& -e 'Makefile'){$self->diag_progress("Building " .($self->{notest}? "" : "and testing ").$distname);$self->build([$self->{make}],$distname,$depth)&& $self->test([$self->{make},"test" ],$distname,$depth)&& $self->install([$self->{make},"install" ],["UNINST=1" ],$depth)&& $installed++}else {my$why;my$configure_failed=$configure_state->{configured}&&!$configure_state->{configured_ok};if ($configure_failed){$why="Configure failed for $distname."}elsif ($self->{make}){$why="The distribution doesn't have a proper Makefile.PL/Build.PL"}else {$why="Can't configure the distribution. You probably need to have 'make'."}$self->diag_fail("$why See $self->{log} for details.",1);return}if ($installed && $self->{test_only}){$self->diag_ok;$self->diag("Successfully tested $distname\n",1)}elsif ($installed){my$local=$self->{local_versions}{$dist->{module}|| ''};my$version=$dist->{module_version}|| $dist->{meta}{version}|| $dist->{version};my$reinstall=$local && ($local eq $version);my$action=$local &&!$reinstall ? $self->numify_ver($version)< $self->numify_ver($local)? "downgraded" : "upgraded" : undef;my$how=$reinstall ? "reinstalled $distname" : $local ? "installed $distname ($action from $local)" : "installed $distname" ;my$msg="Successfully $how";$self->diag_ok;$self->diag("$msg\n",1);$self->{installed_dists}++;$self->save_meta($stuff,$dist,$module_name,\@config_deps,\@deps);return 1}else {my$what=$self->{test_only}? "Testing" : "Installing";$self->diag_fail("$what $stuff failed. See $self->{log} for details. Retry with --force to force install it.",1);return}}sub perl_requirements {my($self,@requires)=@_;my@perl;for my$requires (grep defined,@requires){if (exists$requires->{perl}){push@perl,Dependency->new(perl=>$requires->{perl})}}return@perl}sub should_use_mm {my($self,$dist)=@_;my%should_use_mm=map {$_=>1}qw(version ExtUtils-ParseXS ExtUtils-Install ExtUtils-Manifest);$should_use_mm{$dist}}sub configure_this {my($self,$dist,$depth)=@_;if (-e $self->{cpanfile_path}&& $self->{installdeps}&& $depth==0){require Module::CPANfile;$dist->{cpanfile}=eval {Module::CPANfile->load($self->{cpanfile_path})};$self->diag_fail($@,1)if $@;return {configured=>1,configured_ok=>!!$dist->{cpanfile},use_module_build=>0,}}if ($self->{skip_configure}){my$eumm=-e 'Makefile';my$mb=-e 'Build' && -f _;return {configured=>1,configured_ok=>$eumm || $mb,use_module_build=>$mb,}}my$state={};my$try_eumm=sub {if (-e 'Makefile.PL'){$self->chat("Running Makefile.PL\n");if ($self->configure([$self->{perl},"Makefile.PL" ],$depth)){$state->{configured_ok}=-e 'Makefile'}$state->{configured}++}};my$try_mb=sub {if (-e 'Build.PL'){$self->chat("Running Build.PL\n");if ($self->configure([$self->{perl},"Build.PL" ],$depth)){$state->{configured_ok}=-e 'Build' && -f _}$state->{use_module_build}++;$state->{configured}++}};my@try;if ($dist->{dist}&& $self->should_use_mm($dist->{dist})){@try=($try_eumm,$try_mb)}else {@try=($try_mb,$try_eumm)}for my$try (@try){$try->();last if$state->{configured_ok}}unless ($state->{configured_ok}){while (1){my$ans=lc$self->prompt("Configuring $dist->{dist} failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?","s");last if$ans eq 's';return$self->configure_this($dist,$depth)if$ans eq 'r';$self->show_build_log if$ans eq 'e';$self->look if$ans eq 'l'}}return$state}sub find_module_name {my($self,$state)=@_;return unless$state->{configured_ok};if ($state->{use_module_build}&& -e "_build/build_params"){my$params=do {open my$in,"_build/build_params";$self->safe_eval(join "",<$in>)};return eval {$params->[2]{module_name}}|| undef}elsif (-e "Makefile"){open my$mf,"Makefile";while (<$mf>){if (/^\#\s+NAME\s+=>\s+(.*)/){return$self->safe_eval($1)}}}return}sub list_files {my$self=shift;if (-e 'MANIFEST'){require ExtUtils::Manifest;my$manifest=eval {ExtUtils::Manifest::manifind()}|| {};return sort {lc$a cmp lc$b}keys %$manifest}else {require File::Find;my@files;my$finder=sub {my$name=$File::Find::name;$name =~ s!\.[/\\]!!;push@files,$name};File::Find::find($finder,".");return sort {lc$a cmp lc$b}@files}}sub extract_packages {my($self,$meta,$dir)=@_;my$try=sub {my$file=shift;return 1 unless$meta->{no_index};return 0 if grep {$file =~ m!^$_/!}@{$meta->{no_index}{directory}|| []};return 0 if grep {$file eq $_}@{$meta->{no_index}{file}|| []};return 1};require App::cpanminus::ParsePM;my@files=grep {/\.pm(?:\.PL)?$/ && $try->($_)}$self->list_files;my$provides={};for my$file (@files){my$parser=App::cpanminus::ParsePM->new($meta);my$packages=$parser->parse($file);while (my($package,$meta)=each %$packages){$provides->{$package}||={file=>$meta->{infile},($meta->{version}eq 'undef')? (): (version=>$meta->{version}),}}}return$provides}sub save_meta {my($self,$module,$dist,$module_name,$config_deps,$build_deps)=@_;return unless$dist->{distvname}&& $dist->{source}eq 'cpan';my$base=($ENV{PERL_MM_OPT}|| '')=~ /INSTALL_BASE=/ ? ($self->install_base($ENV{PERL_MM_OPT})."/lib/perl5"): $Config{sitelibexp};my$provides=$dist->{provides};File::Path::mkpath("blib/meta",0,0777);my$local={name=>$module_name,target=>$module,version=>exists$provides->{$module_name}? ($provides->{$module_name}{version}|| $dist->{version}): $dist->{version},dist=>$dist->{distvname},pathname=>$dist->{pathname},provides=>$provides,};require JSON::PP;open my$fh,">","blib/meta/install.json" or die $!;print$fh JSON::PP::encode_json($local);if (-e "MYMETA.json"){File::Copy::copy("MYMETA.json","blib/meta/MYMETA.json")}my@cmd=(($self->{sudo}? 'sudo' : ()),$^X,'-MExtUtils::Install=install','-e',qq[install({ 'blib/meta' => '$base/$Config{archname}/.meta/$dist->{distvname}' })],);$self->run(\@cmd)}sub _merge_hashref {my($self,@hashrefs)=@_;my%hash;for my$h (@hashrefs){%hash=(%hash,%$h)}return \%hash}sub install_base {my($self,$mm_opt)=@_;$mm_opt =~ /INSTALL_BASE=(\S+)/ and return $1;die "Your PERL_MM_OPT doesn't contain INSTALL_BASE"}sub safe_eval {my($self,$code)=@_;eval$code}sub configure_features {my($self,$dist,@features)=@_;map $_->identifier,grep {$self->effective_feature($dist,$_)}@features}sub effective_feature {my($self,$dist,$feature)=@_;if ($dist->{depth}==0){my$value=$self->{features}{$feature->identifier};return$value if defined$value;return 1 if$self->{features}{__all}}if ($self->{interactive}){require CPAN::Meta::Requirements;$self->diag("[@{[ $feature->description ]}]\n",1);my$req=CPAN::Meta::Requirements->new;for my$phase (@{$dist->{want_phases}}){for my$type (@{$self->{install_types}}){$req->add_requirements($feature->prereqs->requirements_for($phase,$type))}}my$reqs=$req->as_string_hash;my@missing;for my$module (keys %$reqs){if ($self->should_install($module,$req->{$module})){push@missing,$module}}if (@missing){my$howmany=@missing;$self->diag("==> Found missing dependencies: " .join(", ",@missing)."\n",1);local$self->{prompt}=1;return$self->prompt_bool("Install the $howmany optional module(s)?","y")}}return}sub find_prereqs {my($self,$dist)=@_;my@deps=$self->extract_meta_prereqs($dist);if ($dist->{module}=~ /^Bundle::/i){push@deps,$self->bundle_deps($dist)}return@deps}sub extract_meta_prereqs {my($self,$dist)=@_;if ($dist->{cpanfile}){my@features=$self->configure_features($dist,$dist->{cpanfile}->features);my$prereqs=$dist->{cpanfile}->prereqs_with(@features);return Dependency->from_prereqs($prereqs,$dist->{want_phases},$self->{install_types})}my$meta=$dist->{meta};my@deps;if (-e "MYMETA.json"){require JSON::PP;$self->chat("Checking dependencies from MYMETA.json ...\n");my$json=do {open my$in,"<MYMETA.json";local $/;<$in>};my$mymeta=JSON::PP::decode_json($json);if ($mymeta){$meta->{$_}=$mymeta->{$_}for qw(name version);return$self->extract_prereqs($mymeta,$dist)}}if (-e 'MYMETA.yml'){$self->chat("Checking dependencies from MYMETA.yml ...\n");my$mymeta=$self->parse_meta('MYMETA.yml');if ($mymeta){$meta->{$_}=$mymeta->{$_}for qw(name version);return$self->extract_prereqs($mymeta,$dist)}}if (-e '_build/prereqs'){$self->chat("Checking dependencies from _build/prereqs ...\n");my$prereqs=do {open my$in,"_build/prereqs";$self->safe_eval(join "",<$in>)};@deps=$self->extract_prereqs({name=>$meta->{name},version=>$meta->{version},%$prereqs },$dist)}elsif (-e 'Makefile'){$self->chat("Finding PREREQ from Makefile ...\n");open my$mf,"Makefile";while (<$mf>){if (/^\#\s+PREREQ_PM => \{\s*(.*?)\s*\}/){my@all;my@pairs=split ', ',$1;for (@pairs){my ($pkg,$v)=split '=>',$_;push@all,[$pkg,$v ]}my$list=join ", ",map {"'$_->[0]' => $_->[1]"}@all;my$prereq=$self->safe_eval("no strict; +{ $list }");push@deps,Dependency->from_versions($prereq)if$prereq;last}}}return@deps}sub bundle_deps {my($self,$dist)=@_;my@files;File::Find::find({wanted=>sub {push@files,File::Spec->rel2abs($_)if /\.pm/i},no_chdir=>1,},'.');my@deps;for my$file (@files){open my$pod,"<",$file or next;my$in_contents;while (<$pod>){if (/^=head\d\s+CONTENTS/){$in_contents=1}elsif (/^=/){$in_contents=0}elsif ($in_contents){/^(\S+)\s*(\S+)?/ and push@deps,Dependency->new($1,$self->maybe_version($2))}}}return@deps}sub maybe_version {my($self,$string)=@_;return$string && $string =~ /^\.?\d/ ? $string : undef}sub extract_prereqs {my($self,$metadata,$dist)=@_;require CPAN::Meta;my$meta=CPAN::Meta->new($metadata,{lazy_validation=>1 });my@features=$self->configure_features($dist,$meta->features);return Dependency->from_prereqs($meta->effective_prereqs(\@features),$dist->{want_phases},$self->{install_types})}sub cleanup_workdirs {my$self=shift;my$expire=time - 24 * 60 * 60 * $self->{auto_cleanup};my@targets;opendir my$dh,"$self->{home}/work";while (my$e=readdir$dh){next if$e !~ /^(\d+)\.\d+$/;my$time=$1;if ($time < $expire){push@targets,"$self->{home}/work/$e"}}if (@targets){if (@targets >= 64){$self->diag("Expiring " .scalar(@targets)." work directories. This might take long...\n")}else {$self->chat("Expiring " .scalar(@targets)." work directories.\n")}File::Path::rmtree(\@targets,0,0)}}sub scandeps_append_child {my($self,$dist)=@_;my$new_node=[$dist,[]];my$curr_node=$self->{scandeps_current}|| [undef,$self->{scandeps_tree}];push @{$curr_node->[1]},$new_node;$self->{scandeps_current}=$new_node;return sub {$self->{scandeps_current}=$curr_node}}sub dump_scandeps {my$self=shift;if ($self->{format}eq 'tree'){$self->walk_down(sub {my($dist,$depth)=@_;if ($depth==0){print "$dist->{distvname}\n"}else {print " " x ($depth - 1);print "\\_ $dist->{distvname}\n"}},1)}elsif ($self->{format}=~ /^dists?$/){$self->walk_down(sub {my($dist,$depth)=@_;print$self->format_dist($dist),"\n"},0)}elsif ($self->{format}eq 'json'){require JSON::PP;print JSON::PP::encode_json($self->{scandeps_tree})}elsif ($self->{format}eq 'yaml'){require YAML;print YAML::Dump($self->{scandeps_tree})}else {$self->diag("Unknown format: $self->{format}\n")}}sub walk_down {my($self,$cb,$pre)=@_;$self->_do_walk_down($self->{scandeps_tree},$cb,0,$pre)}sub _do_walk_down {my($self,$children,$cb,$depth,$pre)=@_;for my$node (@$children){$cb->($node->[0],$depth)if$pre;$self->_do_walk_down($node->[1],$cb,$depth + 1,$pre);$cb->($node->[0],$depth)unless$pre}}sub DESTROY {my$self=shift;$self->{at_exit}->($self)if$self->{at_exit}}sub shell_quote {my($self,@stuff)=@_;if (WIN32){join ' ',map {/^${quote}.+${quote}$/ ? $_ : ($quote .$_ .$quote)}@stuff}else {String::ShellQuote::shell_quote_best_effort(@stuff)}}sub which {my($self,$name)=@_;return$name if File::Spec->file_name_is_absolute($name)&& -x $name;my$exe_ext=$Config{_exe};for my$dir (File::Spec->path){my$fullpath=File::Spec->catfile($dir,$name);if (-x $fullpath || -x ($fullpath .= $exe_ext)){if ($fullpath =~ /\s/){$fullpath=$self->shell_quote($fullpath)}return$fullpath}}return}sub get {my($self,$uri)=@_;if ($uri =~ /^file:/){$self->file_get($uri)}else {$self->{_backends}{get}->(@_)}}sub mirror {my($self,$uri,$local)=@_;if ($uri =~ /^file:/){$self->file_mirror($uri,$local)}else {$self->{_backends}{mirror}->(@_)}}sub untar {$_[0]->{_backends}{untar}->(@_)};sub unzip {$_[0]->{_backends}{unzip}->(@_)};sub uri_to_file {my($self,$uri)=@_;if ($uri =~ s!file:/+!!){$uri="/$uri" unless$uri =~ m![a-zA-Z]:!}return$uri}sub file_get {my($self,$uri)=@_;my$file=$self->uri_to_file($uri);open my$fh,"<$file" or return;join '',<$fh>}sub file_mirror {my($self,$uri,$path)=@_;my$file=$self->uri_to_file($uri);File::Copy::copy($file,$path)}sub has_working_lwp {my($self,$mirrors)=@_;my$https=grep /^https:/,@$mirrors;eval {require LWP::UserAgent;LWP::UserAgent->VERSION(5.802);require LWP::Protocol::https if$https;1}}sub init_tools {my$self=shift;return if$self->{initialized}++;if ($self->{make}=$self->which($Config{make})){$self->chat("You have make $self->{make}\n")}if ($self->{try_lwp}&& $self->has_working_lwp($self->{mirrors})){$self->chat("You have LWP $LWP::VERSION\n");my$ua=sub {LWP::UserAgent->new(parse_head=>0,env_proxy=>1,agent=>$self->agent,timeout=>30,@_,)};$self->{_backends}{get}=sub {my$self=shift;my$res=$ua->()->request(HTTP::Request->new(GET=>$_[0]));return unless$res->is_success;return$res->decoded_content};$self->{_backends}{mirror}=sub {my$self=shift;my$res=$ua->()->mirror(@_);die$res->content if$res->code==501;$res->code}}elsif ($self->{try_wget}and my$wget=$self->which('wget')){$self->chat("You have $wget\n");my@common=('--user-agent',$self->agent,'--retry-connrefused',($self->{verbose}? (): ('-q')),);$self->{_backends}{get}=sub {my($self,$uri)=@_;$self->safeexec(my$fh,$wget,$uri,@common,'-O','-')or die "wget $uri: $!";local $/;<$fh>};$self->{_backends}{mirror}=sub {my($self,$uri,$path)=@_;$self->safeexec(my$fh,$wget,$uri,@common,'-O',$path)or die "wget $uri: $!";local $/;<$fh>}}elsif ($self->{try_curl}and my$curl=$self->which('curl')){$self->chat("You have $curl\n");my@common=('--location','--user-agent',$self->agent,($self->{verbose}? (): '-s'),);$self->{_backends}{get}=sub {my($self,$uri)=@_;$self->safeexec(my$fh,$curl,@common,$uri)or die "curl $uri: $!";local $/;<$fh>};$self->{_backends}{mirror}=sub {my($self,$uri,$path)=@_;$self->safeexec(my$fh,$curl,@common,$uri,'-#','-o',$path)or die "curl $uri: $!";local $/;<$fh>}}else {require HTTP::Tiny;$self->chat("Falling back to HTTP::Tiny $HTTP::Tiny::VERSION\n");my%common=(agent=>$self->agent,);$self->{_backends}{get}=sub {my$self=shift;my$res=HTTP::Tiny->new(%common)->get($_[0]);return unless$res->{success};return$res->{content}};$self->{_backends}{mirror}=sub {my$self=shift;my$res=HTTP::Tiny->new(%common)->mirror(@_);return$res->{status}}}my$tar=$self->which('tar');my$tar_ver;my$maybe_bad_tar=sub {WIN32 || SUNOS || (($tar_ver=`$tar --version 2>/dev/null`)=~ /GNU.*1\.13/i)};if ($tar &&!$maybe_bad_tar->()){chomp$tar_ver;$self->chat("You have $tar: $tar_ver\n");$self->{_backends}{untar}=sub {my($self,$tarfile)=@_;my$xf=($self->{verbose}? 'v' : '')."xf";my$ar=$tarfile =~ /bz2$/ ? 'j' : 'z';my($root,@others)=`$tar ${ar}tf $tarfile` or return undef;FILE: {chomp$root;$root =~ s!^\./!!;$root =~ s{^(.+?)/.*$}{$1};if (!length($root)){$root=shift(@others);redo FILE if$root}}system "$tar $ar$xf $tarfile";return$root if -d $root;$self->diag_fail("Bad archive: $tarfile");return undef}}elsif ($tar and my$gzip=$self->which('gzip')and my$bzip2=$self->which('bzip2')){$self->chat("You have $tar, $gzip and $bzip2\n");$self->{_backends}{untar}=sub {my($self,$tarfile)=@_;my$x="x" .($self->{verbose}? 'v' : '')."f -";my$ar=$tarfile =~ /bz2$/ ? $bzip2 : $gzip;my($root,@others)=`$ar -dc $tarfile | $tar tf -` or return undef;FILE: {chomp$root;$root =~ s!^\./!!;$root =~ s{^(.+?)/.*$}{$1};if (!length($root)){$root=shift(@others);redo FILE if$root}}system "$ar -dc $tarfile | $tar $x";return$root if -d $root;$self->diag_fail("Bad archive: $tarfile");return undef}}elsif (eval {require Archive::Tar}){$self->chat("Falling back to Archive::Tar $Archive::Tar::VERSION\n");$self->{_backends}{untar}=sub {my$self=shift;my$t=Archive::Tar->new($_[0]);my($root,@others)=$t->list_files;FILE: {$root =~ s!^\./!!;$root =~ s{^(.+?)/.*$}{$1};if (!length($root)){$root=shift(@others);redo FILE if$root}}$t->extract;return -d $root ? $root : undef}}else {$self->{_backends}{untar}=sub {die "Failed to extract $_[1] - You need to have tar or Archive::Tar installed.\n"}}if (my$unzip=$self->which('unzip')){$self->chat("You have $unzip\n");$self->{_backends}{unzip}=sub {my($self,$zipfile)=@_;my$opt=$self->{verbose}? '' : '-q';my(undef,$root,@others)=`$unzip -t $zipfile` or return undef;chomp$root;$root =~ s{^\s+testing:\s+([^/]+)/.*?\s+OK$}{$1};system "$unzip $opt $zipfile";return$root if -d $root;$self->diag_fail("Bad archive: [$root] $zipfile");return undef}}else {$self->{_backends}{unzip}=sub {eval {require Archive::Zip}or die "Failed to extract $_[1] - You need to have unzip or Archive::Zip installed.\n";my($self,$file)=@_;my$zip=Archive::Zip->new();my$status;$status=$zip->read($file);$self->diag_fail("Read of file[$file] failed")if$status!=Archive::Zip::AZ_OK();my@members=$zip->members();for my$member (@members){my$af=$member->fileName();next if ($af =~ m!^(/|\.\./)!);$status=$member->extractToFileNamed($af);$self->diag_fail("Extracting of file[$af] from zipfile[$file failed")if$status!=Archive::Zip::AZ_OK()}my ($root)=$zip->membersMatching(qr<^[^/]+/$>);$root &&=$root->fileName;return -d $root ? $root : undef}}}sub safeexec {my$self=shift;my$rdr=$_[0]||=Symbol::gensym();if (WIN32){my$cmd=$self->shell_quote(@_[1..$#_]);return open($rdr,"$cmd |")}if (my$pid=open($rdr,'-|')){return$pid}elsif (defined$pid){exec(@_[1 .. $#_ ]);exit 1}else {return}}sub mask_uri_passwords {my($self,@strings)=@_;s{ (https?://) ([^:/]+) : [^@/]+ @ }{$1$2:*password*@}gx for@strings;return@strings}sub parse_meta {my($self,$file)=@_;return eval {Parse::CPAN::Meta->load_file($file)}}sub parse_meta_string {my($self,$yaml)=@_;return eval {Parse::CPAN::Meta->load_yaml_string($yaml)}}package App::cpanminus::CommandExit;sub new {bless {code=>$_[1]},$_[0]}sub code {$_[0]->{code}}1;
+$fatpacked{"App/cpanminus/script.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS_SCRIPT';
+ package App::cpanminus::script;use strict;use Config;use Cwd ();use App::cpanminus;use App::cpanminus::Dependency;use File::Basename ();use File::Find ();use File::Path ();use File::Spec ();use File::Copy ();use File::Temp ();use Getopt::Long ();use Symbol ();use String::ShellQuote ();use version ();use constant WIN32=>$^O eq 'MSWin32';use constant BAD_TAR=>($^O eq 'solaris' || $^O eq 'hpux');use constant CAN_SYMLINK=>eval {symlink("","");1};our$VERSION=$App::cpanminus::VERSION;if ($INC{"App/FatPacker/Trace.pm"}){require version::vpp}my$quote=WIN32 ? q/"/ : q/'/;sub agent {my$self=shift;my$agent="cpanminus/$VERSION";$agent .= " perl/$]" if$self->{report_perl_version};$agent}sub determine_home {my$class=shift;my$homedir=$ENV{HOME}|| eval {require File::HomeDir;File::HomeDir->my_home}|| join('',@ENV{qw(HOMEDRIVE HOMEPATH)});if (WIN32){require Win32;$homedir=Win32::GetShortPathName($homedir)}return "$homedir/.cpanm"}sub new {my$class=shift;bless {home=>$class->determine_home,cmd=>'install',seen=>{},notest=>undef,test_only=>undef,installdeps=>undef,force=>undef,sudo=>undef,make=>undef,verbose=>undef,quiet=>undef,interactive=>undef,log=>undef,mirrors=>[],mirror_only=>undef,mirror_index=>undef,cpanmetadb=>"http://cpanmetadb.plackperl.org/v1.0/",perl=>$^X,argv=>[],local_lib=>undef,self_contained=>undef,exclude_vendor=>undef,prompt_timeout=>0,prompt=>undef,configure_timeout=>60,build_timeout=>3600,test_timeout=>1800,try_lwp=>1,try_wget=>1,try_curl=>1,uninstall_shadows=>($] < 5.012),skip_installed=>1,skip_satisfied=>0,auto_cleanup=>7,pod2man=>1,installed_dists=>0,install_types=>['requires'],with_develop=>0,showdeps=>0,scandeps=>0,scandeps_tree=>[],format=>'tree',save_dists=>undef,skip_configure=>0,verify=>0,report_perl_version=>!$class->maybe_ci,build_args=>{},features=>{},pure_perl=>0,cpanfile_path=>'cpanfile',@_,},$class}sub env {my($self,$key)=@_;$ENV{"PERL_CPANM_" .$key}}sub maybe_ci {my$class=shift;grep$ENV{$_},qw(TRAVIS CI AUTOMATED_TESTING AUTHOR_TESTING)}sub install_type_handlers {my$self=shift;my@handlers;for my$type (qw(recommends suggests)){push@handlers,"with-$type"=>sub {my%uniq;$self->{install_types}=[grep!$uniq{$_}++,@{$self->{install_types}},$type ]};push@handlers,"without-$type"=>sub {$self->{install_types}=[grep $_ ne $type,@{$self->{install_types}}]}}@handlers}sub build_args_handlers {my$self=shift;my@handlers;for my$phase (qw(configure build test install)){push@handlers,"$phase-args=s"=>\($self->{build_args}{$phase})}@handlers}sub parse_options {my$self=shift;local@ARGV=@{$self->{argv}};push@ARGV,grep length,split /\s+/,$self->env('OPT');push@ARGV,@_;Getopt::Long::Configure("bundling");Getopt::Long::GetOptions('f|force'=>sub {$self->{skip_installed}=0;$self->{force}=1},'n|notest!'=>\$self->{notest},'test-only'=>sub {$self->{notest}=0;$self->{skip_installed}=0;$self->{test_only}=1},'S|sudo!'=>\$self->{sudo},'v|verbose'=>\$self->{verbose},'verify!'=>\$self->{verify},'q|quiet!'=>\$self->{quiet},'h|help'=>sub {$self->{action}='show_help'},'V|version'=>sub {$self->{action}='show_version'},'perl=s'=>sub {$self->diag("--perl is deprecated since it's known to be fragile in figuring out dependencies. Run `$_[1] -S cpanm` instead.\n",1);$self->{perl}=$_[1]},'l|local-lib=s'=>sub {$self->{local_lib}=$self->maybe_abs($_[1])},'L|local-lib-contained=s'=>sub {$self->{local_lib}=$self->maybe_abs($_[1]);$self->{self_contained}=1;$self->{pod2man}=undef},'self-contained!'=>\$self->{self_contained},'exclude-vendor!'=>\$self->{exclude_vendor},'mirror=s@'=>$self->{mirrors},'mirror-only!'=>\$self->{mirror_only},'mirror-index=s'=>sub {$self->{mirror_index}=$self->maybe_abs($_[1])},'M|from=s'=>sub {$self->{mirrors}=[$_[1]];$self->{mirror_only}=1},'cpanmetadb=s'=>\$self->{cpanmetadb},'cascade-search!'=>\$self->{cascade_search},'prompt!'=>\$self->{prompt},'installdeps'=>\$self->{installdeps},'skip-installed!'=>\$self->{skip_installed},'skip-satisfied!'=>\$self->{skip_satisfied},'reinstall'=>sub {$self->{skip_installed}=0},'interactive!'=>\$self->{interactive},'i|install'=>sub {$self->{cmd}='install'},'info'=>sub {$self->{cmd}='info'},'look'=>sub {$self->{cmd}='look';$self->{skip_installed}=0},'U|uninstall'=>sub {$self->{cmd}='uninstall'},'self-upgrade'=>sub {$self->{action}='self_upgrade'},'uninst-shadows!'=>\$self->{uninstall_shadows},'lwp!'=>\$self->{try_lwp},'wget!'=>\$self->{try_wget},'curl!'=>\$self->{try_curl},'auto-cleanup=s'=>\$self->{auto_cleanup},'man-pages!'=>\$self->{pod2man},'scandeps'=>\$self->{scandeps},'showdeps'=>sub {$self->{showdeps}=1;$self->{skip_installed}=0},'format=s'=>\$self->{format},'save-dists=s'=>sub {$self->{save_dists}=$self->maybe_abs($_[1])},'skip-configure!'=>\$self->{skip_configure},'dev!'=>\$self->{dev_release},'metacpan!'=>\$self->{metacpan},'report-perl-version!'=>\$self->{report_perl_version},'configure-timeout=i'=>\$self->{configure_timeout},'build-timeout=i'=>\$self->{build_timeout},'test-timeout=i'=>\$self->{test_timeout},'with-develop'=>\$self->{with_develop},'without-develop'=>sub {$self->{with_develop}=0},'with-feature=s'=>sub {$self->{features}{$_[1]}=1},'without-feature=s'=>sub {$self->{features}{$_[1]}=0},'with-all-features'=>sub {$self->{features}{__all}=1},'pp|pureperl!'=>\$self->{pure_perl},"cpanfile=s"=>\$self->{cpanfile_path},$self->install_type_handlers,$self->build_args_handlers,);if (!@ARGV && $0 ne '-' &&!-t STDIN){push@ARGV,$self->load_argv_from_fh(\*STDIN);$self->{load_from_stdin}=1}$self->{argv}=\@ARGV}sub check_upgrade {my$self=shift;my$install_base=$ENV{PERL_LOCAL_LIB_ROOT}? $self->local_lib_target($ENV{PERL_LOCAL_LIB_ROOT}): $Config{installsitebin};if ($0 eq '-'){return}elsif ($0 !~ /^$install_base/){if ($0 =~ m!perlbrew/bin!){die <<DIE}else {die <<DIE}}}sub check_libs {my$self=shift;return if$self->{_checked}++;$self->bootstrap_local_lib}sub setup_verify {my$self=shift;my$has_modules=eval {require Module::Signature;require Digest::SHA;1};$self->{cpansign}=$self->which('cpansign');unless ($has_modules && $self->{cpansign}){warn "WARNING: Module::Signature and Digest::SHA is required for distribution verifications.\n";$self->{verify}=0}}sub parse_module_args {my($self,$module)=@_;$module =~ s/^([A-Za-z0-9_:]+)@([v\d\._]+)$/$1~== $2/;if ($module =~ /\~[v\d\._,\!<>= ]+$/){return split /\~/,$module,2}else {return$module,undef}}sub doit {my$self=shift;my$code;eval {$code=($self->_doit==0)};if (my$e=$@){warn$e;$code=1}return$code}sub _doit {my$self=shift;$self->setup_home;$self->init_tools;$self->setup_verify if$self->{verify};if (my$action=$self->{action}){$self->$action()and return 1}return$self->show_help(1)unless @{$self->{argv}}or $self->{load_from_stdin};$self->configure_mirrors;my$cwd=Cwd::cwd;my@fail;for my$module (@{$self->{argv}}){if ($module =~ s/\.pm$//i){my ($volume,$dirs,$file)=File::Spec->splitpath($module);$module=join '::',grep {$_}File::Spec->splitdir($dirs),$file}($module,my$version)=$self->parse_module_args($module);$self->chdir($cwd);if ($self->{cmd}eq 'uninstall'){$self->uninstall_module($module)or push@fail,$module}else {$self->install_module($module,0,$version)or push@fail,$module}}if ($self->{base}&& $self->{auto_cleanup}){$self->cleanup_workdirs}if ($self->{installed_dists}){my$dists=$self->{installed_dists}> 1 ? "distributions" : "distribution";$self->diag("$self->{installed_dists} $dists installed\n",1)}if ($self->{scandeps}){$self->dump_scandeps()}$self->chdir($cwd);return!@fail}sub setup_home {my$self=shift;$self->{home}=$self->env('HOME')if$self->env('HOME');unless (_writable($self->{home})){die "Can't write to cpanm home '$self->{home}': You should fix it with chown/chmod first.\n"}$self->{base}="$self->{home}/work/" .time .".$$";File::Path::mkpath([$self->{base}],0,0777);$self->{log}=File::Spec->catfile($self->{base},"build.log");my$final_log="$self->{home}/build.log";{open my$out,">$self->{log}" or die "$self->{log}: $!"}if (CAN_SYMLINK){my$build_link="$self->{home}/latest-build";unlink$build_link;symlink$self->{base},$build_link;unlink$final_log;symlink$self->{log},$final_log}else {my$log=$self->{log};my$home=$self->{home};$self->{at_exit}=sub {my$self=shift;my$temp_log="$home/build.log." .time .".$$";File::Copy::copy($log,$temp_log)&& unlink($final_log);rename($temp_log,$final_log)}}$self->chat("cpanm (App::cpanminus) $VERSION on perl $] built for $Config{archname}\n" ."Work directory is $self->{base}\n")}sub package_index_for {my ($self,$mirror)=@_;return$self->source_for($mirror)."/02packages.details.txt"}sub generate_mirror_index {my ($self,$mirror)=@_;my$file=$self->package_index_for($mirror);my$gz_file=$file .'.gz';my$index_mtime=(stat$gz_file)[9];unless (-e $file && (stat$file)[9]>= $index_mtime){$self->chat("Uncompressing index file...\n");if (eval {require Compress::Zlib}){my$gz=Compress::Zlib::gzopen($gz_file,"rb")or do {$self->diag_fail("$Compress::Zlib::gzerrno opening compressed index");return};open my$fh,'>',$file or do {$self->diag_fail("$! opening uncompressed index for write");return};my$buffer;while (my$status=$gz->gzread($buffer)){if ($status < 0){$self->diag_fail($gz->gzerror ." reading compressed index");return}print$fh $buffer}}else {if (system("gunzip -c $gz_file > $file")){$self->diag_fail("Cannot uncompress -- please install gunzip or Compress::Zlib");return}}utime$index_mtime,$index_mtime,$file}return 1}sub search_mirror_index {my ($self,$mirror,$module,$version)=@_;$self->search_mirror_index_file($self->package_index_for($mirror),$module,$version)}sub search_mirror_index_file {my($self,$file,$module,$version)=@_;open my$fh,'<',$file or return;my$found;while (<$fh>){if (m!^\Q$module\E\s+([\w\.]+)\s+(\S*)!m){$found=$self->cpan_module($module,$2,$1);last}}return$found unless$self->{cascade_search};if ($found){if ($self->satisfy_version($module,$found->{module_version},$version)){return$found}else {$self->chat("Found $module $found->{module_version} which doesn't satisfy $version.\n")}}return}sub with_version_range {my($self,$version)=@_;defined($version)&& $version =~ /(?:<|!=|==)/}sub encode_json {my($self,$data)=@_;require JSON::PP;my$json=JSON::PP::encode_json($data);$json =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;$json}sub version_to_query {my($self,$module,$version)=@_;require CPAN::Meta::Requirements;my$requirements=CPAN::Meta::Requirements->new;$requirements->add_string_requirement($module,$version || '0');my$req=$requirements->requirements_for_module($module);if ($req =~ s/^==\s*//){return {term=>{'module.version'=>$req },}}elsif ($req !~ /\s/){return {range=>{'module.version_numified'=>{'gte'=>$self->numify_ver_metacpan($req)}},}}else {my%ops=qw(< lt <= lte > gt >= gte);my(%range,@exclusion);my@requirements=split /,\s*/,$req;for my$r (@requirements){if ($r =~ s/^([<>]=?)\s*//){$range{$ops{$1}}=$self->numify_ver_metacpan($r)}elsif ($r =~ s/\!=\s*//){push@exclusion,$self->numify_ver_metacpan($r)}}my@filters=({range=>{'module.version_numified'=>\%range }},);if (@exclusion){push@filters,{not=>{or=>[map {+{term=>{'module.version_numified'=>$self->numify_ver_metacpan($_)}}}@exclusion ]},}}return@filters}}sub numify_ver_metacpan {my($self,$ver)=@_;$ver =~ s/_//g;version->new($ver)->numify}sub numify_ver {my($self,$ver)=@_;eval version->new($ver)->numify}sub maturity_filter {my($self,$module,$version)=@_;if ($version =~ /==/){return}elsif ($self->{dev_release}){return +{not=>{term=>{status=>'backpan' }}}}else {return ({not=>{term=>{status=>'backpan' }}},{term=>{maturity=>'released' }},)}}sub by_version {my%s=qw(latest 3 cpan 2 backpan 1);$b->{_score}<=> $a->{_score}|| $s{$b->{fields}{status}}<=> $s{$a->{fields}{status}}}sub by_first_come {$a->{fields}{date}cmp $b->{fields}{date}}sub by_date {$b->{fields}{date}cmp $a->{fields}{date}}sub find_best_match {my($self,$match,$version)=@_;return unless$match && @{$match->{hits}{hits}|| []};my@hits=$self->{dev_release}? sort {by_version || by_date}@{$match->{hits}{hits}}: sort {by_version || by_first_come}@{$match->{hits}{hits}};$hits[0]->{fields}}sub search_metacpan {my($self,$module,$version)=@_;require JSON::PP;$self->chat("Searching $module ($version) on metacpan ...\n");my$metacpan_uri='http://api.metacpan.org/v0';my@filter=$self->maturity_filter($module,$version);my$query={filtered=>{(@filter ? (filter=>{and=>\@filter }): ()),query=>{nested=>{score_mode=>'max',path=>'module',query=>{custom_score=>{metacpan_script=>"score_version_numified",query=>{constant_score=>{filter=>{and=>[{term=>{'module.authorized'=>JSON::PP::true()}},{term=>{'module.indexed'=>JSON::PP::true()}},{term=>{'module.name'=>$module }},$self->version_to_query($module,$version),]}}},}},}},}};my$module_uri="$metacpan_uri/file/_search?source=";$module_uri .= $self->encode_json({query=>$query,fields=>['date','release','author','module','status' ],});my($release,$author,$module_version);my$module_json=$self->get($module_uri);my$module_meta=eval {JSON::PP::decode_json($module_json)};my$match=$self->find_best_match($module_meta);if ($match){$release=$match->{release};$author=$match->{author};my$module_matched=(grep {$_->{name}eq $module}@{$match->{module}})[0];$module_version=$module_matched->{version}}unless ($release){$self->chat("! Could not find a release matching $module ($version) on MetaCPAN.\n");return}my$dist_uri="$metacpan_uri/release/_search?source=";$dist_uri .= $self->encode_json({filter=>{and=>[{term=>{'release.name'=>$release }},{term=>{'release.author'=>$author }},]},fields=>['download_url','stat','status' ],});my$dist_json=$self->get($dist_uri);my$dist_meta=eval {JSON::PP::decode_json($dist_json)};if ($dist_meta){$dist_meta=$dist_meta->{hits}{hits}[0]{fields}}if ($dist_meta && $dist_meta->{download_url}){(my$distfile=$dist_meta->{download_url})=~ s!.+/authors/id/!!;local$self->{mirrors}=$self->{mirrors};if ($dist_meta->{status}eq 'backpan'){$self->{mirrors}=['http://backpan.perl.org' ]}elsif ($dist_meta->{stat}{mtime}> time()-24*60*60){$self->{mirrors}=['http://cpan.metacpan.org' ]}return$self->cpan_module($module,$distfile,$module_version)}$self->diag_fail("Finding $module on metacpan failed.");return}sub search_database {my($self,$module,$version)=@_;my$found;if ($self->{dev_release}or $self->{metacpan}){$found=$self->search_metacpan($module,$version)and return$found;$found=$self->search_cpanmetadb($module,$version)and return$found}else {$found=$self->search_cpanmetadb($module,$version)and return$found;$found=$self->search_metacpan($module,$version)and return$found}}sub search_cpanmetadb {my($self,$module,$version)=@_;$self->chat("Searching $module ($version) on cpanmetadb ...\n");if ($self->with_version_range($version)){return$self->search_cpanmetadb_history($module,$version)}else {return$self->search_cpanmetadb_package($module,$version)}}sub search_cpanmetadb_package {my($self,$module,$version)=@_;require CPAN::Meta::YAML;(my$uri=$self->{cpanmetadb})=~ s{/?$}{/package/$module};my$yaml=$self->get($uri);my$meta=eval {CPAN::Meta::YAML::Load($yaml)};if ($meta && $meta->{distfile}){return$self->cpan_module($module,$meta->{distfile},$meta->{version})}$self->diag_fail("Finding $module on cpanmetadb failed.");return}sub search_cpanmetadb_history {my($self,$module,$version)=@_;(my$uri=$self->{cpanmetadb})=~ s{/?$}{/history/$module};my$content=$self->get($uri)or return;my@found;for my$line (split /\r?\n/,$content){if ($line =~ /^$module\s+(\S+)\s+(\S+)$/){push@found,{version=>$1,version_obj=>version::->parse($1),distfile=>$2,}}}return unless@found;$found[-1]->{latest}=1;my$match;for my$try (sort {$b->{version_obj}cmp $a->{version_obj}}@found){if ($self->satisfy_version($module,$try->{version_obj},$version)){local$self->{mirrors}=$self->{mirrors};unshift @{$self->{mirrors}},'http://backpan.perl.org' unless$try->{latest};return$self->cpan_module($module,$try->{distfile},$try->{version})}}$self->diag_fail("Finding $module ($version) on cpanmetadb failed.");return}sub search_module {my($self,$module,$version)=@_;if ($self->{mirror_index}){$self->mask_output(chat=>"Searching $module on mirror index $self->{mirror_index} ...\n");my$pkg=$self->search_mirror_index_file($self->{mirror_index},$module,$version);return$pkg if$pkg;unless ($self->{cascade_search}){$self->mask_output(diag_fail=>"Finding $module ($version) on mirror index $self->{mirror_index} failed.");return}}unless ($self->{mirror_only}){my$found=$self->search_database($module,$version);return$found if$found}MIRROR: for my$mirror (@{$self->{mirrors}}){$self->mask_output(chat=>"Searching $module on mirror $mirror ...\n");my$name='02packages.details.txt.gz';my$uri="$mirror/modules/$name";my$gz_file=$self->package_index_for($mirror).'.gz';unless ($self->{pkgs}{$uri}){$self->mask_output(chat=>"Downloading index file $uri ...\n");$self->mirror($uri,$gz_file);$self->generate_mirror_index($mirror)or next MIRROR;$self->{pkgs}{$uri}="!!retrieved!!"}my$pkg=$self->search_mirror_index($mirror,$module,$version);return$pkg if$pkg;$self->mask_output(diag_fail=>"Finding $module ($version) on mirror $mirror failed.")}return}sub source_for {my($self,$mirror)=@_;$mirror =~ s/[^\w\.\-]+/%/g;my$dir="$self->{home}/sources/$mirror";File::Path::mkpath([$dir ],0,0777);return$dir}sub load_argv_from_fh {my($self,$fh)=@_;my@argv;while(defined(my$line=<$fh>)){chomp$line;$line =~ s/#.+$//;$line =~ s/^\s+//;$line =~ s/\s+$//;push@argv,split ' ',$line if$line}return@argv}sub show_version {my$self=shift;print "cpanm (App::cpanminus) version $VERSION ($0)\n";print "perl version $] ($^X)\n\n";print " \%Config:\n";for my$key (qw(archname installsitelib installsitebin installman1dir installman3dir sitearchexp sitelibexp vendorarch vendorlibexp archlibexp privlibexp)){print " $key=$Config{$key}\n" if$Config{$key}}print " \%ENV:\n";for my$key (grep /^PERL/,sort keys%ENV){print " $key=$ENV{$key}\n"}print " \@INC:\n";for my$inc (@INC){print " $inc\n" unless ref($inc)eq 'CODE'}return 1}sub show_help {my$self=shift;if ($_[0]){print <<USAGE;return}print <<HELP;return 1}sub _writable {my$dir=shift;my@dir=File::Spec->splitdir($dir);while (@dir){$dir=File::Spec->catdir(@dir);if (-e $dir){return -w _}pop@dir}return}sub maybe_abs {my($self,$lib)=@_;if ($lib eq '_' or $lib =~ /^~/ or File::Spec->file_name_is_absolute($lib)){return$lib}else {return File::Spec->canonpath(File::Spec->catdir(Cwd::cwd(),$lib))}}sub local_lib_target {my($self,$root)=@_;(grep {$_ ne ''}split /\Q$Config{path_sep}/,$root)[0]}sub bootstrap_local_lib {my$self=shift;if ($self->{local_lib}){return$self->setup_local_lib($self->{local_lib})}if ($ENV{PERL_LOCAL_LIB_ROOT}&& $ENV{PERL_MM_OPT}){return$self->setup_local_lib($self->local_lib_target($ENV{PERL_LOCAL_LIB_ROOT}),1)}return if$self->{sudo}or (_writable($Config{installsitelib})and _writable($Config{installsitebin}));if ($ENV{PERL_MM_OPT}and ($ENV{MODULEBUILDRC}or $ENV{PERL_MB_OPT})){return}$self->setup_local_lib;$self->diag(<<DIAG,1);sleep 2}sub upgrade_toolchain {my($self,$config_deps)=@_;my%deps=map {$_->module=>$_}@$config_deps;my$reqs=CPAN::Meta::Requirements->from_string_hash({'Module::Build'=>'0.38','ExtUtils::MakeMaker'=>'6.58','ExtUtils::Install'=>'1.46',});if ($deps{"ExtUtils::MakeMaker"}){$deps{"ExtUtils::MakeMaker"}->merge_with($reqs)}elsif ($deps{"Module::Build"}){$deps{"Module::Build"}->merge_with($reqs);$deps{"ExtUtils::Install"}||= App::cpanminus::Dependency->new("ExtUtils::Install",0,'configure');$deps{"ExtUtils::Install"}->merge_with($reqs)}@$config_deps=values%deps}sub _core_only_inc {my($self,$base)=@_;require local::lib;(local::lib->resolve_path(local::lib->install_base_arch_path($base)),local::lib->resolve_path(local::lib->install_base_perl_path($base)),(!$self->{exclude_vendor}? grep {$_}@Config{qw(vendorarch vendorlibexp)}: ()),@Config{qw(archlibexp privlibexp)},)}sub _diff {my($self,$old,$new)=@_;my@diff;my%old=map {$_=>1}@$old;for my$n (@$new){push@diff,$n unless exists$old{$n}}@diff}sub _setup_local_lib_env {my($self,$base)=@_;$self->diag(<<WARN,1)if$base =~ /\s/;local$SIG{__WARN__}=sub {};local::lib->setup_env_hash_for($base,0)}sub setup_local_lib {my($self,$base,$no_env)=@_;$base=undef if$base eq '_';require local::lib;{local $0='cpanm';$base ||= "~/perl5";$base=local::lib->resolve_path($base);if ($self->{self_contained}){my@inc=$self->_core_only_inc($base);$self->{search_inc}=[@inc ]}else {$self->{search_inc}=[local::lib->install_base_arch_path($base),local::lib->install_base_perl_path($base),@INC,]}$self->_setup_local_lib_env($base)unless$no_env;$self->{local_lib}=$base}}sub prompt_bool {my($self,$mess,$def)=@_;my$val=$self->prompt($mess,$def);return lc$val eq 'y'}sub prompt {my($self,$mess,$def)=@_;my$isa_tty=-t STDIN && (-t STDOUT ||!(-f STDOUT || -c STDOUT));my$dispdef=defined$def ? "[$def] " : " ";$def=defined$def ? $def : "";if (!$self->{prompt}|| (!$isa_tty && eof STDIN)){return$def}local $|=1;local $\;my$ans;eval {local$SIG{ALRM}=sub {undef$ans;die "alarm\n"};print STDOUT "$mess $dispdef";alarm$self->{prompt_timeout}if$self->{prompt_timeout};$ans=<STDIN>;alarm 0};if (defined$ans){chomp$ans}else {print STDOUT "\n"}return (!defined$ans || $ans eq '')? $def : $ans}sub diag_ok {my($self,$msg)=@_;chomp$msg;$msg ||= "OK";if ($self->{in_progress}){$self->_diag("$msg\n");$self->{in_progress}=0}$self->log("-> $msg\n")}sub diag_fail {my($self,$msg,$always)=@_;chomp$msg;if ($self->{in_progress}){$self->_diag("FAIL\n");$self->{in_progress}=0}if ($msg){$self->_diag("! $msg\n",$always,1);$self->log("-> FAIL $msg\n")}}sub diag_progress {my($self,$msg)=@_;chomp$msg;$self->{in_progress}=1;$self->_diag("$msg ... ");$self->log("$msg\n")}sub _diag {my($self,$msg,$always,$error)=@_;my$fh=$error ? *STDERR : *STDOUT;print {$fh}$msg if$always or $self->{verbose}or!$self->{quiet}}sub diag {my($self,$msg,$always)=@_;$self->_diag($msg,$always);$self->log($msg)}sub chat {my$self=shift;print STDERR @_ if$self->{verbose};$self->log(@_)}sub mask_output {my$self=shift;my$method=shift;$self->$method($self->mask_uri_passwords(@_))}sub log {my$self=shift;open my$out,">>$self->{log}";print$out @_}sub run {my($self,$cmd)=@_;if (WIN32){$cmd=$self->shell_quote(@$cmd)if ref$cmd eq 'ARRAY';unless ($self->{verbose}){$cmd .= " >> " .$self->shell_quote($self->{log})." 2>&1"}!system$cmd}else {my$pid=fork;if ($pid){waitpid$pid,0;return!$?}else {$self->run_exec($cmd)}}}sub run_exec {my($self,$cmd)=@_;if (ref$cmd eq 'ARRAY'){unless ($self->{verbose}){open my$logfh,">>",$self->{log};open STDERR,'>&',$logfh;open STDOUT,'>&',$logfh;close$logfh}exec @$cmd}else {unless ($self->{verbose}){$cmd .= " >> " .$self->shell_quote($self->{log})." 2>&1"}exec$cmd}}sub run_timeout {my($self,$cmd,$timeout)=@_;return$self->run($cmd)if WIN32 || $self->{verbose}||!$timeout;my$pid=fork;if ($pid){eval {local$SIG{ALRM}=sub {die "alarm\n"};alarm$timeout;waitpid$pid,0;alarm 0};if ($@ && $@ eq "alarm\n"){$self->diag_fail("Timed out (> ${timeout}s). Use --verbose to retry.");local$SIG{TERM}='IGNORE';kill TERM=>0;waitpid$pid,0;return}return!$?}elsif ($pid==0){$self->run_exec($cmd)}else {$self->chat("! fork failed: falling back to system()\n");$self->run($cmd)}}sub append_args {my($self,$cmd,$phase)=@_;if (my$args=$self->{build_args}{$phase}){$cmd=join ' ',$self->shell_quote(@$cmd),$args}$cmd}sub configure {my($self,$cmd,$depth)=@_;local$ENV{PERL5_CPAN_IS_RUNNING}=local$ENV{PERL5_CPANPLUS_IS_RUNNING}=$$;local$ENV{PERL5_CPANM_IS_RUNNING}=$$;my$use_default=!$self->{interactive};local$ENV{PERL_MM_USE_DEFAULT}=$use_default;local$ENV{PERL_MM_OPT}=$ENV{PERL_MM_OPT};local$ENV{PERL_MB_OPT}=$ENV{PERL_MB_OPT};unless ($self->{pod2man}){$ENV{PERL_MM_OPT}.= " INSTALLMAN1DIR=none INSTALLMAN3DIR=none";$ENV{PERL_MB_OPT}.= " --config installman1dir= --config installsiteman1dir= --config installman3dir= --config installsiteman3dir="}if ($self->{pure_perl}){$ENV{PERL_MM_OPT}.= " PUREPERL_ONLY=1";$ENV{PERL_MB_OPT}.= " --pureperl-only"}$cmd=$self->append_args($cmd,'configure')if$depth==0;local$self->{verbose}=$self->{verbose}|| $self->{interactive};$self->run_timeout($cmd,$self->{configure_timeout})}sub build {my($self,$cmd,$distname,$depth)=@_;local$ENV{PERL_MM_USE_DEFAULT}=!$self->{interactive};$cmd=$self->append_args($cmd,'build')if$depth==0;return 1 if$self->run_timeout($cmd,$self->{build_timeout});while (1){my$ans=lc$self->prompt("Building $distname failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?","s");return if$ans eq 's';return$self->build($cmd,$distname,$depth)if$ans eq 'r';$self->show_build_log if$ans eq 'e';$self->look if$ans eq 'l'}}sub test {my($self,$cmd,$distname,$depth)=@_;return 1 if$self->{notest};local$ENV{PERL_MM_USE_DEFAULT}=!$self->{interactive};local$ENV{NONINTERACTIVE_TESTING}=!$self->{interactive};$cmd=$self->append_args($cmd,'test')if$depth==0;return 1 if$self->run_timeout($cmd,$self->{test_timeout});if ($self->{force}){$self->diag_fail("Testing $distname failed but installing it anyway.");return 1}else {$self->diag_fail;while (1){my$ans=lc$self->prompt("Testing $distname failed.\nYou can s)kip, r)etry, f)orce install, e)xamine build log, or l)ook ?","s");return if$ans eq 's';return$self->test($cmd,$distname,$depth)if$ans eq 'r';return 1 if$ans eq 'f';$self->show_build_log if$ans eq 'e';$self->look if$ans eq 'l'}}}sub install {my($self,$cmd,$uninst_opts,$depth)=@_;if ($depth==0 && $self->{test_only}){return 1}if ($self->{sudo}){unshift @$cmd,"sudo"}if ($self->{uninstall_shadows}&&!$ENV{PERL_MM_OPT}){push @$cmd,@$uninst_opts}$cmd=$self->append_args($cmd,'install')if$depth==0;$self->run($cmd)}sub look {my$self=shift;my$shell=$ENV{SHELL};$shell ||= $ENV{COMSPEC}if WIN32;if ($shell){my$cwd=Cwd::cwd;$self->diag("Entering $cwd with $shell\n");system$shell}else {$self->diag_fail("You don't seem to have a SHELL :/")}}sub show_build_log {my$self=shift;my@pagers=($ENV{PAGER},(WIN32 ? (): ('less')),'more');my$pager;while (@pagers){$pager=shift@pagers;next unless$pager;$pager=$self->which($pager);next unless$pager;last}if ($pager){system("$pager < $self->{log}")}else {$self->diag_fail("You don't seem to have a PAGER :/")}}sub chdir {my$self=shift;Cwd::chdir(File::Spec->canonpath($_[0]))or die "$_[0]: $!"}sub configure_mirrors {my$self=shift;unless (@{$self->{mirrors}}){$self->{mirrors}=['http://www.cpan.org' ]}for (@{$self->{mirrors}}){s!^/!file:///!;s!/$!!}}sub self_upgrade {my$self=shift;$self->check_upgrade;$self->{argv}=['App::cpanminus' ];return}sub install_module {my($self,$module,$depth,$version)=@_;$self->check_libs;if ($self->{seen}{$module}++){$self->chat("Already tried $module. Skipping.\n");return 1}if ($self->{skip_satisfied}){my($ok,$local)=$self->check_module($module,$version || 0);if ($ok){$self->diag("You have $module ($local)\n",1);return 1}}my$dist=$self->resolve_name($module,$version);unless ($dist){my$what=$module .($version ? " ($version)" : "");$self->diag_fail("Couldn't find module or a distribution $what",1);return}if ($dist->{distvname}&& $self->{seen}{$dist->{distvname}}++){$self->chat("Already tried $dist->{distvname}. Skipping.\n");return 1}if ($self->{cmd}eq 'info'){print$self->format_dist($dist),"\n";return 1}$dist->{depth}=$depth;if ($dist->{module}){unless ($self->satisfy_version($dist->{module},$dist->{module_version},$version)){$self->diag("Found $dist->{module} $dist->{module_version} which doesn't satisfy $version.\n",1);return}my$cmp=$version ? "==" : "";my$requirement=$dist->{module_version}? "$cmp$dist->{module_version}" : 0;my($ok,$local)=$self->check_module($dist->{module},$requirement);if ($self->{skip_installed}&& $ok){$self->diag("$dist->{module} is up to date. ($local)\n",1);return 1}}if ($dist->{dist}eq 'perl'){$self->diag("skipping $dist->{pathname}\n");return 1}$self->diag("--> Working on $module\n");$dist->{dir}||= $self->fetch_module($dist);unless ($dist->{dir}){$self->diag_fail("Failed to fetch distribution $dist->{distvname}",1);return}$self->chat("Entering $dist->{dir}\n");$self->chdir($self->{base});$self->chdir($dist->{dir});if ($self->{cmd}eq 'look'){$self->look;return 1}return$self->build_stuff($module,$dist,$depth)}sub uninstall_search_path {my$self=shift;$self->{local_lib}? (local::lib->install_base_arch_path($self->{local_lib}),local::lib->install_base_perl_path($self->{local_lib})): @Config{qw(installsitearch installsitelib)}}sub uninstall_module {my ($self,$module)=@_;$self->check_libs;my@inc=$self->uninstall_search_path;my($metadata,$packlist)=$self->packlists_containing($module,\@inc);unless ($packlist){$self->diag_fail(<<DIAG,1);return}my@uninst_files=$self->uninstall_target($metadata,$packlist);$self->ask_permission($module,\@uninst_files)or return;$self->uninstall_files(@uninst_files,$packlist);$self->diag("Successfully uninstalled $module\n",1);return 1}sub packlists_containing {my($self,$module,$inc)=@_;require Module::Metadata;my$metadata=Module::Metadata->new_from_module($module,inc=>$inc)or return;my$packlist;my$wanted=sub {return unless $_ eq '.packlist' && -f $_;for my$file ($self->unpack_packlist($File::Find::name)){$packlist ||= $File::Find::name if$file eq $metadata->filename}};{require File::pushd;my$pushd=File::pushd::pushd();my@search=grep -d $_,map File::Spec->catdir($_,'auto'),@$inc;File::Find::find($wanted,@search)}return$metadata,$packlist}sub uninstall_target {my($self,$metadata,$packlist)=@_;if ($self->has_shadow_install($metadata)or $self->{local_lib}){grep$self->should_unlink($_),$self->unpack_packlist($packlist)}else {$self->unpack_packlist($packlist)}}sub has_shadow_install {my($self,$metadata)=@_;my@shadow=grep defined,map Module::Metadata->new_from_module($metadata->name,inc=>[$_]),@INC;@shadow >= 2}sub should_unlink {my($self,$file)=@_;if ($self->{local_lib}){$file =~ /^\Q$self->{local_lib}\E/}else {!(grep$file =~ /^\Q$_\E/,@Config{qw(installbin installscript installman1dir installman3dir)})}}sub ask_permission {my ($self,$module,$files)=@_;$self->diag("$module contains the following files:\n\n");for my$file (@$files){$self->diag(" $file\n")}$self->diag("\n");return 'force uninstall' if$self->{force};local$self->{prompt}=1;return$self->prompt_bool("Are you sure you want to uninstall $module?",'y')}sub unpack_packlist {my ($self,$packlist)=@_;open my$fh,'<',$packlist or die "$packlist: $!";map {chomp;$_}<$fh>}sub uninstall_files {my ($self,@files)=@_;$self->diag("\n");for my$file (@files){$self->diag("Unlink: $file\n");unlink$file or $self->diag_fail("$!: $file")}$self->diag("\n");return 1}sub format_dist {my($self,$dist)=@_;return "$dist->{cpanid}/$dist->{filename}"}sub trim {local $_=shift;tr/\n/ /d;s/^\s*|\s*$//g;$_}sub fetch_module {my($self,$dist)=@_;$self->chdir($self->{base});for my$uri (@{$dist->{uris}}){$self->mask_output(diag_progress=>"Fetching $uri");my$filename=$dist->{filename}|| $uri;my$name=File::Basename::basename($filename);my$cancelled;my$fetch=sub {my$file;eval {local$SIG{INT}=sub {$cancelled=1;die "SIGINT\n"};$self->mirror($uri,$name);$file=$name if -e $name};$self->diag("ERROR: " .trim("$@")."\n",1)if $@ && $@ ne "SIGINT\n";return$file};my($try,$file);while ($try++ < 3){$file=$fetch->();last if$cancelled or $file;$self->mask_output(diag_fail=>"Download $uri failed. Retrying ... ")}if ($cancelled){$self->diag_fail("Download cancelled.");return}unless ($file){$self->mask_output(diag_fail=>"Failed to download $uri");next}$self->diag_ok;$dist->{local_path}=File::Spec->rel2abs($name);my$dir=$self->unpack($file,$uri,$dist);next unless$dir;if (my$save=$self->{save_dists}){my$path=$dist->{pathname}? "$save/authors/id/$dist->{pathname}" : "$save/vendor/$file";$self->chat("Copying $name to $path\n");File::Path::mkpath([File::Basename::dirname($path)],0,0777);File::Copy::copy($file,$path)or warn $!}return$dist,$dir}}sub unpack {my($self,$file,$uri,$dist)=@_;if ($self->{verify}){$self->verify_archive($file,$uri,$dist)or return}$self->chat("Unpacking $file\n");my$dir=$file =~ /\.zip/i ? $self->unzip($file): $self->untar($file);unless ($dir){$self->diag_fail("Failed to unpack $file: no directory")}return$dir}sub verify_checksums_signature {my($self,$chk_file)=@_;require Module::Signature;$self->chat("Verifying the signature of CHECKSUMS\n");my$rv=eval {local$SIG{__WARN__}=sub {};my$v=Module::Signature::_verify($chk_file);$v==Module::Signature::SIGNATURE_OK()};if ($rv){$self->chat("Verified OK!\n")}else {$self->diag_fail("Verifying CHECKSUMS signature failed: $rv\n");return}return 1}sub verify_archive {my($self,$file,$uri,$dist)=@_;unless ($dist->{cpanid}){$self->chat("Archive '$file' does not seem to be from PAUSE. Skip verification.\n");return 1}(my$mirror=$uri)=~ s!/authors/id.*$!!;(my$chksum_uri=$uri)=~ s!/[^/]*$!/CHECKSUMS!;my$chk_file=$self->source_for($mirror)."/$dist->{cpanid}.CHECKSUMS";$self->mask_output(diag_progress=>"Fetching $chksum_uri");$self->mirror($chksum_uri,$chk_file);unless (-e $chk_file){$self->diag_fail("Fetching $chksum_uri failed.\n");return}$self->diag_ok;$self->verify_checksums_signature($chk_file)or return;$self->verify_checksum($file,$chk_file)}sub verify_checksum {my($self,$file,$chk_file)=@_;$self->chat("Verifying the SHA1 for $file\n");open my$fh,"<$chk_file" or die "$chk_file: $!";my$data=join '',<$fh>;$data =~ s/\015?\012/\n/g;require Safe;my$chksum=Safe->new->reval($data);if (!ref$chksum or ref$chksum ne 'HASH'){$self->diag_fail("! Checksum file downloaded from $chk_file is broken.\n");return}if (my$sha=$chksum->{$file}{sha256}){my$hex=$self->sha1_for($file);if ($hex eq $sha){$self->chat("Checksum for $file: Verified!\n")}else {$self->diag_fail("Checksum mismatch for $file\n");return}}else {$self->chat("Checksum for $file not found in CHECKSUMS.\n");return}}sub sha1_for {my($self,$file)=@_;require Digest::SHA;open my$fh,"<",$file or die "$file: $!";my$dg=Digest::SHA->new(256);my($data);while (read($fh,$data,4096)){$dg->add($data)}return$dg->hexdigest}sub verify_signature {my($self,$dist)=@_;$self->diag_progress("Verifying the SIGNATURE file");my$out=`$self->{cpansign} -v --skip 2>&1`;$self->log($out);if ($out =~ /Signature verified OK/){$self->diag_ok("Verified OK");return 1}else {$self->diag_fail("SIGNATURE verificaion for $dist->{filename} failed\n");return}}sub resolve_name {my($self,$module,$version)=@_;if ($module =~ /(?:^git:|\.git(?:@.+)?$)/){return$self->git_uri($module)}if ($module =~ /^(ftp|https?|file):/){if ($module =~ m!authors/id/(.*)!){return$self->cpan_dist($1,$module)}else {return {uris=>[$module ]}}}if ($module =~ m!^[\./]! && -d $module){return {source=>'local',dir=>Cwd::abs_path($module),}}if (-f $module){return {source=>'local',uris=>["file://" .Cwd::abs_path($module)],}}if ($module =~ s!^cpan:///distfile/!!){return$self->cpan_dist($module)}if ($module =~ m!^(?:[A-Z]/[A-Z]{2}/)?([A-Z]{2}[\-A-Z0-9]*/.*)$!){return$self->cpan_dist($1)}return$self->search_module($module,$version)}sub cpan_module {my($self,$module,$dist,$version)=@_;my$dist=$self->cpan_dist($dist);$dist->{module}=$module;$dist->{module_version}=$version if$version && $version ne 'undef';return$dist}sub cpan_dist {my($self,$dist,$url)=@_;$dist =~ s!^([A-Z]{2})!substr($1,0,1)."/".substr($1,0,2)."/".$1!e;require CPAN::DistnameInfo;my$d=CPAN::DistnameInfo->new($dist);if ($url){$url=[$url ]unless ref$url eq 'ARRAY'}else {my$id=$d->cpanid;my$fn=substr($id,0,1)."/" .substr($id,0,2)."/" .$id ."/" .$d->filename;my@mirrors=@{$self->{mirrors}};my@urls=map "$_/authors/id/$fn",@mirrors;$url=\@urls,}return {$d->properties,source=>'cpan',uris=>$url,}}sub git_uri {my ($self,$uri)=@_;($uri,my$commitish)=split /(?<=\.git)@/i,$uri,2;my$dir=File::Temp::tempdir(CLEANUP=>1);$self->mask_output(diag_progress=>"Cloning $uri");$self->run(['git','clone',$uri,$dir ]);unless (-e "$dir/.git"){$self->diag_fail("Failed cloning git repository $uri",1);return}if ($commitish){require File::pushd;my$dir=File::pushd::pushd($dir);unless ($self->run(['git','checkout',$commitish ])){$self->diag_fail("Failed to checkout '$commitish' in git repository $uri\n");return}}$self->diag_ok;return {source=>'local',dir=>$dir,}}sub setup_module_build_patch {my$self=shift;open my$out,">$self->{base}/ModuleBuildSkipMan.pm" or die $!;print$out <<EOF}sub core_version_for {my($self,$module)=@_;require Module::CoreList;unless (exists$Module::CoreList::version{$]+0}){die sprintf("Module::CoreList %s (loaded from %s) doesn't seem to have entries for perl $]. " ."You're strongly recommended to upgrade Module::CoreList from CPAN.\n",$Module::CoreList::VERSION,$INC{"Module/CoreList.pm"})}unless (exists$Module::CoreList::version{$]+0}{$module}){return -1}return$Module::CoreList::version{$]+0}{$module}}sub search_inc {my$self=shift;$self->{search_inc}||= do {if (defined$::Bin){[grep!/^\Q$::Bin\E\/..\/(?:fat)?lib$/,@INC]}else {[@INC]}}}sub check_module {my($self,$mod,$want_ver)=@_;require Module::Metadata;my$meta=Module::Metadata->new_from_module($mod,inc=>$self->search_inc)or return 0,undef;my$version=$meta->version;if ($self->{self_contained}&& $self->loaded_from_perl_lib($meta)){$version=$self->core_version_for($mod);return 0,undef if$version && $version==-1}$self->{local_versions}{$mod}=$version;if ($self->is_deprecated($meta)){return 0,$version}elsif ($self->satisfy_version($mod,$version,$want_ver)){return 1,($version || 'undef')}else {return 0,$version}}sub satisfy_version {my($self,$mod,$version,$want_ver)=@_;$want_ver='0' unless defined($want_ver)&& length($want_ver);require CPAN::Meta::Requirements;my$requirements=CPAN::Meta::Requirements->new;$requirements->add_string_requirement($mod,$want_ver);$requirements->accepts_module($mod,$version)}sub unsatisfy_how {my($self,$ver,$want_ver)=@_;if ($want_ver =~ /^[v0-9\.\_]+$/){return "$ver < $want_ver"}else {return "$ver doesn't satisfy $want_ver"}}sub is_deprecated {my($self,$meta)=@_;my$deprecated=eval {require Module::CoreList;Module::CoreList::is_deprecated($meta->{module})};return$deprecated && $self->loaded_from_perl_lib($meta)}sub loaded_from_perl_lib {my($self,$meta)=@_;require Config;my@dirs=qw(archlibexp privlibexp);if ($self->{self_contained}&&!$self->{exclude_vendor}&& $Config{vendorarch}){unshift@dirs,qw(vendorarch vendorlibexp)}for my$dir (@dirs){my$confdir=$Config{$dir};if ($confdir eq substr($meta->filename,0,length($confdir))){return 1}}return}sub should_install {my($self,$mod,$ver)=@_;$self->chat("Checking if you have $mod $ver ... ");my($ok,$local)=$self->check_module($mod,$ver);if ($ok){$self->chat("Yes ($local)\n")}elsif ($local){$self->chat("No (" .$self->unsatisfy_how($local,$ver).")\n")}else {$self->chat("No\n")}return$mod unless$ok;return}sub check_perl_version {my($self,$version)=@_;require CPAN::Meta::Requirements;my$req=CPAN::Meta::Requirements->from_string_hash({perl=>$version });$req->accepts_module(perl=>$])}sub install_deps {my($self,$dir,$depth,@deps)=@_;my(@install,%seen,@fail);for my$dep (@deps){next if$seen{$dep->module};if ($dep->module eq 'perl'){if ($dep->is_requirement &&!$self->check_perl_version($dep->version)){$self->diag("Needs perl @{[$dep->version]}, you have $]\n");push@fail,'perl'}}elsif ($self->should_install($dep->module,$dep->version)){push@install,$dep;$seen{$dep->module}=1}}if (@install){$self->diag("==> Found dependencies: " .join(", ",map $_->module,@install)."\n")}for my$dep (@install){$self->install_module($dep->module,$depth + 1,$dep->version)}$self->chdir($self->{base});$self->chdir($dir)if$dir;if ($self->{scandeps}){return 1}my@not_ok=$self->unsatisfied_deps(@deps);if (@not_ok){return 0,\@not_ok}else {return 1}}sub unsatisfied_deps {my($self,@deps)=@_;require CPAN::Meta::Check;require CPAN::Meta::Requirements;my$reqs=CPAN::Meta::Requirements->new;for my$dep (grep $_->is_requirement,@deps){$reqs->add_string_requirement($dep->module=>$dep->requires_version || '0')}my$ret=CPAN::Meta::Check::check_requirements($reqs,'requires',$self->{search_inc});grep defined,values %$ret}sub install_deps_bailout {my($self,$target,$dir,$depth,@deps)=@_;my($ok,$fail)=$self->install_deps($dir,$depth,@deps);if (!$ok){$self->diag_fail("Installing the dependencies failed: " .join(", ",@$fail),1);unless ($self->prompt_bool("Do you want to continue building $target anyway?","n")){$self->diag_fail("Bailing out the installation for $target.",1);return}}return 1}sub build_stuff {my($self,$stuff,$dist,$depth)=@_;if ($self->{verify}&& -e 'SIGNATURE'){$self->verify_signature($dist)or return}require CPAN::Meta;my($meta_file)=grep -f,qw(META.json META.yml);if ($meta_file){$self->chat("Checking configure dependencies from $meta_file\n");$dist->{cpanmeta}=eval {CPAN::Meta->load_file($meta_file)}}elsif ($dist->{dist}&& $dist->{version}){$self->chat("META.yml/json not found. Creating skeleton for it.\n");$dist->{cpanmeta}=CPAN::Meta->new({name=>$dist->{dist},version=>$dist->{version}})}$dist->{meta}=$dist->{cpanmeta}? $dist->{cpanmeta}->as_struct : {};my@config_deps;if ($dist->{cpanmeta}){push@config_deps,App::cpanminus::Dependency->from_prereqs($dist->{cpanmeta}->effective_prereqs,['configure'],$self->{install_types},)}if (-e 'Build.PL' &&!$self->should_use_mm($dist->{dist})&&!@config_deps){push@config_deps,App::cpanminus::Dependency->from_versions({'Module::Build'=>'0.38' },'configure',)}$self->upgrade_toolchain(\@config_deps);my$target=$dist->{meta}{name}? "$dist->{meta}{name}-$dist->{meta}{version}" : $dist->{dir};{local$self->{notest}=1;$self->install_deps_bailout($target,$dist->{dir},$depth,@config_deps)or return}$self->diag_progress("Configuring $target");my$configure_state=$self->configure_this($dist,$depth);$self->diag_ok($configure_state->{configured_ok}? "OK" : "N/A");if ($dist->{cpanmeta}&& $dist->{source}eq 'cpan'){$dist->{provides}=$dist->{cpanmeta}{provides}|| $self->extract_packages($dist->{cpanmeta},".")}my$root_target=(($self->{installdeps}or $self->{showdeps})and $depth==0);$dist->{want_phases}=$self->{notest}&&!$root_target ? [qw(build runtime)]: [qw(build test runtime)];push @{$dist->{want_phases}},'develop' if$self->{with_develop}&& $depth==0;my@deps=$self->find_prereqs($dist);my$module_name=$self->find_module_name($configure_state)|| $dist->{meta}{name};$module_name =~ s/-/::/g;if ($self->{showdeps}){for my$dep (@config_deps,@deps){print$dep->module,($dep->version ? ("~".$dep->version): ""),"\n"}return 1}my$distname=$dist->{meta}{name}? "$dist->{meta}{name}-$dist->{meta}{version}" : $stuff;my$walkup;if ($self->{scandeps}){$walkup=$self->scandeps_append_child($dist)}$self->install_deps_bailout($distname,$dist->{dir},$depth,@deps)or return;if ($self->{scandeps}){unless ($configure_state->{configured_ok}){my$diag=<<DIAG;if (@config_deps){my@tree=@{$self->{scandeps_tree}};$diag .= "!\n" .join("",map "! * $_->[0]{module}\n",@tree[0..$#tree-1])if@tree}$self->diag("!\n$diag!\n",1)}$walkup->();return 1}if ($self->{installdeps}&& $depth==0){if ($configure_state->{configured_ok}){$self->diag("<== Installed dependencies for $stuff. Finishing.\n");return 1}else {$self->diag("! Configuring $distname failed. See $self->{log} for details.\n",1);return}}my$installed;if ($configure_state->{use_module_build}&& -e 'Build' && -f _){$self->diag_progress("Building " .($self->{notest}? "" : "and testing ").$distname);$self->build([$self->{perl},"./Build" ],$distname,$depth)&& $self->test([$self->{perl},"./Build","test" ],$distname,$depth)&& $self->install([$self->{perl},"./Build","install" ],["--uninst",1 ],$depth)&& $installed++}elsif ($self->{make}&& -e 'Makefile'){$self->diag_progress("Building " .($self->{notest}? "" : "and testing ").$distname);$self->build([$self->{make}],$distname,$depth)&& $self->test([$self->{make},"test" ],$distname,$depth)&& $self->install([$self->{make},"install" ],["UNINST=1" ],$depth)&& $installed++}else {my$why;my$configure_failed=$configure_state->{configured}&&!$configure_state->{configured_ok};if ($configure_failed){$why="Configure failed for $distname."}elsif ($self->{make}){$why="The distribution doesn't have a proper Makefile.PL/Build.PL"}else {$why="Can't configure the distribution. You probably need to have 'make'."}$self->diag_fail("$why See $self->{log} for details.",1);return}if ($installed && $self->{test_only}){$self->diag_ok;$self->diag("Successfully tested $distname\n",1)}elsif ($installed){my$local=$self->{local_versions}{$dist->{module}|| ''};my$version=$dist->{module_version}|| $dist->{meta}{version}|| $dist->{version};my$reinstall=$local && ($local eq $version);my$action=$local &&!$reinstall ? $self->numify_ver($version)< $self->numify_ver($local)? "downgraded" : "upgraded" : undef;my$how=$reinstall ? "reinstalled $distname" : $local ? "installed $distname ($action from $local)" : "installed $distname" ;my$msg="Successfully $how";$self->diag_ok;$self->diag("$msg\n",1);$self->{installed_dists}++;$self->save_meta($stuff,$dist,$module_name,\@config_deps,\@deps);return 1}else {my$what=$self->{test_only}? "Testing" : "Installing";$self->diag_fail("$what $stuff failed. See $self->{log} for details. Retry with --force to force install it.",1);return}}sub perl_requirements {my($self,@requires)=@_;my@perl;for my$requires (grep defined,@requires){if (exists$requires->{perl}){push@perl,App::cpanminus::Dependency->new(perl=>$requires->{perl})}}return@perl}sub should_use_mm {my($self,$dist)=@_;my%should_use_mm=map {$_=>1}qw(version ExtUtils-ParseXS ExtUtils-Install ExtUtils-Manifest);$should_use_mm{$dist}}sub configure_this {my($self,$dist,$depth)=@_;if (-e $self->{cpanfile_path}&& $self->{installdeps}&& $depth==0){require Module::CPANfile;$dist->{cpanfile}=eval {Module::CPANfile->load($self->{cpanfile_path})};$self->diag_fail($@,1)if $@;return {configured=>1,configured_ok=>!!$dist->{cpanfile},use_module_build=>0,}}if ($self->{skip_configure}){my$eumm=-e 'Makefile';my$mb=-e 'Build' && -f _;return {configured=>1,configured_ok=>$eumm || $mb,use_module_build=>$mb,}}my$state={};my$try_eumm=sub {if (-e 'Makefile.PL'){$self->chat("Running Makefile.PL\n");if ($self->configure([$self->{perl},"Makefile.PL" ],$depth)){$state->{configured_ok}=-e 'Makefile'}$state->{configured}++}};my$try_mb=sub {if (-e 'Build.PL'){$self->chat("Running Build.PL\n");if ($self->configure([$self->{perl},"Build.PL" ],$depth)){$state->{configured_ok}=-e 'Build' && -f _}$state->{use_module_build}++;$state->{configured}++}};my@try;if ($dist->{dist}&& $self->should_use_mm($dist->{dist})){@try=($try_eumm,$try_mb)}else {@try=($try_mb,$try_eumm)}for my$try (@try){$try->();last if$state->{configured_ok}}unless ($state->{configured_ok}){while (1){my$ans=lc$self->prompt("Configuring $dist->{dist} failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?","s");last if$ans eq 's';return$self->configure_this($dist,$depth)if$ans eq 'r';$self->show_build_log if$ans eq 'e';$self->look if$ans eq 'l'}}return$state}sub find_module_name {my($self,$state)=@_;return unless$state->{configured_ok};if ($state->{use_module_build}&& -e "_build/build_params"){my$params=do {open my$in,"_build/build_params";$self->safe_eval(join "",<$in>)};return eval {$params->[2]{module_name}}|| undef}elsif (-e "Makefile"){open my$mf,"Makefile";while (<$mf>){if (/^\#\s+NAME\s+=>\s+(.*)/){return$self->safe_eval($1)}}}return}sub list_files {my$self=shift;if (-e 'MANIFEST'){require ExtUtils::Manifest;my$manifest=eval {ExtUtils::Manifest::manifind()}|| {};return sort {lc$a cmp lc$b}keys %$manifest}else {require File::Find;my@files;my$finder=sub {my$name=$File::Find::name;$name =~ s!\.[/\\]!!;push@files,$name};File::Find::find($finder,".");return sort {lc$a cmp lc$b}@files}}sub extract_packages {my($self,$meta,$dir)=@_;my$try=sub {my$file=shift;return 0 if$file =~ m!^(?:x?t|inc|local|perl5|fatlib|_build)/!;return 1 unless$meta->{no_index};return 0 if grep {$file =~ m!^$_/!}@{$meta->{no_index}{directory}|| []};return 0 if grep {$file eq $_}@{$meta->{no_index}{file}|| []};return 1};require Parse::PMFile;my@files=grep {/\.pm(?:\.PL)?$/ && $try->($_)}$self->list_files;my$provides={};for my$file (@files){my$parser=Parse::PMFile->new($meta,{UNSAFE=>1,ALLOW_DEV_VERSION=>1 });my$packages=$parser->parse($file);while (my($package,$meta)=each %$packages){$provides->{$package}||= {file=>$meta->{infile},($meta->{version}eq 'undef')? (): (version=>$meta->{version}),}}}return$provides}sub save_meta {my($self,$module,$dist,$module_name,$config_deps,$build_deps)=@_;return unless$dist->{distvname}&& $dist->{source}eq 'cpan';my$base=($ENV{PERL_MM_OPT}|| '')=~ /INSTALL_BASE=/ ? ($self->install_base($ENV{PERL_MM_OPT})."/lib/perl5"): $Config{sitelibexp};my$provides=$dist->{provides};File::Path::mkpath("blib/meta",0,0777);my$local={name=>$module_name,target=>$module,version=>exists$provides->{$module_name}? ($provides->{$module_name}{version}|| $dist->{version}): $dist->{version},dist=>$dist->{distvname},pathname=>$dist->{pathname},provides=>$provides,};require JSON::PP;open my$fh,">","blib/meta/install.json" or die $!;print$fh JSON::PP::encode_json($local);if (-e "MYMETA.json"){File::Copy::copy("MYMETA.json","blib/meta/MYMETA.json")}my@cmd=(($self->{sudo}? 'sudo' : ()),$^X,'-MExtUtils::Install=install','-e',qq[install({ 'blib/meta' => '$base/$Config{archname}/.meta/$dist->{distvname}' })],);$self->run(\@cmd)}sub _merge_hashref {my($self,@hashrefs)=@_;my%hash;for my$h (@hashrefs){%hash=(%hash,%$h)}return \%hash}sub install_base {my($self,$mm_opt)=@_;$mm_opt =~ /INSTALL_BASE=(\S+)/ and return $1;die "Your PERL_MM_OPT doesn't contain INSTALL_BASE"}sub safe_eval {my($self,$code)=@_;eval$code}sub configure_features {my($self,$dist,@features)=@_;map $_->identifier,grep {$self->effective_feature($dist,$_)}@features}sub effective_feature {my($self,$dist,$feature)=@_;if ($dist->{depth}==0){my$value=$self->{features}{$feature->identifier};return$value if defined$value;return 1 if$self->{features}{__all}}if ($self->{interactive}){require CPAN::Meta::Requirements;$self->diag("[@{[ $feature->description ]}]\n",1);my$req=CPAN::Meta::Requirements->new;for my$phase (@{$dist->{want_phases}}){for my$type (@{$self->{install_types}}){$req->add_requirements($feature->prereqs->requirements_for($phase,$type))}}my$reqs=$req->as_string_hash;my@missing;for my$module (keys %$reqs){if ($self->should_install($module,$req->{$module})){push@missing,$module}}if (@missing){my$howmany=@missing;$self->diag("==> Found missing dependencies: " .join(", ",@missing)."\n",1);local$self->{prompt}=1;return$self->prompt_bool("Install the $howmany optional module(s)?","y")}}return}sub find_prereqs {my($self,$dist)=@_;my@deps=$self->extract_meta_prereqs($dist);if ($dist->{module}=~ /^Bundle::/i){push@deps,$self->bundle_deps($dist)}if ($self->{cpanfile_requirements}&&!$dist->{cpanfile}){for my$dep (@deps){$dep->merge_with($self->{cpanfile_requirements})}}return@deps}sub extract_meta_prereqs {my($self,$dist)=@_;if ($dist->{cpanfile}){my@features=$self->configure_features($dist,$dist->{cpanfile}->features);my$prereqs=$dist->{cpanfile}->prereqs_with(@features);$self->{cpanfile_requirements}=$prereqs->merged_requirements($dist->{want_phases},['requires']);return App::cpanminus::Dependency->from_prereqs($prereqs,$dist->{want_phases},$self->{install_types})}require CPAN::Meta;my@deps;my($meta_file)=grep -f,qw(MYMETA.json MYMETA.yml);if ($meta_file){$self->chat("Checking dependencies from $meta_file ...\n");my$mymeta=eval {CPAN::Meta->load_file($meta_file,{lazy_validation=>1 })};if ($mymeta){$dist->{meta}{name}=$mymeta->name;$dist->{meta}{version}=$mymeta->version;return$self->extract_prereqs($mymeta,$dist)}}if (-e '_build/prereqs'){$self->chat("Checking dependencies from _build/prereqs ...\n");my$prereqs=do {open my$in,"_build/prereqs";$self->safe_eval(join "",<$in>)};my$meta=CPAN::Meta->new({name=>$dist->{meta}{name},version=>$dist->{meta}{version},%$prereqs },{lazy_validation=>1 },);@deps=$self->extract_prereqs($meta,$dist)}elsif (-e 'Makefile'){$self->chat("Finding PREREQ from Makefile ...\n");open my$mf,"Makefile";while (<$mf>){if (/^\#\s+PREREQ_PM => \{\s*(.*?)\s*\}/){my@all;my@pairs=split ', ',$1;for (@pairs){my ($pkg,$v)=split '=>',$_;push@all,[$pkg,$v ]}my$list=join ", ",map {"'$_->[0]' => $_->[1]"}@all;my$prereq=$self->safe_eval("no strict; +{ $list }");push@deps,App::cpanminus::Dependency->from_versions($prereq)if$prereq;last}}}return@deps}sub bundle_deps {my($self,$dist)=@_;my@files;File::Find::find({wanted=>sub {push@files,File::Spec->rel2abs($_)if /\.pm/i},no_chdir=>1,},'.');my@deps;for my$file (@files){open my$pod,"<",$file or next;my$in_contents;while (<$pod>){if (/^=head\d\s+CONTENTS/){$in_contents=1}elsif (/^=/){$in_contents=0}elsif ($in_contents){/^(\S+)\s*(\S+)?/ and push@deps,App::cpanminus::Dependency->new($1,$self->maybe_version($2))}}}return@deps}sub maybe_version {my($self,$string)=@_;return$string && $string =~ /^\.?\d/ ? $string : undef}sub extract_prereqs {my($self,$meta,$dist)=@_;my@features=$self->configure_features($dist,$meta->features);my$prereqs=$self->soften_makemaker_prereqs($meta->effective_prereqs(\@features)->clone);return App::cpanminus::Dependency->from_prereqs($prereqs,$dist->{want_phases},$self->{install_types})}sub soften_makemaker_prereqs {my($self,$prereqs)=@_;return$prereqs unless -e "inc/Module/Install.pm";for my$phase (qw(build test runtime)){my$reqs=$prereqs->requirements_for($phase,'requires');if ($reqs->requirements_for_module('ExtUtils::MakeMaker')){$reqs->clear_requirement('ExtUtils::MakeMaker');$reqs->add_minimum('ExtUtils::MakeMaker'=>0)}}$prereqs}sub cleanup_workdirs {my$self=shift;my$expire=time - 24 * 60 * 60 * $self->{auto_cleanup};my@targets;opendir my$dh,"$self->{home}/work";while (my$e=readdir$dh){next if$e !~ /^(\d+)\.\d+$/;my$time=$1;if ($time < $expire){push@targets,"$self->{home}/work/$e"}}if (@targets){if (@targets >= 64){$self->diag("Expiring " .scalar(@targets)." work directories. This might take a while...\n")}else {$self->chat("Expiring " .scalar(@targets)." work directories.\n")}File::Path::rmtree(\@targets,0,0)}}sub scandeps_append_child {my($self,$dist)=@_;my$new_node=[$dist,[]];my$curr_node=$self->{scandeps_current}|| [undef,$self->{scandeps_tree}];push @{$curr_node->[1]},$new_node;$self->{scandeps_current}=$new_node;return sub {$self->{scandeps_current}=$curr_node}}sub dump_scandeps {my$self=shift;if ($self->{format}eq 'tree'){$self->walk_down(sub {my($dist,$depth)=@_;if ($depth==0){print "$dist->{distvname}\n"}else {print " " x ($depth - 1);print "\\_ $dist->{distvname}\n"}},1)}elsif ($self->{format}=~ /^dists?$/){$self->walk_down(sub {my($dist,$depth)=@_;print$self->format_dist($dist),"\n"},0)}elsif ($self->{format}eq 'json'){require JSON::PP;print JSON::PP::encode_json($self->{scandeps_tree})}elsif ($self->{format}eq 'yaml'){require YAML;print YAML::Dump($self->{scandeps_tree})}else {$self->diag("Unknown format: $self->{format}\n")}}sub walk_down {my($self,$cb,$pre)=@_;$self->_do_walk_down($self->{scandeps_tree},$cb,0,$pre)}sub _do_walk_down {my($self,$children,$cb,$depth,$pre)=@_;for my$node (@$children){$cb->($node->[0],$depth)if$pre;$self->_do_walk_down($node->[1],$cb,$depth + 1,$pre);$cb->($node->[0],$depth)unless$pre}}sub DESTROY {my$self=shift;$self->{at_exit}->($self)if$self->{at_exit}}sub shell_quote {my($self,@stuff)=@_;if (WIN32){join ' ',map {/^${quote}.+${quote}$/ ? $_ : ($quote .$_ .$quote)}@stuff}else {String::ShellQuote::shell_quote_best_effort(@stuff)}}sub which {my($self,$name)=@_;if (File::Spec->file_name_is_absolute($name)){if (-x $name &&!-d _){return$name}}my$exe_ext=$Config{_exe};for my$dir (File::Spec->path){my$fullpath=File::Spec->catfile($dir,$name);if ((-x $fullpath || -x ($fullpath .= $exe_ext))&&!-d _){if ($fullpath =~ /\s/){$fullpath=$self->shell_quote($fullpath)}return$fullpath}}return}sub get {my($self,$uri)=@_;if ($uri =~ /^file:/){$self->file_get($uri)}else {$self->{_backends}{get}->(@_)}}sub mirror {my($self,$uri,$local)=@_;if ($uri =~ /^file:/){$self->file_mirror($uri,$local)}else {$self->{_backends}{mirror}->(@_)}}sub untar {$_[0]->{_backends}{untar}->(@_)};sub unzip {$_[0]->{_backends}{unzip}->(@_)};sub uri_to_file {my($self,$uri)=@_;if ($uri =~ s!file:/+!!){$uri="/$uri" unless$uri =~ m![a-zA-Z]:!}return$uri}sub file_get {my($self,$uri)=@_;my$file=$self->uri_to_file($uri);open my$fh,"<$file" or return;join '',<$fh>}sub file_mirror {my($self,$uri,$path)=@_;my$file=$self->uri_to_file($uri);File::Copy::copy($file,$path)}sub has_working_lwp {my($self,$mirrors)=@_;my$https=grep /^https:/,@$mirrors;eval {require LWP::UserAgent;LWP::UserAgent->VERSION(5.802);require LWP::Protocol::https if$https;1}}sub init_tools {my$self=shift;return if$self->{initialized}++;if ($self->{make}=$self->which($Config{make})){$self->chat("You have make $self->{make}\n")}if ($self->{try_lwp}&& $self->has_working_lwp($self->{mirrors})){$self->chat("You have LWP $LWP::VERSION\n");my$ua=sub {LWP::UserAgent->new(parse_head=>0,env_proxy=>1,agent=>$self->agent,timeout=>30,@_,)};$self->{_backends}{get}=sub {my$self=shift;my$res=$ua->()->request(HTTP::Request->new(GET=>$_[0]));return unless$res->is_success;return$res->decoded_content};$self->{_backends}{mirror}=sub {my$self=shift;my$res=$ua->()->mirror(@_);die$res->content if$res->code==501;$res->code}}elsif ($self->{try_wget}and my$wget=$self->which('wget')){$self->chat("You have $wget\n");my@common=('--user-agent',$self->agent,'--retry-connrefused',($self->{verbose}? (): ('-q')),);$self->{_backends}{get}=sub {my($self,$uri)=@_;$self->safeexec(my$fh,$wget,$uri,@common,'-O','-')or die "wget $uri: $!";local $/;<$fh>};$self->{_backends}{mirror}=sub {my($self,$uri,$path)=@_;$self->safeexec(my$fh,$wget,$uri,@common,'-O',$path)or die "wget $uri: $!";local $/;<$fh>}}elsif ($self->{try_curl}and my$curl=$self->which('curl')){$self->chat("You have $curl\n");my@common=('--location','--user-agent',$self->agent,($self->{verbose}? (): '-s'),);$self->{_backends}{get}=sub {my($self,$uri)=@_;$self->safeexec(my$fh,$curl,@common,$uri)or die "curl $uri: $!";local $/;<$fh>};$self->{_backends}{mirror}=sub {my($self,$uri,$path)=@_;$self->safeexec(my$fh,$curl,@common,$uri,'-#','-o',$path)or die "curl $uri: $!";local $/;<$fh>}}else {require HTTP::Tiny;$self->chat("Falling back to HTTP::Tiny $HTTP::Tiny::VERSION\n");my%common=(agent=>$self->agent,);$self->{_backends}{get}=sub {my$self=shift;my$res=HTTP::Tiny->new(%common)->get($_[0]);return unless$res->{success};return$res->{content}};$self->{_backends}{mirror}=sub {my$self=shift;my$res=HTTP::Tiny->new(%common)->mirror(@_);return$res->{status}}}my$tar=$self->which('tar');my$tar_ver;my$maybe_bad_tar=sub {WIN32 || BAD_TAR || (($tar_ver=`$tar --version 2>/dev/null`)=~ /GNU.*1\.13/i)};if ($tar &&!$maybe_bad_tar->()){chomp$tar_ver;$self->chat("You have $tar: $tar_ver\n");$self->{_backends}{untar}=sub {my($self,$tarfile)=@_;my$xf=($self->{verbose}? 'v' : '')."xf";my$ar=$tarfile =~ /bz2$/ ? 'j' : 'z';my($root,@others)=`$tar ${ar}tf $tarfile` or return undef;FILE: {chomp$root;$root =~ s!^\./!!;$root =~ s{^(.+?)/.*$}{$1};if (!length($root)){$root=shift(@others);redo FILE if$root}}system "$tar $ar$xf $tarfile";return$root if -d $root;$self->diag_fail("Bad archive: $tarfile");return undef}}elsif ($tar and my$gzip=$self->which('gzip')and my$bzip2=$self->which('bzip2')){$self->chat("You have $tar, $gzip and $bzip2\n");$self->{_backends}{untar}=sub {my($self,$tarfile)=@_;my$x="x" .($self->{verbose}? 'v' : '')."f -";my$ar=$tarfile =~ /bz2$/ ? $bzip2 : $gzip;my($root,@others)=`$ar -dc $tarfile | $tar tf -` or return undef;FILE: {chomp$root;$root =~ s!^\./!!;$root =~ s{^(.+?)/.*$}{$1};if (!length($root)){$root=shift(@others);redo FILE if$root}}system "$ar -dc $tarfile | $tar $x";return$root if -d $root;$self->diag_fail("Bad archive: $tarfile");return undef}}elsif (eval {require Archive::Tar}){$self->chat("Falling back to Archive::Tar $Archive::Tar::VERSION\n");$self->{_backends}{untar}=sub {my$self=shift;my$t=Archive::Tar->new($_[0]);my($root,@others)=$t->list_files;FILE: {$root =~ s!^\./!!;$root =~ s{^(.+?)/.*$}{$1};if (!length($root)){$root=shift(@others);redo FILE if$root}}$t->extract;return -d $root ? $root : undef}}else {$self->{_backends}{untar}=sub {die "Failed to extract $_[1] - You need to have tar or Archive::Tar installed.\n"}}if (my$unzip=$self->which('unzip')){$self->chat("You have $unzip\n");$self->{_backends}{unzip}=sub {my($self,$zipfile)=@_;my$opt=$self->{verbose}? '' : '-q';my(undef,$root,@others)=`$unzip -t $zipfile` or return undef;chomp$root;$root =~ s{^\s+testing:\s+([^/]+)/.*?\s+OK$}{$1};system "$unzip $opt $zipfile";return$root if -d $root;$self->diag_fail("Bad archive: [$root] $zipfile");return undef}}else {$self->{_backends}{unzip}=sub {eval {require Archive::Zip}or die "Failed to extract $_[1] - You need to have unzip or Archive::Zip installed.\n";my($self,$file)=@_;my$zip=Archive::Zip->new();my$status;$status=$zip->read($file);$self->diag_fail("Read of file[$file] failed")if$status!=Archive::Zip::AZ_OK();my@members=$zip->members();for my$member (@members){my$af=$member->fileName();next if ($af =~ m!^(/|\.\./)!);$status=$member->extractToFileNamed($af);$self->diag_fail("Extracting of file[$af] from zipfile[$file failed")if$status!=Archive::Zip::AZ_OK()}my ($root)=$zip->membersMatching(qr<^[^/]+/$>);$root &&= $root->fileName;return -d $root ? $root : undef}}}sub safeexec {my$self=shift;my$rdr=$_[0]||= Symbol::gensym();if (WIN32){my$cmd=$self->shell_quote(@_[1..$#_]);return open($rdr,"$cmd |")}if (my$pid=open($rdr,'-|')){return$pid}elsif (defined$pid){exec(@_[1 .. $#_ ]);exit 1}else {return}}sub mask_uri_passwords {my($self,@strings)=@_;s{ (https?://) ([^:/]+) : [^@/]+ @ }{$1$2:********@}gx for@strings;return@strings}1;
It appears your cpanm executable was installed via `perlbrew install-cpanm`.
cpanm --self-upgrade won't upgrade the version of cpanm you're running.
@@ -98,6 +66,7 @@ $fatpacked{"App/cpanminus/script.pm"} = <<'APP_CPANMINUS_SCRIPT';
--reinstall Reinstall the distribution even if you already have the latest version installed
--mirror Specify the base URL for the mirror (e.g. http://cpan.cpantesters.org/)
--mirror-only Use the mirror's index file instead of the CPAN Meta DB
+ -M,--from Use only this mirror base URL and its index file
--prompt Prompt when configure/build/test fails
-l,--local-lib Specify the install base to install modules
-L,--local-lib-contained Specify the install base to install all non-core modules
@@ -122,6 +91,7 @@ $fatpacked{"App/cpanminus/script.pm"} = <<'APP_CPANMINUS_SCRIPT';
cpanm --installdeps . # install all the deps for the current directory
cpanm -L extlib Plack # install Plack and all non-core deps into extlib
cpanm --mirror http://cpan.cpantesters.org/ DBI # use the fast-syncing mirror
+ cpanm -M https://cpan.metacpan.org App::perlbrew # use only this secure mirror and its index
You can also specify the default options in PERL_CPANM_OPT environment variable in the shell rc:
@@ -162,7 +132,7 @@ $fatpacked{"App/cpanminus/script.pm"} = <<'APP_CPANMINUS_SCRIPT';
DIAG
APP_CPANMINUS_SCRIPT
-$fatpacked{"CPAN/DistnameInfo.pm"} = <<'CPAN_DISTNAMEINFO';
+$fatpacked{"CPAN/DistnameInfo.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_DISTNAMEINFO';
package CPAN::DistnameInfo;$VERSION="0.12";use strict;sub distname_info {my$file=shift or return;my ($dist,$version)=$file =~ /^
((?:[-+.]*(?:[A-Za-z0-9]+|(?<=\D)_|_(?=\D))*
(?:
@@ -174,76 +144,84 @@ $fatpacked{"CPAN/DistnameInfo.pm"} = <<'CPAN_DISTNAMEINFO';
$/xs or return ($file,undef,undef);if ($dist =~ /-undef\z/ and!length$version){$dist =~ s/-undef\z//}$version =~ s/-withoutworldwriteables$//;if ($version =~ /^(-[Vv].*)-(\d.*)/){$dist .= $1;$version=$2}if ($version =~ /(.+_.*)-(\d.*)/){$dist .= $1;$version=$2}$dist =~ s{\.pm$}{};$version=$1 if!length$version and $dist =~ s/-(\d+\w)$//;$version=$1 .$version if$version =~ /^\d+$/ and $dist =~ s/-(\w+)$//;if ($version =~ /\d\.\d/){$version =~ s/^[-_.]+//}else {$version =~ s/^[-_]+//}my$dev;if (length$version){if ($file =~ /^perl-?\d+\.(\d+)(?:\D(\d+))?(-(?:TRIAL|RC)\d+)?$/){$dev=1 if (($1 > 6 and $1 & 1)or ($2 and $2 >= 50))or $3}elsif ($version =~ /\d\D\d+_\d/ or $version =~ /-TRIAL/){$dev=1}}else {$version=undef}($dist,$version,$dev)}sub new {my$class=shift;my$distfile=shift;$distfile =~ s,//+,/,g;my%info=(pathname=>$distfile);($info{filename}=$distfile)=~ s,^(((.*?/)?authors/)?id/)?([A-Z])/(\4[A-Z])/(\5[-A-Z0-9]*)/,, and $info{cpanid}=$6;if ($distfile =~ m,([^/]+)\.(tar\.(?:g?z|bz2)|zip|tgz)$,i){$info{distvname}=$1;$info{extension}=$2}@info{qw(dist version beta)}=distname_info($info{distvname});$info{maturity}=delete$info{beta}? 'developer' : 'released';return bless \%info,$class}sub dist {shift->{dist}}sub version {shift->{version}}sub maturity {shift->{maturity}}sub filename {shift->{filename}}sub cpanid {shift->{cpanid}}sub distvname {shift->{distvname}}sub extension {shift->{extension}}sub pathname {shift->{pathname}}sub properties {%{$_[0]}}1;
CPAN_DISTNAMEINFO
-$fatpacked{"CPAN/Meta.pm"} = <<'CPAN_META';
- use 5.006;use strict;use warnings;package CPAN::Meta;our$VERSION='2.132510';use Carp qw(carp croak);use CPAN::Meta::Feature;use CPAN::Meta::Prereqs;use CPAN::Meta::Converter;use CPAN::Meta::Validator;use Parse::CPAN::Meta 1.4403 ();BEGIN {*_dclone=\&CPAN::Meta::Converter::_dclone}BEGIN {my@STRING_READERS=qw(abstract description dynamic_config generated_by name release_status version);no strict 'refs';for my$attr (@STRING_READERS){*$attr=sub {$_[0]{$attr }}}}BEGIN {my@LIST_READERS=qw(author keywords license);no strict 'refs';for my$attr (@LIST_READERS){*$attr=sub {my$value=$_[0]{$attr };croak "$attr must be called in list context" unless wantarray;return @{_dclone($value)}if ref$value;return$value}}}sub authors {$_[0]->author}sub licenses {$_[0]->license}BEGIN {my@MAP_READERS=qw(meta-spec resources provides no_index prereqs optional_features);no strict 'refs';for my$attr (@MAP_READERS){(my$subname=$attr)=~ s/-/_/;*$subname=sub {my$value=$_[0]{$attr };return _dclone($value)if$value;return {}}}}sub custom_keys {return grep {/^x_/i}keys %{$_[0]}}sub custom {my ($self,$attr)=@_;my$value=$self->{$attr};return _dclone($value)if ref$value;return$value}sub _new {my ($class,$struct,$options)=@_;my$self;if ($options->{lazy_validation}){my$cmc=CPAN::Meta::Converter->new($struct);$self=$cmc->convert(version=>2);return bless$self,$class}else {my$cmv=CPAN::Meta::Validator->new($struct);unless ($cmv->is_valid){die "Invalid metadata structure. Errors: " .join(", ",$cmv->errors)."\n"}}my$version=$struct->{'meta-spec'}{version}|| '1.0';if ($version==2){$self=$struct}else {my$cmc=CPAN::Meta::Converter->new($struct);$self=$cmc->convert(version=>2)}return bless$self,$class}sub new {my ($class,$struct,$options)=@_;my$self=eval {$class->_new($struct,$options)};croak($@)if $@;return$self}sub create {my ($class,$struct,$options)=@_;my$version=__PACKAGE__->VERSION || 2;$struct->{generated_by}||=__PACKAGE__ ." version $version" ;$struct->{'meta-spec'}{version}||=int($version);my$self=eval {$class->_new($struct,$options)};croak ($@)if $@;return$self}sub load_file {my ($class,$file,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};croak "load_file() requires a valid, readable filename" unless -r $file;my$self;eval {my$struct=Parse::CPAN::Meta->load_file($file);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub load_yaml_string {my ($class,$yaml,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};my$self;eval {my ($struct)=Parse::CPAN::Meta->load_yaml_string($yaml);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub load_json_string {my ($class,$json,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};my$self;eval {my$struct=Parse::CPAN::Meta->load_json_string($json);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub save {my ($self,$file,$options)=@_;my$version=$options->{version}|| '2';my$layer=$] ge '5.008001' ? ':utf8' : '';if ($version ge '2'){carp "'$file' should end in '.json'" unless$file =~ m{\.json$}}else {carp "'$file' should end in '.yml'" unless$file =~ m{\.yml$}}my$data=$self->as_string($options);open my$fh,">$layer",$file or die "Error opening '$file' for writing: $!\n";print {$fh}$data;close$fh or die "Error closing '$file': $!\n";return 1}sub meta_spec_version {my ($self)=@_;return$self->meta_spec->{version}}sub effective_prereqs {my ($self,$features)=@_;$features ||=[];my$prereq=CPAN::Meta::Prereqs->new($self->prereqs);return$prereq unless @$features;my@other=map {;$self->feature($_)->prereqs}@$features;return$prereq->with_merged_prereqs(\@other)}sub should_index_file {my ($self,$filename)=@_;for my$no_index_file (@{$self->no_index->{file}|| []}){return if$filename eq $no_index_file}for my$no_index_dir (@{$self->no_index->{directory}}){$no_index_dir =~ s{$}{/} unless$no_index_dir =~ m{/\z};return if index($filename,$no_index_dir)==0}return 1}sub should_index_package {my ($self,$package)=@_;for my$no_index_pkg (@{$self->no_index->{package}|| []}){return if$package eq $no_index_pkg}for my$no_index_ns (@{$self->no_index->{namespace}}){return if index($package,"${no_index_ns}::")==0}return 1}sub features {my ($self)=@_;my$opt_f=$self->optional_features;my@features=map {;CPAN::Meta::Feature->new($_=>$opt_f->{$_ })}keys %$opt_f;return@features}sub feature {my ($self,$ident)=@_;croak "no feature named $ident" unless my$f=$self->optional_features->{$ident };return CPAN::Meta::Feature->new($ident,$f)}sub as_struct {my ($self,$options)=@_;my$struct=_dclone($self);if ($options->{version}){my$cmc=CPAN::Meta::Converter->new($struct);$struct=$cmc->convert(version=>$options->{version})}return$struct}sub as_string {my ($self,$options)=@_;my$version=$options->{version}|| '2';my$struct;if ($self->meta_spec_version ne $version){my$cmc=CPAN::Meta::Converter->new($self->as_struct);$struct=$cmc->convert(version=>$version)}else {$struct=$self->as_struct}my ($data,$backend);if ($version ge '2'){$backend=Parse::CPAN::Meta->json_backend();$data=$backend->new->pretty->canonical->encode($struct)}else {$backend=Parse::CPAN::Meta->yaml_backend();$data=eval {no strict 'refs';&{"$backend\::Dump"}($struct)};if ($@){croak$backend->can('errstr')? $backend->errstr : $@}}return$data}sub TO_JSON {return {%{$_[0]}}}1;
+$fatpacked{"CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META';
+ use 5.006;use strict;use warnings;package CPAN::Meta;our$VERSION='2.150005';use Carp qw(carp croak);use CPAN::Meta::Feature;use CPAN::Meta::Prereqs;use CPAN::Meta::Converter;use CPAN::Meta::Validator;use Parse::CPAN::Meta 1.4414 ();BEGIN {*_dclone=\&CPAN::Meta::Converter::_dclone}BEGIN {my@STRING_READERS=qw(abstract description dynamic_config generated_by name release_status version);no strict 'refs';for my$attr (@STRING_READERS){*$attr=sub {$_[0]{$attr }}}}BEGIN {my@LIST_READERS=qw(author keywords license);no strict 'refs';for my$attr (@LIST_READERS){*$attr=sub {my$value=$_[0]{$attr };croak "$attr must be called in list context" unless wantarray;return @{_dclone($value)}if ref$value;return$value}}}sub authors {$_[0]->author}sub licenses {$_[0]->license}BEGIN {my@MAP_READERS=qw(meta-spec resources provides no_index prereqs optional_features);no strict 'refs';for my$attr (@MAP_READERS){(my$subname=$attr)=~ s/-/_/;*$subname=sub {my$value=$_[0]{$attr };return _dclone($value)if$value;return {}}}}sub custom_keys {return grep {/^x_/i}keys %{$_[0]}}sub custom {my ($self,$attr)=@_;my$value=$self->{$attr};return _dclone($value)if ref$value;return$value}sub _new {my ($class,$struct,$options)=@_;my$self;if ($options->{lazy_validation}){my$cmc=CPAN::Meta::Converter->new($struct);$self=$cmc->convert(version=>2);return bless$self,$class}else {my$cmv=CPAN::Meta::Validator->new($struct);unless ($cmv->is_valid){die "Invalid metadata structure. Errors: " .join(", ",$cmv->errors)."\n"}}my$version=$struct->{'meta-spec'}{version}|| '1.0';if ($version==2){$self=$struct}else {my$cmc=CPAN::Meta::Converter->new($struct);$self=$cmc->convert(version=>2)}return bless$self,$class}sub new {my ($class,$struct,$options)=@_;my$self=eval {$class->_new($struct,$options)};croak($@)if $@;return$self}sub create {my ($class,$struct,$options)=@_;my$version=__PACKAGE__->VERSION || 2;$struct->{generated_by}||= __PACKAGE__ ." version $version" ;$struct->{'meta-spec'}{version}||= int($version);my$self=eval {$class->_new($struct,$options)};croak ($@)if $@;return$self}sub load_file {my ($class,$file,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};croak "load_file() requires a valid, readable filename" unless -r $file;my$self;eval {my$struct=Parse::CPAN::Meta->load_file($file);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub load_yaml_string {my ($class,$yaml,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};my$self;eval {my ($struct)=Parse::CPAN::Meta->load_yaml_string($yaml);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub load_json_string {my ($class,$json,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};my$self;eval {my$struct=Parse::CPAN::Meta->load_json_string($json);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub load_string {my ($class,$string,$options)=@_;$options->{lazy_validation}=1 unless exists$options->{lazy_validation};my$self;eval {my$struct=Parse::CPAN::Meta->load_string($string);$self=$class->_new($struct,$options)};croak($@)if $@;return$self}sub save {my ($self,$file,$options)=@_;my$version=$options->{version}|| '2';my$layer=$] ge '5.008001' ? ':utf8' : '';if ($version ge '2'){carp "'$file' should end in '.json'" unless$file =~ m{\.json$}}else {carp "'$file' should end in '.yml'" unless$file =~ m{\.yml$}}my$data=$self->as_string($options);open my$fh,">$layer",$file or die "Error opening '$file' for writing: $!\n";print {$fh}$data;close$fh or die "Error closing '$file': $!\n";return 1}sub meta_spec_version {my ($self)=@_;return$self->meta_spec->{version}}sub effective_prereqs {my ($self,$features)=@_;$features ||= [];my$prereq=CPAN::Meta::Prereqs->new($self->prereqs);return$prereq unless @$features;my@other=map {;$self->feature($_)->prereqs}@$features;return$prereq->with_merged_prereqs(\@other)}sub should_index_file {my ($self,$filename)=@_;for my$no_index_file (@{$self->no_index->{file}|| []}){return if$filename eq $no_index_file}for my$no_index_dir (@{$self->no_index->{directory}}){$no_index_dir =~ s{$}{/} unless$no_index_dir =~ m{/\z};return if index($filename,$no_index_dir)==0}return 1}sub should_index_package {my ($self,$package)=@_;for my$no_index_pkg (@{$self->no_index->{package}|| []}){return if$package eq $no_index_pkg}for my$no_index_ns (@{$self->no_index->{namespace}}){return if index($package,"${no_index_ns}::")==0}return 1}sub features {my ($self)=@_;my$opt_f=$self->optional_features;my@features=map {;CPAN::Meta::Feature->new($_=>$opt_f->{$_ })}keys %$opt_f;return@features}sub feature {my ($self,$ident)=@_;croak "no feature named $ident" unless my$f=$self->optional_features->{$ident };return CPAN::Meta::Feature->new($ident,$f)}sub as_struct {my ($self,$options)=@_;my$struct=_dclone($self);if ($options->{version}){my$cmc=CPAN::Meta::Converter->new($struct);$struct=$cmc->convert(version=>$options->{version})}return$struct}sub as_string {my ($self,$options)=@_;my$version=$options->{version}|| '2';my$struct;if ($self->meta_spec_version ne $version){my$cmc=CPAN::Meta::Converter->new($self->as_struct);$struct=$cmc->convert(version=>$version)}else {$struct=$self->as_struct}my ($data,$backend);if ($version ge '2'){$backend=Parse::CPAN::Meta->json_backend();local$struct->{x_serialization_backend}=sprintf '%s version %s',$backend,$backend->VERSION;$data=$backend->new->pretty->canonical->encode($struct)}else {$backend=Parse::CPAN::Meta->yaml_backend();local$struct->{x_serialization_backend}=sprintf '%s version %s',$backend,$backend->VERSION;$data=eval {no strict 'refs';&{"$backend\::Dump"}($struct)};if ($@){croak$backend->can('errstr')? $backend->errstr : $@}}return$data}sub TO_JSON {return {%{$_[0]}}}1;
CPAN_META
-$fatpacked{"CPAN/Meta/Check.pm"} = <<'CPAN_META_CHECK';
- package CPAN::Meta::Check;{$CPAN::Meta::Check::VERSION='0.007'}use strict;use warnings;use Exporter 5.57 'import';our@EXPORT=qw//;our@EXPORT_OK=qw/check_requirements requirements_for verify_dependencies/;our%EXPORT_TAGS=(all=>[@EXPORT,@EXPORT_OK ]);use CPAN::Meta::Requirements 2.120920;use Module::Metadata;sub _check_dep {my ($reqs,$module,$dirs)=@_;my$version=$module eq 'perl' ? $] : do {my$metadata=Module::Metadata->new_from_module($module,inc=>$dirs);return "Module '$module' is not installed" if not defined$metadata;eval {$metadata->version}};return "Missing version info for module '$module'" if$reqs->requirements_for_module($module)and not $version;return sprintf 'Installed version (%s) of %s is not in range \'%s\'',$version,$module,$reqs->requirements_for_module($module)if not $reqs->accepts_module($module,$version || 0);return}sub _check_conflict {my ($reqs,$module,$dirs)=@_;my$metadata=Module::Metadata->new_from_module($module,inc=>$dirs);return if not defined$metadata;my$version=eval {$metadata->version};return "Missing version info for module '$module'" if not $version;return sprintf 'Installed version (%s) of %s is in range \'%s\'',$version,$module,$reqs->requirements_for_module($module)if$reqs->accepts_module($module,$version);return}sub requirements_for {my ($meta,$phases,$type)=@_;my$prereqs=ref($meta)eq 'CPAN::Meta' ? $meta->effective_prereqs : $meta;if (!ref$phases){return$prereqs->requirements_for($phases,$type)}else {my$ret=CPAN::Meta::Requirements->new;for my$phase (@{$phases}){$ret->add_requirements($prereqs->requirements_for($phase,$type))}return$ret}}sub check_requirements {my ($reqs,$type,$dirs)=@_;my%ret;if ($type ne 'conflicts'){for my$module ($reqs->required_modules){$ret{$module}=_check_dep($reqs,$module,$dirs)}}else {for my$module ($reqs->required_modules){$ret{$module}=_check_conflict($reqs,$module,$dirs)}}return \%ret}sub verify_dependencies {my ($meta,$phases,$type,$dirs)=@_;my$reqs=requirements_for($meta,$phases,$type);my$issues=check_requirements($reqs,$type,$dirs);return grep {defined}values %{$issues}}1;
+$fatpacked{"CPAN/Meta/Check.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_CHECK';
+ package CPAN::Meta::Check;$CPAN::Meta::Check::VERSION='0.012';use strict;use warnings;use base 'Exporter';our@EXPORT=qw//;our@EXPORT_OK=qw/check_requirements requirements_for verify_dependencies/;our%EXPORT_TAGS=(all=>[@EXPORT,@EXPORT_OK ]);use CPAN::Meta::Prereqs '2.132830';use CPAN::Meta::Requirements 2.121;use Module::Metadata 1.000023;sub _check_dep {my ($reqs,$module,$dirs)=@_;$module eq 'perl' and return ($reqs->accepts_module($module,$])? (): sprintf "Your Perl (%s) is not in the range '%s'",$],$reqs->requirements_for_module($module));my$metadata=Module::Metadata->new_from_module($module,inc=>$dirs);return "Module '$module' is not installed" if not defined$metadata;my$version=eval {$metadata->version};return "Missing version info for module '$module'" if$reqs->requirements_for_module($module)and not $version;return sprintf 'Installed version (%s) of %s is not in range \'%s\'',$version,$module,$reqs->requirements_for_module($module)if not $reqs->accepts_module($module,$version || 0);return}sub _check_conflict {my ($reqs,$module,$dirs)=@_;my$metadata=Module::Metadata->new_from_module($module,inc=>$dirs);return if not defined$metadata;my$version=eval {$metadata->version};return "Missing version info for module '$module'" if not $version;return sprintf 'Installed version (%s) of %s is in range \'%s\'',$version,$module,$reqs->requirements_for_module($module)if$reqs->accepts_module($module,$version);return}sub requirements_for {my ($meta,$phases,$type)=@_;my$prereqs=ref($meta)eq 'CPAN::Meta' ? $meta->effective_prereqs : $meta;return$prereqs->merged_requirements(ref($phases)? $phases : [$phases ],[$type ])}sub check_requirements {my ($reqs,$type,$dirs)=@_;return +{map {$_=>$type ne 'conflicts' ? scalar _check_dep($reqs,$_,$dirs): scalar _check_conflict($reqs,$_,$dirs)}$reqs->required_modules }}sub verify_dependencies {my ($meta,$phases,$type,$dirs)=@_;my$reqs=requirements_for($meta,$phases,$type);my$issues=check_requirements($reqs,$type,$dirs);return grep {defined}values %{$issues}}1;
CPAN_META_CHECK
-$fatpacked{"CPAN/Meta/Converter.pm"} = <<'CPAN_META_CONVERTER';
- use 5.006;use strict;use warnings;package CPAN::Meta::Converter;our$VERSION='2.132510';use CPAN::Meta::Validator;use CPAN::Meta::Requirements;use version 0.88 ();use Parse::CPAN::Meta 1.4400 ();sub _dclone {my$ref=shift;no warnings 'once';local*UNIVERSAL::TO_JSON=sub {return "$_[0]"};my$backend=Parse::CPAN::Meta->json_backend();return$backend->new->utf8->decode($backend->new->utf8->allow_blessed->convert_blessed->encode($ref))}my%known_specs=('2'=>'http://search.cpan.org/perldoc?CPAN::Meta::Spec','1.4'=>'http://module-build.sourceforge.net/META-spec-v1.4.html','1.3'=>'http://module-build.sourceforge.net/META-spec-v1.3.html','1.2'=>'http://module-build.sourceforge.net/META-spec-v1.2.html','1.1'=>'http://module-build.sourceforge.net/META-spec-v1.1.html','1.0'=>'http://module-build.sourceforge.net/META-spec-v1.0.html');my@spec_list=sort {$a <=> $b}keys%known_specs;my ($LOWEST,$HIGHEST)=@spec_list[0,-1];sub _keep {$_[0]}sub _keep_or_one {defined($_[0])? $_[0]: 1}sub _keep_or_zero {defined($_[0])? $_[0]: 0}sub _keep_or_unknown {defined($_[0])&& length($_[0])? $_[0]: "unknown"}sub _generated_by {my$gen=shift;my$sig=__PACKAGE__ ." version " .(__PACKAGE__->VERSION || "<dev>");return$sig unless defined$gen and length$gen;return$gen if$gen =~ /(, )\Q$sig/;return "$gen, $sig"}sub _listify {!defined $_[0]? undef : ref $_[0]eq 'ARRAY' ? $_[0]: [$_[0]]}sub _prefix_custom {my$key=shift;$key =~ s/^(?!x_) # Unless it already starts with x_
+$fatpacked{"CPAN/Meta/Converter.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_CONVERTER';
+ use 5.006;use strict;use warnings;package CPAN::Meta::Converter;our$VERSION='2.150005';use CPAN::Meta::Validator;use CPAN::Meta::Requirements;use Parse::CPAN::Meta 1.4400 ();BEGIN {eval "use version ()";if (my$err=$@){eval "use ExtUtils::MakeMaker::version" or die$err}}*_is_qv=version->can('is_qv')? sub {$_[0]->is_qv}: sub {exists $_[0]->{qv}};sub _dclone {my$ref=shift;no warnings 'once';no warnings 'redefine';local*UNIVERSAL::TO_JSON=sub {"$_[0]"};my$json=Parse::CPAN::Meta->json_backend()->new ->utf8 ->allow_blessed ->convert_blessed;$json->decode($json->encode($ref))}my%known_specs=('2'=>'http://search.cpan.org/perldoc?CPAN::Meta::Spec','1.4'=>'http://module-build.sourceforge.net/META-spec-v1.4.html','1.3'=>'http://module-build.sourceforge.net/META-spec-v1.3.html','1.2'=>'http://module-build.sourceforge.net/META-spec-v1.2.html','1.1'=>'http://module-build.sourceforge.net/META-spec-v1.1.html','1.0'=>'http://module-build.sourceforge.net/META-spec-v1.0.html');my@spec_list=sort {$a <=> $b}keys%known_specs;my ($LOWEST,$HIGHEST)=@spec_list[0,-1];sub _keep {$_[0]}sub _keep_or_one {defined($_[0])? $_[0]: 1}sub _keep_or_zero {defined($_[0])? $_[0]: 0}sub _keep_or_unknown {defined($_[0])&& length($_[0])? $_[0]: "unknown"}sub _generated_by {my$gen=shift;my$sig=__PACKAGE__ ." version " .(__PACKAGE__->VERSION || "<dev>");return$sig unless defined$gen and length$gen;return$gen if$gen =~ /\Q$sig/;return "$gen, $sig"}sub _listify {!defined $_[0]? undef : ref $_[0]eq 'ARRAY' ? $_[0]: [$_[0]]}sub _prefix_custom {my$key=shift;$key =~ s/^(?!x_) # Unless it already starts with x_
(?:x-?)? # Remove leading x- or x (if present)
- /x_/ix;return$key}sub _ucfirst_custom {my$key=shift;$key=ucfirst$key unless$key =~ /[A-Z]/;return$key}sub _no_prefix_ucfirst_custom {my$key=shift;$key =~ s/^x_//;return _ucfirst_custom($key)}sub _change_meta_spec {my ($element,undef,undef,$version)=@_;$element->{version}=$version;$element->{url}=$known_specs{$version};return$element}my@valid_licenses_1=('perl','gpl','apache','artistic','artistic_2','lgpl','bsd','gpl','mit','mozilla','open_source','unrestricted','restrictive','unknown',);my%license_map_1=((map {$_=>$_}@valid_licenses_1),artistic2=>'artistic_2',);sub _license_1 {my ($element)=@_;return 'unknown' unless defined$element;if ($license_map_1{lc$element}){return$license_map_1{lc$element}}return 'unknown'}my@valid_licenses_2=qw(agpl_3 apache_1_1 apache_2_0 artistic_1 artistic_2 bsd freebsd gfdl_1_2 gfdl_1_3 gpl_1 gpl_2 gpl_3 lgpl_2_1 lgpl_3_0 mit mozilla_1_0 mozilla_1_1 openssl perl_5 qpl_1_0 ssleay sun zlib open_source restricted unrestricted unknown);my%license_map_2=((map {$_=>$_}@valid_licenses_2),apache=>'apache_2_0',artistic=>'artistic_1',artistic2=>'artistic_2',gpl=>'open_source',lgpl=>'open_source',mozilla=>'open_source',perl=>'perl_5',restrictive=>'restricted',);sub _license_2 {my ($element)=@_;return ['unknown' ]unless defined$element;$element=[$element ]unless ref$element eq 'ARRAY';my@new_list;for my$lic (@$element){next unless defined$lic;if (my$new=$license_map_2{lc$lic}){push@new_list,$new}}return@new_list ? \@new_list : ['unknown' ]}my%license_downgrade_map=qw(agpl_3 open_source apache_1_1 apache apache_2_0 apache artistic_1 artistic artistic_2 artistic_2 bsd bsd freebsd open_source gfdl_1_2 open_source gfdl_1_3 open_source gpl_1 gpl gpl_2 gpl gpl_3 gpl lgpl_2_1 lgpl lgpl_3_0 lgpl mit mit mozilla_1_0 mozilla mozilla_1_1 mozilla openssl open_source perl_5 perl qpl_1_0 open_source ssleay open_source sun open_source zlib open_source open_source open_source restricted restrictive unrestricted unrestricted unknown unknown);sub _downgrade_license {my ($element)=@_;if (!defined$element){return "unknown"}elsif(ref$element eq 'ARRAY'){if (@$element==1){return$license_downgrade_map{$element->[0]}|| "unknown"}}elsif (!ref$element){return$license_downgrade_map{$element}|| "unknown"}return "unknown"}my$no_index_spec_1_2={'file'=>\&_listify,'dir'=>\&_listify,'package'=>\&_listify,'namespace'=>\&_listify,};my$no_index_spec_1_3={'file'=>\&_listify,'directory'=>\&_listify,'package'=>\&_listify,'namespace'=>\&_listify,};my$no_index_spec_2={'file'=>\&_listify,'directory'=>\&_listify,'package'=>\&_listify,'namespace'=>\&_listify,':custom'=>\&_prefix_custom,};sub _no_index_1_2 {my (undef,undef,$meta)=@_;my$no_index=$meta->{no_index}|| $meta->{private};return unless$no_index;if (!ref$no_index){my$item=$no_index;$no_index={dir=>[$item ],file=>[$item ]}}elsif (ref$no_index eq 'ARRAY'){my$list=$no_index;$no_index={dir=>[@$list ],file=>[@$list ]}}if (exists$no_index->{files}){$no_index->{file}=delete$no_index->{file}}if (exists$no_index->{modules}){$no_index->{module}=delete$no_index->{module}}return _convert($no_index,$no_index_spec_1_2)}sub _no_index_directory {my ($element,$key,$meta,$version)=@_;return unless$element;if (!ref$element){my$item=$element;$element={directory=>[$item ],file=>[$item ]}}elsif (ref$element eq 'ARRAY'){my$list=$element;$element={directory=>[@$list ],file=>[@$list ]}}if (exists$element->{dir}){$element->{directory}=delete$element->{dir}}if (exists$element->{files}){$element->{file}=delete$element->{file}}if (exists$element->{modules}){$element->{module}=delete$element->{module}}my$spec=$version==2 ? $no_index_spec_2 : $no_index_spec_1_3;return _convert($element,$spec)}sub _is_module_name {my$mod=shift;return unless defined$mod && length$mod;return$mod =~ m{^[A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z0-9_]+)*$}}sub _clean_version {my ($element)=@_;return 0 if!defined$element;$element =~ s{^\s*}{};$element =~ s{\s*$}{};$element =~ s{^\.}{0.};return 0 if!length$element;return 0 if ($element eq 'undef' || $element eq '<undef>');my$v=eval {version->new($element)};if (defined$v){return$v->is_qv ? $v->normal : $element}else {return 0}}sub _bad_version_hook {my ($v)=@_;$v =~ s{[a-z]+$}{};my$vobj=eval {version->parse($v)};return defined($vobj)? $vobj : version->parse(0)}sub _version_map {my ($element)=@_;return unless defined$element;if (ref$element eq 'HASH'){my$new_map=CPAN::Meta::Requirements->new({bad_version_hook=>sub {version->new(0)}});while (my ($k,$v)=each %$element){next unless _is_module_name($k);if (!defined($v)||!length($v)|| $v eq 'undef' || $v eq '<undef>'){$v=0}if (_is_module_name($v)&&!version::is_lax($v)){$new_map->add_minimum($k=>0);$new_map->add_minimum($v=>0)}$new_map->add_string_requirement($k=>$v)}return$new_map->as_string_hash}elsif (ref$element eq 'ARRAY'){my$hashref={map {$_=>0}@$element };return _version_map($hashref)}elsif (ref$element eq '' && length$element){return {$element=>0 }}return}sub _prereqs_from_1 {my (undef,undef,$meta)=@_;my$prereqs={};for my$phase (qw/build configure/){my$key="${phase}_requires";$prereqs->{$phase}{requires}=_version_map($meta->{$key})if$meta->{$key}}for my$rel (qw/requires recommends conflicts/){$prereqs->{runtime}{$rel}=_version_map($meta->{$rel})if$meta->{$rel}}return$prereqs}my$prereqs_spec={configure=>\&_prereqs_rel,build=>\&_prereqs_rel,test=>\&_prereqs_rel,runtime=>\&_prereqs_rel,develop=>\&_prereqs_rel,':custom'=>\&_prefix_custom,};my$relation_spec={requires=>\&_version_map,recommends=>\&_version_map,suggests=>\&_version_map,conflicts=>\&_version_map,':custom'=>\&_prefix_custom,};sub _cleanup_prereqs {my ($prereqs,$key,$meta,$to_version)=@_;return unless$prereqs && ref$prereqs eq 'HASH';return _convert($prereqs,$prereqs_spec,$to_version)}sub _prereqs_rel {my ($relation,$key,$meta,$to_version)=@_;return unless$relation && ref$relation eq 'HASH';return _convert($relation,$relation_spec,$to_version)}BEGIN {my@old_prereqs=qw(requires configure_requires recommends conflicts);for (@old_prereqs){my$sub="_get_$_";my ($phase,$type)=split qr/_/,$_;if (!defined$type){$type=$phase;$phase='runtime'}no strict 'refs';*{$sub}=sub {_extract_prereqs($_[2]->{prereqs},$phase,$type)}}}sub _get_build_requires {my ($data,$key,$meta)=@_;my$test_h=_extract_prereqs($_[2]->{prereqs},qw(test requires))|| {};my$build_h=_extract_prereqs($_[2]->{prereqs},qw(build requires))|| {};my$test_req=CPAN::Meta::Requirements->from_string_hash($test_h);my$build_req=CPAN::Meta::Requirements->from_string_hash($build_h);$test_req->add_requirements($build_req)->as_string_hash}sub _extract_prereqs {my ($prereqs,$phase,$type)=@_;return unless ref$prereqs eq 'HASH';return scalar _version_map($prereqs->{$phase}{$type})}sub _downgrade_optional_features {my (undef,undef,$meta)=@_;return unless exists$meta->{optional_features};my$origin=$meta->{optional_features};my$features={};for my$name (keys %$origin){$features->{$name}={description=>$origin->{$name}{description},requires=>_extract_prereqs($origin->{$name}{prereqs},'runtime','requires'),configure_requires=>_extract_prereqs($origin->{$name}{prereqs},'runtime','configure_requires'),build_requires=>_extract_prereqs($origin->{$name}{prereqs},'runtime','build_requires'),recommends=>_extract_prereqs($origin->{$name}{prereqs},'runtime','recommends'),conflicts=>_extract_prereqs($origin->{$name}{prereqs},'runtime','conflicts'),};for my$k (keys %{$features->{$name}}){delete$features->{$name}{$k}unless defined$features->{$name}{$k}}}return$features}sub _upgrade_optional_features {my (undef,undef,$meta)=@_;return unless exists$meta->{optional_features};my$origin=$meta->{optional_features};my$features={};for my$name (keys %$origin){$features->{$name}={description=>$origin->{$name}{description},prereqs=>_prereqs_from_1(undef,undef,$origin->{$name}),};delete$features->{$name}{prereqs}{configure}}return$features}my$optional_features_2_spec={description=>\&_keep,prereqs=>\&_cleanup_prereqs,':custom'=>\&_prefix_custom,};sub _feature_2 {my ($element,$key,$meta,$to_version)=@_;return unless$element && ref$element eq 'HASH';_convert($element,$optional_features_2_spec,$to_version)}sub _cleanup_optional_features_2 {my ($element,$key,$meta,$to_version)=@_;return unless$element && ref$element eq 'HASH';my$new_data={};for my$k (keys %$element){$new_data->{$k}=_feature_2($element->{$k},$k,$meta,$to_version)}return unless keys %$new_data;return$new_data}sub _optional_features_1_4 {my ($element)=@_;return unless$element;$element=_optional_features_as_map($element);for my$name (keys %$element){for my$drop (qw/requires_packages requires_os excluded_os/){delete$element->{$name}{$drop}}}return$element}sub _optional_features_as_map {my ($element)=@_;return unless$element;if (ref$element eq 'ARRAY'){my%map;for my$feature (@$element){my (@parts)=%$feature;$map{$parts[0]}=$parts[1]}$element=\%map}return$element}sub _is_urlish {defined $_[0]&& $_[0]=~ m{\A[-+.a-z0-9]+:.+}i}sub _url_or_drop {my ($element)=@_;return$element if _is_urlish($element);return}sub _url_list {my ($element)=@_;return unless$element;$element=_listify($element);$element=[grep {_is_urlish($_)}@$element ];return unless @$element;return$element}sub _author_list {my ($element)=@_;return ['unknown' ]unless$element;$element=_listify($element);$element=[map {defined $_ && length $_ ? $_ : 'unknown'}@$element ];return ['unknown' ]unless @$element;return$element}my$resource2_upgrade={license=>sub {return _is_urlish($_[0])? _listify($_[0]): undef},homepage=>\&_url_or_drop,bugtracker=>sub {my ($item)=@_;return unless$item;if ($item =~ m{^mailto:(.*)$}){return {mailto=>$1 }}elsif(_is_urlish($item)){return {web=>$item }}else {return}},repository=>sub {return _is_urlish($_[0])? {url=>$_[0]}: undef},':custom'=>\&_prefix_custom,};sub _upgrade_resources_2 {my (undef,undef,$meta,$version)=@_;return unless exists$meta->{resources};return _convert($meta->{resources},$resource2_upgrade)}my$bugtracker2_spec={web=>\&_url_or_drop,mailto=>\&_keep,':custom'=>\&_prefix_custom,};sub _repo_type {my ($element,$key,$meta,$to_version)=@_;return$element if defined$element;return unless exists$meta->{url};my$repo_url=$meta->{url};for my$type (qw/git svn/){return$type if$repo_url =~ m{\A$type}}return}my$repository2_spec={web=>\&_url_or_drop,url=>\&_url_or_drop,type=>\&_repo_type,':custom'=>\&_prefix_custom,};my$resources2_cleanup={license=>\&_url_list,homepage=>\&_url_or_drop,bugtracker=>sub {ref $_[0]? _convert($_[0],$bugtracker2_spec): undef},repository=>sub {my$data=shift;ref$data ? _convert($data,$repository2_spec): undef},':custom'=>\&_prefix_custom,};sub _cleanup_resources_2 {my ($resources,$key,$meta,$to_version)=@_;return unless$resources && ref$resources eq 'HASH';return _convert($resources,$resources2_cleanup,$to_version)}my$resource1_spec={license=>\&_url_or_drop,homepage=>\&_url_or_drop,bugtracker=>\&_url_or_drop,repository=>\&_url_or_drop,':custom'=>\&_keep,};sub _resources_1_3 {my (undef,undef,$meta,$version)=@_;return unless exists$meta->{resources};return _convert($meta->{resources},$resource1_spec)}*_resources_1_4=*_resources_1_3;sub _resources_1_2 {my (undef,undef,$meta)=@_;my$resources=$meta->{resources}|| {};if ($meta->{license_url}&&!$resources->{license}){$resources->{license}=$meta->license_url if _is_urlish($meta->{license_url})}return unless keys %$resources;return _convert($resources,$resource1_spec)}my$resource_downgrade_spec={license=>sub {return ref $_[0]? $_[0]->[0]: $_[0]},homepage=>\&_url_or_drop,bugtracker=>sub {return $_[0]->{web}},repository=>sub {return $_[0]->{url}|| $_[0]->{web}},':custom'=>\&_no_prefix_ucfirst_custom,};sub _downgrade_resources {my (undef,undef,$meta,$version)=@_;return unless exists$meta->{resources};return _convert($meta->{resources},$resource_downgrade_spec)}sub _release_status {my ($element,undef,$meta)=@_;return$element if$element && $element =~ m{\A(?:stable|testing|unstable)\z};return _release_status_from_version(undef,undef,$meta)}sub _release_status_from_version {my (undef,undef,$meta)=@_;my$version=$meta->{version}|| '';return ($version =~ /_/)? 'testing' : 'stable'}my$provides_spec={file=>\&_keep,version=>\&_keep,};my$provides_spec_2={file=>\&_keep,version=>\&_keep,':custom'=>\&_prefix_custom,};sub _provides {my ($element,$key,$meta,$to_version)=@_;return unless defined$element && ref$element eq 'HASH';my$spec=$to_version==2 ? $provides_spec_2 : $provides_spec;my$new_data={};for my$k (keys %$element){$new_data->{$k}=_convert($element->{$k},$spec,$to_version);$new_data->{$k}{version}=_clean_version($element->{$k}{version})if exists$element->{$k}{version}}return$new_data}sub _convert {my ($data,$spec,$to_version)=@_;my$new_data={};for my$key (keys %$spec){next if$key eq ':custom' || $key eq ':drop';next unless my$fcn=$spec->{$key};die "spec for '$key' is not a coderef" unless ref$fcn && ref$fcn eq 'CODE';my$new_value=$fcn->($data->{$key},$key,$data,$to_version);$new_data->{$key}=$new_value if defined$new_value}my$drop_list=$spec->{':drop'};my$customizer=$spec->{':custom'}|| \&_keep;for my$key (keys %$data){next if$drop_list && grep {$key eq $_}@$drop_list;next if exists$spec->{$key};$new_data->{$customizer->($key)}=$data->{$key}}return$new_data}my%up_convert=('2-from-1.4'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_2,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'release_status'=>\&_release_status_from_version,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_upgrade_optional_features,'provides'=>\&_provides,'resources'=>\&_upgrade_resources_2,'description'=>\&_keep,'prereqs'=>\&_prereqs_from_1,':drop'=>[qw(build_requires configure_requires conflicts distribution_type license_url private recommends requires) ],':custom'=>\&_prefix_custom,},'1.4-from-1.3'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_1_4,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_4,'configure_requires'=>\&_keep,':drop'=>[qw(license_url private)],':custom'=>\&_keep },'1.3-from-1.2'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':drop'=>[qw(license_url private)],':custom'=>\&_keep },'1.2-from-1.1'=>{'version'=>\&_keep,'license'=>\&_license_1,'name'=>\&_keep,'generated_by'=>\&_generated_by,'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'recommends'=>\&_version_map,'requires'=>\&_version_map,'keywords'=>\&_keep,'no_index'=>\&_no_index_1_2,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'resources'=>\&_resources_1_2,':drop'=>[qw(license_url private)],':custom'=>\&_keep },'1.1-from-1.0'=>{'version'=>\&_keep,'name'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,'license_url'=>\&_url_or_drop,'private'=>\&_keep,':custom'=>\&_keep },);my%down_convert=('1.4-from-2'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_downgrade_license,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_get_build_requires,'configure_requires'=>\&_get_configure_requires,'conflicts'=>\&_get_conflicts,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_downgrade_optional_features,'provides'=>\&_provides,'recommends'=>\&_get_recommends,'requires'=>\&_get_requires,'resources'=>\&_downgrade_resources,':drop'=>[qw(description prereqs release_status)],':custom'=>\&_keep },'1.3-from-1.4'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':drop'=>[qw(configure_requires)],':custom'=>\&_keep,},'1.2-from-1.3'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_1_2,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':custom'=>\&_keep,},'1.1-from-1.2'=>{'version'=>\&_keep,'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'private'=>\&_keep,'recommends'=>\&_version_map,'requires'=>\&_version_map,':drop'=>[qw(abstract author provides no_index keywords resources)],':custom'=>\&_keep,},'1.0-from-1.1'=>{'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,':custom'=>\&_keep,},);my%cleanup=('2'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_2,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'release_status'=>\&_release_status,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_cleanup_optional_features_2,'provides'=>\&_provides,'resources'=>\&_cleanup_resources_2,'description'=>\&_keep,'prereqs'=>\&_cleanup_prereqs,':drop'=>[qw(build_requires configure_requires conflicts distribution_type license_url private recommends requires) ],':custom'=>\&_prefix_custom,},'1.4'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_1_4,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_4,'configure_requires'=>\&_keep,':custom'=>\&_keep },'1.3'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':custom'=>\&_keep },'1.2'=>{'version'=>\&_keep,'license'=>\&_license_1,'name'=>\&_keep,'generated_by'=>\&_generated_by,'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'recommends'=>\&_version_map,'requires'=>\&_version_map,'keywords'=>\&_keep,'no_index'=>\&_no_index_1_2,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'resources'=>\&_resources_1_2,':custom'=>\&_keep },'1.1'=>{'version'=>\&_keep,'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,'license_url'=>\&_url_or_drop,'private'=>\&_keep,':custom'=>\&_keep },'1.0'=>{'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,':custom'=>\&_keep,},);sub new {my ($class,$data)=@_;my$self={'data'=>$data,'spec'=>$data->{'meta-spec'}{'version'}|| "1.0",};return bless$self,$class}sub convert {my ($self,%args)=@_;my$args={%args };my$new_version=$args->{version}|| $HIGHEST;my ($old_version)=$self->{spec};my$converted=_dclone($self->{data});if ($old_version==$new_version){$converted=_convert($converted,$cleanup{$old_version},$old_version);my$cmv=CPAN::Meta::Validator->new($converted);unless ($cmv->is_valid){my$errs=join("\n",$cmv->errors);die "Failed to clean-up $old_version metadata. Errors:\n$errs\n"}return$converted}elsif ($old_version > $new_version){my@vers=sort {$b <=> $a}keys%known_specs;for my$i (0 .. $#vers-1){next if$vers[$i]> $old_version;last if$vers[$i+1]< $new_version;my$spec_string="$vers[$i+1]-from-$vers[$i]";$converted=_convert($converted,$down_convert{$spec_string},$vers[$i+1]);my$cmv=CPAN::Meta::Validator->new($converted);unless ($cmv->is_valid){my$errs=join("\n",$cmv->errors);die "Failed to downconvert metadata to $vers[$i+1]. Errors:\n$errs\n"}}return$converted}else {my@vers=sort {$a <=> $b}keys%known_specs;for my$i (0 .. $#vers-1){next if$vers[$i]< $old_version;last if$vers[$i+1]> $new_version;my$spec_string="$vers[$i+1]-from-$vers[$i]";$converted=_convert($converted,$up_convert{$spec_string},$vers[$i+1]);my$cmv=CPAN::Meta::Validator->new($converted);unless ($cmv->is_valid){my$errs=join("\n",$cmv->errors);die "Failed to upconvert metadata to $vers[$i+1]. Errors:\n$errs\n"}}return$converted}}1;
+ /x_/ix;return$key}sub _ucfirst_custom {my$key=shift;$key=ucfirst$key unless$key =~ /[A-Z]/;return$key}sub _no_prefix_ucfirst_custom {my$key=shift;$key =~ s/^x_//;return _ucfirst_custom($key)}sub _change_meta_spec {my ($element,undef,undef,$version)=@_;return {version=>$version,url=>$known_specs{$version},}}my@open_source=('perl','gpl','apache','artistic','artistic_2','lgpl','bsd','gpl','mit','mozilla','open_source',);my%is_open_source=map {;$_=>1}@open_source;my@valid_licenses_1=(@open_source,'unrestricted','restrictive','unknown',);my%license_map_1=((map {$_=>$_}@valid_licenses_1),artistic2=>'artistic_2',);sub _license_1 {my ($element)=@_;return 'unknown' unless defined$element;if ($license_map_1{lc$element}){return$license_map_1{lc$element}}else {return 'unknown'}}my@valid_licenses_2=qw(agpl_3 apache_1_1 apache_2_0 artistic_1 artistic_2 bsd freebsd gfdl_1_2 gfdl_1_3 gpl_1 gpl_2 gpl_3 lgpl_2_1 lgpl_3_0 mit mozilla_1_0 mozilla_1_1 openssl perl_5 qpl_1_0 ssleay sun zlib open_source restricted unrestricted unknown);my%license_map_2=((map {$_=>$_}@valid_licenses_2),apache=>'apache_2_0',artistic=>'artistic_1',artistic2=>'artistic_2',gpl=>'open_source',lgpl=>'open_source',mozilla=>'open_source',perl=>'perl_5',restrictive=>'restricted',);sub _license_2 {my ($element)=@_;return ['unknown' ]unless defined$element;$element=[$element ]unless ref$element eq 'ARRAY';my@new_list;for my$lic (@$element){next unless defined$lic;if (my$new=$license_map_2{lc$lic}){push@new_list,$new}}return@new_list ? \@new_list : ['unknown' ]}my%license_downgrade_map=qw(agpl_3 open_source apache_1_1 apache apache_2_0 apache artistic_1 artistic artistic_2 artistic_2 bsd bsd freebsd open_source gfdl_1_2 open_source gfdl_1_3 open_source gpl_1 gpl gpl_2 gpl gpl_3 gpl lgpl_2_1 lgpl lgpl_3_0 lgpl mit mit mozilla_1_0 mozilla mozilla_1_1 mozilla openssl open_source perl_5 perl qpl_1_0 open_source ssleay open_source sun open_source zlib open_source open_source open_source restricted restrictive unrestricted unrestricted unknown unknown);sub _downgrade_license {my ($element)=@_;if (!defined$element){return "unknown"}elsif(ref$element eq 'ARRAY'){if (@$element > 1){if (grep {!$is_open_source{$license_downgrade_map{lc $_}|| 'unknown' }}@$element){return 'unknown'}else {return 'open_source'}}elsif (@$element==1){return$license_downgrade_map{lc$element->[0]}|| "unknown"}}elsif (!ref$element){return$license_downgrade_map{lc$element}|| "unknown"}return "unknown"}my$no_index_spec_1_2={'file'=>\&_listify,'dir'=>\&_listify,'package'=>\&_listify,'namespace'=>\&_listify,};my$no_index_spec_1_3={'file'=>\&_listify,'directory'=>\&_listify,'package'=>\&_listify,'namespace'=>\&_listify,};my$no_index_spec_2={'file'=>\&_listify,'directory'=>\&_listify,'package'=>\&_listify,'namespace'=>\&_listify,':custom'=>\&_prefix_custom,};sub _no_index_1_2 {my (undef,undef,$meta)=@_;my$no_index=$meta->{no_index}|| $meta->{private};return unless$no_index;if (!ref$no_index){my$item=$no_index;$no_index={dir=>[$item ],file=>[$item ]}}elsif (ref$no_index eq 'ARRAY'){my$list=$no_index;$no_index={dir=>[@$list ],file=>[@$list ]}}if (exists$no_index->{files}){$no_index->{file}=delete$no_index->{files}}if (exists$no_index->{modules}){$no_index->{module}=delete$no_index->{modules}}return _convert($no_index,$no_index_spec_1_2)}sub _no_index_directory {my ($element,$key,$meta,$version)=@_;return unless$element;if (!ref$element){my$item=$element;$element={directory=>[$item ],file=>[$item ]}}elsif (ref$element eq 'ARRAY'){my$list=$element;$element={directory=>[@$list ],file=>[@$list ]}}if (exists$element->{dir}){$element->{directory}=delete$element->{dir}}if (exists$element->{files}){$element->{file}=delete$element->{files}}if (exists$element->{modules}){$element->{module}=delete$element->{modules}}my$spec=$version==2 ? $no_index_spec_2 : $no_index_spec_1_3;return _convert($element,$spec)}sub _is_module_name {my$mod=shift;return unless defined$mod && length$mod;return$mod =~ m{^[A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z0-9_]+)*$}}sub _clean_version {my ($element)=@_;return 0 if!defined$element;$element =~ s{^\s*}{};$element =~ s{\s*$}{};$element =~ s{^\.}{0.};return 0 if!length$element;return 0 if ($element eq 'undef' || $element eq '<undef>');my$v=eval {version->new($element)};if (defined$v){return _is_qv($v)? $v->normal : $element}else {return 0}}sub _bad_version_hook {my ($v)=@_;$v =~ s{^\s*}{};$v =~ s{\s*$}{};$v =~ s{[a-z]+$}{};my$vobj=eval {version->new($v)};return defined($vobj)? $vobj : version->new(0)}sub _version_map {my ($element)=@_;return unless defined$element;if (ref$element eq 'HASH'){my$new_map=CPAN::Meta::Requirements->new({bad_version_hook=>\&_bad_version_hook });while (my ($k,$v)=each %$element){next unless _is_module_name($k);if (!defined($v)||!length($v)|| $v eq 'undef' || $v eq '<undef>'){$v=0}if (_is_module_name($v)&&!version::is_lax($v)){$new_map->add_minimum($k=>0);$new_map->add_minimum($v=>0)}$new_map->add_string_requirement($k=>$v)}return$new_map->as_string_hash}elsif (ref$element eq 'ARRAY'){my$hashref={map {$_=>0}@$element };return _version_map($hashref)}elsif (ref$element eq '' && length$element){return {$element=>0 }}return}sub _prereqs_from_1 {my (undef,undef,$meta)=@_;my$prereqs={};for my$phase (qw/build configure/){my$key="${phase}_requires";$prereqs->{$phase}{requires}=_version_map($meta->{$key})if$meta->{$key}}for my$rel (qw/requires recommends conflicts/){$prereqs->{runtime}{$rel}=_version_map($meta->{$rel})if$meta->{$rel}}return$prereqs}my$prereqs_spec={configure=>\&_prereqs_rel,build=>\&_prereqs_rel,test=>\&_prereqs_rel,runtime=>\&_prereqs_rel,develop=>\&_prereqs_rel,':custom'=>\&_prefix_custom,};my$relation_spec={requires=>\&_version_map,recommends=>\&_version_map,suggests=>\&_version_map,conflicts=>\&_version_map,':custom'=>\&_prefix_custom,};sub _cleanup_prereqs {my ($prereqs,$key,$meta,$to_version)=@_;return unless$prereqs && ref$prereqs eq 'HASH';return _convert($prereqs,$prereqs_spec,$to_version)}sub _prereqs_rel {my ($relation,$key,$meta,$to_version)=@_;return unless$relation && ref$relation eq 'HASH';return _convert($relation,$relation_spec,$to_version)}BEGIN {my@old_prereqs=qw(requires configure_requires recommends conflicts);for (@old_prereqs){my$sub="_get_$_";my ($phase,$type)=split qr/_/,$_;if (!defined$type){$type=$phase;$phase='runtime'}no strict 'refs';*{$sub}=sub {_extract_prereqs($_[2]->{prereqs},$phase,$type)}}}sub _get_build_requires {my ($data,$key,$meta)=@_;my$test_h=_extract_prereqs($_[2]->{prereqs},qw(test requires))|| {};my$build_h=_extract_prereqs($_[2]->{prereqs},qw(build requires))|| {};my$test_req=CPAN::Meta::Requirements->from_string_hash($test_h);my$build_req=CPAN::Meta::Requirements->from_string_hash($build_h);$test_req->add_requirements($build_req)->as_string_hash}sub _extract_prereqs {my ($prereqs,$phase,$type)=@_;return unless ref$prereqs eq 'HASH';return scalar _version_map($prereqs->{$phase}{$type})}sub _downgrade_optional_features {my (undef,undef,$meta)=@_;return unless exists$meta->{optional_features};my$origin=$meta->{optional_features};my$features={};for my$name (keys %$origin){$features->{$name}={description=>$origin->{$name}{description},requires=>_extract_prereqs($origin->{$name}{prereqs},'runtime','requires'),configure_requires=>_extract_prereqs($origin->{$name}{prereqs},'runtime','configure_requires'),build_requires=>_extract_prereqs($origin->{$name}{prereqs},'runtime','build_requires'),recommends=>_extract_prereqs($origin->{$name}{prereqs},'runtime','recommends'),conflicts=>_extract_prereqs($origin->{$name}{prereqs},'runtime','conflicts'),};for my$k (keys %{$features->{$name}}){delete$features->{$name}{$k}unless defined$features->{$name}{$k}}}return$features}sub _upgrade_optional_features {my (undef,undef,$meta)=@_;return unless exists$meta->{optional_features};my$origin=$meta->{optional_features};my$features={};for my$name (keys %$origin){$features->{$name}={description=>$origin->{$name}{description},prereqs=>_prereqs_from_1(undef,undef,$origin->{$name}),};delete$features->{$name}{prereqs}{configure}}return$features}my$optional_features_2_spec={description=>\&_keep,prereqs=>\&_cleanup_prereqs,':custom'=>\&_prefix_custom,};sub _feature_2 {my ($element,$key,$meta,$to_version)=@_;return unless$element && ref$element eq 'HASH';_convert($element,$optional_features_2_spec,$to_version)}sub _cleanup_optional_features_2 {my ($element,$key,$meta,$to_version)=@_;return unless$element && ref$element eq 'HASH';my$new_data={};for my$k (keys %$element){$new_data->{$k}=_feature_2($element->{$k},$k,$meta,$to_version)}return unless keys %$new_data;return$new_data}sub _optional_features_1_4 {my ($element)=@_;return unless$element;$element=_optional_features_as_map($element);for my$name (keys %$element){for my$drop (qw/requires_packages requires_os excluded_os/){delete$element->{$name}{$drop}}}return$element}sub _optional_features_as_map {my ($element)=@_;return unless$element;if (ref$element eq 'ARRAY'){my%map;for my$feature (@$element){my (@parts)=%$feature;$map{$parts[0]}=$parts[1]}$element=\%map}return$element}sub _is_urlish {defined $_[0]&& $_[0]=~ m{\A[-+.a-z0-9]+:.+}i}sub _url_or_drop {my ($element)=@_;return$element if _is_urlish($element);return}sub _url_list {my ($element)=@_;return unless$element;$element=_listify($element);$element=[grep {_is_urlish($_)}@$element ];return unless @$element;return$element}sub _author_list {my ($element)=@_;return ['unknown' ]unless$element;$element=_listify($element);$element=[map {defined $_ && length $_ ? $_ : 'unknown'}@$element ];return ['unknown' ]unless @$element;return$element}my$resource2_upgrade={license=>sub {return _is_urlish($_[0])? _listify($_[0]): undef},homepage=>\&_url_or_drop,bugtracker=>sub {my ($item)=@_;return unless$item;if ($item =~ m{^mailto:(.*)$}){return {mailto=>$1 }}elsif(_is_urlish($item)){return {web=>$item }}else {return}},repository=>sub {return _is_urlish($_[0])? {url=>$_[0]}: undef},':custom'=>\&_prefix_custom,};sub _upgrade_resources_2 {my (undef,undef,$meta,$version)=@_;return unless exists$meta->{resources};return _convert($meta->{resources},$resource2_upgrade)}my$bugtracker2_spec={web=>\&_url_or_drop,mailto=>\&_keep,':custom'=>\&_prefix_custom,};sub _repo_type {my ($element,$key,$meta,$to_version)=@_;return$element if defined$element;return unless exists$meta->{url};my$repo_url=$meta->{url};for my$type (qw/git svn/){return$type if$repo_url =~ m{\A$type}}return}my$repository2_spec={web=>\&_url_or_drop,url=>\&_url_or_drop,type=>\&_repo_type,':custom'=>\&_prefix_custom,};my$resources2_cleanup={license=>\&_url_list,homepage=>\&_url_or_drop,bugtracker=>sub {ref $_[0]? _convert($_[0],$bugtracker2_spec): undef},repository=>sub {my$data=shift;ref$data ? _convert($data,$repository2_spec): undef},':custom'=>\&_prefix_custom,};sub _cleanup_resources_2 {my ($resources,$key,$meta,$to_version)=@_;return unless$resources && ref$resources eq 'HASH';return _convert($resources,$resources2_cleanup,$to_version)}my$resource1_spec={license=>\&_url_or_drop,homepage=>\&_url_or_drop,bugtracker=>\&_url_or_drop,repository=>\&_url_or_drop,':custom'=>\&_keep,};sub _resources_1_3 {my (undef,undef,$meta,$version)=@_;return unless exists$meta->{resources};return _convert($meta->{resources},$resource1_spec)}*_resources_1_4=*_resources_1_3;sub _resources_1_2 {my (undef,undef,$meta)=@_;my$resources=$meta->{resources}|| {};if ($meta->{license_url}&&!$resources->{license}){$resources->{license}=$meta->{license_url}if _is_urlish($meta->{license_url})}return unless keys %$resources;return _convert($resources,$resource1_spec)}my$resource_downgrade_spec={license=>sub {return ref $_[0]? $_[0]->[0]: $_[0]},homepage=>\&_url_or_drop,bugtracker=>sub {return $_[0]->{web}},repository=>sub {return $_[0]->{url}|| $_[0]->{web}},':custom'=>\&_no_prefix_ucfirst_custom,};sub _downgrade_resources {my (undef,undef,$meta,$version)=@_;return unless exists$meta->{resources};return _convert($meta->{resources},$resource_downgrade_spec)}sub _release_status {my ($element,undef,$meta)=@_;return$element if$element && $element =~ m{\A(?:stable|testing|unstable)\z};return _release_status_from_version(undef,undef,$meta)}sub _release_status_from_version {my (undef,undef,$meta)=@_;my$version=$meta->{version}|| '';return ($version =~ /_/)? 'testing' : 'stable'}my$provides_spec={file=>\&_keep,version=>\&_keep,};my$provides_spec_2={file=>\&_keep,version=>\&_keep,':custom'=>\&_prefix_custom,};sub _provides {my ($element,$key,$meta,$to_version)=@_;return unless defined$element && ref$element eq 'HASH';my$spec=$to_version==2 ? $provides_spec_2 : $provides_spec;my$new_data={};for my$k (keys %$element){$new_data->{$k}=_convert($element->{$k},$spec,$to_version);$new_data->{$k}{version}=_clean_version($element->{$k}{version})if exists$element->{$k}{version}}return$new_data}sub _convert {my ($data,$spec,$to_version,$is_fragment)=@_;my$new_data={};for my$key (keys %$spec){next if$key eq ':custom' || $key eq ':drop';next unless my$fcn=$spec->{$key};if ($is_fragment && $key eq 'generated_by'){$fcn=\&_keep}die "spec for '$key' is not a coderef" unless ref$fcn && ref$fcn eq 'CODE';my$new_value=$fcn->($data->{$key},$key,$data,$to_version);$new_data->{$key}=$new_value if defined$new_value}my$drop_list=$spec->{':drop'};my$customizer=$spec->{':custom'}|| \&_keep;for my$key (keys %$data){next if$drop_list && grep {$key eq $_}@$drop_list;next if exists$spec->{$key};$new_data->{$customizer->($key)}=$data->{$key}}return$new_data}my%up_convert=('2-from-1.4'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_2,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'release_status'=>\&_release_status,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_upgrade_optional_features,'provides'=>\&_provides,'resources'=>\&_upgrade_resources_2,'description'=>\&_keep,'prereqs'=>\&_prereqs_from_1,':drop'=>[qw(build_requires configure_requires conflicts distribution_type license_url private recommends requires) ],':custom'=>\&_prefix_custom,},'1.4-from-1.3'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_1_4,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_4,'configure_requires'=>\&_keep,':drop'=>[qw(license_url private)],':custom'=>\&_keep },'1.3-from-1.2'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':drop'=>[qw(license_url private)],':custom'=>\&_keep },'1.2-from-1.1'=>{'version'=>\&_keep,'license'=>\&_license_1,'name'=>\&_keep,'generated_by'=>\&_generated_by,'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'recommends'=>\&_version_map,'requires'=>\&_version_map,'keywords'=>\&_keep,'no_index'=>\&_no_index_1_2,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'resources'=>\&_resources_1_2,':drop'=>[qw(license_url private)],':custom'=>\&_keep },'1.1-from-1.0'=>{'version'=>\&_keep,'name'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,'license_url'=>\&_url_or_drop,'private'=>\&_keep,':custom'=>\&_keep },);my%down_convert=('1.4-from-2'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_downgrade_license,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_get_build_requires,'configure_requires'=>\&_get_configure_requires,'conflicts'=>\&_get_conflicts,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_downgrade_optional_features,'provides'=>\&_provides,'recommends'=>\&_get_recommends,'requires'=>\&_get_requires,'resources'=>\&_downgrade_resources,':drop'=>[qw(description prereqs release_status)],':custom'=>\&_keep },'1.3-from-1.4'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':drop'=>[qw(configure_requires)],':custom'=>\&_keep,},'1.2-from-1.3'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_1_2,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':custom'=>\&_keep,},'1.1-from-1.2'=>{'version'=>\&_keep,'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'private'=>\&_keep,'recommends'=>\&_version_map,'requires'=>\&_version_map,':drop'=>[qw(abstract author provides no_index keywords resources)],':custom'=>\&_keep,},'1.0-from-1.1'=>{'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,':custom'=>\&_keep,},);my%cleanup=('2'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_2,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'release_status'=>\&_release_status,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_cleanup_optional_features_2,'provides'=>\&_provides,'resources'=>\&_cleanup_resources_2,'description'=>\&_keep,'prereqs'=>\&_cleanup_prereqs,':drop'=>[qw(build_requires configure_requires conflicts distribution_type license_url private recommends requires) ],':custom'=>\&_prefix_custom,},'1.4'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_1_4,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_4,'configure_requires'=>\&_keep,':custom'=>\&_keep },'1.3'=>{'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'meta-spec'=>\&_change_meta_spec,'name'=>\&_keep,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'keywords'=>\&_keep,'no_index'=>\&_no_index_directory,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'recommends'=>\&_version_map,'requires'=>\&_version_map,'resources'=>\&_resources_1_3,':custom'=>\&_keep },'1.2'=>{'version'=>\&_keep,'license'=>\&_license_1,'name'=>\&_keep,'generated_by'=>\&_generated_by,'abstract'=>\&_keep_or_unknown,'author'=>\&_author_list,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'recommends'=>\&_version_map,'requires'=>\&_version_map,'keywords'=>\&_keep,'no_index'=>\&_no_index_1_2,'optional_features'=>\&_optional_features_as_map,'provides'=>\&_provides,'resources'=>\&_resources_1_2,':custom'=>\&_keep },'1.1'=>{'version'=>\&_keep,'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,'license_url'=>\&_url_or_drop,'private'=>\&_keep,':custom'=>\&_keep },'1.0'=>{'name'=>\&_keep,'meta-spec'=>\&_change_meta_spec,'version'=>\&_keep,'build_requires'=>\&_version_map,'conflicts'=>\&_version_map,'distribution_type'=>\&_keep,'dynamic_config'=>\&_keep_or_one,'generated_by'=>\&_generated_by,'license'=>\&_license_1,'recommends'=>\&_version_map,'requires'=>\&_version_map,':custom'=>\&_keep,},);my%fragments_generate=('2'=>{'abstract'=>'abstract','author'=>'author','generated_by'=>'generated_by','license'=>'license','name'=>'name','version'=>'version','dynamic_config'=>'dynamic_config','release_status'=>'release_status','keywords'=>'keywords','no_index'=>'no_index','optional_features'=>'optional_features','provides'=>'provides','resources'=>'resources','description'=>'description','prereqs'=>'prereqs',},'1.4'=>{'abstract'=>'abstract','author'=>'author','generated_by'=>'generated_by','license'=>'license','name'=>'name','version'=>'version','build_requires'=>'prereqs','conflicts'=>'prereqs','distribution_type'=>'distribution_type','dynamic_config'=>'dynamic_config','keywords'=>'keywords','no_index'=>'no_index','optional_features'=>'optional_features','provides'=>'provides','recommends'=>'prereqs','requires'=>'prereqs','resources'=>'resources','configure_requires'=>'prereqs',},);$fragments_generate{$_}=$fragments_generate{'1.4'}for qw/1.3 1.2 1.1 1.0/;sub new {my ($class,$data,%args)=@_;my$self={'data'=>$data,'spec'=>_extract_spec_version($data,$args{default_version}),};return bless$self,$class}sub _extract_spec_version {my ($data,$default)=@_;my$spec=$data->{'meta-spec'};return($default || "1.0")unless defined$spec && ref$spec eq 'HASH';my$v=$spec->{version};if (defined$v && $v =~ /^\d+(?:\.\d+)?$/){return$v if defined$v && grep {$v eq $_}keys%known_specs;return$v+0 if defined$v && grep {$v==$_}keys%known_specs}return "2" if exists$data->{prereqs};return "1.4" if exists$data->{configure_requires};return($default || "1.2")}sub convert {my ($self,%args)=@_;my$args={%args };my$new_version=$args->{version}|| $HIGHEST;my$is_fragment=$args->{is_fragment};my ($old_version)=$self->{spec};my$converted=_dclone($self->{data});if ($old_version==$new_version){$converted=_convert($converted,$cleanup{$old_version},$old_version,$is_fragment);unless ($args->{is_fragment}){my$cmv=CPAN::Meta::Validator->new($converted);unless ($cmv->is_valid){my$errs=join("\n",$cmv->errors);die "Failed to clean-up $old_version metadata. Errors:\n$errs\n"}}return$converted}elsif ($old_version > $new_version){my@vers=sort {$b <=> $a}keys%known_specs;for my$i (0 .. $#vers-1){next if$vers[$i]> $old_version;last if$vers[$i+1]< $new_version;my$spec_string="$vers[$i+1]-from-$vers[$i]";$converted=_convert($converted,$down_convert{$spec_string},$vers[$i+1],$is_fragment);unless ($args->{is_fragment}){my$cmv=CPAN::Meta::Validator->new($converted);unless ($cmv->is_valid){my$errs=join("\n",$cmv->errors);die "Failed to downconvert metadata to $vers[$i+1]. Errors:\n$errs\n"}}}return$converted}else {my@vers=sort {$a <=> $b}keys%known_specs;for my$i (0 .. $#vers-1){next if$vers[$i]< $old_version;last if$vers[$i+1]> $new_version;my$spec_string="$vers[$i+1]-from-$vers[$i]";$converted=_convert($converted,$up_convert{$spec_string},$vers[$i+1],$is_fragment);unless ($args->{is_fragment}){my$cmv=CPAN::Meta::Validator->new($converted);unless ($cmv->is_valid){my$errs=join("\n",$cmv->errors);die "Failed to upconvert metadata to $vers[$i+1]. Errors:\n$errs\n"}}}return$converted}}sub upgrade_fragment {my ($self)=@_;my ($old_version)=$self->{spec};my%expected=map {;$_=>1}grep {defined}map {$fragments_generate{$old_version}{$_}}keys %{$self->{data}};my$converted=$self->convert(version=>$HIGHEST,is_fragment=>1);for my$key (keys %$converted){next if$key =~ /^x_/i || $key eq 'meta-spec';delete$converted->{$key}unless$expected{$key}}return$converted}1;
CPAN_META_CONVERTER
-$fatpacked{"CPAN/Meta/Feature.pm"} = <<'CPAN_META_FEATURE';
- use 5.006;use strict;use warnings;package CPAN::Meta::Feature;our$VERSION='2.132510';use CPAN::Meta::Prereqs;sub new {my ($class,$identifier,$spec)=@_;my%guts=(identifier=>$identifier,description=>$spec->{description},prereqs=>CPAN::Meta::Prereqs->new($spec->{prereqs}),);bless \%guts=>$class}sub identifier {$_[0]{identifier}}sub description {$_[0]{description}}sub prereqs {$_[0]{prereqs}}1;
+$fatpacked{"CPAN/Meta/Feature.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_FEATURE';
+ use 5.006;use strict;use warnings;package CPAN::Meta::Feature;our$VERSION='2.150005';use CPAN::Meta::Prereqs;sub new {my ($class,$identifier,$spec)=@_;my%guts=(identifier=>$identifier,description=>$spec->{description},prereqs=>CPAN::Meta::Prereqs->new($spec->{prereqs}),);bless \%guts=>$class}sub identifier {$_[0]{identifier}}sub description {$_[0]{description}}sub prereqs {$_[0]{prereqs}}1;
CPAN_META_FEATURE
-$fatpacked{"CPAN/Meta/History.pm"} = <<'CPAN_META_HISTORY';
- use 5.006;use strict;use warnings;package CPAN::Meta::History;our$VERSION='2.132510';1;
+$fatpacked{"CPAN/Meta/History.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_HISTORY';
+ use 5.006;use strict;use warnings;package CPAN::Meta::History;our$VERSION='2.150005';1;
CPAN_META_HISTORY
-$fatpacked{"CPAN/Meta/Prereqs.pm"} = <<'CPAN_META_PREREQS';
- use 5.006;use strict;use warnings;package CPAN::Meta::Prereqs;our$VERSION='2.132510';use Carp qw(confess);use Scalar::Util qw(blessed);use CPAN::Meta::Requirements 2.121;sub __legal_phases {qw(configure build test runtime develop)}sub __legal_types {qw(requires recommends suggests conflicts)}sub new {my ($class,$prereq_spec)=@_;$prereq_spec ||={};my%is_legal_phase=map {;$_=>1}$class->__legal_phases;my%is_legal_type=map {;$_=>1}$class->__legal_types;my%guts;PHASE: for my$phase (keys %$prereq_spec){next PHASE unless$phase =~ /\Ax_/i or $is_legal_phase{$phase};my$phase_spec=$prereq_spec->{$phase };next PHASE unless keys %$phase_spec;TYPE: for my$type (keys %$phase_spec){next TYPE unless$type =~ /\Ax_/i or $is_legal_type{$type};my$spec=$phase_spec->{$type };next TYPE unless keys %$spec;$guts{prereqs}{$phase}{$type}=CPAN::Meta::Requirements->from_string_hash($spec)}}return bless \%guts=>$class}sub requirements_for {my ($self,$phase,$type)=@_;confess "requirements_for called without phase" unless defined$phase;confess "requirements_for called without type" unless defined$type;unless ($phase =~ /\Ax_/i or grep {$phase eq $_}$self->__legal_phases){confess "requested requirements for unknown phase: $phase"}unless ($type =~ /\Ax_/i or grep {$type eq $_}$self->__legal_types){confess "requested requirements for unknown type: $type"}my$req=($self->{prereqs}{$phase}{$type}||=CPAN::Meta::Requirements->new);$req->finalize if$self->is_finalized;return$req}sub with_merged_prereqs {my ($self,$other)=@_;my@other=blessed($other)? $other : @$other;my@prereq_objs=($self,@other);my%new_arg;for my$phase ($self->__legal_phases){for my$type ($self->__legal_types){my$req=CPAN::Meta::Requirements->new;for my$prereq (@prereq_objs){my$this_req=$prereq->requirements_for($phase,$type);next unless$this_req->required_modules;$req->add_requirements($this_req)}next unless$req->required_modules;$new_arg{$phase }{$type }=$req->as_string_hash}}return (ref$self)->new(\%new_arg)}sub as_string_hash {my ($self)=@_;my%hash;for my$phase ($self->__legal_phases){for my$type ($self->__legal_types){my$req=$self->requirements_for($phase,$type);next unless$req->required_modules;$hash{$phase }{$type }=$req->as_string_hash}}return \%hash}sub is_finalized {$_[0]{finalized}}sub finalize {my ($self)=@_;$self->{finalized}=1;for my$phase (keys %{$self->{prereqs}}){$_->finalize for values %{$self->{prereqs}{$phase}}}}sub clone {my ($self)=@_;my$clone=(ref$self)->new($self->as_string_hash)}1;
+$fatpacked{"CPAN/Meta/Merge.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_MERGE';
+ use strict;use warnings;package CPAN::Meta::Merge;our$VERSION='2.150005';use Carp qw/croak/;use Scalar::Util qw/blessed/;use CPAN::Meta::Converter 2.141170;sub _is_identical {my ($left,$right)=@_;return (not defined$left and not defined$right)|| (defined$left and defined$right and $left eq $right)}sub _identical {my ($left,$right,$path)=@_;croak sprintf "Can't merge attribute %s: '%s' does not equal '%s'",join('.',@{$path}),$left,$right unless _is_identical($left,$right);return$left}sub _merge {my ($current,$next,$mergers,$path)=@_;for my$key (keys %{$next}){if (not exists$current->{$key}){$current->{$key}=$next->{$key}}elsif (my$merger=$mergers->{$key}){$current->{$key}=$merger->($current->{$key},$next->{$key},[@{$path},$key ])}elsif ($merger=$mergers->{':default'}){$current->{$key}=$merger->($current->{$key},$next->{$key},[@{$path},$key ])}else {croak sprintf "Can't merge unknown attribute '%s'",join '.',@{$path},$key}}return$current}sub _uniq {my%seen=();return grep {not $seen{$_}++}@_}sub _set_addition {my ($left,$right)=@_;return [+_uniq(@{$left},@{$right})]}sub _uniq_map {my ($left,$right,$path)=@_;for my$key (keys %{$right}){if (not exists$left->{$key}){$left->{$key}=$right->{$key}}elsif (_is_identical($left->{$key},$right->{$key})){1}elsif (ref$left->{$key}eq 'HASH' and ref$right->{$key}eq 'HASH'){$left->{$key}=_uniq_map($left->{$key},$right->{$key},[@{$path},$key ])}else {croak 'Duplication of element ' .join '.',@{$path},$key}}return$left}sub _improvize {my ($left,$right,$path)=@_;my ($name)=reverse @{$path};if ($name =~ /^x_/){if (ref($left)eq 'ARRAY'){return _set_addition($left,$right,$path)}elsif (ref($left)eq 'HASH'){return _uniq_map($left,$right,$path)}else {return _identical($left,$right,$path)}}croak sprintf "Can't merge '%s'",join '.',@{$path}}sub _optional_features {my ($left,$right,$path)=@_;for my$key (keys %{$right}){if (not exists$left->{$key}){$left->{$key}=$right->{$key}}else {for my$subkey (keys %{$right->{$key}}){next if$subkey eq 'prereqs';if (not exists$left->{$key}{$subkey}){$left->{$key}{$subkey}=$right->{$key}{$subkey}}else {Carp::croak "Cannot merge two optional_features named '$key' with different '$subkey' values" if do {no warnings 'uninitialized';$left->{$key}{$subkey}ne $right->{$key}{$subkey}}}}require CPAN::Meta::Prereqs;$left->{$key}{prereqs}=CPAN::Meta::Prereqs->new($left->{$key}{prereqs})->with_merged_prereqs(CPAN::Meta::Prereqs->new($right->{$key}{prereqs}))->as_string_hash}}return$left}my%default=(abstract=>\&_identical,author=>\&_set_addition,dynamic_config=>sub {my ($left,$right)=@_;return$left || $right},generated_by=>sub {my ($left,$right)=@_;return join ', ',_uniq(split(/, /,$left),split(/, /,$right))},license=>\&_set_addition,'meta-spec'=>{version=>\&_identical,url=>\&_identical },name=>\&_identical,release_status=>\&_identical,version=>\&_identical,description=>\&_identical,keywords=>\&_set_addition,no_index=>{map {($_=>\&_set_addition)}qw/file directory package namespace/ },optional_features=>\&_optional_features,prereqs=>sub {require CPAN::Meta::Prereqs;my ($left,$right)=map {CPAN::Meta::Prereqs->new($_)}@_[0,1];return$left->with_merged_prereqs($right)->as_string_hash},provides=>\&_uniq_map,resources=>{license=>\&_set_addition,homepage=>\&_identical,bugtracker=>\&_uniq_map,repository=>\&_uniq_map,':default'=>\&_improvize,},':default'=>\&_improvize,);sub new {my ($class,%arguments)=@_;croak 'default version required' if not exists$arguments{default_version};my%mapping=%default;my%extra=%{$arguments{extra_mappings}|| {}};for my$key (keys%extra){if (ref($mapping{$key})eq 'HASH'){$mapping{$key}={%{$mapping{$key}},%{$extra{$key}}}}else {$mapping{$key}=$extra{$key}}}return bless {default_version=>$arguments{default_version},mapping=>_coerce_mapping(\%mapping,[]),},$class}my%coderef_for=(set_addition=>\&_set_addition,uniq_map=>\&_uniq_map,identical=>\&_identical,improvize=>\&_improvize,);sub _coerce_mapping {my ($orig,$map_path)=@_;my%ret;for my$key (keys %{$orig}){my$value=$orig->{$key};if (ref($orig->{$key})eq 'CODE'){$ret{$key}=$value}elsif (ref($value)eq 'HASH'){my$mapping=_coerce_mapping($value,[@{$map_path},$key ]);$ret{$key}=sub {my ($left,$right,$path)=@_;return _merge($left,$right,$mapping,[@{$path}])}}elsif ($coderef_for{$value}){$ret{$key}=$coderef_for{$value}}else {croak "Don't know what to do with " .join '.',@{$map_path},$key}}return \%ret}sub merge {my ($self,@items)=@_;my$current={};for my$next (@items){if (blessed($next)&& $next->isa('CPAN::Meta')){$next=$next->as_struct}elsif (ref($next)eq 'HASH'){my$cmc=CPAN::Meta::Converter->new($next,default_version=>$self->{default_version});$next=$cmc->upgrade_fragment}else {croak "Don't know how to merge '$next'"}$current=_merge($current,$next,$self->{mapping},[])}return$current}1;
+CPAN_META_MERGE
+
+$fatpacked{"CPAN/Meta/Prereqs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_PREREQS';
+ use 5.006;use strict;use warnings;package CPAN::Meta::Prereqs;our$VERSION='2.150005';use Carp qw(confess);use Scalar::Util qw(blessed);use CPAN::Meta::Requirements 2.121;sub __legal_phases {qw(configure build test runtime develop)}sub __legal_types {qw(requires recommends suggests conflicts)}sub new {my ($class,$prereq_spec)=@_;$prereq_spec ||= {};my%is_legal_phase=map {;$_=>1}$class->__legal_phases;my%is_legal_type=map {;$_=>1}$class->__legal_types;my%guts;PHASE: for my$phase (keys %$prereq_spec){next PHASE unless$phase =~ /\Ax_/i or $is_legal_phase{$phase};my$phase_spec=$prereq_spec->{$phase };next PHASE unless keys %$phase_spec;TYPE: for my$type (keys %$phase_spec){next TYPE unless$type =~ /\Ax_/i or $is_legal_type{$type};my$spec=$phase_spec->{$type };next TYPE unless keys %$spec;$guts{prereqs}{$phase}{$type}=CPAN::Meta::Requirements->from_string_hash($spec)}}return bless \%guts=>$class}sub requirements_for {my ($self,$phase,$type)=@_;confess "requirements_for called without phase" unless defined$phase;confess "requirements_for called without type" unless defined$type;unless ($phase =~ /\Ax_/i or grep {$phase eq $_}$self->__legal_phases){confess "requested requirements for unknown phase: $phase"}unless ($type =~ /\Ax_/i or grep {$type eq $_}$self->__legal_types){confess "requested requirements for unknown type: $type"}my$req=($self->{prereqs}{$phase}{$type}||= CPAN::Meta::Requirements->new);$req->finalize if$self->is_finalized;return$req}sub with_merged_prereqs {my ($self,$other)=@_;my@other=blessed($other)? $other : @$other;my@prereq_objs=($self,@other);my%new_arg;for my$phase ($self->__legal_phases){for my$type ($self->__legal_types){my$req=CPAN::Meta::Requirements->new;for my$prereq (@prereq_objs){my$this_req=$prereq->requirements_for($phase,$type);next unless$this_req->required_modules;$req->add_requirements($this_req)}next unless$req->required_modules;$new_arg{$phase }{$type }=$req->as_string_hash}}return (ref$self)->new(\%new_arg)}sub merged_requirements {my ($self,$phases,$types)=@_;$phases=[qw/runtime build test/]unless defined$phases;$types=[qw/requires recommends/]unless defined$types;confess "merged_requirements phases argument must be an arrayref" unless ref$phases eq 'ARRAY';confess "merged_requirements types argument must be an arrayref" unless ref$types eq 'ARRAY';my$req=CPAN::Meta::Requirements->new;for my$phase (@$phases){unless ($phase =~ /\Ax_/i or grep {$phase eq $_}$self->__legal_phases){confess "requested requirements for unknown phase: $phase"}for my$type (@$types){unless ($type =~ /\Ax_/i or grep {$type eq $_}$self->__legal_types){confess "requested requirements for unknown type: $type"}$req->add_requirements($self->requirements_for($phase,$type))}}$req->finalize if$self->is_finalized;return$req}sub as_string_hash {my ($self)=@_;my%hash;for my$phase ($self->__legal_phases){for my$type ($self->__legal_types){my$req=$self->requirements_for($phase,$type);next unless$req->required_modules;$hash{$phase }{$type }=$req->as_string_hash}}return \%hash}sub is_finalized {$_[0]{finalized}}sub finalize {my ($self)=@_;$self->{finalized}=1;for my$phase (keys %{$self->{prereqs}}){$_->finalize for values %{$self->{prereqs}{$phase}}}}sub clone {my ($self)=@_;my$clone=(ref$self)->new($self->as_string_hash)}1;
CPAN_META_PREREQS
-$fatpacked{"CPAN/Meta/Requirements.pm"} = <<'CPAN_META_REQUIREMENTS';
- use strict;use warnings;package CPAN::Meta::Requirements;our$VERSION='2.123';use Carp ();use Scalar::Util ();use version 0.77 ();my@valid_options=qw(bad_version_hook);sub new {my ($class,$options)=@_;$options ||={};Carp::croak "Argument to $class\->new() must be a hash reference" unless ref$options eq 'HASH';my%self=map {;$_=>$options->{$_}}@valid_options;return bless \%self=>$class}sub _version_object {my ($self,$version)=@_;my$vobj;eval {$vobj=(!defined$version)? version->parse(0): (!Scalar::Util::blessed($version))? version->parse($version): $version};if (my$err=$@){my$hook=$self->{bad_version_hook};$vobj=eval {$hook->($version)}if ref$hook eq 'CODE';unless (Scalar::Util::blessed($vobj)&& $vobj->isa("version")){$err =~ s{ at .* line \d+.*$}{};die "Can't convert '$version': $err"}}if ($vobj =~ m{\A\.}){$vobj=version->parse("0$vobj")}if ($vobj->is_qv){$vobj=version->parse($vobj->normal)}return$vobj}BEGIN {for my$type (qw(minimum maximum exclusion exact_version)){my$method="with_$type";my$to_add=$type eq 'exact_version' ? $type : "add_$type";my$code=sub {my ($self,$name,$version)=@_;$version=$self->_version_object($version);$self->__modify_entry_for($name,$method,$version);return$self};no strict 'refs';*$to_add=$code}}sub add_requirements {my ($self,$req)=@_;for my$module ($req->required_modules){my$modifiers=$req->__entry_for($module)->as_modifiers;for my$modifier (@$modifiers){my ($method,@args)=@$modifier;$self->$method($module=>@args)}}return$self}sub accepts_module {my ($self,$module,$version)=@_;$version=$self->_version_object($version);return 1 unless my$range=$self->__entry_for($module);return$range->_accepts($version)}sub clear_requirement {my ($self,$module)=@_;return$self unless$self->__entry_for($module);Carp::confess("can't clear requirements on finalized requirements")if$self->is_finalized;delete$self->{requirements}{$module };return$self}sub requirements_for_module {my ($self,$module)=@_;my$entry=$self->__entry_for($module);return unless$entry;return$entry->as_string}sub required_modules {keys %{$_[0]{requirements}}}sub clone {my ($self)=@_;my$new=(ref$self)->new;return$new->add_requirements($self)}sub __entry_for {$_[0]{requirements}{$_[1]}}sub __modify_entry_for {my ($self,$name,$method,$version)=@_;my$fin=$self->is_finalized;my$old=$self->__entry_for($name);Carp::confess("can't add new requirements to finalized requirements")if$fin and not $old;my$new=($old || 'CPAN::Meta::Requirements::_Range::Range')->$method($version);Carp::confess("can't modify finalized requirements")if$fin and $old->as_string ne $new->as_string;$self->{requirements}{$name }=$new}sub is_simple {my ($self)=@_;for my$module ($self->required_modules){return if$self->__entry_for($module)->as_string =~ /\s/}return 1}sub is_finalized {$_[0]{finalized}}sub finalize {$_[0]{finalized}=1}sub as_string_hash {my ($self)=@_;my%hash=map {;$_=>$self->{requirements}{$_}->as_string}$self->required_modules;return \%hash}my%methods_for_op=('=='=>[qw(exact_version) ],'!='=>[qw(add_exclusion) ],'>='=>[qw(add_minimum) ],'<='=>[qw(add_maximum) ],'>'=>[qw(add_minimum add_exclusion) ],'<'=>[qw(add_maximum add_exclusion) ],);sub add_string_requirement {my ($self,$module,$req)=@_;Carp::confess("No requirement string provided for $module")unless defined$req && length$req;my@parts=split qr{\s*,\s*},$req;for my$part (@parts){my ($op,$ver)=$part =~ m{\A\s*(==|>=|>|<=|<|!=)\s*(.*)\z};if (!defined$op){$self->add_minimum($module=>$part)}else {Carp::confess("illegal requirement string: $req")unless my$methods=$methods_for_op{$op };$self->$_($module=>$ver)for @$methods}}}sub from_string_hash {my ($class,$hash)=@_;my$self=$class->new;for my$module (keys %$hash){my$req=$hash->{$module};unless (defined$req && length$req){$req=0;Carp::carp("Undefined requirement for $module treated as '0'")}$self->add_string_requirement($module,$req)}return$self}{package CPAN::Meta::Requirements::_Range::Exact;sub _new {bless {version=>$_[1]}=>$_[0]}sub _accepts {return $_[0]{version}==$_[1]}sub as_string {return "== $_[0]{version}"}sub as_modifiers {return [[exact_version=>$_[0]{version}]]}sub _clone {(ref $_[0])->_new(version->new($_[0]{version}))}sub with_exact_version {my ($self,$version)=@_;return$self->_clone if$self->_accepts($version);Carp::confess("illegal requirements: unequal exact version specified")}sub with_minimum {my ($self,$minimum)=@_;return$self->_clone if$self->{version}>= $minimum;Carp::confess("illegal requirements: minimum above exact specification")}sub with_maximum {my ($self,$maximum)=@_;return$self->_clone if$self->{version}<= $maximum;Carp::confess("illegal requirements: maximum below exact specification")}sub with_exclusion {my ($self,$exclusion)=@_;return$self->_clone unless$exclusion==$self->{version};Carp::confess("illegal requirements: excluded exact specification")}}{package CPAN::Meta::Requirements::_Range::Range;sub _self {ref($_[0])? $_[0]: (bless {}=>$_[0])}sub _clone {return (bless {}=>$_[0])unless ref $_[0];my ($s)=@_;my%guts=((exists$s->{minimum}? (minimum=>version->new($s->{minimum})): ()),(exists$s->{maximum}? (maximum=>version->new($s->{maximum})): ()),(exists$s->{exclusions}? (exclusions=>[map {version->new($_)}@{$s->{exclusions}}]): ()),);bless \%guts=>ref($s)}sub as_modifiers {my ($self)=@_;my@mods;push@mods,[add_minimum=>$self->{minimum}]if exists$self->{minimum};push@mods,[add_maximum=>$self->{maximum}]if exists$self->{maximum};push@mods,map {;[add_exclusion=>$_ ]}@{$self->{exclusions}|| []};return \@mods}sub as_string {my ($self)=@_;return 0 if!keys %$self;return "$self->{minimum}" if (keys %$self)==1 and exists$self->{minimum};my@exclusions=@{$self->{exclusions}|| []};my@parts;for my$pair ([qw(>= > minimum) ],[qw(<= < maximum) ],){my ($op,$e_op,$k)=@$pair;if (exists$self->{$k}){my@new_exclusions=grep {$_!=$self->{$k }}@exclusions;if (@new_exclusions==@exclusions){push@parts,"$op $self->{ $k }"}else {push@parts,"$e_op $self->{ $k }";@exclusions=@new_exclusions}}}push@parts,map {;"!= $_"}@exclusions;return join q{, },@parts}sub with_exact_version {my ($self,$version)=@_;$self=$self->_clone;Carp::confess("illegal requirements: exact specification outside of range")unless$self->_accepts($version);return CPAN::Meta::Requirements::_Range::Exact->_new($version)}sub _simplify {my ($self)=@_;if (defined$self->{minimum}and defined$self->{maximum}){if ($self->{minimum}==$self->{maximum}){Carp::confess("illegal requirements: excluded all values")if grep {$_==$self->{minimum}}@{$self->{exclusions}|| []};return CPAN::Meta::Requirements::_Range::Exact->_new($self->{minimum})}Carp::confess("illegal requirements: minimum exceeds maximum")if$self->{minimum}> $self->{maximum}}if ($self->{exclusions}){my%seen;@{$self->{exclusions}}=grep {(!defined$self->{minimum}or $_ >= $self->{minimum})and (!defined$self->{maximum}or $_ <= $self->{maximum})and !$seen{$_}++}@{$self->{exclusions}}}return$self}sub with_minimum {my ($self,$minimum)=@_;$self=$self->_clone;if (defined (my$old_min=$self->{minimum})){$self->{minimum}=(sort {$b cmp $a}($minimum,$old_min))[0]}else {$self->{minimum}=$minimum}return$self->_simplify}sub with_maximum {my ($self,$maximum)=@_;$self=$self->_clone;if (defined (my$old_max=$self->{maximum})){$self->{maximum}=(sort {$a cmp $b}($maximum,$old_max))[0]}else {$self->{maximum}=$maximum}return$self->_simplify}sub with_exclusion {my ($self,$exclusion)=@_;$self=$self->_clone;push @{$self->{exclusions}||=[]},$exclusion;return$self->_simplify}sub _accepts {my ($self,$version)=@_;return if defined$self->{minimum}and $version < $self->{minimum};return if defined$self->{maximum}and $version > $self->{maximum};return if defined$self->{exclusions}and grep {$version==$_}@{$self->{exclusions}};return 1}}1;
+$fatpacked{"CPAN/Meta/Requirements.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_REQUIREMENTS';
+ use strict;use warnings;package CPAN::Meta::Requirements;our$VERSION='2.133';use Carp ();BEGIN {eval "use version ()";if (my$err=$@){eval "use ExtUtils::MakeMaker::version" or die$err}}*_is_qv=version->can('is_qv')? sub {$_[0]->is_qv}: sub {exists $_[0]->{qv}};my$V0=version->new(0);my@valid_options=qw(bad_version_hook);sub new {my ($class,$options)=@_;$options ||= {};Carp::croak "Argument to $class\->new() must be a hash reference" unless ref$options eq 'HASH';my%self=map {;$_=>$options->{$_}}@valid_options;return bless \%self=>$class}sub _find_magic_vstring {my$value=shift;my$tvalue='';require B;my$sv=B::svref_2object(\$value);my$magic=ref($sv)eq 'B::PVMG' ? $sv->MAGIC : undef;while ($magic){if ($magic->TYPE eq 'V'){$tvalue=$magic->PTR;$tvalue =~ s/^v?(.+)$/v$1/;last}else {$magic=$magic->MOREMAGIC}}return$tvalue}sub _isa_version {UNIVERSAL::isa($_[0],'UNIVERSAL')&& $_[0]->isa('version')}sub _version_object {my ($self,$module,$version)=@_;my ($vobj,$err);if (not defined$version or (!ref($version)&& $version eq '0')){return$V0}elsif (ref($version)eq 'version' || _isa_version($version)){$vobj=$version}else {if ($INC{'version/vpp.pm'}|| $INC{'ExtUtils/MakeMaker/version/vpp.pm'}){my$magic=_find_magic_vstring($version);$version=$magic if length$magic}eval {local$SIG{__WARN__}=sub {die "Invalid version: $_[0]"};$vobj=version->new($version)};if (my$err=$@){my$hook=$self->{bad_version_hook};$vobj=eval {$hook->($version,$module)}if ref$hook eq 'CODE';unless (eval {$vobj->isa("version")}){$err =~ s{ at .* line \d+.*$}{};die "Can't convert '$version': $err"}}}if ($vobj =~ m{\A\.}){$vobj=version->new("0$vobj")}if (_is_qv($vobj)){$vobj=version->new($vobj->normal)}return$vobj}BEGIN {for my$type (qw(maximum exclusion exact_version)){my$method="with_$type";my$to_add=$type eq 'exact_version' ? $type : "add_$type";my$code=sub {my ($self,$name,$version)=@_;$version=$self->_version_object($name,$version);$self->__modify_entry_for($name,$method,$version);return$self};no strict 'refs';*$to_add=$code}}sub add_minimum {my ($self,$name,$version)=@_;if (not defined$version or "$version" eq '0'){return$self if$self->__entry_for($name);Carp::confess("can't add new requirements to finalized requirements")if$self->is_finalized;$self->{requirements}{$name }=CPAN::Meta::Requirements::_Range::Range->with_minimum($V0)}else {$version=$self->_version_object($name,$version);$self->__modify_entry_for($name,'with_minimum',$version)}return$self}sub add_requirements {my ($self,$req)=@_;for my$module ($req->required_modules){my$modifiers=$req->__entry_for($module)->as_modifiers;for my$modifier (@$modifiers){my ($method,@args)=@$modifier;$self->$method($module=>@args)}}return$self}sub accepts_module {my ($self,$module,$version)=@_;$version=$self->_version_object($module,$version);return 1 unless my$range=$self->__entry_for($module);return$range->_accepts($version)}sub clear_requirement {my ($self,$module)=@_;return$self unless$self->__entry_for($module);Carp::confess("can't clear requirements on finalized requirements")if$self->is_finalized;delete$self->{requirements}{$module };return$self}sub requirements_for_module {my ($self,$module)=@_;my$entry=$self->__entry_for($module);return unless$entry;return$entry->as_string}sub required_modules {keys %{$_[0]{requirements}}}sub clone {my ($self)=@_;my$new=(ref$self)->new;return$new->add_requirements($self)}sub __entry_for {$_[0]{requirements}{$_[1]}}sub __modify_entry_for {my ($self,$name,$method,$version)=@_;my$fin=$self->is_finalized;my$old=$self->__entry_for($name);Carp::confess("can't add new requirements to finalized requirements")if$fin and not $old;my$new=($old || 'CPAN::Meta::Requirements::_Range::Range')->$method($version);Carp::confess("can't modify finalized requirements")if$fin and $old->as_string ne $new->as_string;$self->{requirements}{$name }=$new}sub is_simple {my ($self)=@_;for my$module ($self->required_modules){return if$self->__entry_for($module)->as_string =~ /\s/}return 1}sub is_finalized {$_[0]{finalized}}sub finalize {$_[0]{finalized}=1}sub as_string_hash {my ($self)=@_;my%hash=map {;$_=>$self->{requirements}{$_}->as_string}$self->required_modules;return \%hash}my%methods_for_op=('=='=>[qw(exact_version) ],'!='=>[qw(add_exclusion) ],'>='=>[qw(add_minimum) ],'<='=>[qw(add_maximum) ],'>'=>[qw(add_minimum add_exclusion) ],'<'=>[qw(add_maximum add_exclusion) ],);sub add_string_requirement {my ($self,$module,$req)=@_;unless (defined$req && length$req){$req=0;$self->_blank_carp($module)}my$magic=_find_magic_vstring($req);if (length$magic){$self->add_minimum($module=>$magic);return}my@parts=split qr{\s*,\s*},$req;for my$part (@parts){my ($op,$ver)=$part =~ m{\A\s*(==|>=|>|<=|<|!=)\s*(.*)\z};if (!defined$op){$self->add_minimum($module=>$part)}else {Carp::confess("illegal requirement string: $req")unless my$methods=$methods_for_op{$op };$self->$_($module=>$ver)for @$methods}}}sub _blank_carp {my ($self,$module)=@_;Carp::carp("Undefined requirement for $module treated as '0'")}sub from_string_hash {my ($class,$hash,$options)=@_;my$self=$class->new($options);for my$module (keys %$hash){my$req=$hash->{$module};unless (defined$req && length$req){$req=0;$class->_blank_carp($module)}$self->add_string_requirement($module,$req)}return$self}{package CPAN::Meta::Requirements::_Range::Exact;sub _new {bless {version=>$_[1]}=>$_[0]}sub _accepts {return $_[0]{version}==$_[1]}sub as_string {return "== $_[0]{version}"}sub as_modifiers {return [[exact_version=>$_[0]{version}]]}sub _clone {(ref $_[0])->_new(version->new($_[0]{version}))}sub with_exact_version {my ($self,$version)=@_;return$self->_clone if$self->_accepts($version);Carp::confess("illegal requirements: unequal exact version specified")}sub with_minimum {my ($self,$minimum)=@_;return$self->_clone if$self->{version}>= $minimum;Carp::confess("illegal requirements: minimum above exact specification")}sub with_maximum {my ($self,$maximum)=@_;return$self->_clone if$self->{version}<= $maximum;Carp::confess("illegal requirements: maximum below exact specification")}sub with_exclusion {my ($self,$exclusion)=@_;return$self->_clone unless$exclusion==$self->{version};Carp::confess("illegal requirements: excluded exact specification")}}{package CPAN::Meta::Requirements::_Range::Range;sub _self {ref($_[0])? $_[0]: (bless {}=>$_[0])}sub _clone {return (bless {}=>$_[0])unless ref $_[0];my ($s)=@_;my%guts=((exists$s->{minimum}? (minimum=>version->new($s->{minimum})): ()),(exists$s->{maximum}? (maximum=>version->new($s->{maximum})): ()),(exists$s->{exclusions}? (exclusions=>[map {version->new($_)}@{$s->{exclusions}}]): ()),);bless \%guts=>ref($s)}sub as_modifiers {my ($self)=@_;my@mods;push@mods,[add_minimum=>$self->{minimum}]if exists$self->{minimum};push@mods,[add_maximum=>$self->{maximum}]if exists$self->{maximum};push@mods,map {;[add_exclusion=>$_ ]}@{$self->{exclusions}|| []};return \@mods}sub as_string {my ($self)=@_;return 0 if!keys %$self;return "$self->{minimum}" if (keys %$self)==1 and exists$self->{minimum};my@exclusions=@{$self->{exclusions}|| []};my@parts;for my$pair ([qw(>= > minimum) ],[qw(<= < maximum) ],){my ($op,$e_op,$k)=@$pair;if (exists$self->{$k}){my@new_exclusions=grep {$_!=$self->{$k }}@exclusions;if (@new_exclusions==@exclusions){push@parts,"$op $self->{ $k }"}else {push@parts,"$e_op $self->{ $k }";@exclusions=@new_exclusions}}}push@parts,map {;"!= $_"}@exclusions;return join q{, },@parts}sub with_exact_version {my ($self,$version)=@_;$self=$self->_clone;Carp::confess("illegal requirements: exact specification outside of range")unless$self->_accepts($version);return CPAN::Meta::Requirements::_Range::Exact->_new($version)}sub _simplify {my ($self)=@_;if (defined$self->{minimum}and defined$self->{maximum}){if ($self->{minimum}==$self->{maximum}){Carp::confess("illegal requirements: excluded all values")if grep {$_==$self->{minimum}}@{$self->{exclusions}|| []};return CPAN::Meta::Requirements::_Range::Exact->_new($self->{minimum})}Carp::confess("illegal requirements: minimum exceeds maximum")if$self->{minimum}> $self->{maximum}}if ($self->{exclusions}){my%seen;@{$self->{exclusions}}=grep {(!defined$self->{minimum}or $_ >= $self->{minimum})and (!defined$self->{maximum}or $_ <= $self->{maximum})and !$seen{$_}++}@{$self->{exclusions}}}return$self}sub with_minimum {my ($self,$minimum)=@_;$self=$self->_clone;if (defined (my$old_min=$self->{minimum})){$self->{minimum}=(sort {$b cmp $a}($minimum,$old_min))[0]}else {$self->{minimum}=$minimum}return$self->_simplify}sub with_maximum {my ($self,$maximum)=@_;$self=$self->_clone;if (defined (my$old_max=$self->{maximum})){$self->{maximum}=(sort {$a cmp $b}($maximum,$old_max))[0]}else {$self->{maximum}=$maximum}return$self->_simplify}sub with_exclusion {my ($self,$exclusion)=@_;$self=$self->_clone;push @{$self->{exclusions}||= []},$exclusion;return$self->_simplify}sub _accepts {my ($self,$version)=@_;return if defined$self->{minimum}and $version < $self->{minimum};return if defined$self->{maximum}and $version > $self->{maximum};return if defined$self->{exclusions}and grep {$version==$_}@{$self->{exclusions}};return 1}}1;
CPAN_META_REQUIREMENTS
-$fatpacked{"CPAN/Meta/Spec.pm"} = <<'CPAN_META_SPEC';
- use 5.006;use strict;use warnings;package CPAN::Meta::Spec;our$VERSION='2.132510';1;
+$fatpacked{"CPAN/Meta/Spec.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_SPEC';
+ use 5.006;use strict;use warnings;package CPAN::Meta::Spec;our$VERSION='2.150005';1;
CPAN_META_SPEC
-$fatpacked{"CPAN/Meta/Validator.pm"} = <<'CPAN_META_VALIDATOR';
- use 5.006;use strict;use warnings;package CPAN::Meta::Validator;our$VERSION='2.132510';my%known_specs=('1.4'=>'http://module-build.sourceforge.net/META-spec-v1.4.html','1.3'=>'http://module-build.sourceforge.net/META-spec-v1.3.html','1.2'=>'http://module-build.sourceforge.net/META-spec-v1.2.html','1.1'=>'http://module-build.sourceforge.net/META-spec-v1.1.html','1.0'=>'http://module-build.sourceforge.net/META-spec-v1.0.html');my%known_urls=map {$known_specs{$_}=>$_}keys%known_specs;my$module_map1={'map'=>{':key'=>{name=>\&module,value=>\&exversion }}};my$module_map2={'map'=>{':key'=>{name=>\&module,value=>\&version }}};my$no_index_2={'map'=>{file=>{list=>{value=>\&string }},directory=>{list=>{value=>\&string }},'package'=>{list=>{value=>\&string }},namespace=>{list=>{value=>\&string }},':key'=>{name=>\&custom_2,value=>\&anything },}};my$no_index_1_3={'map'=>{file=>{list=>{value=>\&string }},directory=>{list=>{value=>\&string }},'package'=>{list=>{value=>\&string }},namespace=>{list=>{value=>\&string }},':key'=>{name=>\&string,value=>\&anything },}};my$no_index_1_2={'map'=>{file=>{list=>{value=>\&string }},dir=>{list=>{value=>\&string }},'package'=>{list=>{value=>\&string }},namespace=>{list=>{value=>\&string }},':key'=>{name=>\&string,value=>\&anything },}};my$no_index_1_1={'map'=>{':key'=>{name=>\&string,list=>{value=>\&string }},}};my$prereq_map={map=>{':key'=>{name=>\&phase,'map'=>{':key'=>{name=>\&relation,%$module_map1,},},}},};my%definitions=('2'=>{'abstract'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,lazylist=>{value=>\&string }},'dynamic_config'=>{mandatory=>1,value=>\&boolean },'generated_by'=>{mandatory=>1,value=>\&string },'license'=>{mandatory=>1,lazylist=>{value=>\&license }},'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{value=>\&url },':key'=>{name=>\&custom_2,value=>\&anything },}},'name'=>{mandatory=>1,value=>\&string },'release_status'=>{mandatory=>1,value=>\&release_status },'version'=>{mandatory=>1,value=>\&version },'description'=>{value=>\&string },'keywords'=>{lazylist=>{value=>\&string }},'no_index'=>$no_index_2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },prereqs=>$prereq_map,':key'=>{name=>\&custom_2,value=>\&anything },}}}},'prereqs'=>$prereq_map,'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&custom_2,value=>\&anything },}}}},'resources'=>{'map'=>{license=>{lazylist=>{value=>\&url }},homepage=>{value=>\&url },bugtracker=>{'map'=>{web=>{value=>\&url },mailto=>{value=>\&string},':key'=>{name=>\&custom_2,value=>\&anything },}},repository=>{'map'=>{web=>{value=>\&url },url=>{value=>\&url },type=>{value=>\&string },':key'=>{name=>\&custom_2,value=>\&anything },}},':key'=>{value=>\&string,name=>\&custom_2 },}},':key'=>{name=>\&custom_2,value=>\&anything },},'1.4'=>{'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{mandatory=>1,value=>\&urlspec },':key'=>{name=>\&string,value=>\&anything },},},'name'=>{mandatory=>1,value=>\&string },'version'=>{mandatory=>1,value=>\&version },'abstract'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'license'=>{mandatory=>1,value=>\&license },'generated_by'=>{mandatory=>1,value=>\&string },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'configure_requires'=>$module_map1,'conflicts'=>$module_map2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },requires=>$module_map1,recommends=>$module_map1,build_requires=>$module_map1,conflicts=>$module_map2,':key'=>{name=>\&string,value=>\&anything },}}}},'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&string,value=>\&anything },}}}},'no_index'=>$no_index_1_3,'private'=>$no_index_1_3,'keywords'=>{list=>{value=>\&string }},'resources'=>{'map'=>{license=>{value=>\&url },homepage=>{value=>\&url },bugtracker=>{value=>\&url },repository=>{value=>\&url },':key'=>{value=>\&string,name=>\&custom_1 },}},':key'=>{name=>\&string,value=>\&anything },},'1.3'=>{'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{mandatory=>1,value=>\&urlspec },':key'=>{name=>\&string,value=>\&anything },},},'name'=>{mandatory=>1,value=>\&string },'version'=>{mandatory=>1,value=>\&version },'abstract'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'license'=>{mandatory=>1,value=>\&license },'generated_by'=>{mandatory=>1,value=>\&string },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },requires=>$module_map1,recommends=>$module_map1,build_requires=>$module_map1,conflicts=>$module_map2,':key'=>{name=>\&string,value=>\&anything },}}}},'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&string,value=>\&anything },}}}},'no_index'=>$no_index_1_3,'private'=>$no_index_1_3,'keywords'=>{list=>{value=>\&string }},'resources'=>{'map'=>{license=>{value=>\&url },homepage=>{value=>\&url },bugtracker=>{value=>\&url },repository=>{value=>\&url },':key'=>{value=>\&string,name=>\&custom_1 },}},':key'=>{name=>\&string,value=>\&anything },},'1.2'=>{'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{mandatory=>1,value=>\&urlspec },':key'=>{name=>\&string,value=>\&anything },},},'name'=>{mandatory=>1,value=>\&string },'version'=>{mandatory=>1,value=>\&version },'license'=>{mandatory=>1,value=>\&license },'generated_by'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'abstract'=>{mandatory=>1,value=>\&string },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'keywords'=>{list=>{value=>\&string }},'private'=>$no_index_1_2,'$no_index'=>$no_index_1_2,'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },requires=>$module_map1,recommends=>$module_map1,build_requires=>$module_map1,conflicts=>$module_map2,':key'=>{name=>\&string,value=>\&anything },}}}},'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&string,value=>\&anything },}}}},'resources'=>{'map'=>{license=>{value=>\&url },homepage=>{value=>\&url },bugtracker=>{value=>\&url },repository=>{value=>\&url },':key'=>{value=>\&string,name=>\&custom_1 },}},':key'=>{name=>\&string,value=>\&anything },},'1.1'=>{'name'=>{value=>\&string },'version'=>{mandatory=>1,value=>\&version },'license'=>{value=>\&license },'generated_by'=>{value=>\&string },'license_uri'=>{value=>\&url },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'private'=>$no_index_1_1,'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,':key'=>{name=>\&string,value=>\&anything },},'1.0'=>{'name'=>{value=>\&string },'version'=>{mandatory=>1,value=>\&version },'license'=>{value=>\&license },'generated_by'=>{value=>\&string },'license_uri'=>{value=>\&url },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,':key'=>{name=>\&string,value=>\&anything },},);sub new {my ($class,$data)=@_;my$self={'data'=>$data,'spec'=>$data->{'meta-spec'}{'version'}|| "1.0",'errors'=>undef,};return bless$self,$class}sub is_valid {my$self=shift;my$data=$self->{data};my$spec_version=$self->{spec};$self->check_map($definitions{$spec_version},$data);return!$self->errors}sub errors {my$self=shift;return ()unless(defined$self->{errors});return @{$self->{errors}}}my$spec_error="Missing validation action in specification. " ."Must be one of 'map', 'list', 'lazylist', or 'value'";sub check_map {my ($self,$spec,$data)=@_;if(ref($spec)ne 'HASH'){$self->_error("Unknown META specification, cannot validate.");return}if(ref($data)ne 'HASH'){$self->_error("Expected a map structure from string or file.");return}for my$key (keys %$spec){next unless($spec->{$key}->{mandatory});next if(defined$data->{$key});push @{$self->{stack}},$key;$self->_error("Missing mandatory field, '$key'");pop @{$self->{stack}}}for my$key (keys %$data){push @{$self->{stack}},$key;if($spec->{$key}){if($spec->{$key}{value}){$spec->{$key}{value}->($self,$key,$data->{$key})}elsif($spec->{$key}{'map'}){$self->check_map($spec->{$key}{'map'},$data->{$key})}elsif($spec->{$key}{'list'}){$self->check_list($spec->{$key}{'list'},$data->{$key})}elsif($spec->{$key}{'lazylist'}){$self->check_lazylist($spec->{$key}{'lazylist'},$data->{$key})}else {$self->_error("$spec_error for '$key'")}}elsif ($spec->{':key'}){$spec->{':key'}{name}->($self,$key,$key);if($spec->{':key'}{value}){$spec->{':key'}{value}->($self,$key,$data->{$key})}elsif($spec->{':key'}{'map'}){$self->check_map($spec->{':key'}{'map'},$data->{$key})}elsif($spec->{':key'}{'list'}){$self->check_list($spec->{':key'}{'list'},$data->{$key})}elsif($spec->{':key'}{'lazylist'}){$self->check_lazylist($spec->{':key'}{'lazylist'},$data->{$key})}else {$self->_error("$spec_error for ':key'")}}else {$self->_error("Unknown key, '$key', found in map structure")}pop @{$self->{stack}}}}sub check_lazylist {my ($self,$spec,$data)=@_;if (defined$data &&!ref($data)){$data=[$data ]}$self->check_list($spec,$data)}sub check_list {my ($self,$spec,$data)=@_;if(ref($data)ne 'ARRAY'){$self->_error("Expected a list structure");return}if(defined$spec->{mandatory}){if(!defined$data->[0]){$self->_error("Missing entries from mandatory list")}}for my$value (@$data){push @{$self->{stack}},$value || "<undef>";if(defined$spec->{value}){$spec->{value}->($self,'list',$value)}elsif(defined$spec->{'map'}){$self->check_map($spec->{'map'},$value)}elsif(defined$spec->{'list'}){$self->check_list($spec->{'list'},$value)}elsif(defined$spec->{'lazylist'}){$self->check_lazylist($spec->{'lazylist'},$value)}elsif ($spec->{':key'}){$self->check_map($spec,$value)}else {$self->_error("$spec_error associated with '$self->{stack}[-2]'")}pop @{$self->{stack}}}}sub header {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value && $value =~ /^--- #YAML:1.0/)}$self->_error("file does not have a valid YAML header.");return 0}sub release_status {my ($self,$key,$value)=@_;if(defined$value){my$version=$self->{data}{version}|| '';if ($version =~ /_/){return 1 if ($value =~ /\A(?:testing|unstable)\z/);$self->_error("'$value' for '$key' is invalid for version '$version'")}else {return 1 if ($value =~ /\A(?:stable|testing|unstable)\z/);$self->_error("'$value' for '$key' is invalid")}}else {$self->_error("'$key' is not defined")}return 0}sub _uri_split {return $_[0]=~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,}sub url {my ($self,$key,$value)=@_;if(defined$value){my ($scheme,$auth,$path,$query,$frag)=_uri_split($value);unless (defined$scheme && length$scheme){$self->_error("'$value' for '$key' does not have a URL scheme");return 0}unless (defined$auth && length$auth){$self->_error("'$value' for '$key' does not have a URL authority");return 0}return 1}$value ||='';$self->_error("'$value' for '$key' is not a valid URL.");return 0}sub urlspec {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value && $known_specs{$self->{spec}}eq $value);if($value && $known_urls{$value}){$self->_error('META specification URL does not match version');return 0}}$self->_error('Unknown META specification');return 0}sub anything {return 1}sub string {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value || $value =~ /^0$/)}$self->_error("value is an undefined string");return 0}sub string_or_undef {my ($self,$key,$value)=@_;return 1 unless(defined$value);return 1 if($value || $value =~ /^0$/);$self->_error("No string defined for '$key'");return 0}sub file {my ($self,$key,$value)=@_;return 1 if(defined$value);$self->_error("No file defined for '$key'");return 0}sub exversion {my ($self,$key,$value)=@_;if(defined$value && ($value || $value =~ /0/)){my$pass=1;for(split(",",$value)){$self->version($key,$_)or ($pass=0)}return$pass}$value='<undef>' unless(defined$value);$self->_error("'$value' for '$key' is not a valid version.");return 0}sub version {my ($self,$key,$value)=@_;if(defined$value){return 0 unless($value || $value =~ /0/);return 1 if($value =~ /^\s*((<|<=|>=|>|!=|==)\s*)?v?\d+((\.\d+((_|\.)\d+)?)?)/)}else {$value='<undef>'}$self->_error("'$value' for '$key' is not a valid version.");return 0}sub boolean {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value =~ /^(0|1|true|false)$/)}else {$value='<undef>'}$self->_error("'$value' for '$key' is not a boolean value.");return 0}my%v1_licenses=('perl'=>'http://dev.perl.org/licenses/','gpl'=>'http://www.opensource.org/licenses/gpl-license.php','apache'=>'http://apache.org/licenses/LICENSE-2.0','artistic'=>'http://opensource.org/licenses/artistic-license.php','artistic_2'=>'http://opensource.org/licenses/artistic-license-2.0.php','lgpl'=>'http://www.opensource.org/licenses/lgpl-license.php','bsd'=>'http://www.opensource.org/licenses/bsd-license.php','gpl'=>'http://www.opensource.org/licenses/gpl-license.php','mit'=>'http://opensource.org/licenses/mit-license.php','mozilla'=>'http://opensource.org/licenses/mozilla1.1.php','open_source'=>undef,'unrestricted'=>undef,'restrictive'=>undef,'unknown'=>undef,);my%v2_licenses=map {$_=>1}qw(agpl_3 apache_1_1 apache_2_0 artistic_1 artistic_2 bsd freebsd gfdl_1_2 gfdl_1_3 gpl_1 gpl_2 gpl_3 lgpl_2_1 lgpl_3_0 mit mozilla_1_0 mozilla_1_1 openssl perl_5 qpl_1_0 ssleay sun zlib open_source restricted unrestricted unknown);sub license {my ($self,$key,$value)=@_;my$licenses=$self->{spec}< 2 ? \%v1_licenses : \%v2_licenses;if(defined$value){return 1 if($value && exists$licenses->{$value})}else {$value='<undef>'}$self->_error("License '$value' is invalid");return 0}sub custom_1 {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^[_a-z]+$/i && $key =~ /[A-Z]/)}else {$key='<undef>'}$self->_error("Custom resource '$key' must be in CamelCase.");return 0}sub custom_2 {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^x_/i)}else {$key='<undef>'}$self->_error("Custom key '$key' must begin with 'x_' or 'X_'.");return 0}sub identifier {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^([a-z][_a-z]+)$/i)}else {$key='<undef>'}$self->_error("Key '$key' is not a legal identifier.");return 0}sub module {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^[A-Za-z0-9_]+(::[A-Za-z0-9_]+)*$/)}else {$key='<undef>'}$self->_error("Key '$key' is not a legal module name.");return 0}my@valid_phases=qw/configure build test runtime develop/;sub phase {my ($self,$key)=@_;if(defined$key){return 1 if(length$key && grep {$key eq $_}@valid_phases);return 1 if$key =~ /x_/i}else {$key='<undef>'}$self->_error("Key '$key' is not a legal phase.");return 0}my@valid_relations=qw/requires recommends suggests conflicts/;sub relation {my ($self,$key)=@_;if(defined$key){return 1 if(length$key && grep {$key eq $_}@valid_relations);return 1 if$key =~ /x_/i}else {$key='<undef>'}$self->_error("Key '$key' is not a legal prereq relationship.");return 0}sub _error {my$self=shift;my$mess=shift;$mess .= ' ('.join(' -> ',@{$self->{stack}}).')' if($self->{stack});$mess .= " [Validation: $self->{spec}]";push @{$self->{errors}},$mess}1;
+$fatpacked{"CPAN/Meta/Validator.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_VALIDATOR';
+ use 5.006;use strict;use warnings;package CPAN::Meta::Validator;our$VERSION='2.150005';my%known_specs=('1.4'=>'http://module-build.sourceforge.net/META-spec-v1.4.html','1.3'=>'http://module-build.sourceforge.net/META-spec-v1.3.html','1.2'=>'http://module-build.sourceforge.net/META-spec-v1.2.html','1.1'=>'http://module-build.sourceforge.net/META-spec-v1.1.html','1.0'=>'http://module-build.sourceforge.net/META-spec-v1.0.html');my%known_urls=map {$known_specs{$_}=>$_}keys%known_specs;my$module_map1={'map'=>{':key'=>{name=>\&module,value=>\&exversion }}};my$module_map2={'map'=>{':key'=>{name=>\&module,value=>\&version }}};my$no_index_2={'map'=>{file=>{list=>{value=>\&string }},directory=>{list=>{value=>\&string }},'package'=>{list=>{value=>\&string }},namespace=>{list=>{value=>\&string }},':key'=>{name=>\&custom_2,value=>\&anything },}};my$no_index_1_3={'map'=>{file=>{list=>{value=>\&string }},directory=>{list=>{value=>\&string }},'package'=>{list=>{value=>\&string }},namespace=>{list=>{value=>\&string }},':key'=>{name=>\&string,value=>\&anything },}};my$no_index_1_2={'map'=>{file=>{list=>{value=>\&string }},dir=>{list=>{value=>\&string }},'package'=>{list=>{value=>\&string }},namespace=>{list=>{value=>\&string }},':key'=>{name=>\&string,value=>\&anything },}};my$no_index_1_1={'map'=>{':key'=>{name=>\&string,list=>{value=>\&string }},}};my$prereq_map={map=>{':key'=>{name=>\&phase,'map'=>{':key'=>{name=>\&relation,%$module_map1,},},}},};my%definitions=('2'=>{'abstract'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'dynamic_config'=>{mandatory=>1,value=>\&boolean },'generated_by'=>{mandatory=>1,value=>\&string },'license'=>{mandatory=>1,list=>{value=>\&license }},'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{value=>\&url },':key'=>{name=>\&custom_2,value=>\&anything },}},'name'=>{mandatory=>1,value=>\&string },'release_status'=>{mandatory=>1,value=>\&release_status },'version'=>{mandatory=>1,value=>\&version },'description'=>{value=>\&string },'keywords'=>{list=>{value=>\&string }},'no_index'=>$no_index_2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },prereqs=>$prereq_map,':key'=>{name=>\&custom_2,value=>\&anything },}}}},'prereqs'=>$prereq_map,'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&custom_2,value=>\&anything },}}}},'resources'=>{'map'=>{license=>{list=>{value=>\&url }},homepage=>{value=>\&url },bugtracker=>{'map'=>{web=>{value=>\&url },mailto=>{value=>\&string},':key'=>{name=>\&custom_2,value=>\&anything },}},repository=>{'map'=>{web=>{value=>\&url },url=>{value=>\&url },type=>{value=>\&string },':key'=>{name=>\&custom_2,value=>\&anything },}},':key'=>{value=>\&string,name=>\&custom_2 },}},':key'=>{name=>\&custom_2,value=>\&anything },},'1.4'=>{'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{mandatory=>1,value=>\&urlspec },':key'=>{name=>\&string,value=>\&anything },},},'name'=>{mandatory=>1,value=>\&string },'version'=>{mandatory=>1,value=>\&version },'abstract'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'license'=>{mandatory=>1,value=>\&license },'generated_by'=>{mandatory=>1,value=>\&string },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'configure_requires'=>$module_map1,'conflicts'=>$module_map2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },requires=>$module_map1,recommends=>$module_map1,build_requires=>$module_map1,conflicts=>$module_map2,':key'=>{name=>\&string,value=>\&anything },}}}},'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&string,value=>\&anything },}}}},'no_index'=>$no_index_1_3,'private'=>$no_index_1_3,'keywords'=>{list=>{value=>\&string }},'resources'=>{'map'=>{license=>{value=>\&url },homepage=>{value=>\&url },bugtracker=>{value=>\&url },repository=>{value=>\&url },':key'=>{value=>\&string,name=>\&custom_1 },}},':key'=>{name=>\&string,value=>\&anything },},'1.3'=>{'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{mandatory=>1,value=>\&urlspec },':key'=>{name=>\&string,value=>\&anything },},},'name'=>{mandatory=>1,value=>\&string },'version'=>{mandatory=>1,value=>\&version },'abstract'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'license'=>{mandatory=>1,value=>\&license },'generated_by'=>{mandatory=>1,value=>\&string },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },requires=>$module_map1,recommends=>$module_map1,build_requires=>$module_map1,conflicts=>$module_map2,':key'=>{name=>\&string,value=>\&anything },}}}},'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&string,value=>\&anything },}}}},'no_index'=>$no_index_1_3,'private'=>$no_index_1_3,'keywords'=>{list=>{value=>\&string }},'resources'=>{'map'=>{license=>{value=>\&url },homepage=>{value=>\&url },bugtracker=>{value=>\&url },repository=>{value=>\&url },':key'=>{value=>\&string,name=>\&custom_1 },}},':key'=>{name=>\&string,value=>\&anything },},'1.2'=>{'meta-spec'=>{mandatory=>1,'map'=>{version=>{mandatory=>1,value=>\&version},url=>{mandatory=>1,value=>\&urlspec },':key'=>{name=>\&string,value=>\&anything },},},'name'=>{mandatory=>1,value=>\&string },'version'=>{mandatory=>1,value=>\&version },'license'=>{mandatory=>1,value=>\&license },'generated_by'=>{mandatory=>1,value=>\&string },'author'=>{mandatory=>1,list=>{value=>\&string }},'abstract'=>{mandatory=>1,value=>\&string },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'keywords'=>{list=>{value=>\&string }},'private'=>$no_index_1_2,'$no_index'=>$no_index_1_2,'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,'optional_features'=>{'map'=>{':key'=>{name=>\&string,'map'=>{description=>{value=>\&string },requires=>$module_map1,recommends=>$module_map1,build_requires=>$module_map1,conflicts=>$module_map2,':key'=>{name=>\&string,value=>\&anything },}}}},'provides'=>{'map'=>{':key'=>{name=>\&module,'map'=>{file=>{mandatory=>1,value=>\&file },version=>{value=>\&version },':key'=>{name=>\&string,value=>\&anything },}}}},'resources'=>{'map'=>{license=>{value=>\&url },homepage=>{value=>\&url },bugtracker=>{value=>\&url },repository=>{value=>\&url },':key'=>{value=>\&string,name=>\&custom_1 },}},':key'=>{name=>\&string,value=>\&anything },},'1.1'=>{'name'=>{value=>\&string },'version'=>{mandatory=>1,value=>\&version },'license'=>{value=>\&license },'generated_by'=>{value=>\&string },'license_uri'=>{value=>\&url },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'private'=>$no_index_1_1,'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,':key'=>{name=>\&string,value=>\&anything },},'1.0'=>{'name'=>{value=>\&string },'version'=>{mandatory=>1,value=>\&version },'license'=>{value=>\&license },'generated_by'=>{value=>\&string },'license_uri'=>{value=>\&url },'distribution_type'=>{value=>\&string },'dynamic_config'=>{value=>\&boolean },'requires'=>$module_map1,'recommends'=>$module_map1,'build_requires'=>$module_map1,'conflicts'=>$module_map2,':key'=>{name=>\&string,value=>\&anything },},);sub new {my ($class,$data)=@_;my$self={'data'=>$data,'spec'=>eval {$data->{'meta-spec'}{'version'}}|| "1.0",'errors'=>undef,};return bless$self,$class}sub is_valid {my$self=shift;my$data=$self->{data};my$spec_version=$self->{spec};$self->check_map($definitions{$spec_version},$data);return!$self->errors}sub errors {my$self=shift;return ()unless(defined$self->{errors});return @{$self->{errors}}}my$spec_error="Missing validation action in specification. " ."Must be one of 'map', 'list', or 'value'";sub check_map {my ($self,$spec,$data)=@_;if(ref($spec)ne 'HASH'){$self->_error("Unknown META specification, cannot validate.");return}if(ref($data)ne 'HASH'){$self->_error("Expected a map structure from string or file.");return}for my$key (keys %$spec){next unless($spec->{$key}->{mandatory});next if(defined$data->{$key});push @{$self->{stack}},$key;$self->_error("Missing mandatory field, '$key'");pop @{$self->{stack}}}for my$key (keys %$data){push @{$self->{stack}},$key;if($spec->{$key}){if($spec->{$key}{value}){$spec->{$key}{value}->($self,$key,$data->{$key})}elsif($spec->{$key}{'map'}){$self->check_map($spec->{$key}{'map'},$data->{$key})}elsif($spec->{$key}{'list'}){$self->check_list($spec->{$key}{'list'},$data->{$key})}else {$self->_error("$spec_error for '$key'")}}elsif ($spec->{':key'}){$spec->{':key'}{name}->($self,$key,$key);if($spec->{':key'}{value}){$spec->{':key'}{value}->($self,$key,$data->{$key})}elsif($spec->{':key'}{'map'}){$self->check_map($spec->{':key'}{'map'},$data->{$key})}elsif($spec->{':key'}{'list'}){$self->check_list($spec->{':key'}{'list'},$data->{$key})}else {$self->_error("$spec_error for ':key'")}}else {$self->_error("Unknown key, '$key', found in map structure")}pop @{$self->{stack}}}}sub check_list {my ($self,$spec,$data)=@_;if(ref($data)ne 'ARRAY'){$self->_error("Expected a list structure");return}if(defined$spec->{mandatory}){if(!defined$data->[0]){$self->_error("Missing entries from mandatory list")}}for my$value (@$data){push @{$self->{stack}},$value || "<undef>";if(defined$spec->{value}){$spec->{value}->($self,'list',$value)}elsif(defined$spec->{'map'}){$self->check_map($spec->{'map'},$value)}elsif(defined$spec->{'list'}){$self->check_list($spec->{'list'},$value)}elsif ($spec->{':key'}){$self->check_map($spec,$value)}else {$self->_error("$spec_error associated with '$self->{stack}[-2]'")}pop @{$self->{stack}}}}sub header {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value && $value =~ /^--- #YAML:1.0/)}$self->_error("file does not have a valid YAML header.");return 0}sub release_status {my ($self,$key,$value)=@_;if(defined$value){my$version=$self->{data}{version}|| '';if ($version =~ /_/){return 1 if ($value =~ /\A(?:testing|unstable)\z/);$self->_error("'$value' for '$key' is invalid for version '$version'")}else {return 1 if ($value =~ /\A(?:stable|testing|unstable)\z/);$self->_error("'$value' for '$key' is invalid")}}else {$self->_error("'$key' is not defined")}return 0}sub _uri_split {return $_[0]=~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,}sub url {my ($self,$key,$value)=@_;if(defined$value){my ($scheme,$auth,$path,$query,$frag)=_uri_split($value);unless (defined$scheme && length$scheme){$self->_error("'$value' for '$key' does not have a URL scheme");return 0}unless (defined$auth && length$auth){$self->_error("'$value' for '$key' does not have a URL authority");return 0}return 1}$value ||= '';$self->_error("'$value' for '$key' is not a valid URL.");return 0}sub urlspec {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value && $known_specs{$self->{spec}}eq $value);if($value && $known_urls{$value}){$self->_error('META specification URL does not match version');return 0}}$self->_error('Unknown META specification');return 0}sub anything {return 1}sub string {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value || $value =~ /^0$/)}$self->_error("value is an undefined string");return 0}sub string_or_undef {my ($self,$key,$value)=@_;return 1 unless(defined$value);return 1 if($value || $value =~ /^0$/);$self->_error("No string defined for '$key'");return 0}sub file {my ($self,$key,$value)=@_;return 1 if(defined$value);$self->_error("No file defined for '$key'");return 0}sub exversion {my ($self,$key,$value)=@_;if(defined$value && ($value || $value =~ /0/)){my$pass=1;for(split(",",$value)){$self->version($key,$_)or ($pass=0)}return$pass}$value='<undef>' unless(defined$value);$self->_error("'$value' for '$key' is not a valid version.");return 0}sub version {my ($self,$key,$value)=@_;if(defined$value){return 0 unless($value || $value =~ /0/);return 1 if($value =~ /^\s*((<|<=|>=|>|!=|==)\s*)?v?\d+((\.\d+((_|\.)\d+)?)?)/)}else {$value='<undef>'}$self->_error("'$value' for '$key' is not a valid version.");return 0}sub boolean {my ($self,$key,$value)=@_;if(defined$value){return 1 if($value =~ /^(0|1|true|false)$/)}else {$value='<undef>'}$self->_error("'$value' for '$key' is not a boolean value.");return 0}my%v1_licenses=('perl'=>'http://dev.perl.org/licenses/','gpl'=>'http://www.opensource.org/licenses/gpl-license.php','apache'=>'http://apache.org/licenses/LICENSE-2.0','artistic'=>'http://opensource.org/licenses/artistic-license.php','artistic_2'=>'http://opensource.org/licenses/artistic-license-2.0.php','lgpl'=>'http://www.opensource.org/licenses/lgpl-license.php','bsd'=>'http://www.opensource.org/licenses/bsd-license.php','gpl'=>'http://www.opensource.org/licenses/gpl-license.php','mit'=>'http://opensource.org/licenses/mit-license.php','mozilla'=>'http://opensource.org/licenses/mozilla1.1.php','open_source'=>undef,'unrestricted'=>undef,'restrictive'=>undef,'unknown'=>undef,);my%v2_licenses=map {$_=>1}qw(agpl_3 apache_1_1 apache_2_0 artistic_1 artistic_2 bsd freebsd gfdl_1_2 gfdl_1_3 gpl_1 gpl_2 gpl_3 lgpl_2_1 lgpl_3_0 mit mozilla_1_0 mozilla_1_1 openssl perl_5 qpl_1_0 ssleay sun zlib open_source restricted unrestricted unknown);sub license {my ($self,$key,$value)=@_;my$licenses=$self->{spec}< 2 ? \%v1_licenses : \%v2_licenses;if(defined$value){return 1 if($value && exists$licenses->{$value})}else {$value='<undef>'}$self->_error("License '$value' is invalid");return 0}sub custom_1 {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^[_a-z]+$/i && $key =~ /[A-Z]/)}else {$key='<undef>'}$self->_error("Custom resource '$key' must be in CamelCase.");return 0}sub custom_2 {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^x_/i)}else {$key='<undef>'}$self->_error("Custom key '$key' must begin with 'x_' or 'X_'.");return 0}sub identifier {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^([a-z][_a-z]+)$/i)}else {$key='<undef>'}$self->_error("Key '$key' is not a legal identifier.");return 0}sub module {my ($self,$key)=@_;if(defined$key){return 1 if($key && $key =~ /^[A-Za-z0-9_]+(::[A-Za-z0-9_]+)*$/)}else {$key='<undef>'}$self->_error("Key '$key' is not a legal module name.");return 0}my@valid_phases=qw/configure build test runtime develop/;sub phase {my ($self,$key)=@_;if(defined$key){return 1 if(length$key && grep {$key eq $_}@valid_phases);return 1 if$key =~ /x_/i}else {$key='<undef>'}$self->_error("Key '$key' is not a legal phase.");return 0}my@valid_relations=qw/requires recommends suggests conflicts/;sub relation {my ($self,$key)=@_;if(defined$key){return 1 if(length$key && grep {$key eq $_}@valid_relations);return 1 if$key =~ /x_/i}else {$key='<undef>'}$self->_error("Key '$key' is not a legal prereq relationship.");return 0}sub _error {my$self=shift;my$mess=shift;$mess .= ' ('.join(' -> ',@{$self->{stack}}).')' if($self->{stack});$mess .= " [Validation: $self->{spec}]";push @{$self->{errors}},$mess}1;
CPAN_META_VALIDATOR
-$fatpacked{"CPAN/Meta/YAML.pm"} = <<'CPAN_META_YAML';
- package CPAN::Meta::YAML;{$CPAN::Meta::YAML::VERSION='0.008'}use strict;sub HAVE_UTF8 () {$] >= 5.007003}BEGIN {if (HAVE_UTF8){eval "require utf8;";die "Failed to load UTF-8 support" if $@}require 5.004;require Exporter;require Carp;@CPAN::Meta::YAML::ISA=qw{Exporter};@CPAN::Meta::YAML::EXPORT=qw{Load Dump};@CPAN::Meta::YAML::EXPORT_OK=qw{LoadFile DumpFile freeze thaw};$CPAN::Meta::YAML::errstr=''}my@UNPRINTABLE=qw(z x01 x02 x03 x04 x05 x06 a x08 t n v f r x0e x0f x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x1a e x1c x1d x1e x1f);my%UNESCAPES=(z=>"\x00",a=>"\x07",t=>"\x09",n=>"\x0a",v=>"\x0b",f=>"\x0c",r=>"\x0d",e=>"\x1b",'\\'=>'\\',);my%QUOTE=map {$_=>1}qw{null Null NULL y Y yes Yes YES n N no No NO true True TRUE false False FALSE on On ON off Off OFF};sub new {my$class=shift;bless [@_ ],$class}sub read {my$class=ref $_[0]? ref shift : shift;my$file=shift or return$class->_error('You did not specify a file name');return$class->_error("File '$file' does not exist")unless -e $file;return$class->_error("'$file' is a directory, not a file")unless -f _;return$class->_error("Insufficient permissions to read '$file'")unless -r _;local $/=undef;local*CFG;unless (open(CFG,$file)){return$class->_error("Failed to open file '$file': $!")}my$contents=<CFG>;unless (close(CFG)){return$class->_error("Failed to close file '$file': $!")}$class->read_string($contents)}sub read_string {my$class=ref $_[0]? ref shift : shift;my$self=bless [],$class;my$string=$_[0];eval {unless (defined$string){die \"Did not provide a string to load"}if ($string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/){die \"Stream has a non UTF-8 BOM"}else {$string =~ s/^\357\273\277//}utf8::decode($string)if HAVE_UTF8;return$self unless length$string;unless ($string =~ /[\012\015]+\z/){die \"Stream does not end with newline character"}my@lines=grep {!/^\s*(?:\#.*)?\z/}split /(?:\015{1,2}\012|\015|\012)/,$string;@lines and $lines[0]=~ /^\%YAML[: ][\d\.]+.*\z/ and shift@lines;while (@lines){if ($lines[0]=~ /^---\s*(?:(.+)\s*)?\z/){shift@lines;if (defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/){push @$self,$self->_read_scalar("$1",[undef ],\@lines);next}}if (!@lines or $lines[0]=~ /^(?:---|\.\.\.)/){push @$self,undef;while (@lines and $lines[0]!~ /^---/){shift@lines}}elsif ($lines[0]=~ /^\s*\-/){my$document=[];push @$self,$document;$self->_read_array($document,[0 ],\@lines)}elsif ($lines[0]=~ /^(\s*)\S/){my$document={};push @$self,$document;$self->_read_hash($document,[length($1)],\@lines)}else {die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"}}};if (ref $@ eq 'SCALAR'){return$self->_error(${$@})}elsif ($@){require Carp;Carp::croak($@)}return$self}sub _read_scalar {my ($self,$string,$indent,$lines)=@_;$string =~ s/\s*\z//;return undef if$string eq '~';if ($string =~ /^\'(.*?)\'(?:\s+\#.*)?\z/){return '' unless defined $1;$string=$1;$string =~ s/\'\'/\'/g;return$string}if ($string =~ /^\"([^\\"]*(?:\\.[^\\"]*)*)\"(?:\s+\#.*)?\z/){$string=$1;$string =~ s/\\"/"/g;$string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex;return$string}if ($string =~ /^[\'\"!&]/){die \"CPAN::Meta::YAML does not support a feature in line '$string'"}return {}if$string =~ /^{}(?:\s+\#.*)?\z/;return []if$string =~ /^\[\](?:\s+\#.*)?\z/;if ($string !~ /^[>|]/){if ($string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or $string =~ /:(?:\s|$)/){die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'"}$string =~ s/\s+#.*\z//;return$string}die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines;$lines->[0]=~ /^(\s*)/;$indent->[-1]=length("$1");if (defined$indent->[-2]and $indent->[-1]<= $indent->[-2]){die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"}my@multiline=();while (@$lines){$lines->[0]=~ /^(\s*)/;last unless length($1)>= $indent->[-1];push@multiline,substr(shift(@$lines),length($1))}my$j=(substr($string,0,1)eq '>')? ' ' : "\n";my$t=(substr($string,1,1)eq '-')? '' : "\n";return join($j,@multiline).$t}sub _read_array {my ($self,$array,$indent,$lines)=@_;while (@$lines){if ($lines->[0]=~ /^(?:---|\.\.\.)/){while (@$lines and $lines->[0]!~ /^---/){shift @$lines}return 1}$lines->[0]=~ /^(\s*)/;if (length($1)< $indent->[-1]){return 1}elsif (length($1)> $indent->[-1]){die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"}if ($lines->[0]=~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/){my$indent2=length("$1");$lines->[0]=~ s/-/ /;push @$array,{};$self->_read_hash($array->[-1],[@$indent,$indent2 ],$lines)}elsif ($lines->[0]=~ /^\s*\-(\s*)(.+?)\s*\z/){shift @$lines;push @$array,$self->_read_scalar("$2",[@$indent,undef ],$lines)}elsif ($lines->[0]=~ /^\s*\-\s*\z/){shift @$lines;unless (@$lines){push @$array,undef;return 1}if ($lines->[0]=~ /^(\s*)\-/){my$indent2=length("$1");if ($indent->[-1]==$indent2){push @$array,undef}else {push @$array,[];$self->_read_array($array->[-1],[@$indent,$indent2 ],$lines)}}elsif ($lines->[0]=~ /^(\s*)\S/){push @$array,{};$self->_read_hash($array->[-1],[@$indent,length("$1")],$lines)}else {die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"}}elsif (defined$indent->[-2]and $indent->[-1]==$indent->[-2]){return 1}else {die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"}}return 1}sub _read_hash {my ($self,$hash,$indent,$lines)=@_;while (@$lines){if ($lines->[0]=~ /^(?:---|\.\.\.)/){while (@$lines and $lines->[0]!~ /^---/){shift @$lines}return 1}$lines->[0]=~ /^(\s*)/;if (length($1)< $indent->[-1]){return 1}elsif (length($1)> $indent->[-1]){die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"}unless ($lines->[0]=~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+(?:\#.*)?|$)//){if ($lines->[0]=~ /^\s*[?\'\"]/){die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"}die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"}my$key=$1;if (length$lines->[0]){$hash->{$key}=$self->_read_scalar(shift(@$lines),[@$indent,undef ],$lines)}else {shift @$lines;unless (@$lines){$hash->{$key}=undef;return 1}if ($lines->[0]=~ /^(\s*)-/){$hash->{$key}=[];$self->_read_array($hash->{$key},[@$indent,length($1)],$lines)}elsif ($lines->[0]=~ /^(\s*)./){my$indent2=length("$1");if ($indent->[-1]>= $indent2){$hash->{$key}=undef}else {$hash->{$key}={};$self->_read_hash($hash->{$key},[@$indent,length($1)],$lines)}}}}return 1}sub write {my$self=shift;my$file=shift or return$self->_error('No file name provided');open(CFG,'>' .$file)or return$self->_error("Failed to open file '$file' for writing: $!");print CFG$self->write_string;close CFG;return 1}sub write_string {my$self=shift;return '' unless @$self;my$indent=0;my@lines=();for my$cursor (@$self){push@lines,'---';if (!defined$cursor){}elsif (!ref$cursor){$lines[-1].= ' ' .$self->_write_scalar($cursor,$indent)}elsif (ref$cursor eq 'ARRAY'){unless (@$cursor){$lines[-1].= ' []';next}push@lines,$self->_write_array($cursor,$indent,{})}elsif (ref$cursor eq 'HASH'){unless (%$cursor){$lines[-1].= ' {}';next}push@lines,$self->_write_hash($cursor,$indent,{})}else {Carp::croak("Cannot serialize " .ref($cursor))}}join '',map {"$_\n"}@lines}sub _write_scalar {my$string=$_[1];return '~' unless defined$string;return "''" unless length$string;if ($string =~ /[\x00-\x08\x0b-\x0d\x0e-\x1f\"\'\n]/){$string =~ s/\\/\\\\/g;$string =~ s/"/\\"/g;$string =~ s/\n/\\n/g;$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;return qq|"$string"|}if ($string =~ /(?:^\W|\s|:\z)/ or $QUOTE{$string}){return "'$string'"}return$string}sub _write_array {my ($self,$array,$indent,$seen)=@_;if ($seen->{refaddr($array)}++){die "CPAN::Meta::YAML does not support circular references"}my@lines=();for my$el (@$array){my$line=(' ' x $indent).'-';my$type=ref$el;if (!$type){$line .= ' ' .$self->_write_scalar($el,$indent + 1);push@lines,$line}elsif ($type eq 'ARRAY'){if (@$el){push@lines,$line;push@lines,$self->_write_array($el,$indent + 1,$seen)}else {$line .= ' []';push@lines,$line}}elsif ($type eq 'HASH'){if (keys %$el){push@lines,$line;push@lines,$self->_write_hash($el,$indent + 1,$seen)}else {$line .= ' {}';push@lines,$line}}else {die "CPAN::Meta::YAML does not support $type references"}}@lines}sub _write_hash {my ($self,$hash,$indent,$seen)=@_;if ($seen->{refaddr($hash)}++){die "CPAN::Meta::YAML does not support circular references"}my@lines=();for my$name (sort keys %$hash){my$el=$hash->{$name};my$line=(' ' x $indent)."$name:";my$type=ref$el;if (!$type){$line .= ' ' .$self->_write_scalar($el,$indent + 1);push@lines,$line}elsif ($type eq 'ARRAY'){if (@$el){push@lines,$line;push@lines,$self->_write_array($el,$indent + 1,$seen)}else {$line .= ' []';push@lines,$line}}elsif ($type eq 'HASH'){if (keys %$el){push@lines,$line;push@lines,$self->_write_hash($el,$indent + 1,$seen)}else {$line .= ' {}';push@lines,$line}}else {die "CPAN::Meta::YAML does not support $type references"}}@lines}sub _error {$CPAN::Meta::YAML::errstr=$_[1];undef}sub errstr {$CPAN::Meta::YAML::errstr}sub Dump {CPAN::Meta::YAML->new(@_)->write_string}sub Load {my$self=CPAN::Meta::YAML->read_string(@_);unless ($self){Carp::croak("Failed to load YAML document from string")}if (wantarray){return @$self}else {return$self->[-1]}}BEGIN {*freeze=*Dump;*thaw=*Load}sub DumpFile {my$file=shift;CPAN::Meta::YAML->new(@_)->write($file)}sub LoadFile {my$self=CPAN::Meta::YAML->read($_[0]);unless ($self){Carp::croak("Failed to load YAML document from '" .($_[0]|| '')."'")}if (wantarray){return @$self}else {return$self->[-1]}}BEGIN {local $@;eval {require Scalar::Util};my$v=eval("$Scalar::Util::VERSION")|| 0;if ($@ or $v < 1.18){eval <<'END_PERL'}else {*refaddr=*Scalar::Util::refaddr}}1;
+$fatpacked{"CPAN/Meta/YAML.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_YAML';
+ use 5.008001;use strict;use warnings;package CPAN::Meta::YAML;$CPAN::Meta::YAML::VERSION='0.016';;use Exporter;our@ISA=qw{Exporter};our@EXPORT=qw{Load Dump};our@EXPORT_OK=qw{LoadFile DumpFile freeze thaw};sub Dump {return CPAN::Meta::YAML->new(@_)->_dump_string}sub Load {my$self=CPAN::Meta::YAML->_load_string(@_);if (wantarray){return @$self}else {return$self->[-1]}}BEGIN {*freeze=\&Dump;*thaw=\&Load}sub DumpFile {my$file=shift;return CPAN::Meta::YAML->new(@_)->_dump_file($file)}sub LoadFile {my$file=shift;my$self=CPAN::Meta::YAML->_load_file($file);if (wantarray){return @$self}else {return$self->[-1]}}sub new {my$class=shift;bless [@_ ],$class}sub read_string {my$self=shift;$self->_load_string(@_)}sub write_string {my$self=shift;$self->_dump_string(@_)}sub read {my$self=shift;$self->_load_file(@_)}sub write {my$self=shift;$self->_dump_file(@_)}my@UNPRINTABLE=qw(0 x01 x02 x03 x04 x05 x06 a b t n v f r x0E x0F x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x1A e x1C x1D x1E x1F);my%UNESCAPES=(0=>"\x00",z=>"\x00",N=>"\x85",a=>"\x07",b=>"\x08",t=>"\x09",n=>"\x0a",v=>"\x0b",f=>"\x0c",r=>"\x0d",e=>"\x1b",'\\'=>'\\',);my%QUOTE=map {$_=>1}qw{null true false};my$re_capture_double_quoted=qr/\"([^\\"]*(?:\\.[^\\"]*)*)\"/;my$re_capture_single_quoted=qr/\'([^\']*(?:\'\'[^\']*)*)\'/;my$re_capture_unquoted_key=qr/([^:]+(?::+\S(?:[^:]*|.*?(?=:)))*)(?=\s*\:(?:\s+|$))/;my$re_trailing_comment=qr/(?:\s+\#.*)?/;my$re_key_value_separator=qr/\s*:(?:\s+(?:\#.*)?|$)/;sub _load_file {my$class=ref $_[0]? ref shift : shift;my$file=shift or $class->_error('You did not specify a file name');$class->_error("File '$file' does not exist")unless -e $file;$class->_error("'$file' is a directory, not a file")unless -f _;$class->_error("Insufficient permissions to read '$file'")unless -r _;open(my$fh,"<:unix:encoding(UTF-8)",$file);unless ($fh){$class->_error("Failed to open file '$file': $!")}if (_can_flock()){flock($fh,Fcntl::LOCK_SH())or warn "Couldn't lock '$file' for reading: $!"}my$contents=eval {use warnings FATAL=>'utf8';local $/;<$fh>};if (my$err=$@){$class->_error("Error reading from file '$file': $err")}unless (close$fh){$class->_error("Failed to close file '$file': $!")}$class->_load_string($contents)}sub _load_string {my$class=ref $_[0]? ref shift : shift;my$self=bless [],$class;my$string=$_[0];eval {unless (defined$string){die \"Did not provide a string to load"}if (utf8::is_utf8($string)&&!utf8::valid($string)){die \<<'...'}utf8::upgrade($string);$string =~ s/^\x{FEFF}//;return$self unless length$string;my@lines=grep {!/^\s*(?:\#.*)?\z/}split /(?:\015{1,2}\012|\015|\012)/,$string;@lines and $lines[0]=~ /^\%YAML[: ][\d\.]+.*\z/ and shift@lines;my$in_document=0;while (@lines){if ($lines[0]=~ /^---\s*(?:(.+)\s*)?\z/){shift@lines;if (defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/){push @$self,$self->_load_scalar("$1",[undef ],\@lines);next}$in_document=1}if (!@lines or $lines[0]=~ /^(?:---|\.\.\.)/){push @$self,undef;while (@lines and $lines[0]!~ /^---/){shift@lines}$in_document=0}elsif (!$in_document && @$self){die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"}elsif ($lines[0]=~ /^\s*\-(?:\s|$|-+$)/){my$document=[];push @$self,$document;$self->_load_array($document,[0 ],\@lines)}elsif ($lines[0]=~ /^(\s*)\S/){my$document={};push @$self,$document;$self->_load_hash($document,[length($1)],\@lines)}else {die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"}}};my$err=$@;if (ref$err eq 'SCALAR'){$self->_error(${$err})}elsif ($err){$self->_error($err)}return$self}sub _unquote_single {my ($self,$string)=@_;return '' unless length$string;$string =~ s/\'\'/\'/g;return$string}sub _unquote_double {my ($self,$string)=@_;return '' unless length$string;$string =~ s/\\"/"/g;$string =~ s{\\([Nnever\\fartz0b]|x([0-9a-fA-F]{2}))}
+ Read an invalid UTF-8 string (maybe mixed UTF-8 and 8-bit character set).
+ Did you decode with lax ":utf8" instead of strict ":encoding(UTF-8)"?
+ ...
+ {(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}}gex;return$string}sub _load_scalar {my ($self,$string,$indent,$lines)=@_;$string =~ s/\s*\z//;return undef if$string eq '~';if ($string =~ /^$re_capture_single_quoted$re_trailing_comment\z/){return$self->_unquote_single($1)}if ($string =~ /^$re_capture_double_quoted$re_trailing_comment\z/){return$self->_unquote_double($1)}if ($string =~ /^[\'\"!&]/){die \"CPAN::Meta::YAML does not support a feature in line '$string'"}return {}if$string =~ /^{}(?:\s+\#.*)?\z/;return []if$string =~ /^\[\](?:\s+\#.*)?\z/;if ($string !~ /^[>|]/){die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'" if$string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or $string =~ /:(?:\s|$)/;$string =~ s/\s+#.*\z//;return$string}die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines;$lines->[0]=~ /^(\s*)/;$indent->[-1]=length("$1");if (defined$indent->[-2]and $indent->[-1]<= $indent->[-2]){die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"}my@multiline=();while (@$lines){$lines->[0]=~ /^(\s*)/;last unless length($1)>= $indent->[-1];push@multiline,substr(shift(@$lines),length($1))}my$j=(substr($string,0,1)eq '>')? ' ' : "\n";my$t=(substr($string,1,1)eq '-')? '' : "\n";return join($j,@multiline).$t}sub _load_array {my ($self,$array,$indent,$lines)=@_;while (@$lines){if ($lines->[0]=~ /^(?:---|\.\.\.)/){while (@$lines and $lines->[0]!~ /^---/){shift @$lines}return 1}$lines->[0]=~ /^(\s*)/;if (length($1)< $indent->[-1]){return 1}elsif (length($1)> $indent->[-1]){die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"}if ($lines->[0]=~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/){my$indent2=length("$1");$lines->[0]=~ s/-/ /;push @$array,{};$self->_load_hash($array->[-1],[@$indent,$indent2 ],$lines)}elsif ($lines->[0]=~ /^\s*\-\s*\z/){shift @$lines;unless (@$lines){push @$array,undef;return 1}if ($lines->[0]=~ /^(\s*)\-/){my$indent2=length("$1");if ($indent->[-1]==$indent2){push @$array,undef}else {push @$array,[];$self->_load_array($array->[-1],[@$indent,$indent2 ],$lines)}}elsif ($lines->[0]=~ /^(\s*)\S/){push @$array,{};$self->_load_hash($array->[-1],[@$indent,length("$1")],$lines)}else {die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"}}elsif ($lines->[0]=~ /^\s*\-(\s*)(.+?)\s*\z/){shift @$lines;push @$array,$self->_load_scalar("$2",[@$indent,undef ],$lines)}elsif (defined$indent->[-2]and $indent->[-1]==$indent->[-2]){return 1}else {die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"}}return 1}sub _load_hash {my ($self,$hash,$indent,$lines)=@_;while (@$lines){if ($lines->[0]=~ /^(?:---|\.\.\.)/){while (@$lines and $lines->[0]!~ /^---/){shift @$lines}return 1}$lines->[0]=~ /^(\s*)/;if (length($1)< $indent->[-1]){return 1}elsif (length($1)> $indent->[-1]){die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"}my$key;if ($lines->[0]=~ s/^\s*$re_capture_single_quoted$re_key_value_separator//){$key=$self->_unquote_single($1)}elsif ($lines->[0]=~ s/^\s*$re_capture_double_quoted$re_key_value_separator//){$key=$self->_unquote_double($1)}elsif ($lines->[0]=~ s/^\s*$re_capture_unquoted_key$re_key_value_separator//){$key=$1;$key =~ s/\s+$//}elsif ($lines->[0]=~ /^\s*\?/){die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"}else {die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"}if (exists$hash->{$key}){warn "CPAN::Meta::YAML found a duplicate key '$key' in line '$lines->[0]'"}if (length$lines->[0]){$hash->{$key}=$self->_load_scalar(shift(@$lines),[@$indent,undef ],$lines)}else {shift @$lines;unless (@$lines){$hash->{$key}=undef;return 1}if ($lines->[0]=~ /^(\s*)-/){$hash->{$key}=[];$self->_load_array($hash->{$key},[@$indent,length($1)],$lines)}elsif ($lines->[0]=~ /^(\s*)./){my$indent2=length("$1");if ($indent->[-1]>= $indent2){$hash->{$key}=undef}else {$hash->{$key}={};$self->_load_hash($hash->{$key},[@$indent,length($1)],$lines)}}}}return 1}sub _dump_file {my$self=shift;require Fcntl;my$file=shift or $self->_error('You did not specify a file name');my$fh;if (_can_flock()){my$flags=Fcntl::O_WRONLY()|Fcntl::O_CREAT();sysopen($fh,$file,$flags);unless ($fh){$self->_error("Failed to open file '$file' for writing: $!")}binmode($fh,":raw:encoding(UTF-8)");flock($fh,Fcntl::LOCK_EX())or warn "Couldn't lock '$file' for reading: $!";truncate$fh,0;seek$fh,0,0}else {open$fh,">:unix:encoding(UTF-8)",$file}print {$fh}$self->_dump_string;unless (close$fh){$self->_error("Failed to close file '$file': $!")}return 1}sub _dump_string {my$self=shift;return '' unless ref$self && @$self;my$indent=0;my@lines=();eval {for my$cursor (@$self){push@lines,'---';if (!defined$cursor){}elsif (!ref$cursor){$lines[-1].= ' ' .$self->_dump_scalar($cursor)}elsif (ref$cursor eq 'ARRAY'){unless (@$cursor){$lines[-1].= ' []';next}push@lines,$self->_dump_array($cursor,$indent,{})}elsif (ref$cursor eq 'HASH'){unless (%$cursor){$lines[-1].= ' {}';next}push@lines,$self->_dump_hash($cursor,$indent,{})}else {die \("Cannot serialize " .ref($cursor))}}};if (ref $@ eq 'SCALAR'){$self->_error(${$@})}elsif ($@){$self->_error($@)}join '',map {"$_\n"}@lines}sub _has_internal_string_value {my$value=shift;my$b_obj=B::svref_2object(\$value);return$b_obj->FLAGS & B::SVf_POK()}sub _dump_scalar {my$string=$_[1];my$is_key=$_[2];my$has_string_flag=_has_internal_string_value($string);return '~' unless defined$string;return "''" unless length$string;if (Scalar::Util::looks_like_number($string)){if ($is_key || $has_string_flag){return qq['$string']}else {return$string}}if ($string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/){$string =~ s/\\/\\\\/g;$string =~ s/"/\\"/g;$string =~ s/\n/\\n/g;$string =~ s/[\x85]/\\N/g;$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;$string =~ s/([\x7f-\x9f])/'\x' . sprintf("%X",ord($1))/ge;return qq|"$string"|}if ($string =~ /(?:^[~!@#%&*|>?:,'"`{}\[\]]|^-+$|\s|:\z)/ or $QUOTE{$string}){return "'$string'"}return$string}sub _dump_array {my ($self,$array,$indent,$seen)=@_;if ($seen->{refaddr($array)}++){die \"CPAN::Meta::YAML does not support circular references"}my@lines=();for my$el (@$array){my$line=(' ' x $indent).'-';my$type=ref$el;if (!$type){$line .= ' ' .$self->_dump_scalar($el);push@lines,$line}elsif ($type eq 'ARRAY'){if (@$el){push@lines,$line;push@lines,$self->_dump_array($el,$indent + 1,$seen)}else {$line .= ' []';push@lines,$line}}elsif ($type eq 'HASH'){if (keys %$el){push@lines,$line;push@lines,$self->_dump_hash($el,$indent + 1,$seen)}else {$line .= ' {}';push@lines,$line}}else {die \"CPAN::Meta::YAML does not support $type references"}}@lines}sub _dump_hash {my ($self,$hash,$indent,$seen)=@_;if ($seen->{refaddr($hash)}++){die \"CPAN::Meta::YAML does not support circular references"}my@lines=();for my$name (sort keys %$hash){my$el=$hash->{$name};my$line=(' ' x $indent).$self->_dump_scalar($name,1).":";my$type=ref$el;if (!$type){$line .= ' ' .$self->_dump_scalar($el);push@lines,$line}elsif ($type eq 'ARRAY'){if (@$el){push@lines,$line;push@lines,$self->_dump_array($el,$indent + 1,$seen)}else {$line .= ' []';push@lines,$line}}elsif ($type eq 'HASH'){if (keys %$el){push@lines,$line;push@lines,$self->_dump_hash($el,$indent + 1,$seen)}else {$line .= ' {}';push@lines,$line}}else {die \"CPAN::Meta::YAML does not support $type references"}}@lines}our$errstr='';sub _error {require Carp;$errstr=$_[1];$errstr =~ s/ at \S+ line \d+.*//;Carp::croak($errstr)}my$errstr_warned;sub errstr {require Carp;Carp::carp("CPAN::Meta::YAML->errstr and \$CPAN::Meta::YAML::errstr is deprecated")unless$errstr_warned++;$errstr}use B;my$HAS_FLOCK;sub _can_flock {if (defined$HAS_FLOCK){return$HAS_FLOCK}else {require Config;my$c=\%Config::Config;$HAS_FLOCK=grep {$c->{$_}}qw/d_flock d_fcntl_can_lock d_lockf/;require Fcntl if$HAS_FLOCK;return$HAS_FLOCK}}use Scalar::Util ();BEGIN {local $@;if (eval {Scalar::Util->VERSION(1.18)}){*refaddr=*Scalar::Util::refaddr}else {eval <<'END_PERL'}}delete$CPAN::Meta::YAML::{refaddr};1;
# Scalar::Util failed to load or too old
sub refaddr {
- my $pkg = ref($_[0]) or return undef;
- if ( !! UNIVERSAL::can($_[0], 'can') ) {
- bless $_[0], 'Scalar::Util::Fake';
- } else {
- $pkg = undef;
- }
- "$_[0]" =~ /0x(\w+)/;
- my $i = do { local $^W; hex $1 };
- bless $_[0], $pkg if defined $pkg;
- $i;
+ my $pkg = ref($_[0]) or return undef;
+ if ( !! UNIVERSAL::can($_[0], 'can') ) {
+ bless $_[0], 'Scalar::Util::Fake';
+ } else {
+ $pkg = undef;
+ }
+ "$_[0]" =~ /0x(\w+)/;
+ my $i = do { no warnings 'portable'; hex $1 };
+ bless $_[0], $pkg if defined $pkg;
+ $i;
}
END_PERL
CPAN_META_YAML
-$fatpacked{"Exporter.pm"} = <<'EXPORTER';
- package Exporter;require 5.006;our$Debug=0;our$ExportLevel=0;our$Verbose ||=0;our$VERSION='5.68';our (%Cache);sub as_heavy {require Exporter::Heavy;my$c=(caller(1))[3];$c =~ s/.*:://;\&{"Exporter::Heavy::heavy_$c"}}sub export {goto &{as_heavy()}}sub import {my$pkg=shift;my$callpkg=caller($ExportLevel);if ($pkg eq "Exporter" and @_ and $_[0]eq "import"){*{$callpkg."::import"}=\&import;return}my$exports=\@{"$pkg\::EXPORT"};my$fail=${$pkg .'::'}{EXPORT_FAIL}&& \@{"$pkg\::EXPORT_FAIL"};return export$pkg,$callpkg,@_ if$Verbose or $Debug or $fail && @$fail > 1;my$export_cache=($Cache{$pkg}||={});my$args=@_ or @_=@$exports;if ($args and not %$export_cache){s/^&//,$export_cache->{$_}=1 foreach (@$exports,@{"$pkg\::EXPORT_OK"})}my$heavy;if ($args or $fail){($heavy=(/\W/ or $args and not exists$export_cache->{$_}or $fail and @$fail and $_ eq $fail->[0]))and last foreach (@_)}else {($heavy=/\W/)and last foreach (@_)}return export$pkg,$callpkg,($args ? @_ : ())if$heavy;local$SIG{__WARN__}=sub {require Carp;&Carp::carp}if not $SIG{__WARN__};*{"$callpkg\::$_"}=\&{"$pkg\::$_"}foreach @_}sub export_fail {my$self=shift;@_}sub export_to_level {goto &{as_heavy()}}sub export_tags {goto &{as_heavy()}}sub export_ok_tags {goto &{as_heavy()}}sub require_version {goto &{as_heavy()}}1;
+$fatpacked{"Exporter.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXPORTER';
+ package Exporter;require 5.006;our$Debug=0;our$ExportLevel=0;our$Verbose ||=0;our$VERSION='5.70';our (%Cache);sub as_heavy {require Exporter::Heavy;my$c=(caller(1))[3];$c =~ s/.*:://;\&{"Exporter::Heavy::heavy_$c"}}sub export {goto &{as_heavy()}}sub import {my$pkg=shift;my$callpkg=caller($ExportLevel);if ($pkg eq "Exporter" and @_ and $_[0]eq "import"){*{$callpkg."::import"}=\&import;return}my$exports=\@{"$pkg\::EXPORT"};my$fail=${$pkg .'::'}{EXPORT_FAIL}&& \@{"$pkg\::EXPORT_FAIL"};return export$pkg,$callpkg,@_ if$Verbose or $Debug or $fail && @$fail > 1;my$export_cache=($Cache{$pkg}||={});my$args=@_ or @_=@$exports;if ($args and not %$export_cache){s/^&//,$export_cache->{$_}=1 foreach (@$exports,@{"$pkg\::EXPORT_OK"})}my$heavy;if ($args or $fail){($heavy=(/\W/ or $args and not exists$export_cache->{$_}or $fail and @$fail and $_ eq $fail->[0]))and last foreach (@_)}else {($heavy=/\W/)and last foreach (@_)}return export$pkg,$callpkg,($args ? @_ : ())if$heavy;local$SIG{__WARN__}=sub {require Carp;&Carp::carp}if not $SIG{__WARN__};*{"$callpkg\::$_"}=\&{"$pkg\::$_"}foreach @_}sub export_fail {my$self=shift;@_}sub export_to_level {goto &{as_heavy()}}sub export_tags {goto &{as_heavy()}}sub export_ok_tags {goto &{as_heavy()}}sub require_version {goto &{as_heavy()}}1;
EXPORTER
-$fatpacked{"Exporter/Heavy.pm"} = <<'EXPORTER_HEAVY';
- package Exporter::Heavy;use strict;no strict 'refs';require Exporter;our$VERSION=$Exporter::VERSION;sub _rebuild_cache {my ($pkg,$exports,$cache)=@_;s/^&// foreach @$exports;@{$cache}{@$exports}=(1)x @$exports;my$ok=\@{"${pkg}::EXPORT_OK"};if (@$ok){s/^&// foreach @$ok;@{$cache}{@$ok}=(1)x @$ok}}sub heavy_export {local$SIG{__WARN__}=sub {my$text=shift;if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//){require Carp;local$Carp::CarpLevel=1;Carp::carp($text)}else {warn$text}};local$SIG{__DIE__}=sub {require Carp;local$Carp::CarpLevel=1;Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT")if $_[0]=~ /^Unable to create sub named "(.*?)::"/};my($pkg,$callpkg,@imports)=@_;my($type,$sym,$cache_is_current,$oops);my($exports,$export_cache)=(\@{"${pkg}::EXPORT"},$Exporter::Cache{$pkg}||={});if (@imports){if (!%$export_cache){_rebuild_cache ($pkg,$exports,$export_cache);$cache_is_current=1}if (grep m{^[/!:]},@imports){my$tagsref=\%{"${pkg}::EXPORT_TAGS"};my$tagdata;my%imports;my($remove,$spec,@names,@allexports);unshift@imports,':DEFAULT' if$imports[0]=~ m/^!/;for$spec (@imports){$remove=$spec =~ s/^!//;if ($spec =~ s/^://){if ($spec eq 'DEFAULT'){@names=@$exports}elsif ($tagdata=$tagsref->{$spec}){@names=@$tagdata}else {warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS];++$oops;next}}elsif ($spec =~ m:^/(.*)/$:){my$patn=$1;@allexports=keys %$export_cache unless@allexports;@names=grep(/$patn/,@allexports)}else {@names=($spec)}warn "Import ".($remove ? "del":"add").": @names " if$Exporter::Verbose;if ($remove){for$sym (@names){delete$imports{$sym}}}else {@imports{@names}=(1)x @names}}@imports=keys%imports}my@carp;for$sym (@imports){if (!$export_cache->{$sym}){if ($sym =~ m/^\d/){$pkg->VERSION($sym);if (@imports==1){@imports=@$exports;last}if (@imports==2 and!$imports[1]){@imports=();last}}elsif ($sym !~ s/^&// ||!$export_cache->{$sym}){unless ($cache_is_current){%$export_cache=();_rebuild_cache ($pkg,$exports,$export_cache);$cache_is_current=1}if (!$export_cache->{$sym}){push@carp,qq["$sym" is not exported by the $pkg module\n];$oops++}}}}if ($oops){require Carp;Carp::croak("@{carp}Can't continue after import errors")}}else {@imports=@$exports}my($fail,$fail_cache)=(\@{"${pkg}::EXPORT_FAIL"},$Exporter::FailCache{$pkg}||={});if (@$fail){if (!%$fail_cache){my@expanded=map {/^\w/ ? ($_,'&'.$_): $_}@$fail;warn "${pkg}::EXPORT_FAIL cached: @expanded" if$Exporter::Verbose;@{$fail_cache}{@expanded}=(1)x @expanded}my@failed;for$sym (@imports){push(@failed,$sym)if$fail_cache->{$sym}}if (@failed){@failed=$pkg->export_fail(@failed);for$sym (@failed){require Carp;Carp::carp(qq["$sym" is not implemented by the $pkg module ],"on this architecture")}if (@failed){require Carp;Carp::croak("Can't continue after import errors")}}}warn "Importing into $callpkg from $pkg: ",join(", ",sort@imports)if$Exporter::Verbose;for$sym (@imports){(*{"${callpkg}::$sym"}=\&{"${pkg}::$sym"},next)unless$sym =~ s/^(\W)//;$type=$1;no warnings 'once';*{"${callpkg}::$sym"}=$type eq '&' ? \&{"${pkg}::$sym"}: $type eq '$' ? \${"${pkg}::$sym"}: $type eq '@' ? \@{"${pkg}::$sym"}: $type eq '%' ? \%{"${pkg}::$sym"}: $type eq '*' ? *{"${pkg}::$sym"}: do {require Carp;Carp::croak("Can't export symbol: $type$sym")}}}sub heavy_export_to_level {my$pkg=shift;my$level=shift;(undef)=shift;my$callpkg=caller($level);$pkg->export($callpkg,@_)}sub _push_tags {my($pkg,$var,$syms)=@_;my@nontag=();my$export_tags=\%{"${pkg}::EXPORT_TAGS"};push(@{"${pkg}::$var"},map {$export_tags->{$_}? @{$export_tags->{$_}}: scalar(push(@nontag,$_),$_)}(@$syms)? @$syms : keys %$export_tags);if (@nontag and $^W){require Carp;Carp::carp(join(", ",@nontag)." are not tags of $pkg")}}sub heavy_require_version {my($self,$wanted)=@_;my$pkg=ref$self || $self;return ${pkg}->VERSION($wanted)}sub heavy_export_tags {_push_tags((caller)[0],"EXPORT",\@_)}sub heavy_export_ok_tags {_push_tags((caller)[0],"EXPORT_OK",\@_)}1;
+$fatpacked{"Exporter/Heavy.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXPORTER_HEAVY';
+ package Exporter::Heavy;use strict;no strict 'refs';require Exporter;our$VERSION=$Exporter::VERSION;sub _rebuild_cache {my ($pkg,$exports,$cache)=@_;s/^&// foreach @$exports;@{$cache}{@$exports}=(1)x @$exports;my$ok=\@{"${pkg}::EXPORT_OK"};if (@$ok){s/^&// foreach @$ok;@{$cache}{@$ok}=(1)x @$ok}}sub heavy_export {my$oldwarn=$SIG{__WARN__};local$SIG{__WARN__}=sub {local$SIG{__WARN__}=$oldwarn;my$text=shift;if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//){require Carp;local$Carp::CarpLevel=1;Carp::carp($text)}else {warn$text}};local$SIG{__DIE__}=sub {require Carp;local$Carp::CarpLevel=1;Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT")if $_[0]=~ /^Unable to create sub named "(.*?)::"/};my($pkg,$callpkg,@imports)=@_;my($type,$sym,$cache_is_current,$oops);my($exports,$export_cache)=(\@{"${pkg}::EXPORT"},$Exporter::Cache{$pkg}||={});if (@imports){if (!%$export_cache){_rebuild_cache ($pkg,$exports,$export_cache);$cache_is_current=1}if (grep m{^[/!:]},@imports){my$tagsref=\%{"${pkg}::EXPORT_TAGS"};my$tagdata;my%imports;my($remove,$spec,@names,@allexports);unshift@imports,':DEFAULT' if$imports[0]=~ m/^!/;for$spec (@imports){$remove=$spec =~ s/^!//;if ($spec =~ s/^://){if ($spec eq 'DEFAULT'){@names=@$exports}elsif ($tagdata=$tagsref->{$spec}){@names=@$tagdata}else {warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS];++$oops;next}}elsif ($spec =~ m:^/(.*)/$:){my$patn=$1;@allexports=keys %$export_cache unless@allexports;@names=grep(/$patn/,@allexports)}else {@names=($spec)}warn "Import ".($remove ? "del":"add").": @names " if$Exporter::Verbose;if ($remove){for$sym (@names){delete$imports{$sym}}}else {@imports{@names}=(1)x @names}}@imports=keys%imports}my@carp;for$sym (@imports){if (!$export_cache->{$sym}){if ($sym =~ m/^\d/){$pkg->VERSION($sym);if (@imports==1){@imports=@$exports;last}if (@imports==2 and!$imports[1]){@imports=();last}}elsif ($sym !~ s/^&// ||!$export_cache->{$sym}){unless ($cache_is_current){%$export_cache=();_rebuild_cache ($pkg,$exports,$export_cache);$cache_is_current=1}if (!$export_cache->{$sym}){push@carp,qq["$sym" is not exported by the $pkg module\n];$oops++}}}}if ($oops){require Carp;Carp::croak("@{carp}Can't continue after import errors")}}else {@imports=@$exports}my($fail,$fail_cache)=(\@{"${pkg}::EXPORT_FAIL"},$Exporter::FailCache{$pkg}||={});if (@$fail){if (!%$fail_cache){my@expanded=map {/^\w/ ? ($_,'&'.$_): $_}@$fail;warn "${pkg}::EXPORT_FAIL cached: @expanded" if$Exporter::Verbose;@{$fail_cache}{@expanded}=(1)x @expanded}my@failed;for$sym (@imports){push(@failed,$sym)if$fail_cache->{$sym}}if (@failed){@failed=$pkg->export_fail(@failed);for$sym (@failed){require Carp;Carp::carp(qq["$sym" is not implemented by the $pkg module ],"on this architecture")}if (@failed){require Carp;Carp::croak("Can't continue after import errors")}}}warn "Importing into $callpkg from $pkg: ",join(", ",sort@imports)if$Exporter::Verbose;for$sym (@imports){(*{"${callpkg}::$sym"}=\&{"${pkg}::$sym"},next)unless$sym =~ s/^(\W)//;$type=$1;no warnings 'once';*{"${callpkg}::$sym"}=$type eq '&' ? \&{"${pkg}::$sym"}: $type eq '$' ? \${"${pkg}::$sym"}: $type eq '@' ? \@{"${pkg}::$sym"}: $type eq '%' ? \%{"${pkg}::$sym"}: $type eq '*' ? *{"${pkg}::$sym"}: do {require Carp;Carp::croak("Can't export symbol: $type$sym")}}}sub heavy_export_to_level {my$pkg=shift;my$level=shift;(undef)=shift;my$callpkg=caller($level);$pkg->export($callpkg,@_)}sub _push_tags {my($pkg,$var,$syms)=@_;my@nontag=();my$export_tags=\%{"${pkg}::EXPORT_TAGS"};push(@{"${pkg}::$var"},map {$export_tags->{$_}? @{$export_tags->{$_}}: scalar(push(@nontag,$_),$_)}(@$syms)? @$syms : keys %$export_tags);if (@nontag and $^W){require Carp;Carp::carp(join(", ",@nontag)." are not tags of $pkg")}}sub heavy_require_version {my($self,$wanted)=@_;my$pkg=ref$self || $self;return ${pkg}->VERSION($wanted)}sub heavy_export_tags {_push_tags((caller)[0],"EXPORT",\@_)}sub heavy_export_ok_tags {_push_tags((caller)[0],"EXPORT_OK",\@_)}1;
EXPORTER_HEAVY
-$fatpacked{"File/pushd.pm"} = <<'FILE_PUSHD';
- use strict;use warnings;package File::pushd;our$VERSION='1.005';our@EXPORT=qw(pushd tempd);our@ISA=qw(Exporter);use Exporter;use Carp;use Cwd qw(getcwd abs_path);use File::Path qw(rmtree);use File::Temp qw();use File::Spec;use overload q{""}=>sub {File::Spec->canonpath($_[0]->{_pushd})},fallback=>1;sub pushd {my ($target_dir,$options)=@_;$options->{untaint_pattern}||=qr{^([-+@\w./]+)$};$target_dir="." unless defined$target_dir;croak "Can't locate directory $target_dir" unless -d $target_dir;my$tainted_orig=getcwd;my$orig;if ($tainted_orig =~ $options->{untaint_pattern}){$orig=$1}else {$orig=$tainted_orig}my$tainted_dest;eval {$tainted_dest=$target_dir ? abs_path($target_dir): $orig};croak "Can't locate absolute path for $target_dir: $@" if $@;my$dest;if ($tainted_dest =~ $options->{untaint_pattern}){$dest=$1}else {$dest=$tainted_dest}if ($dest ne $orig){chdir$dest or croak "Can't chdir to $dest\: $!"}my$self=bless {_pushd=>$dest,_original=>$orig },__PACKAGE__;return$self}sub tempd {my ($options)=@_;my$dir;eval {$dir=pushd(File::Temp::tempdir(CLEANUP=>0),$options)};croak $@ if $@;$dir->{_tempd}=1;return$dir}sub preserve {my$self=shift;return 1 if!$self->{"_tempd"};if (@_==0){return$self->{_preserve}=1}else {return$self->{_preserve}=$_[0]? 1 : 0}}sub DESTROY {my ($self)=@_;my$orig=$self->{_original};chdir$orig if$orig;if ($self->{_tempd}&& !$self->{_preserve}){my$err=do {local $@;eval {rmtree($self->{_pushd})};$@};carp$err if$err}}1;
+$fatpacked{"File/pushd.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_PUSHD';
+ use strict;use warnings;package File::pushd;our$VERSION='1.009';our@EXPORT=qw(pushd tempd);our@ISA=qw(Exporter);use Exporter;use Carp;use Cwd qw(getcwd abs_path);use File::Path qw(rmtree);use File::Temp qw();use File::Spec;use overload q{""}=>sub {File::Spec->canonpath($_[0]->{_pushd})},fallback=>1;sub pushd {my ($target_dir,$options)=@_;$options->{untaint_pattern}||= qr{^([-+@\w./]+)$};$target_dir="." unless defined$target_dir;croak "Can't locate directory $target_dir" unless -d $target_dir;my$tainted_orig=getcwd;my$orig;if ($tainted_orig =~ $options->{untaint_pattern}){$orig=$1}else {$orig=$tainted_orig}my$tainted_dest;eval {$tainted_dest=$target_dir ? abs_path($target_dir): $orig};croak "Can't locate absolute path for $target_dir: $@" if $@;my$dest;if ($tainted_dest =~ $options->{untaint_pattern}){$dest=$1}else {$dest=$tainted_dest}if ($dest ne $orig){chdir$dest or croak "Can't chdir to $dest\: $!"}my$self=bless {_pushd=>$dest,_original=>$orig },__PACKAGE__;return$self}sub tempd {my ($options)=@_;my$dir;eval {$dir=pushd(File::Temp::tempdir(CLEANUP=>0),$options)};croak $@ if $@;$dir->{_tempd}=1;return$dir}sub preserve {my$self=shift;return 1 if!$self->{"_tempd"};if (@_==0){return$self->{_preserve}=1}else {return$self->{_preserve}=$_[0]? 1 : 0}}sub DESTROY {my ($self)=@_;my$orig=$self->{_original};chdir$orig if$orig;if ($self->{_tempd}&&!$self->{_preserve}){my$err=do {local $@;eval {rmtree($self->{_pushd})};$@};carp$err if$err}}1;
FILE_PUSHD
-$fatpacked{"HTTP/Tiny.pm"} = <<'HTTP_TINY';
- package HTTP::Tiny;use strict;use warnings;our$VERSION='0.034';use Carp ();my@attributes;BEGIN {@attributes=qw(cookie_jar default_headers local_address max_redirect max_size proxy no_proxy timeout SSL_options verify_SSL);no strict 'refs';for my$accessor (@attributes){*{$accessor}=sub {@_ > 1 ? $_[0]->{$accessor}=$_[1]: $_[0]->{$accessor}}}}sub agent {my($self,$agent)=@_;if(@_ > 1){$self->{agent}=(defined$agent && $agent =~ / $/)? $agent .$self->_agent : $agent}return$self->{agent}}sub new {my($class,%args)=@_;my$self={max_redirect=>5,timeout=>60,verify_SSL=>$args{verify_SSL}|| $args{verify_ssl}|| 0,no_proxy=>$ENV{no_proxy},};bless$self,$class;$class->_validate_cookie_jar($args{cookie_jar})if$args{cookie_jar};for my$key (@attributes){$self->{$key}=$args{$key}if exists$args{$key}}$self->agent(exists$args{agent}? $args{agent}: $class->_agent);if (!exists$self->{proxy}&& (my$http_proxy=$ENV{http_proxy})){if ($http_proxy =~ m{\Ahttp://[^/?#:@]+:\d+/?\z}){$self->{proxy}=$http_proxy}else {Carp::croak(qq{Environment 'http_proxy' must be in format http://<host>:<port>/\n})}}unless (ref$self->{no_proxy}eq 'ARRAY'){$self->{no_proxy}=(defined$self->{no_proxy})? [split /\s*,\s*/,$self->{no_proxy}]: []}return$self}for my$sub_name (qw/get head put post delete/){my$req_method=uc$sub_name;no strict 'refs';eval <<"HERE"}sub post_form {my ($self,$url,$data,$args)=@_;(@_==3 || @_==4 && ref$args eq 'HASH')or Carp::croak(q/Usage: $http->post_form(URL, DATAREF, [HASHREF])/ ."\n");my$headers={};while (my ($key,$value)=each %{$args->{headers}|| {}}){$headers->{lc$key}=$value}delete$args->{headers};return$self->request('POST',$url,{%$args,content=>$self->www_form_urlencode($data),headers=>{%$headers,'content-type'=>'application/x-www-form-urlencoded' },})}sub mirror {my ($self,$url,$file,$args)=@_;@_==3 || (@_==4 && ref$args eq 'HASH')or Carp::croak(q/Usage: $http->mirror(URL, FILE, [HASHREF])/ ."\n");if (-e $file and my$mtime=(stat($file))[9]){$args->{headers}{'if-modified-since'}||=$self->_http_date($mtime)}my$tempfile=$file .int(rand(2**31));open my$fh,">",$tempfile or Carp::croak(qq/Error: Could not open temporary file $tempfile for downloading: $!\n/);binmode$fh;$args->{data_callback}=sub {print {$fh}$_[0]};my$response=$self->request('GET',$url,$args);close$fh or Carp::croak(qq/Error: Could not close temporary file $tempfile: $!\n/);if ($response->{success}){rename$tempfile,$file or Carp::croak(qq/Error replacing $file with $tempfile: $!\n/);my$lm=$response->{headers}{'last-modified'};if ($lm and my$mtime=$self->_parse_http_date($lm)){utime$mtime,$mtime,$file}}$response->{success}||=$response->{status}eq '304';unlink$tempfile;return$response}my%idempotent=map {$_=>1}qw/GET HEAD PUT DELETE OPTIONS TRACE/;sub request {my ($self,$method,$url,$args)=@_;@_==3 || (@_==4 && ref$args eq 'HASH')or Carp::croak(q/Usage: $http->request(METHOD, URL, [HASHREF])/ ."\n");$args ||={};my$response;for (0 .. 1){$response=eval {$self->_request($method,$url,$args)};last unless $@ && $idempotent{$method}&& $@ =~ m{^(?:Socket closed|Unexpected end)}}if (my$e="$@"){$response={url=>$url,success=>q{},status=>599,reason=>'Internal Exception',content=>$e,headers=>{'content-type'=>'text/plain','content-length'=>length$e,}}}return$response}sub www_form_urlencode {my ($self,$data)=@_;(@_==2 && ref$data)or Carp::croak(q/Usage: $http->www_form_urlencode(DATAREF)/ ."\n");(ref$data eq 'HASH' || ref$data eq 'ARRAY')or Carp::croak("form data must be a hash or array reference\n");my@params=ref$data eq 'HASH' ? %$data : @$data;@params % 2==0 or Carp::croak("form data reference must have an even number of terms\n");my@terms;while(@params){my ($key,$value)=splice(@params,0,2);if (ref$value eq 'ARRAY'){unshift@params,map {$key=>$_}@$value}else {push@terms,join("=",map {$self->_uri_escape($_)}$key,$value)}}return join("&",sort@terms)}my%DefaultPort=(http=>80,https=>443,);sub _agent {my$class=ref($_[0])|| $_[0];(my$default_agent=$class)=~ s{::}{-}g;return$default_agent ."/" .($class->VERSION || 0)}sub _request {my ($self,$method,$url,$args)=@_;my ($scheme,$host,$port,$path_query,$auth)=$self->_split_url($url);my$request={method=>$method,scheme=>$scheme,host_port=>($port==$DefaultPort{$scheme}? $host : "$host:$port"),uri=>$path_query,headers=>{},};my$handle=HTTP::Tiny::Handle->new(timeout=>$self->{timeout},SSL_options=>$self->{SSL_options},verify_SSL=>$self->{verify_SSL},local_address=>$self->{local_address},);if ($self->{proxy}&&!grep {$host =~ /\Q$_\E$/}@{$self->{no_proxy}}){$request->{uri}="$scheme://$request->{host_port}$path_query";die(qq/HTTPS via proxy is not supported\n/)if$request->{scheme}eq 'https';$handle->connect(($self->_split_url($self->{proxy}))[0..2])}else {$handle->connect($scheme,$host,$port)}$self->_prepare_headers_and_cb($request,$args,$url,$auth);$handle->write_request($request);my$response;do {$response=$handle->read_response_header}until (substr($response->{status},0,1)ne '1');$self->_update_cookie_jar($url,$response)if$self->{cookie_jar};if (my@redir_args=$self->_maybe_redirect($request,$response,$args)){$handle->close;return$self->_request(@redir_args,$args)}if ($method eq 'HEAD' || $response->{status}=~ /^[23]04/){}else {my$data_cb=$self->_prepare_data_cb($response,$args);$handle->read_body($data_cb,$response)}$handle->close;$response->{success}=substr($response->{status},0,1)eq '2';$response->{url}=$url;return$response}sub _prepare_headers_and_cb {my ($self,$request,$args,$url,$auth)=@_;for ($self->{default_headers},$args->{headers}){next unless defined;while (my ($k,$v)=each %$_){$request->{headers}{lc$k}=$v}}$request->{headers}{'host'}=$request->{host_port};$request->{headers}{'connection'}="close";$request->{headers}{'user-agent'}||=$self->{agent};if (defined$args->{content}){if (ref$args->{content}eq 'CODE'){$request->{headers}{'content-type'}||="application/octet-stream";$request->{headers}{'transfer-encoding'}='chunked' unless$request->{headers}{'content-length'}|| $request->{headers}{'transfer-encoding'};$request->{cb}=$args->{content}}elsif (length$args->{content}){my$content=$args->{content};if ($] ge '5.008'){utf8::downgrade($content,1)or die(qq/Wide character in request message body\n/)}$request->{headers}{'content-type'}||="application/octet-stream";$request->{headers}{'content-length'}=length$content unless$request->{headers}{'content-length'}|| $request->{headers}{'transfer-encoding'};$request->{cb}=sub {substr$content,0,length$content,''}}$request->{trailer_cb}=$args->{trailer_callback}if ref$args->{trailer_callback}eq 'CODE'}if ($self->{cookie_jar}){my$cookies=$self->cookie_jar->cookie_header($url);$request->{headers}{cookie}=$cookies if length$cookies}if (length$auth &&!defined$request->{headers}{authentication}){require MIME::Base64;$request->{headers}{authorization}="Basic " .MIME::Base64::encode_base64($auth,"")}return}sub _prepare_data_cb {my ($self,$response,$args)=@_;my$data_cb=$args->{data_callback};$response->{content}='';if (!$data_cb || $response->{status}!~ /^2/){if (defined$self->{max_size}){$data_cb=sub {$_[1]->{content}.= $_[0];die(qq/Size of response body exceeds the maximum allowed of $self->{max_size}\n/)if length $_[1]->{content}> $self->{max_size}}}else {$data_cb=sub {$_[1]->{content}.= $_[0]}}}return$data_cb}sub _update_cookie_jar {my ($self,$url,$response)=@_;my$cookies=$response->{headers}->{'set-cookie'};return unless defined$cookies;my@cookies=ref$cookies ? @$cookies : $cookies;$self->cookie_jar->add($url,$_)for@cookies;return}sub _validate_cookie_jar {my ($class,$jar)=@_;for my$method (qw/add cookie_header/){Carp::croak(qq/Cookie jar must provide the '$method' method\n/)unless ref($jar)&& ref($jar)->can($method)}return}sub _maybe_redirect {my ($self,$request,$response,$args)=@_;my$headers=$response->{headers};my ($status,$method)=($response->{status},$request->{method});if (($status eq '303' or ($status =~ /^30[127]/ && $method =~ /^GET|HEAD$/))and $headers->{location}and ++$args->{redirects}<= $self->{max_redirect}){my$location=($headers->{location}=~ /^\//)? "$request->{scheme}://$request->{host_port}$headers->{location}" : $headers->{location};return (($status eq '303' ? 'GET' : $method),$location)}return}sub _split_url {my$url=pop;my ($scheme,$authority,$path_query)=$url =~ m<\A([^:/?#]+)://([^/?#]*)([^#]*)> or die(qq/Cannot parse URL: '$url'\n/);$scheme=lc$scheme;$path_query="/$path_query" unless$path_query =~ m<\A/>;my ($auth,$host);$authority=(length($authority))? $authority : 'localhost';if ($authority =~ /@/){($auth,$host)=$authority =~ m/\A([^@]*)@(.*)\z/}else {$host=$authority;$auth=''}$host=lc$host;my$port=do {$host =~ s/:([0-9]*)\z// && length $1 ? $1 : ($scheme eq 'http' ? 80 : $scheme eq 'https' ? 443 : undef)};return ($scheme,$host,$port,$path_query,$auth)}my$DoW="Sun|Mon|Tue|Wed|Thu|Fri|Sat";my$MoY="Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";sub _http_date {my ($sec,$min,$hour,$mday,$mon,$year,$wday)=gmtime($_[1]);return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",substr($DoW,$wday*4,3),$mday,substr($MoY,$mon*4,3),$year+1900,$hour,$min,$sec)}sub _parse_http_date {my ($self,$str)=@_;require Time::Local;my@tl_parts;if ($str =~ /^[SMTWF][a-z]+, +(\d{1,2}) ($MoY) +(\d\d\d\d) +(\d\d):(\d\d):(\d\d) +GMT$/){@tl_parts=($6,$5,$4,$1,(index($MoY,$2)/4),$3)}elsif ($str =~ /^[SMTWF][a-z]+, +(\d\d)-($MoY)-(\d{2,4}) +(\d\d):(\d\d):(\d\d) +GMT$/){@tl_parts=($6,$5,$4,$1,(index($MoY,$2)/4),$3)}elsif ($str =~ /^[SMTWF][a-z]+ +($MoY) +(\d{1,2}) +(\d\d):(\d\d):(\d\d) +(?:[^0-9]+ +)?(\d\d\d\d)$/){@tl_parts=($5,$4,$3,$2,(index($MoY,$1)/4),$6)}return eval {my$t=@tl_parts ? Time::Local::timegm(@tl_parts): -1;$t < 0 ? undef : $t}}my%escapes=map {chr($_)=>sprintf("%%%02X",$_)}0..255;$escapes{' '}="+";my$unsafe_char=qr/[^A-Za-z0-9\-\._~]/;sub _uri_escape {my ($self,$str)=@_;if ($] ge '5.008'){utf8::encode($str)}else {$str=pack("U*",unpack("C*",$str))if (length$str==do {use bytes;length$str});$str=pack("C*",unpack("C*",$str))}$str =~ s/($unsafe_char)/$escapes{$1}/ge;return$str}package HTTP::Tiny::Handle;use strict;use warnings;use Errno qw[EINTR EPIPE];use IO::Socket qw[SOCK_STREAM];sub BUFSIZE () {32768}my$Printable=sub {local $_=shift;s/\r/\\r/g;s/\n/\\n/g;s/\t/\\t/g;s/([^\x20-\x7E])/sprintf('\\x%.2X', ord($1))/ge;$_};my$Token=qr/[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/;sub new {my ($class,%args)=@_;return bless {rbuf=>'',timeout=>60,max_line_size=>16384,max_header_lines=>64,verify_SSL=>0,SSL_options=>{},%args },$class}sub connect {@_==4 || die(q/Usage: $handle->connect(scheme, host, port)/ ."\n");my ($self,$scheme,$host,$port)=@_;if ($scheme eq 'https'){die(qq/IO::Socket::SSL 1.42 must be installed for https support\n/)unless eval {require IO::Socket::SSL;IO::Socket::SSL->VERSION(1.42)};die(qq/Net::SSLeay 1.49 must be installed for https support\n/)unless eval {require Net::SSLeay;Net::SSLeay->VERSION(1.49)}}elsif ($scheme ne 'http'){die(qq/Unsupported URL scheme '$scheme'\n/)}$self->{fh}='IO::Socket::INET'->new(PeerHost=>$host,PeerPort=>$port,$self->{local_address}? (LocalAddr=>$self->{local_address}): (),Proto=>'tcp',Type=>SOCK_STREAM,Timeout=>$self->{timeout})or die(qq/Could not connect to '$host:$port': $@\n/);binmode($self->{fh})or die(qq/Could not binmode() socket: '$!'\n/);if ($scheme eq 'https'){my$ssl_args=$self->_ssl_args($host);IO::Socket::SSL->start_SSL($self->{fh},%$ssl_args,SSL_create_ctx_callback=>sub {my$ctx=shift;Net::SSLeay::CTX_set_mode($ctx,Net::SSLeay::MODE_AUTO_RETRY())},);unless (ref($self->{fh})eq 'IO::Socket::SSL'){my$ssl_err=IO::Socket::SSL->errstr;die(qq/SSL connection failed for $host: $ssl_err\n/)}}$self->{host}=$host;$self->{port}=$port;return$self}sub close {@_==1 || die(q/Usage: $handle->close()/ ."\n");my ($self)=@_;CORE::close($self->{fh})or die(qq/Could not close socket: '$!'\n/)}sub write {@_==2 || die(q/Usage: $handle->write(buf)/ ."\n");my ($self,$buf)=@_;if ($] ge '5.008'){utf8::downgrade($buf,1)or die(qq/Wide character in write()\n/)}my$len=length$buf;my$off=0;local$SIG{PIPE}='IGNORE';while (){$self->can_write or die(qq/Timed out while waiting for socket to become ready for writing\n/);my$r=syswrite($self->{fh},$buf,$len,$off);if (defined$r){$len -= $r;$off += $r;last unless$len > 0}elsif ($!==EPIPE){die(qq/Socket closed by remote server: $!\n/)}elsif ($!!=EINTR){if ($self->{fh}->can('errstr')){my$err=$self->{fh}->errstr();die (qq/Could not write to SSL socket: '$err'\n /)}else {die(qq/Could not write to socket: '$!'\n/)}}}return$off}sub read {@_==2 || @_==3 || die(q/Usage: $handle->read(len [, allow_partial])/ ."\n");my ($self,$len,$allow_partial)=@_;my$buf='';my$got=length$self->{rbuf};if ($got){my$take=($got < $len)? $got : $len;$buf=substr($self->{rbuf},0,$take,'');$len -= $take}while ($len > 0){$self->can_read or die(q/Timed out while waiting for socket to become ready for reading/ ."\n");my$r=sysread($self->{fh},$buf,$len,length$buf);if (defined$r){last unless$r;$len -= $r}elsif ($!!=EINTR){if ($self->{fh}->can('errstr')){my$err=$self->{fh}->errstr();die (qq/Could not read from SSL socket: '$err'\n /)}else {die(qq/Could not read from socket: '$!'\n/)}}}if ($len &&!$allow_partial){die(qq/Unexpected end of stream\n/)}return$buf}sub readline {@_==1 || die(q/Usage: $handle->readline()/ ."\n");my ($self)=@_;while (){if ($self->{rbuf}=~ s/\A ([^\x0D\x0A]* \x0D?\x0A)//x){return $1}if (length$self->{rbuf}>= $self->{max_line_size}){die(qq/Line size exceeds the maximum allowed size of $self->{max_line_size}\n/)}$self->can_read or die(qq/Timed out while waiting for socket to become ready for reading\n/);my$r=sysread($self->{fh},$self->{rbuf},BUFSIZE,length$self->{rbuf});if (defined$r){last unless$r}elsif ($!!=EINTR){if ($self->{fh}->can('errstr')){my$err=$self->{fh}->errstr();die (qq/Could not read from SSL socket: '$err'\n /)}else {die(qq/Could not read from socket: '$!'\n/)}}}die(qq/Unexpected end of stream while looking for line\n/)}sub read_header_lines {@_==1 || @_==2 || die(q/Usage: $handle->read_header_lines([headers])/ ."\n");my ($self,$headers)=@_;$headers ||={};my$lines=0;my$val;while (){my$line=$self->readline;if (++$lines >= $self->{max_header_lines}){die(qq/Header lines exceeds maximum number allowed of $self->{max_header_lines}\n/)}elsif ($line =~ /\A ([^\x00-\x1F\x7F:]+) : [\x09\x20]* ([^\x0D\x0A]*)/x){my ($field_name)=lc $1;if (exists$headers->{$field_name}){for ($headers->{$field_name}){$_=[$_]unless ref $_ eq "ARRAY";push @$_,$2;$val=\$_->[-1]}}else {$val=\($headers->{$field_name}=$2)}}elsif ($line =~ /\A [\x09\x20]+ ([^\x0D\x0A]*)/x){$val or die(qq/Unexpected header continuation line\n/);next unless length $1;$$val .= ' ' if length $$val;$$val .= $1}elsif ($line =~ /\A \x0D?\x0A \z/x){last}else {die(q/Malformed header line: / .$Printable->($line)."\n")}}return$headers}sub write_request {@_==2 || die(q/Usage: $handle->write_request(request)/ ."\n");my($self,$request)=@_;$self->write_request_header(@{$request}{qw/method uri headers/});$self->write_body($request)if$request->{cb};return}my%HeaderCase=('content-md5'=>'Content-MD5','etag'=>'ETag','te'=>'TE','www-authenticate'=>'WWW-Authenticate','x-xss-protection'=>'X-XSS-Protection',);sub write_header_lines {(@_==2 && ref $_[1]eq 'HASH')|| die(q/Usage: $handle->write_header_lines(headers)/ ."\n");my($self,$headers)=@_;my$buf='';while (my ($k,$v)=each %$headers){my$field_name=lc$k;if (exists$HeaderCase{$field_name}){$field_name=$HeaderCase{$field_name}}else {$field_name =~ /\A $Token+ \z/xo or die(q/Invalid HTTP header field name: / .$Printable->($field_name)."\n");$field_name =~ s/\b(\w)/\u$1/g;$HeaderCase{lc$field_name}=$field_name}for (ref$v eq 'ARRAY' ? @$v : $v){/[^\x0D\x0A]/ or die(qq/Invalid HTTP header field value ($field_name): / .$Printable->($_)."\n");$buf .= "$field_name: $_\x0D\x0A"}}$buf .= "\x0D\x0A";return$self->write($buf)}sub read_body {@_==3 || die(q/Usage: $handle->read_body(callback, response)/ ."\n");my ($self,$cb,$response)=@_;my$te=$response->{headers}{'transfer-encoding'}|| '';if (grep {/chunked/i}(ref$te eq 'ARRAY' ? @$te : $te)){$self->read_chunked_body($cb,$response)}else {$self->read_content_body($cb,$response)}return}sub write_body {@_==2 || die(q/Usage: $handle->write_body(request)/ ."\n");my ($self,$request)=@_;if ($request->{headers}{'content-length'}){return$self->write_content_body($request)}else {return$self->write_chunked_body($request)}}sub read_content_body {@_==3 || @_==4 || die(q/Usage: $handle->read_content_body(callback, response, [read_length])/ ."\n");my ($self,$cb,$response,$content_length)=@_;$content_length ||=$response->{headers}{'content-length'};if (defined$content_length){my$len=$content_length;while ($len > 0){my$read=($len > BUFSIZE)? BUFSIZE : $len;$cb->($self->read($read,0),$response);$len -= $read}}else {my$chunk;$cb->($chunk,$response)while length($chunk=$self->read(BUFSIZE,1))}return}sub write_content_body {@_==2 || die(q/Usage: $handle->write_content_body(request)/ ."\n");my ($self,$request)=@_;my ($len,$content_length)=(0,$request->{headers}{'content-length'});while (){my$data=$request->{cb}->();defined$data && length$data or last;if ($] ge '5.008'){utf8::downgrade($data,1)or die(qq/Wide character in write_content()\n/)}$len += $self->write($data)}$len==$content_length or die(qq/Content-Length missmatch (got: $len expected: $content_length)\n/);return$len}sub read_chunked_body {@_==3 || die(q/Usage: $handle->read_chunked_body(callback, $response)/ ."\n");my ($self,$cb,$response)=@_;while (){my$head=$self->readline;$head =~ /\A ([A-Fa-f0-9]+)/x or die(q/Malformed chunk head: / .$Printable->($head)."\n");my$len=hex($1)or last;$self->read_content_body($cb,$response,$len);$self->read(2)eq "\x0D\x0A" or die(qq/Malformed chunk: missing CRLF after chunk data\n/)}$self->read_header_lines($response->{headers});return}sub write_chunked_body {@_==2 || die(q/Usage: $handle->write_chunked_body(request)/ ."\n");my ($self,$request)=@_;my$len=0;while (){my$data=$request->{cb}->();defined$data && length$data or last;if ($] ge '5.008'){utf8::downgrade($data,1)or die(qq/Wide character in write_chunked_body()\n/)}$len += length$data;my$chunk=sprintf '%X',length$data;$chunk .= "\x0D\x0A";$chunk .= $data;$chunk .= "\x0D\x0A";$self->write($chunk)}$self->write("0\x0D\x0A");$self->write_header_lines($request->{trailer_cb}->())if ref$request->{trailer_cb}eq 'CODE';return$len}sub read_response_header {@_==1 || die(q/Usage: $handle->read_response_header()/ ."\n");my ($self)=@_;my$line=$self->readline;$line =~ /\A (HTTP\/(0*\d+\.0*\d+)) [\x09\x20]+ ([0-9]{3}) [\x09\x20]+ ([^\x0D\x0A]*) \x0D?\x0A/x or die(q/Malformed Status-Line: / .$Printable->($line)."\n");my ($protocol,$version,$status,$reason)=($1,$2,$3,$4);die (qq/Unsupported HTTP protocol: $protocol\n/)unless$version =~ /0*1\.0*[01]/;return {status=>$status,reason=>$reason,headers=>$self->read_header_lines,protocol=>$protocol,}}sub write_request_header {@_==4 || die(q/Usage: $handle->write_request_header(method, request_uri, headers)/ ."\n");my ($self,$method,$request_uri,$headers)=@_;return$self->write("$method $request_uri HTTP/1.1\x0D\x0A")+ $self->write_header_lines($headers)}sub _do_timeout {my ($self,$type,$timeout)=@_;$timeout=$self->{timeout}unless defined$timeout && $timeout >= 0;my$fd=fileno$self->{fh};defined$fd && $fd >= 0 or die(qq/select(2): 'Bad file descriptor'\n/);my$initial=time;my$pending=$timeout;my$nfound;vec(my$fdset='',$fd,1)=1;while (){$nfound=($type eq 'read')? select($fdset,undef,undef,$pending): select(undef,$fdset,undef,$pending);if ($nfound==-1){$!==EINTR or die(qq/select(2): '$!'\n/);redo if!$timeout || ($pending=$timeout - (time - $initial))> 0;$nfound=0}last}$!=0;return$nfound}sub can_read {@_==1 || @_==2 || die(q/Usage: $handle->can_read([timeout])/ ."\n");my$self=shift;return$self->_do_timeout('read',@_)}sub can_write {@_==1 || @_==2 || die(q/Usage: $handle->can_write([timeout])/ ."\n");my$self=shift;return$self->_do_timeout('write',@_)}sub _find_CA_file {my$self=shift();return$self->{SSL_options}->{SSL_ca_file}if$self->{SSL_options}->{SSL_ca_file}and -e $self->{SSL_options}->{SSL_ca_file};return Mozilla::CA::SSL_ca_file()if eval {require Mozilla::CA};for my$ca_bundle (qw{/etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/ca-bundle.pem}){return$ca_bundle if -e $ca_bundle}die qq/Couldn't find a CA bundle with which to verify the SSL certificate.\n/ .qq/Try installing Mozilla::CA from CPAN\n/}sub _ssl_args {my ($self,$host)=@_;my%ssl_args;if (Net::SSLeay::OPENSSL_VERSION_NUMBER()>= 0x01000000){$ssl_args{SSL_hostname}=$host,}if ($self->{verify_SSL}){$ssl_args{SSL_verifycn_scheme}='http';$ssl_args{SSL_verifycn_name}=$host;$ssl_args{SSL_verify_mode}=0x01;$ssl_args{SSL_ca_file}=$self->_find_CA_file}else {$ssl_args{SSL_verifycn_scheme}='none';$ssl_args{SSL_verify_mode}=0x00}for my$k (keys %{$self->{SSL_options}}){$ssl_args{$k}=$self->{SSL_options}{$k}if$k =~ m/^SSL_/}return \%ssl_args}1;
+$fatpacked{"HTTP/Tiny.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_TINY';
+ package HTTP::Tiny;use strict;use warnings;our$VERSION='0.056';use Carp ();my@attributes;BEGIN {@attributes=qw(cookie_jar default_headers http_proxy https_proxy keep_alive local_address max_redirect max_size proxy no_proxy timeout SSL_options verify_SSL);my%persist_ok=map {;$_=>1}qw(cookie_jar default_headers max_redirect max_size);no strict 'refs';no warnings 'uninitialized';for my$accessor (@attributes){*{$accessor}=sub {@_ > 1 ? do {delete $_[0]->{handle}if!$persist_ok{$accessor}&& $_[1]ne $_[0]->{$accessor};$_[0]->{$accessor}=$_[1]}: $_[0]->{$accessor}}}}sub agent {my($self,$agent)=@_;if(@_ > 1){$self->{agent}=(defined$agent && $agent =~ / $/)? $agent .$self->_agent : $agent}return$self->{agent}}sub new {my($class,%args)=@_;my$self={max_redirect=>5,timeout=>60,keep_alive=>1,verify_SSL=>$args{verify_SSL}|| $args{verify_ssl}|| 0,no_proxy=>$ENV{no_proxy},};bless$self,$class;$class->_validate_cookie_jar($args{cookie_jar})if$args{cookie_jar};for my$key (@attributes){$self->{$key}=$args{$key}if exists$args{$key}}$self->agent(exists$args{agent}? $args{agent}: $class->_agent);$self->_set_proxies;return$self}sub _set_proxies {my ($self)=@_;if (!exists$self->{proxy}){$self->{proxy}=$ENV{all_proxy}|| $ENV{ALL_PROXY}}if (defined$self->{proxy}){$self->_split_proxy('generic proxy'=>$self->{proxy})}else {delete$self->{proxy}}if (!exists$self->{http_proxy}){local$ENV{HTTP_PROXY}if$ENV{REQUEST_METHOD};$self->{http_proxy}=$ENV{http_proxy}|| $ENV{HTTP_PROXY}|| $self->{proxy}}if (defined$self->{http_proxy}){$self->_split_proxy(http_proxy=>$self->{http_proxy});$self->{_has_proxy}{http}=1}else {delete$self->{http_proxy}}if (!exists$self->{https_proxy}){$self->{https_proxy}=$ENV{https_proxy}|| $ENV{HTTPS_PROXY}|| $self->{proxy}}if ($self->{https_proxy}){$self->_split_proxy(https_proxy=>$self->{https_proxy});$self->{_has_proxy}{https}=1}else {delete$self->{https_proxy}}unless (ref$self->{no_proxy}eq 'ARRAY'){$self->{no_proxy}=(defined$self->{no_proxy})? [split /\s*,\s*/,$self->{no_proxy}]: []}return}for my$sub_name (qw/get head put post delete/){my$req_method=uc$sub_name;no strict 'refs';eval <<"HERE"}sub post_form {my ($self,$url,$data,$args)=@_;(@_==3 || @_==4 && ref$args eq 'HASH')or Carp::croak(q/Usage: $http->post_form(URL, DATAREF, [HASHREF])/ ."\n");my$headers={};while (my ($key,$value)=each %{$args->{headers}|| {}}){$headers->{lc$key}=$value}delete$args->{headers};return$self->request('POST',$url,{%$args,content=>$self->www_form_urlencode($data),headers=>{%$headers,'content-type'=>'application/x-www-form-urlencoded' },})}sub mirror {my ($self,$url,$file,$args)=@_;@_==3 || (@_==4 && ref$args eq 'HASH')or Carp::croak(q/Usage: $http->mirror(URL, FILE, [HASHREF])/ ."\n");if (-e $file and my$mtime=(stat($file))[9]){$args->{headers}{'if-modified-since'}||= $self->_http_date($mtime)}my$tempfile=$file .int(rand(2**31));require Fcntl;sysopen my$fh,$tempfile,Fcntl::O_CREAT()|Fcntl::O_EXCL()|Fcntl::O_WRONLY()or Carp::croak(qq/Error: Could not create temporary file $tempfile for downloading: $!\n/);binmode$fh;$args->{data_callback}=sub {print {$fh}$_[0]};my$response=$self->request('GET',$url,$args);close$fh or Carp::croak(qq/Error: Caught error closing temporary file $tempfile: $!\n/);if ($response->{success}){rename$tempfile,$file or Carp::croak(qq/Error replacing $file with $tempfile: $!\n/);my$lm=$response->{headers}{'last-modified'};if ($lm and my$mtime=$self->_parse_http_date($lm)){utime$mtime,$mtime,$file}}$response->{success}||= $response->{status}eq '304';unlink$tempfile;return$response}my%idempotent=map {$_=>1}qw/GET HEAD PUT DELETE OPTIONS TRACE/;sub request {my ($self,$method,$url,$args)=@_;@_==3 || (@_==4 && ref$args eq 'HASH')or Carp::croak(q/Usage: $http->request(METHOD, URL, [HASHREF])/ ."\n");$args ||= {};my$response;for (0 .. 1){$response=eval {$self->_request($method,$url,$args)};last unless $@ && $idempotent{$method}&& $@ =~ m{^(?:Socket closed|Unexpected end)}}if (my$e=$@){if (ref$e eq 'HASH' && exists$e->{status}){return$e}$e="$e";$response={url=>$url,success=>q{},status=>599,reason=>'Internal Exception',content=>$e,headers=>{'content-type'=>'text/plain','content-length'=>length$e,}}}return$response}sub www_form_urlencode {my ($self,$data)=@_;(@_==2 && ref$data)or Carp::croak(q/Usage: $http->www_form_urlencode(DATAREF)/ ."\n");(ref$data eq 'HASH' || ref$data eq 'ARRAY')or Carp::croak("form data must be a hash or array reference\n");my@params=ref$data eq 'HASH' ? %$data : @$data;@params % 2==0 or Carp::croak("form data reference must have an even number of terms\n");my@terms;while(@params){my ($key,$value)=splice(@params,0,2);if (ref$value eq 'ARRAY'){unshift@params,map {$key=>$_}@$value}else {push@terms,join("=",map {$self->_uri_escape($_)}$key,$value)}}return join("&",(ref$data eq 'ARRAY')? (@terms): (sort@terms))}sub can_ssl {my ($self)=@_;my($ok,$reason)=(1,'');unless (eval {require IO::Socket::SSL;IO::Socket::SSL->VERSION(1.42)}){$ok=0;$reason .= qq/IO::Socket::SSL 1.42 must be installed for https support\n/}unless (eval {require Net::SSLeay;Net::SSLeay->VERSION(1.49)}){$ok=0;$reason .= qq/Net::SSLeay 1.49 must be installed for https support\n/}if (ref($self)&& ($self->{verify_SSL}|| $self->{SSL_options}{SSL_verify_mode})){my$handle=HTTP::Tiny::Handle->new(SSL_options=>$self->{SSL_options},verify_SSL=>$self->{verify_SSL},);unless (eval {$handle->_find_CA_file;1}){$ok=0;$reason .= "$@"}}wantarray ? ($ok,$reason): $ok}my%DefaultPort=(http=>80,https=>443,);sub _agent {my$class=ref($_[0])|| $_[0];(my$default_agent=$class)=~ s{::}{-}g;return$default_agent ."/" .$class->VERSION}sub _request {my ($self,$method,$url,$args)=@_;my ($scheme,$host,$port,$path_query,$auth)=$self->_split_url($url);my$request={method=>$method,scheme=>$scheme,host=>$host,port=>$port,host_port=>($port==$DefaultPort{$scheme}? $host : "$host:$port"),uri=>$path_query,headers=>{},};my$handle=delete$self->{handle};if ($handle){unless ($handle->can_reuse($scheme,$host,$port)){$handle->close;undef$handle}}$handle ||= $self->_open_handle($request,$scheme,$host,$port);$self->_prepare_headers_and_cb($request,$args,$url,$auth);$handle->write_request($request);my$response;do {$response=$handle->read_response_header}until (substr($response->{status},0,1)ne '1');$self->_update_cookie_jar($url,$response)if$self->{cookie_jar};if (my@redir_args=$self->_maybe_redirect($request,$response,$args)){$handle->close;return$self->_request(@redir_args,$args)}my$known_message_length;if ($method eq 'HEAD' || $response->{status}=~ /^[23]04/){$known_message_length=1}else {my$data_cb=$self->_prepare_data_cb($response,$args);$known_message_length=$handle->read_body($data_cb,$response)}if ($self->{keep_alive}&& $known_message_length && $response->{protocol}eq 'HTTP/1.1' && ($response->{headers}{connection}|| '')ne 'close'){$self->{handle}=$handle}else {$handle->close}$response->{success}=substr($response->{status},0,1)eq '2';$response->{url}=$url;return$response}sub _open_handle {my ($self,$request,$scheme,$host,$port)=@_;my$handle=HTTP::Tiny::Handle->new(timeout=>$self->{timeout},SSL_options=>$self->{SSL_options},verify_SSL=>$self->{verify_SSL},local_address=>$self->{local_address},keep_alive=>$self->{keep_alive});if ($self->{_has_proxy}{$scheme}&&!grep {$host =~ /\Q$_\E$/}@{$self->{no_proxy}}){return$self->_proxy_connect($request,$handle)}else {return$handle->connect($scheme,$host,$port)}}sub _proxy_connect {my ($self,$request,$handle)=@_;my@proxy_vars;if ($request->{scheme}eq 'https'){Carp::croak(qq{No https_proxy defined})unless$self->{https_proxy};@proxy_vars=$self->_split_proxy(https_proxy=>$self->{https_proxy});if ($proxy_vars[0]eq 'https'){Carp::croak(qq{Can't proxy https over https: $request->{uri} via $self->{https_proxy}})}}else {Carp::croak(qq{No http_proxy defined})unless$self->{http_proxy};@proxy_vars=$self->_split_proxy(http_proxy=>$self->{http_proxy})}my ($p_scheme,$p_host,$p_port,$p_auth)=@proxy_vars;if (length$p_auth &&!defined$request->{headers}{'proxy-authorization'}){$self->_add_basic_auth_header($request,'proxy-authorization'=>$p_auth)}$handle->connect($p_scheme,$p_host,$p_port);if ($request->{scheme}eq 'https'){$self->_create_proxy_tunnel($request,$handle)}else {$request->{uri}="$request->{scheme}://$request->{host_port}$request->{uri}"}return$handle}sub _split_proxy {my ($self,$type,$proxy)=@_;my ($scheme,$host,$port,$path_query,$auth)=eval {$self->_split_url($proxy)};unless(defined($scheme)&& length($scheme)&& length($host)&& length($port)&& $path_query eq '/'){Carp::croak(qq{$type URL must be in format http[s]://[auth@]<host>:<port>/\n})}return ($scheme,$host,$port,$auth)}sub _create_proxy_tunnel {my ($self,$request,$handle)=@_;$handle->_assert_ssl;my$agent=exists($request->{headers}{'user-agent'})? $request->{headers}{'user-agent'}: $self->{agent};my$connect_request={method=>'CONNECT',uri=>"$request->{host}:$request->{port}",headers=>{host=>"$request->{host}:$request->{port}",'user-agent'=>$agent,}};if ($request->{headers}{'proxy-authorization'}){$connect_request->{headers}{'proxy-authorization'}=delete$request->{headers}{'proxy-authorization'}}$handle->write_request($connect_request);my$response;do {$response=$handle->read_response_header}until (substr($response->{status},0,1)ne '1');unless (substr($response->{status},0,1)eq '2'){die$response}$handle->start_ssl($request->{host});return}sub _prepare_headers_and_cb {my ($self,$request,$args,$url,$auth)=@_;for ($self->{default_headers},$args->{headers}){next unless defined;while (my ($k,$v)=each %$_){$request->{headers}{lc$k}=$v}}if (exists$request->{headers}{'host'}){die(qq/The 'Host' header must not be provided as header option\n/)}$request->{headers}{'host'}=$request->{host_port};$request->{headers}{'user-agent'}||= $self->{agent};$request->{headers}{'connection'}="close" unless$self->{keep_alive};if (defined$args->{content}){if (ref$args->{content}eq 'CODE'){$request->{headers}{'content-type'}||= "application/octet-stream";$request->{headers}{'transfer-encoding'}='chunked' unless$request->{headers}{'content-length'}|| $request->{headers}{'transfer-encoding'};$request->{cb}=$args->{content}}elsif (length$args->{content}){my$content=$args->{content};if ($] ge '5.008'){utf8::downgrade($content,1)or die(qq/Wide character in request message body\n/)}$request->{headers}{'content-type'}||= "application/octet-stream";$request->{headers}{'content-length'}=length$content unless$request->{headers}{'content-length'}|| $request->{headers}{'transfer-encoding'};$request->{cb}=sub {substr$content,0,length$content,''}}$request->{trailer_cb}=$args->{trailer_callback}if ref$args->{trailer_callback}eq 'CODE'}if ($self->{cookie_jar}){my$cookies=$self->cookie_jar->cookie_header($url);$request->{headers}{cookie}=$cookies if length$cookies}if (length$auth &&!defined$request->{headers}{authorization}){$self->_add_basic_auth_header($request,'authorization'=>$auth)}return}sub _add_basic_auth_header {my ($self,$request,$header,$auth)=@_;require MIME::Base64;$request->{headers}{$header}="Basic " .MIME::Base64::encode_base64($auth,"");return}sub _prepare_data_cb {my ($self,$response,$args)=@_;my$data_cb=$args->{data_callback};$response->{content}='';if (!$data_cb || $response->{status}!~ /^2/){if (defined$self->{max_size}){$data_cb=sub {$_[1]->{content}.= $_[0];die(qq/Size of response body exceeds the maximum allowed of $self->{max_size}\n/)if length $_[1]->{content}> $self->{max_size}}}else {$data_cb=sub {$_[1]->{content}.= $_[0]}}}return$data_cb}sub _update_cookie_jar {my ($self,$url,$response)=@_;my$cookies=$response->{headers}->{'set-cookie'};return unless defined$cookies;my@cookies=ref$cookies ? @$cookies : $cookies;$self->cookie_jar->add($url,$_)for@cookies;return}sub _validate_cookie_jar {my ($class,$jar)=@_;for my$method (qw/add cookie_header/){Carp::croak(qq/Cookie jar must provide the '$method' method\n/)unless ref($jar)&& ref($jar)->can($method)}return}sub _maybe_redirect {my ($self,$request,$response,$args)=@_;my$headers=$response->{headers};my ($status,$method)=($response->{status},$request->{method});if (($status eq '303' or ($status =~ /^30[1278]/ && $method =~ /^GET|HEAD$/))and $headers->{location}and ++$args->{redirects}<= $self->{max_redirect}){my$location=($headers->{location}=~ /^\//)? "$request->{scheme}://$request->{host_port}$headers->{location}" : $headers->{location};return (($status eq '303' ? 'GET' : $method),$location)}return}sub _split_url {my$url=pop;my ($scheme,$host,$path_query)=$url =~ m<\A([^:/?#]+)://([^/?#]*)([^#]*)> or die(qq/Cannot parse URL: '$url'\n/);$scheme=lc$scheme;$path_query="/$path_query" unless$path_query =~ m<\A/>;my$auth='';if ((my$i=index$host,'@')!=-1){$auth=substr$host,0,$i,'';substr$host,0,1,'';$auth =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg}my$port=$host =~ s/:(\d*)\z// && length $1 ? $1 : $scheme eq 'http' ? 80 : $scheme eq 'https' ? 443 : undef;return ($scheme,(length$host ? lc$host : "localhost"),$port,$path_query,$auth)}my$DoW="Sun|Mon|Tue|Wed|Thu|Fri|Sat";my$MoY="Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";sub _http_date {my ($sec,$min,$hour,$mday,$mon,$year,$wday)=gmtime($_[1]);return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",substr($DoW,$wday*4,3),$mday,substr($MoY,$mon*4,3),$year+1900,$hour,$min,$sec)}sub _parse_http_date {my ($self,$str)=@_;require Time::Local;my@tl_parts;if ($str =~ /^[SMTWF][a-z]+, +(\d{1,2}) ($MoY) +(\d\d\d\d) +(\d\d):(\d\d):(\d\d) +GMT$/){@tl_parts=($6,$5,$4,$1,(index($MoY,$2)/4),$3)}elsif ($str =~ /^[SMTWF][a-z]+, +(\d\d)-($MoY)-(\d{2,4}) +(\d\d):(\d\d):(\d\d) +GMT$/){@tl_parts=($6,$5,$4,$1,(index($MoY,$2)/4),$3)}elsif ($str =~ /^[SMTWF][a-z]+ +($MoY) +(\d{1,2}) +(\d\d):(\d\d):(\d\d) +(?:[^0-9]+ +)?(\d\d\d\d)$/){@tl_parts=($5,$4,$3,$2,(index($MoY,$1)/4),$6)}return eval {my$t=@tl_parts ? Time::Local::timegm(@tl_parts): -1;$t < 0 ? undef : $t}}my%escapes=map {chr($_)=>sprintf("%%%02X",$_)}0..255;$escapes{' '}="+";my$unsafe_char=qr/[^A-Za-z0-9\-\._~]/;sub _uri_escape {my ($self,$str)=@_;if ($] ge '5.008'){utf8::encode($str)}else {$str=pack("U*",unpack("C*",$str))if (length$str==do {use bytes;length$str});$str=pack("C*",unpack("C*",$str))}$str =~ s/($unsafe_char)/$escapes{$1}/ge;return$str}package HTTP::Tiny::Handle;use strict;use warnings;use Errno qw[EINTR EPIPE];use IO::Socket qw[SOCK_STREAM];my$SOCKET_CLASS=$ENV{PERL_HTTP_TINY_IPV4_ONLY}? 'IO::Socket::INET' : eval {require IO::Socket::IP;IO::Socket::IP->VERSION(0.25)}? 'IO::Socket::IP' : 'IO::Socket::INET';sub BUFSIZE () {32768}my$Printable=sub {local $_=shift;s/\r/\\r/g;s/\n/\\n/g;s/\t/\\t/g;s/([^\x20-\x7E])/sprintf('\\x%.2X', ord($1))/ge;$_};my$Token=qr/[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/;sub new {my ($class,%args)=@_;return bless {rbuf=>'',timeout=>60,max_line_size=>16384,max_header_lines=>64,verify_SSL=>0,SSL_options=>{},%args },$class}sub connect {@_==4 || die(q/Usage: $handle->connect(scheme, host, port)/ ."\n");my ($self,$scheme,$host,$port)=@_;if ($scheme eq 'https'){$self->_assert_ssl}elsif ($scheme ne 'http'){die(qq/Unsupported URL scheme '$scheme'\n/)}$self->{fh}=$SOCKET_CLASS->new(PeerHost=>$host,PeerPort=>$port,$self->{local_address}? (LocalAddr=>$self->{local_address}): (),Proto=>'tcp',Type=>SOCK_STREAM,Timeout=>$self->{timeout},KeepAlive=>!!$self->{keep_alive})or die(qq/Could not connect to '$host:$port': $@\n/);binmode($self->{fh})or die(qq/Could not binmode() socket: '$!'\n/);$self->start_ssl($host)if$scheme eq 'https';$self->{scheme}=$scheme;$self->{host}=$host;$self->{port}=$port;$self->{pid}=$$;$self->{tid}=_get_tid();return$self}sub start_ssl {my ($self,$host)=@_;if (ref($self->{fh})eq 'IO::Socket::SSL'){unless ($self->{fh}->stop_SSL){my$ssl_err=IO::Socket::SSL->errstr;die(qq/Error halting prior SSL connection: $ssl_err/)}}my$ssl_args=$self->_ssl_args($host);IO::Socket::SSL->start_SSL($self->{fh},%$ssl_args,SSL_create_ctx_callback=>sub {my$ctx=shift;Net::SSLeay::CTX_set_mode($ctx,Net::SSLeay::MODE_AUTO_RETRY())},);unless (ref($self->{fh})eq 'IO::Socket::SSL'){my$ssl_err=IO::Socket::SSL->errstr;die(qq/SSL connection failed for $host: $ssl_err\n/)}}sub close {@_==1 || die(q/Usage: $handle->close()/ ."\n");my ($self)=@_;CORE::close($self->{fh})or die(qq/Could not close socket: '$!'\n/)}sub write {@_==2 || die(q/Usage: $handle->write(buf)/ ."\n");my ($self,$buf)=@_;if ($] ge '5.008'){utf8::downgrade($buf,1)or die(qq/Wide character in write()\n/)}my$len=length$buf;my$off=0;local$SIG{PIPE}='IGNORE';while (){$self->can_write or die(qq/Timed out while waiting for socket to become ready for writing\n/);my$r=syswrite($self->{fh},$buf,$len,$off);if (defined$r){$len -= $r;$off += $r;last unless$len > 0}elsif ($!==EPIPE){die(qq/Socket closed by remote server: $!\n/)}elsif ($!!=EINTR){if ($self->{fh}->can('errstr')){my$err=$self->{fh}->errstr();die (qq/Could not write to SSL socket: '$err'\n /)}else {die(qq/Could not write to socket: '$!'\n/)}}}return$off}sub read {@_==2 || @_==3 || die(q/Usage: $handle->read(len [, allow_partial])/ ."\n");my ($self,$len,$allow_partial)=@_;my$buf='';my$got=length$self->{rbuf};if ($got){my$take=($got < $len)? $got : $len;$buf=substr($self->{rbuf},0,$take,'');$len -= $take}while ($len > 0){$self->can_read or die(q/Timed out while waiting for socket to become ready for reading/ ."\n");my$r=sysread($self->{fh},$buf,$len,length$buf);if (defined$r){last unless$r;$len -= $r}elsif ($!!=EINTR){if ($self->{fh}->can('errstr')){my$err=$self->{fh}->errstr();die (qq/Could not read from SSL socket: '$err'\n /)}else {die(qq/Could not read from socket: '$!'\n/)}}}if ($len &&!$allow_partial){die(qq/Unexpected end of stream\n/)}return$buf}sub readline {@_==1 || die(q/Usage: $handle->readline()/ ."\n");my ($self)=@_;while (){if ($self->{rbuf}=~ s/\A ([^\x0D\x0A]* \x0D?\x0A)//x){return $1}if (length$self->{rbuf}>= $self->{max_line_size}){die(qq/Line size exceeds the maximum allowed size of $self->{max_line_size}\n/)}$self->can_read or die(qq/Timed out while waiting for socket to become ready for reading\n/);my$r=sysread($self->{fh},$self->{rbuf},BUFSIZE,length$self->{rbuf});if (defined$r){last unless$r}elsif ($!!=EINTR){if ($self->{fh}->can('errstr')){my$err=$self->{fh}->errstr();die (qq/Could not read from SSL socket: '$err'\n /)}else {die(qq/Could not read from socket: '$!'\n/)}}}die(qq/Unexpected end of stream while looking for line\n/)}sub read_header_lines {@_==1 || @_==2 || die(q/Usage: $handle->read_header_lines([headers])/ ."\n");my ($self,$headers)=@_;$headers ||= {};my$lines=0;my$val;while (){my$line=$self->readline;if (++$lines >= $self->{max_header_lines}){die(qq/Header lines exceeds maximum number allowed of $self->{max_header_lines}\n/)}elsif ($line =~ /\A ([^\x00-\x1F\x7F:]+) : [\x09\x20]* ([^\x0D\x0A]*)/x){my ($field_name)=lc $1;if (exists$headers->{$field_name}){for ($headers->{$field_name}){$_=[$_]unless ref $_ eq "ARRAY";push @$_,$2;$val=\$_->[-1]}}else {$val=\($headers->{$field_name}=$2)}}elsif ($line =~ /\A [\x09\x20]+ ([^\x0D\x0A]*)/x){$val or die(qq/Unexpected header continuation line\n/);next unless length $1;$$val .= ' ' if length $$val;$$val .= $1}elsif ($line =~ /\A \x0D?\x0A \z/x){last}else {die(q/Malformed header line: / .$Printable->($line)."\n")}}return$headers}sub write_request {@_==2 || die(q/Usage: $handle->write_request(request)/ ."\n");my($self,$request)=@_;$self->write_request_header(@{$request}{qw/method uri headers/});$self->write_body($request)if$request->{cb};return}my%HeaderCase=('content-md5'=>'Content-MD5','etag'=>'ETag','te'=>'TE','www-authenticate'=>'WWW-Authenticate','x-xss-protection'=>'X-XSS-Protection',);sub write_header_lines {(@_==2 || @_==3 && ref $_[1]eq 'HASH')|| die(q/Usage: $handle->write_header_lines(headers[,prefix])/ ."\n");my($self,$headers,$prefix_data)=@_;my$buf=(defined$prefix_data ? $prefix_data : '');while (my ($k,$v)=each %$headers){my$field_name=lc$k;if (exists$HeaderCase{$field_name}){$field_name=$HeaderCase{$field_name}}else {$field_name =~ /\A $Token+ \z/xo or die(q/Invalid HTTP header field name: / .$Printable->($field_name)."\n");$field_name =~ s/\b(\w)/\u$1/g;$HeaderCase{lc$field_name}=$field_name}for (ref$v eq 'ARRAY' ? @$v : $v){$_='' unless defined $_;$buf .= "$field_name: $_\x0D\x0A"}}$buf .= "\x0D\x0A";return$self->write($buf)}sub read_body {@_==3 || die(q/Usage: $handle->read_body(callback, response)/ ."\n");my ($self,$cb,$response)=@_;my$te=$response->{headers}{'transfer-encoding'}|| '';my$chunked=grep {/chunked/i}(ref$te eq 'ARRAY' ? @$te : $te);return$chunked ? $self->read_chunked_body($cb,$response): $self->read_content_body($cb,$response)}sub write_body {@_==2 || die(q/Usage: $handle->write_body(request)/ ."\n");my ($self,$request)=@_;if ($request->{headers}{'content-length'}){return$self->write_content_body($request)}else {return$self->write_chunked_body($request)}}sub read_content_body {@_==3 || @_==4 || die(q/Usage: $handle->read_content_body(callback, response, [read_length])/ ."\n");my ($self,$cb,$response,$content_length)=@_;$content_length ||= $response->{headers}{'content-length'};if (defined$content_length){my$len=$content_length;while ($len > 0){my$read=($len > BUFSIZE)? BUFSIZE : $len;$cb->($self->read($read,0),$response);$len -= $read}return length($self->{rbuf})==0}my$chunk;$cb->($chunk,$response)while length($chunk=$self->read(BUFSIZE,1));return}sub write_content_body {@_==2 || die(q/Usage: $handle->write_content_body(request)/ ."\n");my ($self,$request)=@_;my ($len,$content_length)=(0,$request->{headers}{'content-length'});while (){my$data=$request->{cb}->();defined$data && length$data or last;if ($] ge '5.008'){utf8::downgrade($data,1)or die(qq/Wide character in write_content()\n/)}$len += $self->write($data)}$len==$content_length or die(qq/Content-Length mismatch (got: $len expected: $content_length)\n/);return$len}sub read_chunked_body {@_==3 || die(q/Usage: $handle->read_chunked_body(callback, $response)/ ."\n");my ($self,$cb,$response)=@_;while (){my$head=$self->readline;$head =~ /\A ([A-Fa-f0-9]+)/x or die(q/Malformed chunk head: / .$Printable->($head)."\n");my$len=hex($1)or last;$self->read_content_body($cb,$response,$len);$self->read(2)eq "\x0D\x0A" or die(qq/Malformed chunk: missing CRLF after chunk data\n/)}$self->read_header_lines($response->{headers});return 1}sub write_chunked_body {@_==2 || die(q/Usage: $handle->write_chunked_body(request)/ ."\n");my ($self,$request)=@_;my$len=0;while (){my$data=$request->{cb}->();defined$data && length$data or last;if ($] ge '5.008'){utf8::downgrade($data,1)or die(qq/Wide character in write_chunked_body()\n/)}$len += length$data;my$chunk=sprintf '%X',length$data;$chunk .= "\x0D\x0A";$chunk .= $data;$chunk .= "\x0D\x0A";$self->write($chunk)}$self->write("0\x0D\x0A");$self->write_header_lines($request->{trailer_cb}->())if ref$request->{trailer_cb}eq 'CODE';return$len}sub read_response_header {@_==1 || die(q/Usage: $handle->read_response_header()/ ."\n");my ($self)=@_;my$line=$self->readline;$line =~ /\A (HTTP\/(0*\d+\.0*\d+)) [\x09\x20]+ ([0-9]{3}) [\x09\x20]+ ([^\x0D\x0A]*) \x0D?\x0A/x or die(q/Malformed Status-Line: / .$Printable->($line)."\n");my ($protocol,$version,$status,$reason)=($1,$2,$3,$4);die (qq/Unsupported HTTP protocol: $protocol\n/)unless$version =~ /0*1\.0*[01]/;return {status=>$status,reason=>$reason,headers=>$self->read_header_lines,protocol=>$protocol,}}sub write_request_header {@_==4 || die(q/Usage: $handle->write_request_header(method, request_uri, headers)/ ."\n");my ($self,$method,$request_uri,$headers)=@_;return$self->write_header_lines($headers,"$method $request_uri HTTP/1.1\x0D\x0A")}sub _do_timeout {my ($self,$type,$timeout)=@_;$timeout=$self->{timeout}unless defined$timeout && $timeout >= 0;my$fd=fileno$self->{fh};defined$fd && $fd >= 0 or die(qq/select(2): 'Bad file descriptor'\n/);my$initial=time;my$pending=$timeout;my$nfound;vec(my$fdset='',$fd,1)=1;while (){$nfound=($type eq 'read')? select($fdset,undef,undef,$pending): select(undef,$fdset,undef,$pending);if ($nfound==-1){$!==EINTR or die(qq/select(2): '$!'\n/);redo if!$timeout || ($pending=$timeout - (time - $initial))> 0;$nfound=0}last}$!=0;return$nfound}sub can_read {@_==1 || @_==2 || die(q/Usage: $handle->can_read([timeout])/ ."\n");my$self=shift;if (ref($self->{fh})eq 'IO::Socket::SSL'){return 1 if$self->{fh}->pending}return$self->_do_timeout('read',@_)}sub can_write {@_==1 || @_==2 || die(q/Usage: $handle->can_write([timeout])/ ."\n");my$self=shift;return$self->_do_timeout('write',@_)}sub _assert_ssl {my($ok,$reason)=HTTP::Tiny->can_ssl();die$reason unless$ok}sub can_reuse {my ($self,$scheme,$host,$port)=@_;return 0 if $self->{pid}!=$$ || $self->{tid}!=_get_tid()|| length($self->{rbuf})|| $scheme ne $self->{scheme}|| $host ne $self->{host}|| $port ne $self->{port}|| eval {$self->can_read(0)}|| $@ ;return 1}sub _find_CA_file {my$self=shift();if ($self->{SSL_options}->{SSL_ca_file}){unless (-r $self->{SSL_options}->{SSL_ca_file}){die qq/SSL_ca_file '$self->{SSL_options}->{SSL_ca_file}' not found or not readable\n/}return$self->{SSL_options}->{SSL_ca_file}}return Mozilla::CA::SSL_ca_file()if eval {require Mozilla::CA;1};for my$ca_bundle ("/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/ssl/ca-bundle.pem","/etc/openssl/certs/ca-certificates.crt","/etc/ssl/cert.pem","/usr/local/share/certs/ca-root-nss.crt","/etc/pki/tls/cacert.pem","/etc/certs/ca-certificates.crt",){return$ca_bundle if -e $ca_bundle}die qq/Couldn't find a CA bundle with which to verify the SSL certificate.\n/ .qq/Try installing Mozilla::CA from CPAN\n/}sub _get_tid {no warnings 'reserved';return threads->can("tid")? threads->tid : 0}sub _ssl_args {my ($self,$host)=@_;my%ssl_args;if (Net::SSLeay::OPENSSL_VERSION_NUMBER()>= 0x01000000){$ssl_args{SSL_hostname}=$host,}if ($self->{verify_SSL}){$ssl_args{SSL_verifycn_scheme}='http';$ssl_args{SSL_verifycn_name}=$host;$ssl_args{SSL_verify_mode}=0x01;$ssl_args{SSL_ca_file}=$self->_find_CA_file}else {$ssl_args{SSL_verifycn_scheme}='none';$ssl_args{SSL_verify_mode}=0x00}for my$k (keys %{$self->{SSL_options}}){$ssl_args{$k}=$self->{SSL_options}{$k}if$k =~ m/^SSL_/}return \%ssl_args}1;
sub $sub_name {
my (\$self, \$url, \$args) = \@_;
\@_ == 2 || (\@_ == 3 && ref \$args eq 'HASH')
@@ -253,8 +231,8 @@ $fatpacked{"HTTP/Tiny.pm"} = <<'HTTP_TINY';
HERE
HTTP_TINY
-$fatpacked{"JSON/PP.pm"} = <<'JSON_PP';
- package JSON::PP;use 5.005;use strict;use base qw(Exporter);use overload ();use Carp ();use B ();$JSON::PP::VERSION='2.27202';@JSON::PP::EXPORT=qw(encode_json decode_json from_json to_json);use constant P_ASCII=>0;use constant P_LATIN1=>1;use constant P_UTF8=>2;use constant P_INDENT=>3;use constant P_CANONICAL=>4;use constant P_SPACE_BEFORE=>5;use constant P_SPACE_AFTER=>6;use constant P_ALLOW_NONREF=>7;use constant P_SHRINK=>8;use constant P_ALLOW_BLESSED=>9;use constant P_CONVERT_BLESSED=>10;use constant P_RELAXED=>11;use constant P_LOOSE=>12;use constant P_ALLOW_BIGNUM=>13;use constant P_ALLOW_BAREKEY=>14;use constant P_ALLOW_SINGLEQUOTE=>15;use constant P_ESCAPE_SLASH=>16;use constant P_AS_NONBLESSED=>17;use constant P_ALLOW_UNKNOWN=>18;use constant OLD_PERL=>$] < 5.008 ? 1 : 0;BEGIN {my@xs_compati_bit_properties=qw(latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink allow_blessed convert_blessed relaxed allow_unknown);my@pp_bit_properties=qw(allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed);if ($] < 5.008){my$helper=$] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';eval qq| require $helper |;if ($@){Carp::croak $@}}for my$name (@xs_compati_bit_properties,@pp_bit_properties){my$flag_name='P_' .uc($name);eval qq/
+$fatpacked{"JSON/PP.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP';
+ package JSON::PP;use 5.005;use strict;use base qw(Exporter);use overload ();use Carp ();use B ();$JSON::PP::VERSION='2.27300';@JSON::PP::EXPORT=qw(encode_json decode_json from_json to_json);use constant P_ASCII=>0;use constant P_LATIN1=>1;use constant P_UTF8=>2;use constant P_INDENT=>3;use constant P_CANONICAL=>4;use constant P_SPACE_BEFORE=>5;use constant P_SPACE_AFTER=>6;use constant P_ALLOW_NONREF=>7;use constant P_SHRINK=>8;use constant P_ALLOW_BLESSED=>9;use constant P_CONVERT_BLESSED=>10;use constant P_RELAXED=>11;use constant P_LOOSE=>12;use constant P_ALLOW_BIGNUM=>13;use constant P_ALLOW_BAREKEY=>14;use constant P_ALLOW_SINGLEQUOTE=>15;use constant P_ESCAPE_SLASH=>16;use constant P_AS_NONBLESSED=>17;use constant P_ALLOW_UNKNOWN=>18;use constant OLD_PERL=>$] < 5.008 ? 1 : 0;BEGIN {my@xs_compati_bit_properties=qw(latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink allow_blessed convert_blessed relaxed allow_unknown);my@pp_bit_properties=qw(allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed);if ($] < 5.008){my$helper=$] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';eval qq| require $helper |;if ($@){Carp::croak $@}}for my$name (@xs_compati_bit_properties,@pp_bit_properties){my$flag_name='P_' .uc($name);eval qq/
sub $name {
my \$enable = defined \$_[1] ? \$_[1] : 1;
@@ -271,7 +249,7 @@ $fatpacked{"JSON/PP.pm"} = <<'JSON_PP';
sub get_$name {
\$_[0]->{PROPS}->[$flag_name] ? 1 : '';
}
- /}}my%encode_allow_method =map {($_=>1)}qw/utf8 pretty allow_nonref latin1 self_encode escape_slash allow_blessed convert_blessed indent indent_length allow_bignum as_nonblessed/;my%decode_allow_method =map {($_=>1)}qw/utf8 allow_nonref loose allow_singlequote allow_bignum allow_barekey max_size relaxed/;my$JSON;sub encode_json ($) {($JSON ||=__PACKAGE__->new->utf8)->encode(@_)}sub decode_json {($JSON ||=__PACKAGE__->new->utf8)->decode(@_)}sub to_json($) {Carp::croak ("JSON::PP::to_json has been renamed to encode_json.")}sub from_json($) {Carp::croak ("JSON::PP::from_json has been renamed to decode_json.")}sub new {my$class=shift;my$self={max_depth=>512,max_size=>0,indent=>0,FLAGS=>0,fallback=>sub {encode_error('Invalid value. JSON can only reference.')},indent_length=>3,};bless$self,$class}sub encode {return $_[0]->PP_encode_json($_[1])}sub decode {return $_[0]->PP_decode_json($_[1],0x00000000)}sub decode_prefix {return $_[0]->PP_decode_json($_[1],0x00000001)}sub pretty {my ($self,$v)=@_;my$enable=defined$v ? $v : 1;if ($enable){$self->indent(1)->indent_length(3)->space_before(1)->space_after(1)}else {$self->indent(0)->space_before(0)->space_after(0)}$self}sub max_depth {my$max=defined $_[1]? $_[1]: 0x80000000;$_[0]->{max_depth}=$max;$_[0]}sub get_max_depth {$_[0]->{max_depth}}sub max_size {my$max=defined $_[1]? $_[1]: 0;$_[0]->{max_size}=$max;$_[0]}sub get_max_size {$_[0]->{max_size}}sub filter_json_object {$_[0]->{cb_object}=defined $_[1]? $_[1]: 0;$_[0]->{F_HOOK}=($_[0]->{cb_object}or $_[0]->{cb_sk_object})? 1 : 0;$_[0]}sub filter_json_single_key_object {if (@_ > 1){$_[0]->{cb_sk_object}->{$_[1]}=$_[2]}$_[0]->{F_HOOK}=($_[0]->{cb_object}or $_[0]->{cb_sk_object})? 1 : 0;$_[0]}sub indent_length {if (!defined $_[1]or $_[1]> 15 or $_[1]< 0){Carp::carp "The acceptable range of indent_length() is 0 to 15."}else {$_[0]->{indent_length}=$_[1]}$_[0]}sub get_indent_length {$_[0]->{indent_length}}sub sort_by {$_[0]->{sort_by}=defined $_[1]? $_[1]: 1;$_[0]}sub allow_bigint {Carp::carp("allow_bigint() is obsoleted. use allow_bignum() insted.")}{my$max_depth;my$indent;my$ascii;my$latin1;my$utf8;my$space_before;my$space_after;my$canonical;my$allow_blessed;my$convert_blessed;my$indent_length;my$escape_slash;my$bignum;my$as_nonblessed;my$depth;my$indent_count;my$keysort;sub PP_encode_json {my$self=shift;my$obj=shift;$indent_count=0;$depth=0;my$idx=$self->{PROPS};($ascii,$latin1,$utf8,$indent,$canonical,$space_before,$space_after,$allow_blessed,$convert_blessed,$escape_slash,$bignum,$as_nonblessed)=@{$idx}[P_ASCII .. P_SPACE_AFTER,P_ALLOW_BLESSED,P_CONVERT_BLESSED,P_ESCAPE_SLASH,P_ALLOW_BIGNUM,P_AS_NONBLESSED];($max_depth,$indent_length)=@{$self}{qw/max_depth indent_length/};$keysort=$canonical ? sub {$a cmp $b}: undef;if ($self->{sort_by}){$keysort=ref($self->{sort_by})eq 'CODE' ? $self->{sort_by}: $self->{sort_by}=~ /\D+/ ? $self->{sort_by}: sub {$a cmp $b}}encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)")if(!ref$obj and!$idx->[P_ALLOW_NONREF ]);my$str=$self->object_to_json($obj);$str .= "\n" if ($indent);unless ($ascii or $latin1 or $utf8){utf8::upgrade($str)}if ($idx->[P_SHRINK ]){utf8::downgrade($str,1)}return$str}sub object_to_json {my ($self,$obj)=@_;my$type=ref($obj);if($type eq 'HASH'){return$self->hash_to_json($obj)}elsif($type eq 'ARRAY'){return$self->array_to_json($obj)}elsif ($type){if (blessed($obj)){return$self->value_to_json($obj)if ($obj->isa('JSON::PP::Boolean'));if ($convert_blessed and $obj->can('TO_JSON')){my$result=$obj->TO_JSON();if (defined$result and ref($result)){if (refaddr($obj)eq refaddr($result)){encode_error(sprintf("%s::TO_JSON method returned same object as was passed instead of a new one",ref$obj))}}return$self->object_to_json($result)}return "$obj" if ($bignum and _is_bignum($obj));return$self->blessed_to_json($obj)if ($allow_blessed and $as_nonblessed);encode_error(sprintf("encountered object '%s', but neither allow_blessed " ."nor convert_blessed settings are enabled",$obj))unless ($allow_blessed);return 'null'}else {return$self->value_to_json($obj)}}else{return$self->value_to_json($obj)}}sub hash_to_json {my ($self,$obj)=@_;my@res;encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")if (++$depth > $max_depth);my ($pre,$post)=$indent ? $self->_up_indent(): ('','');my$del=($space_before ? ' ' : '').':' .($space_after ? ' ' : '');for my$k (_sort($obj)){if (OLD_PERL){utf8::decode($k)}push@res,string_to_json($self,$k).$del .($self->object_to_json($obj->{$k})|| $self->value_to_json($obj->{$k}))}--$depth;$self->_down_indent()if ($indent);return '{' .(@res ? $pre : '').(@res ? join(",$pre",@res).$post : '').'}'}sub array_to_json {my ($self,$obj)=@_;my@res;encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")if (++$depth > $max_depth);my ($pre,$post)=$indent ? $self->_up_indent(): ('','');for my$v (@$obj){push@res,$self->object_to_json($v)|| $self->value_to_json($v)}--$depth;$self->_down_indent()if ($indent);return '[' .(@res ? $pre : '').(@res ? join(",$pre",@res).$post : '').']'}sub value_to_json {my ($self,$value)=@_;return 'null' if(!defined$value);my$b_obj=B::svref_2object(\$value);my$flags=$b_obj->FLAGS;return$value if$flags & (B::SVp_IOK | B::SVp_NOK)and!($flags & B::SVp_POK);my$type=ref($value);if(!$type){return string_to_json($self,$value)}elsif(blessed($value)and $value->isa('JSON::PP::Boolean')){return $$value==1 ? 'true' : 'false'}elsif ($type){if ((overload::StrVal($value)=~ /=(\w+)/)[0]){return$self->value_to_json("$value")}if ($type eq 'SCALAR' and defined $$value){return $$value eq '1' ? 'true' : $$value eq '0' ? 'false' : $self->{PROPS}->[P_ALLOW_UNKNOWN ]? 'null' : encode_error("cannot encode reference to scalar")}if ($self->{PROPS}->[P_ALLOW_UNKNOWN ]){return 'null'}else {if ($type eq 'SCALAR' or $type eq 'REF'){encode_error("cannot encode reference to scalar")}else {encode_error("encountered $value, but JSON can only represent references to arrays or hashes")}}}else {return$self->{fallback}->($value)if ($self->{fallback}and ref($self->{fallback})eq 'CODE');return 'null'}}my%esc=("\n"=>'\n',"\r"=>'\r',"\t"=>'\t',"\f"=>'\f',"\b"=>'\b',"\""=>'\"',"\\"=>'\\\\',"\'"=>'\\\'',);sub string_to_json {my ($self,$arg)=@_;$arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;$arg =~ s/\//\\\//g if ($escape_slash);$arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;if ($ascii){$arg=JSON_PP_encode_ascii($arg)}if ($latin1){$arg=JSON_PP_encode_latin1($arg)}if ($utf8){utf8::encode($arg)}return '"' .$arg .'"'}sub blessed_to_json {my$reftype=reftype($_[1])|| '';if ($reftype eq 'HASH'){return $_[0]->hash_to_json($_[1])}elsif ($reftype eq 'ARRAY'){return $_[0]->array_to_json($_[1])}else {return 'null'}}sub encode_error {my$error=shift;Carp::croak "$error"}sub _sort {defined$keysort ? (sort$keysort (keys %{$_[0]})): keys %{$_[0]}}sub _up_indent {my$self=shift;my$space=' ' x $indent_length;my ($pre,$post)=('','');$post="\n" .$space x $indent_count;$indent_count++;$pre="\n" .$space x $indent_count;return ($pre,$post)}sub _down_indent {$indent_count--}sub PP_encode_box {{depth=>$depth,indent_count=>$indent_count,}}}sub _encode_ascii {join('',map {$_ <= 127 ? chr($_): $_ <= 65535 ? sprintf('\u%04x',$_): sprintf('\u%x\u%x',_encode_surrogates($_))}unpack('U*',$_[0]))}sub _encode_latin1 {join('',map {$_ <= 255 ? chr($_): $_ <= 65535 ? sprintf('\u%04x',$_): sprintf('\u%x\u%x',_encode_surrogates($_))}unpack('U*',$_[0]))}sub _encode_surrogates {my$uni=$_[0]- 0x10000;return ($uni / 0x400 + 0xD800,$uni % 0x400 + 0xDC00)}sub _is_bignum {$_[0]->isa('Math::BigInt')or $_[0]->isa('Math::BigFloat')}my$max_intsize;BEGIN {my$checkint=1111;for my$d (5..64){$checkint .= 1;my$int=eval qq| $checkint |;if ($int =~ /[eE]/){$max_intsize=$d - 1;last}}}{my%escapes=(b=>"\x8",t=>"\x9",n=>"\xA",f=>"\xC",r=>"\xD",'\\'=>'\\','"'=>'"','/'=>'/',);my$text;my$at;my$ch;my$len;my$depth;my$encoding;my$is_valid_utf8;my$utf8_len;my$utf8;my$max_depth;my$max_size;my$relaxed;my$cb_object;my$cb_sk_object;my$F_HOOK;my$allow_bigint;my$singlequote;my$loose;my$allow_barekey;sub PP_decode_json {my ($self,$opt);($self,$text,$opt)=@_;($at,$ch,$depth)=(0,'',0);if (!defined$text or ref$text){decode_error("malformed JSON string, neither array, object, number, string or atom")}my$idx=$self->{PROPS};($utf8,$relaxed,$loose,$allow_bigint,$allow_barekey,$singlequote)=@{$idx}[P_UTF8,P_RELAXED,P_LOOSE .. P_ALLOW_SINGLEQUOTE];if ($utf8){utf8::downgrade($text,1)or Carp::croak("Wide character in subroutine entry")}else {utf8::upgrade($text)}$len=length$text;($max_depth,$max_size,$cb_object,$cb_sk_object,$F_HOOK)=@{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/};if ($max_size > 1){use bytes;my$bytes=length$text;decode_error(sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s" ,$bytes,$max_size),1)if ($bytes > $max_size)}my@octets=unpack('C4',$text);$encoding=($octets[0]and $octets[1])? 'UTF-8' : (!$octets[0]and $octets[1])? 'UTF-16BE' : (!$octets[0]and!$octets[1])? 'UTF-32BE' : ($octets[2])? 'UTF-16LE' : (!$octets[2])? 'UTF-32LE' : 'unknown';white();my$valid_start=defined$ch;my$result=value();return undef if (!$result && ($opt & 0x10000000));decode_error("malformed JSON string, neither array, object, number, string or atom")unless$valid_start;if (!$idx->[P_ALLOW_NONREF ]and!ref$result){decode_error('JSON text must be an object or array (but found number, string, true, false or null,' .' use allow_nonref to allow this)',1)}Carp::croak('something wrong.')if$len < $at;my$consumed=defined$ch ? $at - 1 : $at;white();if ($ch){return ($result,$consumed)if ($opt & 0x00000001);decode_error("garbage after JSON object")}($opt & 0x00000001)? ($result,$consumed): $result}sub next_chr {return$ch=undef if($at >= $len);$ch=substr($text,$at++,1)}sub value {white();return if(!defined$ch);return object()if($ch eq '{');return array()if($ch eq '[');return string()if($ch eq '"' or ($singlequote and $ch eq "'"));return number()if($ch =~ /[0-9]/ or $ch eq '-');return word()}sub string {my ($i,$s,$t,$u);my$utf16;my$is_utf8;($is_valid_utf8,$utf8_len)=('',0);$s='';if($ch eq '"' or ($singlequote and $ch eq "'")){my$boundChar=$ch;OUTER: while(defined(next_chr())){if($ch eq $boundChar){next_chr();if ($utf16){decode_error("missing low surrogate character in surrogate pair")}utf8::decode($s)if($is_utf8);return$s}elsif($ch eq '\\'){next_chr();if(exists$escapes{$ch}){$s .= $escapes{$ch}}elsif($ch eq 'u'){my$u='';for(1..4){$ch=next_chr();last OUTER if($ch !~ /[0-9a-fA-F]/);$u .= $ch}if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/){$utf16=$u}elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/){unless (defined$utf16){decode_error("missing high surrogate character in surrogate pair")}$is_utf8=1;$s .= JSON_PP_decode_surrogates($utf16,$u)|| next;$utf16=undef}else {if (defined$utf16){decode_error("surrogate pair expected")}if ((my$hex=hex($u))> 127){$is_utf8=1;$s .= JSON_PP_decode_unicode($u)|| next}else {$s .= chr$hex}}}else{unless ($loose){$at -= 2;decode_error('illegal backslash escape sequence in string')}$s .= $ch}}else{if (ord$ch > 127){if ($utf8){unless($ch=is_valid_utf8($ch)){$at -= 1;decode_error("malformed UTF-8 character in JSON string")}else {$at += $utf8_len - 1}}else {utf8::encode($ch)}$is_utf8=1}if (!$loose){if ($ch =~ /[\x00-\x1f\x22\x5c]/){$at--;decode_error('invalid character encountered while parsing JSON string')}}$s .= $ch}}}decode_error("unexpected end of string while parsing JSON string")}sub white {while(defined$ch){if($ch le ' '){next_chr()}elsif($ch eq '/'){next_chr();if(defined$ch and $ch eq '/'){1 while(defined(next_chr())and $ch ne "\n" and $ch ne "\r")}elsif(defined$ch and $ch eq '*'){next_chr();while(1){if(defined$ch){if($ch eq '*'){if(defined(next_chr())and $ch eq '/'){next_chr();last}}else{next_chr()}}else{decode_error("Unterminated comment")}}next}else{$at--;decode_error("malformed JSON string, neither array, object, number, string or atom")}}else{if ($relaxed and $ch eq '#'){pos($text)=$at;$text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g;$at=pos($text);next_chr;next}last}}}sub array {my$a=$_[0]|| [];decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')if (++$depth > $max_depth);next_chr();white();if(defined$ch and $ch eq ']'){--$depth;next_chr();return$a}else {while(defined($ch)){push @$a,value();white();if (!defined$ch){last}if($ch eq ']'){--$depth;next_chr();return$a}if($ch ne ','){last}next_chr();white();if ($relaxed and $ch eq ']'){--$depth;next_chr();return$a}}}decode_error(", or ] expected while parsing array")}sub object {my$o=$_[0]|| {};my$k;decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')if (++$depth > $max_depth);next_chr();white();if(defined$ch and $ch eq '}'){--$depth;next_chr();if ($F_HOOK){return _json_object_hook($o)}return$o}else {while (defined$ch){$k=($allow_barekey and $ch ne '"' and $ch ne "'")? bareKey(): string();white();if(!defined$ch or $ch ne ':'){$at--;decode_error("':' expected")}next_chr();$o->{$k}=value();white();last if (!defined$ch);if($ch eq '}'){--$depth;next_chr();if ($F_HOOK){return _json_object_hook($o)}return$o}if($ch ne ','){last}next_chr();white();if ($relaxed and $ch eq '}'){--$depth;next_chr();if ($F_HOOK){return _json_object_hook($o)}return$o}}}$at--;decode_error(", or } expected while parsing object/hash")}sub bareKey {my$key;while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){$key .= $ch;next_chr()}return$key}sub word {my$word=substr($text,$at-1,4);if($word eq 'true'){$at += 3;next_chr;return$JSON::PP::true}elsif($word eq 'null'){$at += 3;next_chr;return undef}elsif($word eq 'fals'){$at += 3;if(substr($text,$at,1)eq 'e'){$at++;next_chr;return$JSON::PP::false}}$at--;decode_error("'null' expected")if ($word =~ /^n/);decode_error("'true' expected")if ($word =~ /^t/);decode_error("'false' expected")if ($word =~ /^f/);decode_error("malformed JSON string, neither array, object, number, string or atom")}sub number {my$n='';my$v;if($ch eq '0'){my$peek=substr($text,$at,1);my$hex=$peek =~ /[xX]/;if($hex){decode_error("malformed number (leading zero must not be followed by another digit)");($n)=(substr($text,$at+1)=~ /^([0-9a-fA-F]+)/)}else{($n)=(substr($text,$at)=~ /^([0-7]+)/);if (defined$n and length$n > 1){decode_error("malformed number (leading zero must not be followed by another digit)")}}if(defined$n and length($n)){if (!$hex and length($n)==1){decode_error("malformed number (leading zero must not be followed by another digit)")}$at += length($n)+ $hex;next_chr;return$hex ? hex($n): oct($n)}}if($ch eq '-'){$n='-';next_chr;if (!defined$ch or $ch !~ /\d/){decode_error("malformed number (no digits after initial minus)")}}while(defined$ch and $ch =~ /\d/){$n .= $ch;next_chr}if(defined$ch and $ch eq '.'){$n .= '.';next_chr;if (!defined$ch or $ch !~ /\d/){decode_error("malformed number (no digits after decimal point)")}else {$n .= $ch}while(defined(next_chr)and $ch =~ /\d/){$n .= $ch}}if(defined$ch and ($ch eq 'e' or $ch eq 'E')){$n .= $ch;next_chr;if(defined($ch)and ($ch eq '+' or $ch eq '-')){$n .= $ch;next_chr;if (!defined$ch or $ch =~ /\D/){decode_error("malformed number (no digits after exp sign)")}$n .= $ch}elsif(defined($ch)and $ch =~ /\d/){$n .= $ch}else {decode_error("malformed number (no digits after exp sign)")}while(defined(next_chr)and $ch =~ /\d/){$n .= $ch}}$v .= $n;if ($v !~ /[.eE]/ and length$v > $max_intsize){if ($allow_bigint){require Math::BigInt;return Math::BigInt->new($v)}else {return "$v"}}elsif ($allow_bigint){require Math::BigFloat;return Math::BigFloat->new($v)}return 0+$v}sub is_valid_utf8 {$utf8_len=$_[0]=~ /[\x00-\x7F]/ ? 1 : $_[0]=~ /[\xC2-\xDF]/ ? 2 : $_[0]=~ /[\xE0-\xEF]/ ? 3 : $_[0]=~ /[\xF0-\xF4]/ ? 4 : 0 ;return unless$utf8_len;my$is_valid_utf8=substr($text,$at - 1,$utf8_len);return ($is_valid_utf8 =~ /^(?:
+ /}}my%encode_allow_method =map {($_=>1)}qw/utf8 pretty allow_nonref latin1 self_encode escape_slash allow_blessed convert_blessed indent indent_length allow_bignum as_nonblessed/;my%decode_allow_method =map {($_=>1)}qw/utf8 allow_nonref loose allow_singlequote allow_bignum allow_barekey max_size relaxed/;my$JSON;sub encode_json ($) {($JSON ||= __PACKAGE__->new->utf8)->encode(@_)}sub decode_json {($JSON ||= __PACKAGE__->new->utf8)->decode(@_)}sub to_json($) {Carp::croak ("JSON::PP::to_json has been renamed to encode_json.")}sub from_json($) {Carp::croak ("JSON::PP::from_json has been renamed to decode_json.")}sub new {my$class=shift;my$self={max_depth=>512,max_size=>0,indent=>0,FLAGS=>0,fallback=>sub {encode_error('Invalid value. JSON can only reference.')},indent_length=>3,};bless$self,$class}sub encode {return $_[0]->PP_encode_json($_[1])}sub decode {return $_[0]->PP_decode_json($_[1],0x00000000)}sub decode_prefix {return $_[0]->PP_decode_json($_[1],0x00000001)}sub pretty {my ($self,$v)=@_;my$enable=defined$v ? $v : 1;if ($enable){$self->indent(1)->indent_length(3)->space_before(1)->space_after(1)}else {$self->indent(0)->space_before(0)->space_after(0)}$self}sub max_depth {my$max=defined $_[1]? $_[1]: 0x80000000;$_[0]->{max_depth}=$max;$_[0]}sub get_max_depth {$_[0]->{max_depth}}sub max_size {my$max=defined $_[1]? $_[1]: 0;$_[0]->{max_size}=$max;$_[0]}sub get_max_size {$_[0]->{max_size}}sub filter_json_object {$_[0]->{cb_object}=defined $_[1]? $_[1]: 0;$_[0]->{F_HOOK}=($_[0]->{cb_object}or $_[0]->{cb_sk_object})? 1 : 0;$_[0]}sub filter_json_single_key_object {if (@_ > 1){$_[0]->{cb_sk_object}->{$_[1]}=$_[2]}$_[0]->{F_HOOK}=($_[0]->{cb_object}or $_[0]->{cb_sk_object})? 1 : 0;$_[0]}sub indent_length {if (!defined $_[1]or $_[1]> 15 or $_[1]< 0){Carp::carp "The acceptable range of indent_length() is 0 to 15."}else {$_[0]->{indent_length}=$_[1]}$_[0]}sub get_indent_length {$_[0]->{indent_length}}sub sort_by {$_[0]->{sort_by}=defined $_[1]? $_[1]: 1;$_[0]}sub allow_bigint {Carp::carp("allow_bigint() is obsoleted. use allow_bignum() insted.")}{my$max_depth;my$indent;my$ascii;my$latin1;my$utf8;my$space_before;my$space_after;my$canonical;my$allow_blessed;my$convert_blessed;my$indent_length;my$escape_slash;my$bignum;my$as_nonblessed;my$depth;my$indent_count;my$keysort;sub PP_encode_json {my$self=shift;my$obj=shift;$indent_count=0;$depth=0;my$idx=$self->{PROPS};($ascii,$latin1,$utf8,$indent,$canonical,$space_before,$space_after,$allow_blessed,$convert_blessed,$escape_slash,$bignum,$as_nonblessed)=@{$idx}[P_ASCII .. P_SPACE_AFTER,P_ALLOW_BLESSED,P_CONVERT_BLESSED,P_ESCAPE_SLASH,P_ALLOW_BIGNUM,P_AS_NONBLESSED];($max_depth,$indent_length)=@{$self}{qw/max_depth indent_length/};$keysort=$canonical ? sub {$a cmp $b}: undef;if ($self->{sort_by}){$keysort=ref($self->{sort_by})eq 'CODE' ? $self->{sort_by}: $self->{sort_by}=~ /\D+/ ? $self->{sort_by}: sub {$a cmp $b}}encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)")if(!ref$obj and!$idx->[P_ALLOW_NONREF ]);my$str=$self->object_to_json($obj);$str .= "\n" if ($indent);unless ($ascii or $latin1 or $utf8){utf8::upgrade($str)}if ($idx->[P_SHRINK ]){utf8::downgrade($str,1)}return$str}sub object_to_json {my ($self,$obj)=@_;my$type=ref($obj);if($type eq 'HASH'){return$self->hash_to_json($obj)}elsif($type eq 'ARRAY'){return$self->array_to_json($obj)}elsif ($type){if (blessed($obj)){return$self->value_to_json($obj)if ($obj->isa('JSON::PP::Boolean'));if ($convert_blessed and $obj->can('TO_JSON')){my$result=$obj->TO_JSON();if (defined$result and ref($result)){if (refaddr($obj)eq refaddr($result)){encode_error(sprintf("%s::TO_JSON method returned same object as was passed instead of a new one",ref$obj))}}return$self->object_to_json($result)}return "$obj" if ($bignum and _is_bignum($obj));return$self->blessed_to_json($obj)if ($allow_blessed and $as_nonblessed);encode_error(sprintf("encountered object '%s', but neither allow_blessed " ."nor convert_blessed settings are enabled",$obj))unless ($allow_blessed);return 'null'}else {return$self->value_to_json($obj)}}else{return$self->value_to_json($obj)}}sub hash_to_json {my ($self,$obj)=@_;my@res;encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")if (++$depth > $max_depth);my ($pre,$post)=$indent ? $self->_up_indent(): ('','');my$del=($space_before ? ' ' : '').':' .($space_after ? ' ' : '');for my$k (_sort($obj)){if (OLD_PERL){utf8::decode($k)}push@res,string_to_json($self,$k).$del .($self->object_to_json($obj->{$k})|| $self->value_to_json($obj->{$k}))}--$depth;$self->_down_indent()if ($indent);return '{' .(@res ? $pre : '').(@res ? join(",$pre",@res).$post : '').'}'}sub array_to_json {my ($self,$obj)=@_;my@res;encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")if (++$depth > $max_depth);my ($pre,$post)=$indent ? $self->_up_indent(): ('','');for my$v (@$obj){push@res,$self->object_to_json($v)|| $self->value_to_json($v)}--$depth;$self->_down_indent()if ($indent);return '[' .(@res ? $pre : '').(@res ? join(",$pre",@res).$post : '').']'}sub value_to_json {my ($self,$value)=@_;return 'null' if(!defined$value);my$b_obj=B::svref_2object(\$value);my$flags=$b_obj->FLAGS;return$value if$flags & (B::SVp_IOK | B::SVp_NOK)and!($flags & B::SVp_POK);my$type=ref($value);if(!$type){return string_to_json($self,$value)}elsif(blessed($value)and $value->isa('JSON::PP::Boolean')){return $$value==1 ? 'true' : 'false'}elsif ($type){if ((overload::StrVal($value)=~ /=(\w+)/)[0]){return$self->value_to_json("$value")}if ($type eq 'SCALAR' and defined $$value){return $$value eq '1' ? 'true' : $$value eq '0' ? 'false' : $self->{PROPS}->[P_ALLOW_UNKNOWN ]? 'null' : encode_error("cannot encode reference to scalar")}if ($self->{PROPS}->[P_ALLOW_UNKNOWN ]){return 'null'}else {if ($type eq 'SCALAR' or $type eq 'REF'){encode_error("cannot encode reference to scalar")}else {encode_error("encountered $value, but JSON can only represent references to arrays or hashes")}}}else {return$self->{fallback}->($value)if ($self->{fallback}and ref($self->{fallback})eq 'CODE');return 'null'}}my%esc=("\n"=>'\n',"\r"=>'\r',"\t"=>'\t',"\f"=>'\f',"\b"=>'\b',"\""=>'\"',"\\"=>'\\\\',"\'"=>'\\\'',);sub string_to_json {my ($self,$arg)=@_;$arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;$arg =~ s/\//\\\//g if ($escape_slash);$arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;if ($ascii){$arg=JSON_PP_encode_ascii($arg)}if ($latin1){$arg=JSON_PP_encode_latin1($arg)}if ($utf8){utf8::encode($arg)}return '"' .$arg .'"'}sub blessed_to_json {my$reftype=reftype($_[1])|| '';if ($reftype eq 'HASH'){return $_[0]->hash_to_json($_[1])}elsif ($reftype eq 'ARRAY'){return $_[0]->array_to_json($_[1])}else {return 'null'}}sub encode_error {my$error=shift;Carp::croak "$error"}sub _sort {defined$keysort ? (sort$keysort (keys %{$_[0]})): keys %{$_[0]}}sub _up_indent {my$self=shift;my$space=' ' x $indent_length;my ($pre,$post)=('','');$post="\n" .$space x $indent_count;$indent_count++;$pre="\n" .$space x $indent_count;return ($pre,$post)}sub _down_indent {$indent_count--}sub PP_encode_box {{depth=>$depth,indent_count=>$indent_count,}}}sub _encode_ascii {join('',map {$_ <= 127 ? chr($_): $_ <= 65535 ? sprintf('\u%04x',$_): sprintf('\u%x\u%x',_encode_surrogates($_))}unpack('U*',$_[0]))}sub _encode_latin1 {join('',map {$_ <= 255 ? chr($_): $_ <= 65535 ? sprintf('\u%04x',$_): sprintf('\u%x\u%x',_encode_surrogates($_))}unpack('U*',$_[0]))}sub _encode_surrogates {my$uni=$_[0]- 0x10000;return ($uni / 0x400 + 0xD800,$uni % 0x400 + 0xDC00)}sub _is_bignum {$_[0]->isa('Math::BigInt')or $_[0]->isa('Math::BigFloat')}my$max_intsize;BEGIN {my$checkint=1111;for my$d (5..64){$checkint .= 1;my$int=eval qq| $checkint |;if ($int =~ /[eE]/){$max_intsize=$d - 1;last}}}{my%escapes=(b=>"\x8",t=>"\x9",n=>"\xA",f=>"\xC",r=>"\xD",'\\'=>'\\','"'=>'"','/'=>'/',);my$text;my$at;my$ch;my$len;my$depth;my$encoding;my$is_valid_utf8;my$utf8_len;my$utf8;my$max_depth;my$max_size;my$relaxed;my$cb_object;my$cb_sk_object;my$F_HOOK;my$allow_bigint;my$singlequote;my$loose;my$allow_barekey;sub PP_decode_json {my ($self,$opt);($self,$text,$opt)=@_;($at,$ch,$depth)=(0,'',0);if (!defined$text or ref$text){decode_error("malformed JSON string, neither array, object, number, string or atom")}my$idx=$self->{PROPS};($utf8,$relaxed,$loose,$allow_bigint,$allow_barekey,$singlequote)=@{$idx}[P_UTF8,P_RELAXED,P_LOOSE .. P_ALLOW_SINGLEQUOTE];if ($utf8){utf8::downgrade($text,1)or Carp::croak("Wide character in subroutine entry")}else {utf8::upgrade($text);utf8::encode($text)}$len=length$text;($max_depth,$max_size,$cb_object,$cb_sk_object,$F_HOOK)=@{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/};if ($max_size > 1){use bytes;my$bytes=length$text;decode_error(sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s" ,$bytes,$max_size),1)if ($bytes > $max_size)}my@octets=unpack('C4',$text);$encoding=($octets[0]and $octets[1])? 'UTF-8' : (!$octets[0]and $octets[1])? 'UTF-16BE' : (!$octets[0]and!$octets[1])? 'UTF-32BE' : ($octets[2])? 'UTF-16LE' : (!$octets[2])? 'UTF-32LE' : 'unknown';white();my$valid_start=defined$ch;my$result=value();return undef if (!$result && ($opt & 0x10000000));decode_error("malformed JSON string, neither array, object, number, string or atom")unless$valid_start;if (!$idx->[P_ALLOW_NONREF ]and!ref$result){decode_error('JSON text must be an object or array (but found number, string, true, false or null,' .' use allow_nonref to allow this)',1)}Carp::croak('something wrong.')if$len < $at;my$consumed=defined$ch ? $at - 1 : $at;white();if ($ch){return ($result,$consumed)if ($opt & 0x00000001);decode_error("garbage after JSON object")}($opt & 0x00000001)? ($result,$consumed): $result}sub next_chr {return$ch=undef if($at >= $len);$ch=substr($text,$at++,1)}sub value {white();return if(!defined$ch);return object()if($ch eq '{');return array()if($ch eq '[');return string()if($ch eq '"' or ($singlequote and $ch eq "'"));return number()if($ch =~ /[0-9]/ or $ch eq '-');return word()}sub string {my ($i,$s,$t,$u);my$utf16;my$is_utf8;($is_valid_utf8,$utf8_len)=('',0);$s='';if($ch eq '"' or ($singlequote and $ch eq "'")){my$boundChar=$ch;OUTER: while(defined(next_chr())){if($ch eq $boundChar){next_chr();if ($utf16){decode_error("missing low surrogate character in surrogate pair")}utf8::decode($s)if($is_utf8);return$s}elsif($ch eq '\\'){next_chr();if(exists$escapes{$ch}){$s .= $escapes{$ch}}elsif($ch eq 'u'){my$u='';for(1..4){$ch=next_chr();last OUTER if($ch !~ /[0-9a-fA-F]/);$u .= $ch}if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/){$utf16=$u}elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/){unless (defined$utf16){decode_error("missing high surrogate character in surrogate pair")}$is_utf8=1;$s .= JSON_PP_decode_surrogates($utf16,$u)|| next;$utf16=undef}else {if (defined$utf16){decode_error("surrogate pair expected")}if ((my$hex=hex($u))> 127){$is_utf8=1;$s .= JSON_PP_decode_unicode($u)|| next}else {$s .= chr$hex}}}else{unless ($loose){$at -= 2;decode_error('illegal backslash escape sequence in string')}$s .= $ch}}else{if (ord$ch > 127){unless($ch=is_valid_utf8($ch)){$at -= 1;decode_error("malformed UTF-8 character in JSON string")}else {$at += $utf8_len - 1}$is_utf8=1}if (!$loose){if ($ch =~ /[\x00-\x1f\x22\x5c]/){$at--;decode_error('invalid character encountered while parsing JSON string')}}$s .= $ch}}}decode_error("unexpected end of string while parsing JSON string")}sub white {while(defined$ch){if($ch le ' '){next_chr()}elsif($ch eq '/'){next_chr();if(defined$ch and $ch eq '/'){1 while(defined(next_chr())and $ch ne "\n" and $ch ne "\r")}elsif(defined$ch and $ch eq '*'){next_chr();while(1){if(defined$ch){if($ch eq '*'){if(defined(next_chr())and $ch eq '/'){next_chr();last}}else{next_chr()}}else{decode_error("Unterminated comment")}}next}else{$at--;decode_error("malformed JSON string, neither array, object, number, string or atom")}}else{if ($relaxed and $ch eq '#'){pos($text)=$at;$text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g;$at=pos($text);next_chr;next}last}}}sub array {my$a=$_[0]|| [];decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')if (++$depth > $max_depth);next_chr();white();if(defined$ch and $ch eq ']'){--$depth;next_chr();return$a}else {while(defined($ch)){push @$a,value();white();if (!defined$ch){last}if($ch eq ']'){--$depth;next_chr();return$a}if($ch ne ','){last}next_chr();white();if ($relaxed and $ch eq ']'){--$depth;next_chr();return$a}}}decode_error(", or ] expected while parsing array")}sub object {my$o=$_[0]|| {};my$k;decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')if (++$depth > $max_depth);next_chr();white();if(defined$ch and $ch eq '}'){--$depth;next_chr();if ($F_HOOK){return _json_object_hook($o)}return$o}else {while (defined$ch){$k=($allow_barekey and $ch ne '"' and $ch ne "'")? bareKey(): string();white();if(!defined$ch or $ch ne ':'){$at--;decode_error("':' expected")}next_chr();$o->{$k}=value();white();last if (!defined$ch);if($ch eq '}'){--$depth;next_chr();if ($F_HOOK){return _json_object_hook($o)}return$o}if($ch ne ','){last}next_chr();white();if ($relaxed and $ch eq '}'){--$depth;next_chr();if ($F_HOOK){return _json_object_hook($o)}return$o}}}$at--;decode_error(", or } expected while parsing object/hash")}sub bareKey {my$key;while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){$key .= $ch;next_chr()}return$key}sub word {my$word=substr($text,$at-1,4);if($word eq 'true'){$at += 3;next_chr;return$JSON::PP::true}elsif($word eq 'null'){$at += 3;next_chr;return undef}elsif($word eq 'fals'){$at += 3;if(substr($text,$at,1)eq 'e'){$at++;next_chr;return$JSON::PP::false}}$at--;decode_error("'null' expected")if ($word =~ /^n/);decode_error("'true' expected")if ($word =~ /^t/);decode_error("'false' expected")if ($word =~ /^f/);decode_error("malformed JSON string, neither array, object, number, string or atom")}sub number {my$n='';my$v;if($ch eq '0'){my$peek=substr($text,$at,1);my$hex=$peek =~ /[xX]/;if($hex){decode_error("malformed number (leading zero must not be followed by another digit)");($n)=(substr($text,$at+1)=~ /^([0-9a-fA-F]+)/)}else{($n)=(substr($text,$at)=~ /^([0-7]+)/);if (defined$n and length$n > 1){decode_error("malformed number (leading zero must not be followed by another digit)")}}if(defined$n and length($n)){if (!$hex and length($n)==1){decode_error("malformed number (leading zero must not be followed by another digit)")}$at += length($n)+ $hex;next_chr;return$hex ? hex($n): oct($n)}}if($ch eq '-'){$n='-';next_chr;if (!defined$ch or $ch !~ /\d/){decode_error("malformed number (no digits after initial minus)")}}while(defined$ch and $ch =~ /\d/){$n .= $ch;next_chr}if(defined$ch and $ch eq '.'){$n .= '.';next_chr;if (!defined$ch or $ch !~ /\d/){decode_error("malformed number (no digits after decimal point)")}else {$n .= $ch}while(defined(next_chr)and $ch =~ /\d/){$n .= $ch}}if(defined$ch and ($ch eq 'e' or $ch eq 'E')){$n .= $ch;next_chr;if(defined($ch)and ($ch eq '+' or $ch eq '-')){$n .= $ch;next_chr;if (!defined$ch or $ch =~ /\D/){decode_error("malformed number (no digits after exp sign)")}$n .= $ch}elsif(defined($ch)and $ch =~ /\d/){$n .= $ch}else {decode_error("malformed number (no digits after exp sign)")}while(defined(next_chr)and $ch =~ /\d/){$n .= $ch}}$v .= $n;if ($v !~ /[.eE]/ and length$v > $max_intsize){if ($allow_bigint){require Math::BigInt;return Math::BigInt->new($v)}else {return "$v"}}elsif ($allow_bigint){require Math::BigFloat;return Math::BigFloat->new($v)}return 0+$v}sub is_valid_utf8 {$utf8_len=$_[0]=~ /[\x00-\x7F]/ ? 1 : $_[0]=~ /[\xC2-\xDF]/ ? 2 : $_[0]=~ /[\xE0-\xEF]/ ? 3 : $_[0]=~ /[\xF0-\xF4]/ ? 4 : 0 ;return unless$utf8_len;my$is_valid_utf8=substr($text,$at - 1,$utf8_len);return ($is_valid_utf8 =~ /^(?:
[\x00-\x7F]
|[\xC2-\xDF][\x80-\xBF]
|[\xE0][\xA0-\xBF][\x80-\xBF]
@@ -289,7 +267,7 @@ $fatpacked{"JSON/PP.pm"} = <<'JSON_PP';
for (@_) { $str .= $j . $_; }
return $str;
}
- |}sub JSON::PP::incr_parse {local$Carp::CarpLevel=1;($_[0]->{_incr_parser}||=JSON::PP::IncrParser->new)->incr_parse(@_)}sub JSON::PP::incr_skip {($_[0]->{_incr_parser}||=JSON::PP::IncrParser->new)->incr_skip}sub JSON::PP::incr_reset {($_[0]->{_incr_parser}||=JSON::PP::IncrParser->new)->incr_reset}eval q{
+ |}sub JSON::PP::incr_parse {local$Carp::CarpLevel=1;($_[0]->{_incr_parser}||= JSON::PP::IncrParser->new)->incr_parse(@_)}sub JSON::PP::incr_skip {($_[0]->{_incr_parser}||= JSON::PP::IncrParser->new)->incr_skip}sub JSON::PP::incr_reset {($_[0]->{_incr_parser}||= JSON::PP::IncrParser->new)->incr_reset}eval q{
sub JSON::PP::incr_text : lvalue {
$_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
@@ -298,37 +276,42 @@ $fatpacked{"JSON/PP.pm"} = <<'JSON_PP';
}
$_[0]->{_incr_parser}->{incr_text};
}
- } if ($] >= 5.006)}BEGIN {eval 'require Scalar::Util';unless($@){*JSON::PP::blessed=\&Scalar::Util::blessed;*JSON::PP::reftype=\&Scalar::Util::reftype;*JSON::PP::refaddr=\&Scalar::Util::refaddr}else{eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';*JSON::PP::blessed=sub {local($@,$SIG{__DIE__},$SIG{__WARN__});ref($_[0])? eval {$_[0]->a_sub_not_likely_to_be_here}: undef};my%tmap=qw(B::NULL SCALAR B::HV HASH B::AV ARRAY B::CV CODE B::IO IO B::GV GLOB B::REGEXP REGEXP);*JSON::PP::reftype=sub {my$r=shift;return undef unless length(ref($r));my$t=ref(B::svref_2object($r));return exists$tmap{$t}? $tmap{$t}: length(ref($$r))? 'REF' : 'SCALAR'};*JSON::PP::refaddr=sub {return undef unless length(ref($_[0]));my$addr;if(defined(my$pkg=blessed($_[0]))){$addr .= bless $_[0],'Scalar::Util::Fake';bless $_[0],$pkg}else {$addr .= $_[0]}$addr =~ /0x(\w+)/;local $^W;hex($1)}}}$JSON::PP::true=do {bless \(my$dummy=1),"JSON::PP::Boolean"};$JSON::PP::false=do {bless \(my$dummy=0),"JSON::PP::Boolean"};sub is_bool {defined $_[0]and UNIVERSAL::isa($_[0],"JSON::PP::Boolean")}sub true {$JSON::PP::true}sub false {$JSON::PP::false}sub null {undef}package JSON::PP::Boolean;use overload ("0+"=>sub {${$_[0]}},"++"=>sub {$_[0]=${$_[0]}+ 1},"--"=>sub {$_[0]=${$_[0]}- 1},fallback=>1,);package JSON::PP::IncrParser;use strict;use constant INCR_M_WS=>0;use constant INCR_M_STR=>1;use constant INCR_M_BS=>2;use constant INCR_M_JSON=>3;use constant INCR_M_C0=>4;use constant INCR_M_C1=>5;$JSON::PP::IncrParser::VERSION='1.01';my$unpack_format=$] < 5.006 ? 'C*' : 'U*';sub new {my ($class)=@_;bless {incr_nest=>0,incr_text=>undef,incr_parsing=>0,incr_p=>0,},$class}sub incr_parse {my ($self,$coder,$text)=@_;$self->{incr_text}='' unless (defined$self->{incr_text});if (defined$text){if (utf8::is_utf8($text)and!utf8::is_utf8($self->{incr_text})){utf8::upgrade($self->{incr_text});utf8::decode($self->{incr_text})}$self->{incr_text}.= $text}my$max_size=$coder->get_max_size;if (defined wantarray){$self->{incr_mode}=INCR_M_WS unless defined$self->{incr_mode};if (wantarray){my@ret;$self->{incr_parsing}=1;do {push@ret,$self->_incr_parse($coder,$self->{incr_text});unless (!$self->{incr_nest}and $self->{incr_mode}==INCR_M_JSON){$self->{incr_mode}=INCR_M_WS if$self->{incr_mode}!=INCR_M_STR}}until (length$self->{incr_text}>= $self->{incr_p});$self->{incr_parsing}=0;return@ret}else {$self->{incr_parsing}=1;my$obj=$self->_incr_parse($coder,$self->{incr_text});$self->{incr_parsing}=0 if defined$obj;return$obj ? $obj : undef}}}sub _incr_parse {my ($self,$coder,$text,$skip)=@_;my$p=$self->{incr_p};my$restore=$p;my@obj;my$len=length$text;if ($self->{incr_mode}==INCR_M_WS){while ($len > $p){my$s=substr($text,$p,1);$p++ and next if (0x20 >= unpack($unpack_format,$s));$self->{incr_mode}=INCR_M_JSON;last}}while ($len > $p){my$s=substr($text,$p++,1);if ($s eq '"'){if (substr($text,$p - 2,1)eq '\\'){next}if ($self->{incr_mode}!=INCR_M_STR){$self->{incr_mode}=INCR_M_STR}else {$self->{incr_mode}=INCR_M_JSON;unless ($self->{incr_nest}){last}}}if ($self->{incr_mode}==INCR_M_JSON){if ($s eq '[' or $s eq '{'){if (++$self->{incr_nest}> $coder->get_max_depth){Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')}}elsif ($s eq ']' or $s eq '}'){last if (--$self->{incr_nest}<= 0)}elsif ($s eq '#'){while ($len > $p){last if substr($text,$p++,1)eq "\n"}}}}$self->{incr_p}=$p;return if ($self->{incr_mode}==INCR_M_STR and not $self->{incr_nest});return if ($self->{incr_mode}==INCR_M_JSON and $self->{incr_nest}> 0);return '' unless (length substr($self->{incr_text},0,$p));local$Carp::CarpLevel=2;$self->{incr_p}=$restore;$self->{incr_c}=$p;my ($obj,$tail)=$coder->PP_decode_json(substr($self->{incr_text},0,$p),0x10000001);$self->{incr_text}=substr($self->{incr_text},$p);$self->{incr_p}=0;return$obj or ''}sub incr_text {if ($_[0]->{incr_parsing}){Carp::croak("incr_text can not be called when the incremental parser already started parsing")}$_[0]->{incr_text}}sub incr_skip {my$self=shift;$self->{incr_text}=substr($self->{incr_text},$self->{incr_c});$self->{incr_p}=0}sub incr_reset {my$self=shift;$self->{incr_text}=undef;$self->{incr_p}=0;$self->{incr_mode}=0;$self->{incr_nest}=0;$self->{incr_parsing}=0}1;
+ } if ($] >= 5.006)}BEGIN {eval 'require Scalar::Util';unless($@){*JSON::PP::blessed=\&Scalar::Util::blessed;*JSON::PP::reftype=\&Scalar::Util::reftype;*JSON::PP::refaddr=\&Scalar::Util::refaddr}else{eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';*JSON::PP::blessed=sub {local($@,$SIG{__DIE__},$SIG{__WARN__});ref($_[0])? eval {$_[0]->a_sub_not_likely_to_be_here}: undef};my%tmap=qw(B::NULL SCALAR B::HV HASH B::AV ARRAY B::CV CODE B::IO IO B::GV GLOB B::REGEXP REGEXP);*JSON::PP::reftype=sub {my$r=shift;return undef unless length(ref($r));my$t=ref(B::svref_2object($r));return exists$tmap{$t}? $tmap{$t}: length(ref($$r))? 'REF' : 'SCALAR'};*JSON::PP::refaddr=sub {return undef unless length(ref($_[0]));my$addr;if(defined(my$pkg=blessed($_[0]))){$addr .= bless $_[0],'Scalar::Util::Fake';bless $_[0],$pkg}else {$addr .= $_[0]}$addr =~ /0x(\w+)/;local $^W;hex($1)}}}$JSON::PP::true=do {bless \(my$dummy=1),"JSON::PP::Boolean"};$JSON::PP::false=do {bless \(my$dummy=0),"JSON::PP::Boolean"};sub is_bool {defined $_[0]and UNIVERSAL::isa($_[0],"JSON::PP::Boolean")}sub true {$JSON::PP::true}sub false {$JSON::PP::false}sub null {undef}package JSON::PP::Boolean;use overload ("0+"=>sub {${$_[0]}},"++"=>sub {$_[0]=${$_[0]}+ 1},"--"=>sub {$_[0]=${$_[0]}- 1},fallback=>1,);package JSON::PP::IncrParser;use strict;use constant INCR_M_WS=>0;use constant INCR_M_STR=>1;use constant INCR_M_BS=>2;use constant INCR_M_JSON=>3;use constant INCR_M_C0=>4;use constant INCR_M_C1=>5;$JSON::PP::IncrParser::VERSION='1.01';my$unpack_format=$] < 5.006 ? 'C*' : 'U*';sub new {my ($class)=@_;bless {incr_nest=>0,incr_text=>undef,incr_parsing=>0,incr_p=>0,},$class}sub incr_parse {my ($self,$coder,$text)=@_;$self->{incr_text}='' unless (defined$self->{incr_text});if (defined$text){if (utf8::is_utf8($text)and!utf8::is_utf8($self->{incr_text})){utf8::upgrade($self->{incr_text});utf8::decode($self->{incr_text})}$self->{incr_text}.= $text}my$max_size=$coder->get_max_size;if (defined wantarray){$self->{incr_mode}=INCR_M_WS unless defined$self->{incr_mode};if (wantarray){my@ret;$self->{incr_parsing}=1;do {push@ret,$self->_incr_parse($coder,$self->{incr_text});unless (!$self->{incr_nest}and $self->{incr_mode}==INCR_M_JSON){$self->{incr_mode}=INCR_M_WS if$self->{incr_mode}!=INCR_M_STR}}until (length$self->{incr_text}>= $self->{incr_p});$self->{incr_parsing}=0;return@ret}else {$self->{incr_parsing}=1;my$obj=$self->_incr_parse($coder,$self->{incr_text});$self->{incr_parsing}=0 if defined$obj;return$obj ? $obj : undef}}}sub _incr_parse {my ($self,$coder,$text,$skip)=@_;my$p=$self->{incr_p};my$restore=$p;my@obj;my$len=length$text;if ($self->{incr_mode}==INCR_M_WS){while ($len > $p){my$s=substr($text,$p,1);$p++ and next if (0x20 >= unpack($unpack_format,$s));$self->{incr_mode}=INCR_M_JSON;last}}while ($len > $p){my$s=substr($text,$p++,1);if ($s eq '"'){if (substr($text,$p - 2,1)eq '\\'){next}if ($self->{incr_mode}!=INCR_M_STR){$self->{incr_mode}=INCR_M_STR}else {$self->{incr_mode}=INCR_M_JSON;unless ($self->{incr_nest}){last}}}if ($self->{incr_mode}==INCR_M_JSON){if ($s eq '[' or $s eq '{'){if (++$self->{incr_nest}> $coder->get_max_depth){Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')}}elsif ($s eq ']' or $s eq '}'){last if (--$self->{incr_nest}<= 0)}elsif ($s eq '#'){while ($len > $p){last if substr($text,$p++,1)eq "\n"}}}}$self->{incr_p}=$p;return if ($self->{incr_mode}==INCR_M_STR and not $self->{incr_nest});return if ($self->{incr_mode}==INCR_M_JSON and $self->{incr_nest}> 0);return '' unless (length substr($self->{incr_text},0,$p));local$Carp::CarpLevel=2;$self->{incr_p}=$restore;$self->{incr_c}=$p;my ($obj,$tail)=$coder->PP_decode_json(substr($self->{incr_text},0,$p),0x10000001);$self->{incr_text}=substr($self->{incr_text},$p);$self->{incr_p}=0;return$obj || ''}sub incr_text {if ($_[0]->{incr_parsing}){Carp::croak("incr_text can not be called when the incremental parser already started parsing")}$_[0]->{incr_text}}sub incr_skip {my$self=shift;$self->{incr_text}=substr($self->{incr_text},$self->{incr_c});$self->{incr_p}=0}sub incr_reset {my$self=shift;$self->{incr_text}=undef;$self->{incr_p}=0;$self->{incr_mode}=0;$self->{incr_nest}=0;$self->{incr_parsing}=0}1;
JSON_PP
-$fatpacked{"JSON/PP/Boolean.pm"} = <<'JSON_PP_BOOLEAN';
+$fatpacked{"JSON/PP/Boolean.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP_BOOLEAN';
use JSON::PP ();use strict;1;
JSON_PP_BOOLEAN
-$fatpacked{"Module/CPANfile.pm"} = <<'MODULE_CPANFILE';
- package Module::CPANfile;use strict;use warnings;use Cwd;use Carp ();use Module::CPANfile::Environment;use Module::CPANfile::Result;our$VERSION='1.0002';sub new {my($class,$file)=@_;bless {},$class}sub load {my($proto,$file)=@_;my$self=ref$proto ? $proto : $proto->new;$self->parse($file || Cwd::abs_path('cpanfile'));$self}sub save {my($self,$path)=@_;open my$out,">",$path or die "$path: $!";print {$out}$self->to_string}sub parse {my($self,$file)=@_;my$code=do {open my$fh,"<",$file or die "$file: $!";join '',<$fh>};my$env=Module::CPANfile::Environment->new($file);$self->{result}=$env->parse($code)or die $@}sub from_prereqs {my($proto,$prereqs)=@_;my$self=$proto->new;$self->{result}=Module::CPANfile::Result->from_prereqs($prereqs);$self}sub features {my$self=shift;map$self->feature($_),keys %{$self->{result}{features}}}sub feature {my($self,$identifier)=@_;my$data=$self->{result}{features}{$identifier}or Carp::croak("Unknown feature '$identifier'");require CPAN::Meta::Feature;CPAN::Meta::Feature->new($data->{identifier},{description=>$data->{description},prereqs=>$data->{spec},})}sub prereq {shift->prereqs}sub prereqs {my$self=shift;require CPAN::Meta::Prereqs;CPAN::Meta::Prereqs->new($self->prereq_specs)}sub effective_prereqs {my($self,$features)=@_;$self->prereqs_with(@{$features || []})}sub prereqs_with {my($self,@feature_identifiers)=@_;my$prereqs=$self->prereqs;my@others=map {$self->feature($_)->prereqs}@feature_identifiers;$prereqs->with_merged_prereqs(\@others)}sub prereq_specs {my$self=shift;$self->{result}{spec}}sub merge_meta {my($self,$file,$version)=@_;require CPAN::Meta;$version ||=$file =~ /\.yml$/ ? '1.4' : '2';my$prereq=$self->prereqs;my$meta=CPAN::Meta->load_file($file);my$prereqs_hash=$prereq->with_merged_prereqs($meta->effective_prereqs)->as_string_hash;my$struct={%{$meta->as_struct},prereqs=>$prereqs_hash };CPAN::Meta->new($struct)->save($file,{version=>$version })}sub _dump {my$str=shift;require Data::Dumper;chomp(my$value=Data::Dumper->new([$str])->Terse(1)->Dump);$value}sub to_string {my($self,$include_empty)=@_;my$prereqs=$self->{result}{spec};my$code='';$code .= $self->_dump_prereqs($self->{result}{spec},$include_empty);for my$feature (values %{$self->{result}{features}}){$code .= sprintf "feature %s, %s => sub {\n",_dump($feature->{identifier}),_dump($feature->{description});$code .= $self->_dump_prereqs($feature->{spec},$include_empty,4);$code .= "}\n\n"}$code =~ s/\n+$/\n/s;$code}sub _dump_prereqs {my($self,$prereqs,$include_empty,$base_indent)=@_;my$code='';for my$phase (qw(runtime configure build test develop)){my$indent=$phase eq 'runtime' ? '' : ' ';$indent=(' ' x ($base_indent || 0)).$indent;my($phase_code,$requirements);$phase_code .= "on $phase => sub {\n" unless$phase eq 'runtime';for my$type (qw(requires recommends suggests conflicts)){for my$mod (sort keys %{$prereqs->{$phase}{$type}}){my$ver=$prereqs->{$phase}{$type}{$mod};$phase_code .= $ver eq '0' ? "${indent}$type '$mod';\n" : "${indent}$type '$mod', '$ver';\n";$requirements++}}$phase_code .= "\n" unless$requirements;$phase_code .= "};\n" unless$phase eq 'runtime';$code .= $phase_code ."\n" if$requirements or $include_empty}$code =~ s/\n+$/\n/s;$code}1;
+$fatpacked{"Module/CPANfile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE';
+ package Module::CPANfile;use strict;use warnings;use Cwd;use Carp ();use Module::CPANfile::Environment;use Module::CPANfile::Requirement;our$VERSION='1.1000';sub new {my($class,$file)=@_;bless {},$class}sub load {my($proto,$file)=@_;my$self=ref$proto ? $proto : $proto->new;$self->parse($file || Cwd::abs_path('cpanfile'));$self}sub save {my($self,$path)=@_;open my$out,">",$path or die "$path: $!";print {$out}$self->to_string}sub parse {my($self,$file)=@_;my$code=do {open my$fh,"<",$file or die "$file: $!";join '',<$fh>};my$env=Module::CPANfile::Environment->new($file);$env->parse($code)or die $@;$self->{_mirrors}=$env->mirrors;$self->{_prereqs}=$env->prereqs}sub from_prereqs {my($proto,$prereqs)=@_;my$self=$proto->new;$self->{_prereqs}=Module::CPANfile::Prereqs->from_cpan_meta($prereqs);$self}sub mirrors {my$self=shift;$self->{_mirrors}|| []}sub features {my$self=shift;map$self->feature($_),$self->{_prereqs}->identifiers}sub feature {my($self,$identifier)=@_;$self->{_prereqs}->feature($identifier)}sub prereq {shift->prereqs}sub prereqs {my$self=shift;$self->{_prereqs}->as_cpan_meta}sub merged_requirements {my$self=shift;$self->{_prereqs}->merged_requirements}sub effective_prereqs {my($self,$features)=@_;$self->prereqs_with(@{$features || []})}sub prereqs_with {my($self,@feature_identifiers)=@_;my$prereqs=$self->prereqs;my@others=map {$self->feature($_)->prereqs}@feature_identifiers;$prereqs->with_merged_prereqs(\@others)}sub prereq_specs {my$self=shift;$self->prereqs->as_string_hash}sub prereq_for_module {my($self,$module)=@_;$self->{_prereqs}->find($module)}sub options_for_module {my($self,$module)=@_;my$prereq=$self->prereq_for_module($module)or return;$prereq->requirement->options}sub merge_meta {my($self,$file,$version)=@_;require CPAN::Meta;$version ||= $file =~ /\.yml$/ ? '1.4' : '2';my$prereq=$self->prereqs;my$meta=CPAN::Meta->load_file($file);my$prereqs_hash=$prereq->with_merged_prereqs($meta->effective_prereqs)->as_string_hash;my$struct={%{$meta->as_struct},prereqs=>$prereqs_hash };CPAN::Meta->new($struct)->save($file,{version=>$version })}sub _dump {my$str=shift;require Data::Dumper;chomp(my$value=Data::Dumper->new([$str])->Terse(1)->Dump);$value}sub to_string {my($self,$include_empty)=@_;my$mirrors=$self->mirrors;my$prereqs=$self->prereq_specs;my$code='';$code .= $self->_dump_mirrors($mirrors);$code .= $self->_dump_prereqs($prereqs,$include_empty);for my$feature ($self->features){$code .= sprintf "feature %s, %s => sub {\n",_dump($feature->{identifier}),_dump($feature->{description});$code .= $self->_dump_prereqs($feature->{spec},$include_empty,4);$code .= "}\n\n"}$code =~ s/\n+$/\n/s;$code}sub _dump_mirrors {my($self,$mirrors)=@_;my$code="";for my$url (@$mirrors){$code .= "mirror '$url';\n"}$code =~ s/\n+$/\n/s;$code}sub _dump_prereqs {my($self,$prereqs,$include_empty,$base_indent)=@_;my$code='';for my$phase (qw(runtime configure build test develop)){my$indent=$phase eq 'runtime' ? '' : ' ';$indent=(' ' x ($base_indent || 0)).$indent;my($phase_code,$requirements);$phase_code .= "on $phase => sub {\n" unless$phase eq 'runtime';for my$type (qw(requires recommends suggests conflicts)){for my$mod (sort keys %{$prereqs->{$phase}{$type}}){my$ver=$prereqs->{$phase}{$type}{$mod};$phase_code .= $ver eq '0' ? "${indent}$type '$mod';\n" : "${indent}$type '$mod', '$ver';\n";$requirements++}}$phase_code .= "\n" unless$requirements;$phase_code .= "};\n" unless$phase eq 'runtime';$code .= $phase_code ."\n" if$requirements or $include_empty}$code =~ s/\n+$/\n/s;$code}1;
MODULE_CPANFILE
-$fatpacked{"Module/CPANfile/Environment.pm"} = <<'MODULE_CPANFILE_ENVIRONMENT';
- package Module::CPANfile::Environment;use strict;use warnings;use Module::CPANfile::Result;use Carp ();my@bindings=qw(on requires recommends suggests conflicts feature osname configure_requires build_requires test_requires author_requires);my$file_id=1;sub new {my($class,$file)=@_;bless {file=>$file,},$class}sub bind {my$class=shift;my$pkg=caller;my$result=Module::CPANfile::Result->new;for my$binding (@bindings){no strict 'refs';*{"$pkg\::$binding"}=sub {$result->$binding(@_)}}return$result}sub parse {my($self,$code)=@_;my($res,$err);{local $@;$file_id++;$res=eval <<EVAL;$err=$@}if ($err){die "Parsing $self->{file} failed: $err"};return$res}1;
+$fatpacked{"Module/CPANfile/Environment.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_ENVIRONMENT';
+ package Module::CPANfile::Environment;use strict;use warnings;use Module::CPANfile::Prereqs;use Carp ();my@bindings=qw(on requires recommends suggests conflicts feature osname mirror configure_requires build_requires test_requires author_requires);my$file_id=1;sub new {my($class,$file)=@_;bless {file=>$file,phase=>'runtime',feature=>undef,features=>{},prereqs=>Module::CPANfile::Prereqs->new,mirrors=>[],},$class}sub bind {my$self=shift;my$pkg=caller;for my$binding (@bindings){no strict 'refs';*{"$pkg\::$binding"}=sub {$self->$binding(@_)}}}sub parse {my($self,$code)=@_;my$err;{local $@;$file_id++;$self->_evaluate(<<EVAL);$err=$@}if ($err){die "Parsing $self->{file} failed: $err"};return 1}sub _evaluate {my$_environment=$_[0];eval $_[1]}sub prereqs {$_[0]->{prereqs}}sub mirrors {$_[0]->{mirrors}}sub on {my($self,$phase,$code)=@_;local$self->{phase}=$phase;$code->()}sub feature {my($self,$identifier,$description,$code)=@_;if (@_==3 && ref($description)eq 'CODE'){$code=$description;$description=$identifier}unless (ref$description eq '' && ref$code eq 'CODE'){Carp::croak("Usage: feature 'identifier', 'Description' => sub { ... }")}local$self->{feature}=$identifier;$self->prereqs->add_feature($identifier,$description);$code->()}sub osname {die "TODO"}sub mirror {my($self,$url)=@_;push @{$self->{mirrors}},$url}sub requirement_for {my($self,$module,@args)=@_;my$requirement=0;$requirement=shift@args if@args % 2;return Module::CPANfile::Requirement->new(name=>$module,version=>$requirement,@args,)}sub requires {my$self=shift;$self->add_prereq(requires=>@_)}sub recommends {my$self=shift;$self->add_prereq(recommends=>@_)}sub suggests {my$self=shift;$self->add_prereq(suggests=>@_)}sub conflicts {my$self=shift;$self->add_prereq(conflicts=>@_)}sub add_prereq {my($self,$type,$module,@args)=@_;$self->prereqs->add_prereq(feature=>$self->{feature},phase=>$self->{phase},type=>$type,module=>$module,requirement=>$self->requirement_for($module,@args),)}sub configure_requires {my($self,@args)=@_;$self->on(configure=>sub {$self->requires(@args)})}sub build_requires {my($self,@args)=@_;$self->on(build=>sub {$self->requires(@args)})}sub test_requires {my($self,@args)=@_;$self->on(test=>sub {$self->requires(@args)})}sub author_requires {my($self,@args)=@_;$self->on(develop=>sub {$self->requires(@args)})}1;
package Module::CPANfile::Sandbox$file_id;
no warnings;
- my \$_result;
- BEGIN { \$_result = Module::CPANfile::Environment->bind }
+ BEGIN { \$_environment->bind }
# line 1 "$self->{file}"
$code;
-
- \$_result;
EVAL
MODULE_CPANFILE_ENVIRONMENT
-$fatpacked{"Module/CPANfile/Result.pm"} = <<'MODULE_CPANFILE_RESULT';
- package Module::CPANfile::Result;use strict;sub from_prereqs {my($class,$spec)=@_;bless {phase=>'runtime',spec=>$spec,},$class}sub new {bless {phase=>'runtime',features=>{},feature=>undef,spec=>{},},shift}sub on {my($self,$phase,$code)=@_;local$self->{phase}=$phase;$code->()}sub feature {my($self,$identifier,$description,$code)=@_;if (@_==3 && ref($description)eq 'CODE'){$code=$description;$description=$identifier}unless (ref$description eq '' && ref$code eq 'CODE'){Carp::croak("Usage: feature 'identifier', 'Description' => sub { ... }")}local$self->{feature}=$self->{features}{$identifier}={identifier=>$identifier,description=>$description,spec=>{}};$code->()}sub osname {die "TODO"}sub requires {my($self,$module,$requirement)=@_;($self->{feature}? $self->{feature}{spec}: $self->{spec})->{$self->{phase}}{requires}{$module}=$requirement || 0}sub recommends {my($self,$module,$requirement)=@_;($self->{feature}? $self->{feature}{spec}: $self->{spec})->{$self->{phase}}{recommends}{$module}=$requirement || 0}sub suggests {my($self,$module,$requirement)=@_;($self->{feature}? $self->{feature}{spec}: $self->{spec})->{$self->{phase}}{suggests}{$module}=$requirement || 0}sub conflicts {my($self,$module,$requirement)=@_;($self->{feature}? $self->{feature}{spec}: $self->{spec})->{$self->{phase}}{conflicts}{$module}=$requirement || 0}sub configure_requires {my($self,@args)=@_;$self->on(configure=>sub {$self->requires(@args)})}sub build_requires {my($self,@args)=@_;$self->on(build=>sub {$self->requires(@args)})}sub test_requires {my($self,@args)=@_;$self->on(test=>sub {$self->requires(@args)})}sub author_requires {my($self,@args)=@_;$self->on(develop=>sub {$self->requires(@args)})}1;
-MODULE_CPANFILE_RESULT
+$fatpacked{"Module/CPANfile/Prereq.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_PREREQ';
+ package Module::CPANfile::Prereq;use strict;sub new {my($class,%options)=@_;bless \%options,$class}sub feature {$_[0]->{feature}}sub phase {$_[0]->{phase}}sub type {$_[0]->{type}}sub module {$_[0]->{module}}sub requirement {$_[0]->{requirement}}sub match_feature {my($self,$identifier)=@_;no warnings 'uninitialized';$self->feature eq $identifier}1;
+MODULE_CPANFILE_PREREQ
-$fatpacked{"Module/Metadata.pm"} = <<'MODULE_METADATA';
- package Module::Metadata;use strict;use vars qw($VERSION);$VERSION='1.000016';$VERSION=eval$VERSION;use Carp qw/croak/;use File::Spec;use IO::File;use version 0.87;BEGIN {if ($INC{'Log/Contextual.pm'}){Log::Contextual->import('log_info')}else {*log_info=sub (&) {warn $_[0]->()}}}use File::Find qw(find);my$V_NUM_REGEXP=qr{v?[0-9._]+};my$PKG_FIRST_WORD_REGEXP=qr{ # the FIRST word in a package name
+$fatpacked{"Module/CPANfile/Prereqs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_PREREQS';
+ package Module::CPANfile::Prereqs;use strict;use Carp ();use CPAN::Meta::Feature;use Module::CPANfile::Prereq;sub from_cpan_meta {my($class,$prereqs)=@_;my$self=$class->new;for my$phase (keys %$prereqs){for my$type (keys %{$prereqs->{$phase}}){while (my($module,$requirement)=each %{$prereqs->{$phase}{$type}}){$self->add_prereq(phase=>$phase,type=>$type,module=>$module,requirement=>Module::CPANfile::Requirement->new(name=>$module,version=>$requirement),)}}}$self}sub new {my$class=shift;bless {prereqs=>[],features=>{},},$class}sub add_feature {my($self,$identifier,$description)=@_;$self->{features}{$identifier}={description=>$description }}sub add_prereq {my($self,%args)=@_;$self->add(Module::CPANfile::Prereq->new(%args))}sub add {my($self,$prereq)=@_;push @{$self->{prereqs}},$prereq}sub as_cpan_meta {my$self=shift;$self->{cpanmeta}||= $self->build_cpan_meta}sub build_cpan_meta {my($self,$identifier)=@_;my$prereq_spec={};$self->prereq_each($identifier,sub {my$prereq=shift;$prereq_spec->{$prereq->phase}{$prereq->type}{$prereq->module}=$prereq->requirement->version});CPAN::Meta::Prereqs->new($prereq_spec)}sub prereq_each {my($self,$identifier,$code)=@_;for my$prereq (@{$self->{prereqs}}){next unless$prereq->match_feature($identifier);$code->($prereq)}}sub merged_requirements {my$self=shift;my$reqs=CPAN::Meta::Requirements->new;for my$prereq (@{$self->{prereqs}}){$reqs->add_string_requirement($prereq->module,$prereq->requirement->version)}$reqs}sub find {my($self,$module)=@_;for my$prereq (@{$self->{prereqs}}){return$prereq if$prereq->module eq $module}return}sub identifiers {my$self=shift;keys %{$self->{features}}}sub feature {my($self,$identifier)=@_;my$data=$self->{features}{$identifier}or Carp::croak("Unknown feature '$identifier'");my$prereqs=$self->build_cpan_meta($identifier);CPAN::Meta::Feature->new($identifier,{description=>$data->{description},prereqs=>$prereqs->as_string_hash,})}1;
+MODULE_CPANFILE_PREREQS
+
+$fatpacked{"Module/CPANfile/Requirement.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_REQUIREMENT';
+ package Module::CPANfile::Requirement;use strict;sub new {my ($class,%args)=@_;$args{version}||= 0;bless +{name=>delete$args{name},version=>delete$args{version},options=>\%args,},$class}sub name {$_[0]->{name}}sub version {$_[0]->{version}}sub options {$_[0]->{options}}sub has_options {keys %{$_[0]->{options}}> 0}1;
+MODULE_CPANFILE_REQUIREMENT
+
+$fatpacked{"Module/Metadata.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_METADATA';
+ package Module::Metadata;sub __clean_eval {eval $_[0]}use strict;use warnings;our$VERSION='1.000027';use Carp qw/croak/;use File::Spec;BEGIN {eval {require Fcntl;Fcntl->import('SEEK_SET');1}or *SEEK_SET=sub {0}}use version 0.87;BEGIN {if ($INC{'Log/Contextual.pm'}){require "Log/Contextual/WarnLogger.pm";Log::Contextual->import('log_info','-default_logger'=>Log::Contextual::WarnLogger->new({env_prefix=>'MODULE_METADATA',}),)}else {*log_info=sub (&) {warn $_[0]->()}}}use File::Find qw(find);my$V_NUM_REGEXP=qr{v?[0-9._]+};my$PKG_FIRST_WORD_REGEXP=qr{ # the FIRST word in a package name
[a-zA-Z_] # the first word CANNOT start with a digit
(?:
[\w']? # can contain letters, digits, _, or ticks
@@ -341,14 +324,14 @@ $fatpacked{"Module/Metadata.pm"} = <<'MODULE_METADATA';
\w # But, NO multi-ticks or trailing ticks
)*
}x;my$PKG_NAME_REGEXP=qr{ # match a package name
- (?: :: )? # a pkg name can start with aristotle
+ (?: :: )? # a pkg name can start with arisdottle
$PKG_FIRST_WORD_REGEXP # a package word
(?:
- (?: :: )+ ### aristotle (allow one or many times)
+ (?: :: )+ ### arisdottle (allow one or many times)
$PKG_ADDL_WORD_REGEXP ### a package word
)* # ^ zero, one or many times
(?:
- :: # allow trailing aristotle
+ :: # allow trailing arisdottle
)?
}x;my$PKG_REGEXP=qr{ # match a package declaration
^[\s\{;]* # intro chars on a line
@@ -363,7 +346,7 @@ $fatpacked{"Module/Metadata.pm"} = <<'MODULE_METADATA';
([\$*]) # sigil - $ or *
(
( # optional leading package name
- (?:::|\')? # possibly starting like just :: (Ì la $::VERSION)
+ (?:::|\')? # possibly starting like just :: (a la $::VERSION)
(?:\w+(?:::|\'))* # Foo::Bar:: ...
)?
VERSION
@@ -375,39 +358,63 @@ $fatpacked{"Module/Metadata.pm"} = <<'MODULE_METADATA';
$VARNAME_REGEXP # without parens
)
\s*
- =[^=~] # = but not ==, nor =~
- }x;sub new_from_file {my$class=shift;my$filename=File::Spec->rel2abs(shift);return undef unless defined($filename)&& -f $filename;return$class->_init(undef,$filename,@_)}sub new_from_handle {my$class=shift;my$handle=shift;my$filename=shift;return undef unless defined($handle)&& defined($filename);$filename=File::Spec->rel2abs($filename);return$class->_init(undef,$filename,@_,handle=>$handle)}sub new_from_module {my$class=shift;my$module=shift;my%props=@_;$props{inc}||=\@INC;my$filename=$class->find_module_by_name($module,$props{inc});return undef unless defined($filename)&& -f $filename;return$class->_init($module,$filename,%props)}{my$compare_versions=sub {my ($v1,$op,$v2)=@_;$v1=version->new($v1)unless UNIVERSAL::isa($v1,'version');my$eval_str="\$v1 $op \$v2";my$result=eval$eval_str;log_info {"error comparing versions: '$eval_str' $@"}if $@;return$result};my$normalize_version=sub {my ($version)=@_;if ($version =~ /[=<>!,]/){}elsif (ref$version eq 'version'){$version=$version->is_qv ? $version->normal : $version->stringify}elsif ($version =~ /^[^v][^.]*\.[^.]+\./){$version="v$version"}else {}return$version};my$resolve_module_versions=sub {my$packages=shift;my($file,$version);my$err='';for my$p (@$packages){if (defined($p->{version})){if (defined($version)){if ($compare_versions->($version,'!=',$p->{version})){$err .= " $p->{file} ($p->{version})\n"}else {}}else {$file=$p->{file};$version=$p->{version}}}$file ||=$p->{file}if defined($p->{file})}if ($err){$err=" $file ($version)\n" .$err}my%result=(file=>$file,version=>$version,err=>$err);return \%result};sub provides {my$class=shift;croak "provides() requires key/value pairs \n" if @_ % 2;my%args=@_;croak "provides() takes only one of 'dir' or 'files'\n" if$args{dir}&& $args{files};croak "provides() requires a 'version' argument" unless defined$args{version};croak "provides() does not support version '$args{version}' metadata" unless grep {$args{version}eq $_}qw/1.4 2/;$args{prefix}='lib' unless defined$args{prefix};my$p;if ($args{dir}){$p=$class->package_versions_from_directory($args{dir})}else {croak "provides() requires 'files' to be an array reference\n" unless ref$args{files}eq 'ARRAY';$p=$class->package_versions_from_directory($args{files})}if (length$args{prefix}){$args{prefix}=~ s{/$}{};for my$v (values %$p){$v->{file}="$args{prefix}/$v->{file}"}}return$p}sub package_versions_from_directory {my ($class,$dir,$files)=@_;my@files;if ($files){@files=@$files}else {find({wanted=>sub {push@files,$_ if -f $_ && /\.pm$/},no_chdir=>1,},$dir)}my(%prime,%alt);for my$file (@files){my$mapped_filename=File::Spec::Unix->abs2rel($file,$dir);my@path=split(/\//,$mapped_filename);(my$prime_package=join('::',@path))=~ s/\.pm$//;my$pm_info=$class->new_from_file($file);for my$package ($pm_info->packages_inside){next if$package eq 'main';next if$package eq 'DB';next if grep /^_/,split(/::/,$package);my$version=$pm_info->version($package);$prime_package=$package if lc($prime_package)eq lc($package);if ($package eq $prime_package){if (exists($prime{$package})){croak "Unexpected conflict in '$package'; multiple versions found.\n"}else {$mapped_filename="$package.pm" if lc("$package.pm")eq lc($mapped_filename);$prime{$package}{file}=$mapped_filename;$prime{$package}{version}=$version if defined($version)}}else {push(@{$alt{$package}},{file=>$mapped_filename,version=>$version,})}}}for my$package (keys(%alt)){my$result=$resolve_module_versions->($alt{$package});if (exists($prime{$package})){if ($result->{err}){log_info {"Found conflicting versions for package '$package'\n" ." $prime{$package}{file} ($prime{$package}{version})\n" .$result->{err}}}elsif (defined($result->{version})){if (exists($prime{$package}{version})&& defined($prime{$package}{version})){if ($compare_versions->($prime{$package}{version},'!=',$result->{version})){log_info {"Found conflicting versions for package '$package'\n" ." $prime{$package}{file} ($prime{$package}{version})\n" ." $result->{file} ($result->{version})\n"}}}else {$prime{$package}{file}=$result->{file};$prime{$package}{version}=$result->{version}}}else {}}else {if ($result->{err}){log_info {"Found conflicting versions for package '$package'\n" .$result->{err}}}$prime{$package}{file}=$result->{file};$prime{$package}{version}=$result->{version}if defined($result->{version})}}for (grep defined $_->{version},values%prime){$_->{version}=$normalize_version->($_->{version})}return \%prime}}sub _init {my$class=shift;my$module=shift;my$filename=shift;my%props=@_;my$handle=delete$props{handle};my(%valid_props,@valid_props);@valid_props=qw(collect_pod inc);@valid_props{@valid_props}=delete(@props{@valid_props});warn "Unknown properties: @{[keys %props]}\n" if scalar(%props);my%data=(module=>$module,filename=>$filename,version=>undef,packages=>[],versions=>{},pod=>{},pod_headings=>[],collect_pod=>0,%valid_props,);my$self=bless(\%data,$class);if ($handle){$self->_parse_fh($handle)}else {$self->_parse_file()}unless($self->{module}and length($self->{module})){my ($v,$d,$f)=File::Spec->splitpath($self->{filename});if($f =~ /\.pm$/){$f =~ s/\..+$//;my@candidates=grep /$f$/,@{$self->{packages}};$self->{module}=shift(@candidates)}else {if(grep /main/,@{$self->{packages}}){$self->{module}='main'}else {$self->{module}=$self->{packages}[0]|| ''}}}$self->{version}=$self->{versions}{$self->{module}}if defined($self->{module});return$self}sub _do_find_module {my$class=shift;my$module=shift || croak 'find_module_by_name() requires a package name';my$dirs=shift || \@INC;my$file=File::Spec->catfile(split(/::/,$module));for my$dir (@$dirs){my$testfile=File::Spec->catfile($dir,$file);return [File::Spec->rel2abs($testfile),$dir ]if -e $testfile and!-d _;return [File::Spec->rel2abs("$testfile.pm"),$dir ]if -e "$testfile.pm"}return}sub find_module_by_name {my$found=shift()->_do_find_module(@_)or return;return$found->[0]}sub find_module_dir_by_name {my$found=shift()->_do_find_module(@_)or return;return$found->[1]}sub _parse_version_expression {my$self=shift;my$line=shift;my($sig,$var,$pkg);if ($line =~ /$VERS_REGEXP/o){($sig,$var,$pkg)=$2 ? ($1,$2,$3): ($4,$5,$6);if ($pkg){$pkg=($pkg eq '::')? 'main' : $pkg;$pkg =~ s/::$//}}return ($sig,$var,$pkg)}sub _parse_file {my$self=shift;my$filename=$self->{filename};my$fh=IO::File->new($filename)or croak("Can't open '$filename': $!");$self->_handle_bom($fh,$filename);$self->_parse_fh($fh)}sub _handle_bom {my ($self,$fh,$filename)=@_;my$pos=$fh->getpos;return unless defined$pos;my$buf=' ' x 2;my$count=$fh->read($buf,length$buf);return unless defined$count and $count >= 2;my$encoding;if ($buf eq "\x{FE}\x{FF}"){$encoding='UTF-16BE'}elsif ($buf eq "\x{FF}\x{FE}"){$encoding='UTF-16LE'}elsif ($buf eq "\x{EF}\x{BB}"){$buf=' ';$count=$fh->read($buf,length$buf);if (defined$count and $count >= 1 and $buf eq "\x{BF}"){$encoding='UTF-8'}}if (defined$encoding){if ("$]" >= 5.008){binmode($fh,":encoding($encoding)")}}else {$fh->setpos($pos)or croak(sprintf "Can't reset position to the top of '$filename'")}return$encoding}sub _parse_fh {my ($self,$fh)=@_;my($in_pod,$seen_end,$need_vers)=(0,0,0);my(@pkgs,%vers,%pod,@pod);my$pkg='main';my$pod_sect='';my$pod_data='';my$in_end=0;while (defined(my$line=<$fh>)){my$line_num=$.;chomp($line);my$is_cut;if ($line =~ /^=([a-zA-Z].*)/){my$cmd=$1;$is_cut=$cmd =~ /^cut(?:[^a-zA-Z]|$)/;$in_pod=!$is_cut}if ($in_pod){if ($line =~ /^=head[1-4]\s+(.+)\s*$/){push(@pod,$1);if ($self->{collect_pod}&& length($pod_data)){$pod{$pod_sect}=$pod_data;$pod_data=''}$pod_sect=$1}elsif ($self->{collect_pod}){$pod_data .= "$line\n"}}elsif ($is_cut){if ($self->{collect_pod}&& length($pod_data)){$pod{$pod_sect}=$pod_data;$pod_data=''}$pod_sect=''}else {next if$in_end;next if$line =~ /^\s*#/;if ($line eq '__END__'){$in_end++;next}last if$line eq '__DATA__';my($vers_sig,$vers_fullname,$vers_pkg)=($line =~ /VERSION/)? $self->_parse_version_expression($line): ();if ($line =~ /$PKG_REGEXP/o){$pkg=$1;push(@pkgs,$pkg)unless grep($pkg eq $_,@pkgs);$vers{$pkg}=$2 unless exists($vers{$pkg});$need_vers=defined $2 ? 0 : 1}elsif ($vers_fullname && $vers_pkg){push(@pkgs,$vers_pkg)unless grep($vers_pkg eq $_,@pkgs);$need_vers=0 if$vers_pkg eq $pkg;unless (defined$vers{$vers_pkg}&& length$vers{$vers_pkg}){$vers{$vers_pkg}=$self->_evaluate_version_line($vers_sig,$vers_fullname,$line)}}elsif (!exists($vers{main})&& $pkg eq 'main' && $vers_fullname){$need_vers=0;my$v=$self->_evaluate_version_line($vers_sig,$vers_fullname,$line);$vers{$pkg}=$v;push(@pkgs,'main')}elsif (!exists($vers{main})&& $pkg eq 'main' && $line =~ /\w+/){$need_vers=1;$vers{main}='';push(@pkgs,'main')}elsif ($vers_fullname && $need_vers){$need_vers=0;my$v=$self->_evaluate_version_line($vers_sig,$vers_fullname,$line);unless (defined$vers{$pkg}&& length$vers{$pkg}){$vers{$pkg}=$v}}}}if ($self->{collect_pod}&& length($pod_data)){$pod{$pod_sect}=$pod_data}$self->{versions}=\%vers;$self->{packages}=\@pkgs;$self->{pod}=\%pod;$self->{pod_headings}=\@pod}{my$pn=0;sub _evaluate_version_line {my$self=shift;my($sigil,$var,$line)=@_;my$vsub;$pn++;my$eval=qq{BEGIN { q# Hide from _packages_inside()
- #; package Module::Metadata::_version::p$pn;
+ =[^=~>] # = but not ==, nor =~, nor =>
+ }x;sub new_from_file {my$class=shift;my$filename=File::Spec->rel2abs(shift);return undef unless defined($filename)&& -f $filename;return$class->_init(undef,$filename,@_)}sub new_from_handle {my$class=shift;my$handle=shift;my$filename=shift;return undef unless defined($handle)&& defined($filename);$filename=File::Spec->rel2abs($filename);return$class->_init(undef,$filename,@_,handle=>$handle)}sub new_from_module {my$class=shift;my$module=shift;my%props=@_;$props{inc}||= \@INC;my$filename=$class->find_module_by_name($module,$props{inc});return undef unless defined($filename)&& -f $filename;return$class->_init($module,$filename,%props)}{my$compare_versions=sub {my ($v1,$op,$v2)=@_;$v1=version->new($v1)unless UNIVERSAL::isa($v1,'version');my$eval_str="\$v1 $op \$v2";my$result=eval$eval_str;log_info {"error comparing versions: '$eval_str' $@"}if $@;return$result};my$normalize_version=sub {my ($version)=@_;if ($version =~ /[=<>!,]/){}elsif (ref$version eq 'version'){$version=$version->is_qv ? $version->normal : $version->stringify}elsif ($version =~ /^[^v][^.]*\.[^.]+\./){$version="v$version"}else {}return$version};my$resolve_module_versions=sub {my$packages=shift;my($file,$version);my$err='';for my$p (@$packages){if (defined($p->{version})){if (defined($version)){if ($compare_versions->($version,'!=',$p->{version})){$err .= " $p->{file} ($p->{version})\n"}else {}}else {$file=$p->{file};$version=$p->{version}}}$file ||= $p->{file}if defined($p->{file})}if ($err){$err=" $file ($version)\n" .$err}my%result=(file=>$file,version=>$version,err=>$err);return \%result};sub provides {my$class=shift;croak "provides() requires key/value pairs \n" if @_ % 2;my%args=@_;croak "provides() takes only one of 'dir' or 'files'\n" if$args{dir}&& $args{files};croak "provides() requires a 'version' argument" unless defined$args{version};croak "provides() does not support version '$args{version}' metadata" unless grep {$args{version}eq $_}qw/1.4 2/;$args{prefix}='lib' unless defined$args{prefix};my$p;if ($args{dir}){$p=$class->package_versions_from_directory($args{dir})}else {croak "provides() requires 'files' to be an array reference\n" unless ref$args{files}eq 'ARRAY';$p=$class->package_versions_from_directory($args{files})}if (length$args{prefix}){$args{prefix}=~ s{/$}{};for my$v (values %$p){$v->{file}="$args{prefix}/$v->{file}"}}return$p}sub package_versions_from_directory {my ($class,$dir,$files)=@_;my@files;if ($files){@files=@$files}else {find({wanted=>sub {push@files,$_ if -f $_ && /\.pm$/},no_chdir=>1,},$dir)}my(%prime,%alt);for my$file (@files){my$mapped_filename=File::Spec::Unix->abs2rel($file,$dir);my@path=split(/\//,$mapped_filename);(my$prime_package=join('::',@path))=~ s/\.pm$//;my$pm_info=$class->new_from_file($file);for my$package ($pm_info->packages_inside){next if$package eq 'main';next if$package eq 'DB';next if grep /^_/,split(/::/,$package);my$version=$pm_info->version($package);$prime_package=$package if lc($prime_package)eq lc($package);if ($package eq $prime_package){if (exists($prime{$package})){croak "Unexpected conflict in '$package'; multiple versions found.\n"}else {$mapped_filename="$package.pm" if lc("$package.pm")eq lc($mapped_filename);$prime{$package}{file}=$mapped_filename;$prime{$package}{version}=$version if defined($version)}}else {push(@{$alt{$package}},{file=>$mapped_filename,version=>$version,})}}}for my$package (keys(%alt)){my$result=$resolve_module_versions->($alt{$package});if (exists($prime{$package})){if ($result->{err}){log_info {"Found conflicting versions for package '$package'\n" ." $prime{$package}{file} ($prime{$package}{version})\n" .$result->{err}}}elsif (defined($result->{version})){if (exists($prime{$package}{version})&& defined($prime{$package}{version})){if ($compare_versions->($prime{$package}{version},'!=',$result->{version})){log_info {"Found conflicting versions for package '$package'\n" ." $prime{$package}{file} ($prime{$package}{version})\n" ." $result->{file} ($result->{version})\n"}}}else {$prime{$package}{file}=$result->{file};$prime{$package}{version}=$result->{version}}}else {}}else {if ($result->{err}){log_info {"Found conflicting versions for package '$package'\n" .$result->{err}}}$prime{$package}{file}=$result->{file};$prime{$package}{version}=$result->{version}if defined($result->{version})}}for (grep defined $_->{version},values%prime){$_->{version}=$normalize_version->($_->{version})}return \%prime}}sub _init {my$class=shift;my$module=shift;my$filename=shift;my%props=@_;my$handle=delete$props{handle};my(%valid_props,@valid_props);@valid_props=qw(collect_pod inc);@valid_props{@valid_props}=delete(@props{@valid_props});warn "Unknown properties: @{[keys %props]}\n" if scalar(%props);my%data=(module=>$module,filename=>$filename,version=>undef,packages=>[],versions=>{},pod=>{},pod_headings=>[],collect_pod=>0,%valid_props,);my$self=bless(\%data,$class);if (not $handle){my$filename=$self->{filename};open$handle,'<',$filename or croak("Can't open '$filename': $!");$self->_handle_bom($handle,$filename)}$self->_parse_fh($handle);unless($self->{module}and length($self->{module})){my ($v,$d,$f)=File::Spec->splitpath($self->{filename});if($f =~ /\.pm$/){$f =~ s/\..+$//;my@candidates=grep /$f$/,@{$self->{packages}};$self->{module}=shift(@candidates)}else {if(grep /main/,@{$self->{packages}}){$self->{module}='main'}else {$self->{module}=$self->{packages}[0]|| ''}}}$self->{version}=$self->{versions}{$self->{module}}if defined($self->{module});return$self}sub _do_find_module {my$class=shift;my$module=shift || croak 'find_module_by_name() requires a package name';my$dirs=shift || \@INC;my$file=File::Spec->catfile(split(/::/,$module));for my$dir (@$dirs){my$testfile=File::Spec->catfile($dir,$file);return [File::Spec->rel2abs($testfile),$dir ]if -e $testfile and!-d _;$testfile .= '.pm';return [File::Spec->rel2abs($testfile),$dir ]if -e $testfile}return}sub find_module_by_name {my$found=shift()->_do_find_module(@_)or return;return$found->[0]}sub find_module_dir_by_name {my$found=shift()->_do_find_module(@_)or return;return$found->[1]}sub _parse_version_expression {my$self=shift;my$line=shift;my($sigil,$variable_name,$package);if ($line =~ /$VERS_REGEXP/o){($sigil,$variable_name,$package)=$2 ? ($1,$2,$3): ($4,$5,$6);if ($package){$package=($package eq '::')? 'main' : $package;$package =~ s/::$//}}return ($sigil,$variable_name,$package)}sub _handle_bom {my ($self,$fh,$filename)=@_;my$pos=tell$fh;return unless defined$pos;my$buf=' ' x 2;my$count=read$fh,$buf,length$buf;return unless defined$count and $count >= 2;my$encoding;if ($buf eq "\x{FE}\x{FF}"){$encoding='UTF-16BE'}elsif ($buf eq "\x{FF}\x{FE}"){$encoding='UTF-16LE'}elsif ($buf eq "\x{EF}\x{BB}"){$buf=' ';$count=read$fh,$buf,length$buf;if (defined$count and $count >= 1 and $buf eq "\x{BF}"){$encoding='UTF-8'}}if (defined$encoding){if ("$]" >= 5.008){binmode($fh,":encoding($encoding)")}}else {seek$fh,$pos,SEEK_SET or croak(sprintf "Can't reset position to the top of '$filename'")}return$encoding}sub _parse_fh {my ($self,$fh)=@_;my($in_pod,$seen_end,$need_vers)=(0,0,0);my(@packages,%vers,%pod,@pod);my$package='main';my$pod_sect='';my$pod_data='';my$in_end=0;while (defined(my$line=<$fh>)){my$line_num=$.;chomp($line);my$is_cut;if ($line =~ /^=([a-zA-Z].*)/){my$cmd=$1;$is_cut=$cmd =~ /^cut(?:[^a-zA-Z]|$)/;$in_pod=!$is_cut}if ($in_pod){if ($line =~ /^=head[1-4]\s+(.+)\s*$/){push(@pod,$1);if ($self->{collect_pod}&& length($pod_data)){$pod{$pod_sect}=$pod_data;$pod_data=''}$pod_sect=$1}elsif ($self->{collect_pod}){$pod_data .= "$line\n"}}elsif ($is_cut){if ($self->{collect_pod}&& length($pod_data)){$pod{$pod_sect}=$pod_data;$pod_data=''}$pod_sect=''}else {next if$in_end;next if$line =~ /^\s*#/;if ($line eq '__END__'){$in_end++;next}last if$line eq '__DATA__';my($version_sigil,$version_fullname,$version_package)=index($line,'VERSION')>= 1 ? $self->_parse_version_expression($line): ();if ($line =~ /$PKG_REGEXP/o){$package=$1;my$version=$2;push(@packages,$package)unless grep($package eq $_,@packages);$need_vers=defined$version ? 0 : 1;if (not exists$vers{$package}and defined$version){my$dwim_version=eval {_dwim_version($version)};croak "Version '$version' from $self->{filename} does not appear to be valid:\n$line\n\nThe fatal error was: $@\n" unless defined$dwim_version;$vers{$package}=$dwim_version}}elsif ($version_fullname && $version_package){push(@packages,$version_package)unless grep($version_package eq $_,@packages);$need_vers=0 if$version_package eq $package;unless (defined$vers{$version_package}&& length$vers{$version_package}){$vers{$version_package}=$self->_evaluate_version_line($version_sigil,$version_fullname,$line)}}elsif ($package eq 'main' && $version_fullname &&!exists($vers{main})){$need_vers=0;my$v=$self->_evaluate_version_line($version_sigil,$version_fullname,$line);$vers{$package}=$v;push(@packages,'main')}elsif ($package eq 'main' &&!exists($vers{main})&& $line =~ /\w/){$need_vers=1;$vers{main}='';push(@packages,'main')}elsif ($version_fullname && $need_vers){$need_vers=0;my$v=$self->_evaluate_version_line($version_sigil,$version_fullname,$line);unless (defined$vers{$package}&& length$vers{$package}){$vers{$package}=$v}}}}if ($self->{collect_pod}&& length($pod_data)){$pod{$pod_sect}=$pod_data}$self->{versions}=\%vers;$self->{packages}=\@packages;$self->{pod}=\%pod;$self->{pod_headings}=\@pod}{my$pn=0;sub _evaluate_version_line {my$self=shift;my($sigil,$variable_name,$line)=@_;$pn++;my$eval=qq{ my \$dummy = q# Hide from _packages_inside()
+ #; package Module::Metadata::_version::p${pn};
use version;
- no strict;
-
- \$vsub = sub {
- local $sigil$var;
- \$$var=undef;
- $line;
- \$$var
- };
- }};local $^W;eval$eval;if ($@ =~ /Can't locate/ && -d 'lib'){local@INC=('lib',@INC);eval$eval}warn "Error evaling version line '$eval' in $self->{filename}: $@\n" if $@;(ref($vsub)eq 'CODE')or croak "failed to build version sub for $self->{filename}";my$result=eval {$vsub->()};croak "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n" if $@;my$version=eval {_dwim_version($result)};croak "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n" unless defined$version;return$version}}{my@version_prep=(sub {return shift},sub {my$v=shift;$v =~ s{([0-9])[a-z-].*$}{$1}i;return$v},sub {my$v=shift;my$num_dots=()=$v =~ m{(\.)}g;my$num_unders=()=$v =~ m{(_)}g;my$leading_v=substr($v,0,1)eq 'v';if (!$leading_v && $num_dots < 2 && $num_unders > 1){$v =~ s{_}{}g;$num_unders=()=$v =~ m{(_)}g}return$v},sub {my$v=shift;no warnings 'numeric';return 0 + $v},);sub _dwim_version {my ($result)=shift;return$result if ref($result)eq 'version';my ($version,$error);for my$f (@version_prep){$result=$f->($result);$version=eval {version->new($result)};$error ||=$@ if $@;last if defined$version}croak$error unless defined$version;return$version}}sub name {$_[0]->{module}}sub filename {$_[0]->{filename}}sub packages_inside {@{$_[0]->{packages}}}sub pod_inside {@{$_[0]->{pod_headings}}}sub contains_pod {0+@{$_[0]->{pod_headings}}}sub version {my$self=shift;my$mod=shift || $self->{module};my$vers;if (defined($mod)&& length($mod)&& exists($self->{versions}{$mod})){return$self->{versions}{$mod}}else {return undef}}sub pod {my$self=shift;my$sect=shift;if (defined($sect)&& length($sect)&& exists($self->{pod}{$sect})){return$self->{pod}{$sect}}else {return undef}}1;
+ sub {
+ local $sigil$variable_name;
+ $line;
+ \$$variable_name
+ };
+ };$eval=$1 if$eval =~ m{^(.+)}s;local $^W;my$vsub=__clean_eval($eval);if ($@ =~ /Can't locate/ && -d 'lib'){local@INC=('lib',@INC);$vsub=__clean_eval($eval)}warn "Error evaling version line '$eval' in $self->{filename}: $@\n" if $@;(ref($vsub)eq 'CODE')or croak "failed to build version sub for $self->{filename}";my$result=eval {$vsub->()};croak "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n" if $@;my$version=eval {_dwim_version($result)};croak "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n" unless defined$version;return$version}}{my@version_prep=(sub {return shift},sub {my$v=shift;$v =~ s{([0-9])[a-z-].*$}{$1}i;return$v},sub {my$v=shift;my$num_dots=()=$v =~ m{(\.)}g;my$num_unders=()=$v =~ m{(_)}g;my$leading_v=substr($v,0,1)eq 'v';if (!$leading_v && $num_dots < 2 && $num_unders > 1){$v =~ s{_}{}g;$num_unders=()=$v =~ m{(_)}g}return$v},sub {my$v=shift;no warnings 'numeric';return 0 + $v},);sub _dwim_version {my ($result)=shift;return$result if ref($result)eq 'version';my ($version,$error);for my$f (@version_prep){$result=$f->($result);$version=eval {version->new($result)};$error ||= $@ if $@;last if defined$version}croak$error unless defined$version;return$version}}sub name {$_[0]->{module}}sub filename {$_[0]->{filename}}sub packages_inside {@{$_[0]->{packages}}}sub pod_inside {@{$_[0]->{pod_headings}}}sub contains_pod {0+@{$_[0]->{pod_headings}}}sub version {my$self=shift;my$mod=shift || $self->{module};my$vers;if (defined($mod)&& length($mod)&& exists($self->{versions}{$mod})){return$self->{versions}{$mod}}else {return undef}}sub pod {my$self=shift;my$sect=shift;if (defined($sect)&& length($sect)&& exists($self->{pod}{$sect})){return$self->{pod}{$sect}}else {return undef}}sub is_indexable {my ($self,$package)=@_;my@indexable_packages=grep {$_ ne 'main'}$self->packages_inside;return!!grep {$_ eq $package}@indexable_packages if$package;return!!@indexable_packages}1;
MODULE_METADATA
-$fatpacked{"Parse/CPAN/Meta.pm"} = <<'PARSE_CPAN_META';
- use strict;package Parse::CPAN::Meta;our$VERSION='1.4407';use Carp 'croak';sub HAVE_UTF8 () {$] >= 5.007003}sub IO_LAYER () {$] >= 5.008001 ? ":utf8" : ""}BEGIN {if (HAVE_UTF8){eval "require utf8;";die "Failed to load UTF-8 support" if $@}require 5.004;require Exporter;@Parse::CPAN::Meta::ISA=qw{Exporter};@Parse::CPAN::Meta::EXPORT_OK=qw{Load LoadFile}}sub load_file {my ($class,$filename)=@_;if ($filename =~ /\.ya?ml$/){return$class->load_yaml_string(_slurp($filename))}if ($filename =~ /\.json$/){return$class->load_json_string(_slurp($filename))}croak("file type cannot be determined by filename")}sub load_yaml_string {my ($class,$string)=@_;my$backend=$class->yaml_backend();my$data=eval {no strict 'refs';&{"$backend\::Load"}($string)};if ($@){croak$backend->can('errstr')? $backend->errstr : $@}return$data || {}}sub load_json_string {my ($class,$string)=@_;return$class->json_backend()->new->decode($string)}sub yaml_backend {local$Module::Load::Conditional::CHECK_INC_HASH=1;if (!defined$ENV{PERL_YAML_BACKEND}){_can_load('CPAN::Meta::YAML',0.002)or croak "CPAN::Meta::YAML 0.002 is not available\n";return "CPAN::Meta::YAML"}else {my$backend=$ENV{PERL_YAML_BACKEND};_can_load($backend)or croak "Could not load PERL_YAML_BACKEND '$backend'\n";$backend->can("Load")or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n";return$backend}}sub json_backend {local$Module::Load::Conditional::CHECK_INC_HASH=1;if (!$ENV{PERL_JSON_BACKEND}or $ENV{PERL_JSON_BACKEND}eq 'JSON::PP'){_can_load('JSON::PP'=>2.27103)or croak "JSON::PP 2.27103 is not available\n";return 'JSON::PP'}else {_can_load('JSON'=>2.5)or croak "JSON 2.5 is required for " ."\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n";return "JSON"}}sub _slurp {open my$fh,"<" .IO_LAYER,"$_[0]" or die "can't open $_[0] for reading: $!";return do {local $/;<$fh>}}sub _can_load {my ($module,$version)=@_;(my$file=$module)=~ s{::}{/}g;$file .= ".pm";return 1 if$INC{$file};return 0 if exists$INC{$file};eval {require$file;1}or return 0;if (defined$version){eval {$module->VERSION($version);1}or return 0}return 1}sub LoadFile ($) {require CPAN::Meta::YAML;my$object=CPAN::Meta::YAML::LoadFile(shift)or die CPAN::Meta::YAML->errstr;return$object}sub Load ($) {require CPAN::Meta::YAML;my$object=CPAN::Meta::YAML::Load(shift)or die CPAN::Meta::YAML->errstr;return$object}1;
+$fatpacked{"Parse/CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_CPAN_META';
+ use 5.008001;use strict;package Parse::CPAN::Meta;our$VERSION='1.4414';use Exporter;use Carp 'croak';our@ISA=qw/Exporter/;our@EXPORT_OK=qw/Load LoadFile/;sub load_file {my ($class,$filename)=@_;my$meta=_slurp($filename);if ($filename =~ /\.ya?ml$/){return$class->load_yaml_string($meta)}elsif ($filename =~ /\.json$/){return$class->load_json_string($meta)}else {$class->load_string($meta)}}sub load_string {my ($class,$string)=@_;if ($string =~ /^---/){return$class->load_yaml_string($string)}elsif ($string =~ /^\s*\{/){return$class->load_json_string($string)}else {return$class->load_yaml_string($string)}}sub load_yaml_string {my ($class,$string)=@_;my$backend=$class->yaml_backend();my$data=eval {no strict 'refs';&{"$backend\::Load"}($string)};croak $@ if $@;return$data || {}}sub load_json_string {my ($class,$string)=@_;my$data=eval {$class->json_backend()->new->decode($string)};croak $@ if $@;return$data || {}}sub yaml_backend {if (!defined$ENV{PERL_YAML_BACKEND}){_can_load('CPAN::Meta::YAML',0.011)or croak "CPAN::Meta::YAML 0.011 is not available\n";return "CPAN::Meta::YAML"}else {my$backend=$ENV{PERL_YAML_BACKEND};_can_load($backend)or croak "Could not load PERL_YAML_BACKEND '$backend'\n";$backend->can("Load")or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n";return$backend}}sub json_backend {if (!$ENV{PERL_JSON_BACKEND}or $ENV{PERL_JSON_BACKEND}eq 'JSON::PP'){_can_load('JSON::PP'=>2.27103)or croak "JSON::PP 2.27103 is not available\n";return 'JSON::PP'}else {_can_load('JSON'=>2.5)or croak "JSON 2.5 is required for " ."\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n";return "JSON"}}sub _slurp {require Encode;open my$fh,"<:raw","$_[0]" or die "can't open $_[0] for reading: $!";my$content=do {local $/;<$fh>};$content=Encode::decode('UTF-8',$content,Encode::PERLQQ());return$content}sub _can_load {my ($module,$version)=@_;(my$file=$module)=~ s{::}{/}g;$file .= ".pm";return 1 if$INC{$file};return 0 if exists$INC{$file};eval {require$file;1}or return 0;if (defined$version){eval {$module->VERSION($version);1}or return 0}return 1}sub LoadFile ($) {return Load(_slurp(shift))}sub Load ($) {require CPAN::Meta::YAML;my$object=eval {CPAN::Meta::YAML::Load(shift)};croak $@ if $@;return$object}1;
PARSE_CPAN_META
-$fatpacked{"String/ShellQuote.pm"} = <<'STRING_SHELLQUOTE';
+$fatpacked{"Parse/PMFile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_PMFILE';
+ package Parse::PMFile;sub __clean_eval {eval $_[0]}use strict;use warnings;use Safe;use JSON::PP ();use Dumpvalue;use version ();use File::Spec ();our$VERSION='0.36';our$VERBOSE=0;our$ALLOW_DEV_VERSION=0;our$FORK=0;our$UNSAFE=$] < 5.010000 ? 1 : 0;sub new {my ($class,$meta,$opts)=@_;bless {%{$opts || {}},META_CONTENT=>$meta},$class}sub parse {my ($self,$pmfile)=@_;$pmfile =~ s|\\|/|g;my($filemtime)=(stat$pmfile)[9];$self->{MTIME}=$filemtime;$self->{PMFILE}=$pmfile;unless ($self->_version_from_meta_ok){my$version;unless (eval {$version=$self->_parse_version;1}){$self->_verbose(1,"error with version in $pmfile: $@");return}$self->{VERSION}=$version;if ($self->{VERSION}=~ /^\{.*\}$/){}elsif ($self->{VERSION}=~ /[_\s]/ &&!$self->{ALLOW_DEV_VERSION}&&!$ALLOW_DEV_VERSION){return}}my($ppp)=$self->_packages_per_pmfile;my@keys_ppp=$self->_filter_ppps(sort keys %$ppp);$self->_verbose(1,"Will check keys_ppp[@keys_ppp]\n");my ($package,%errors);my%checked_in;DBPACK: foreach$package (@keys_ppp){if ($package !~ /^\w[\w\:\']*\w?\z/ || $package !~ /\w\z/ || $package =~ /:/ && $package !~ /::/ || $package =~ /\w:\w/ || $package =~ /:::/){$self->_verbose(1,"Package[$package] did not pass the ultimate sanity check");delete$ppp->{$package};next}if ($self->{USERID}&& $self->{PERMISSIONS}&&!$self->_perm_check($package)){delete$ppp->{$package};next}{my (undef,$module)=split m{/lib/},$self->{PMFILE},2;if ($module){$module =~ s{\.pm\z}{};$module =~ s{/}{::}g;if (lc$module eq lc$package && $module ne $package){$errors{$package}={indexing_warning=>"Capitalization of package ($package) does not match filename!",infile=>$self->{PMFILE},}}}}my$pp=$ppp->{$package};if ($pp->{version}&& $pp->{version}=~ /^\{.*\}$/){my$err=JSON::PP::decode_json($pp->{version});if ($err->{x_normalize}){$errors{$package}={normalize=>$err->{version},infile=>$pp->{infile},};$pp->{version}="undef"}elsif ($err->{openerr}){$pp->{version}="undef";$self->_verbose(1,qq{Parse::PMFile was not able to
+ read the file. It issued the following error: C< $err->{r} >},);$errors{$package}={open=>$err->{r},infile=>$pp->{infile},}}else {$pp->{version}="undef";$self->_verbose(1,qq{Parse::PMFile was not able to
+ parse the following line in that file: C< $err->{line} >
+
+ Note: the indexer is running in a Safe compartement and cannot
+ provide the full functionality of perl in the VERSION line. It
+ is trying hard, but sometime it fails. As a workaround, please
+ consider writing a META.yml that contains a 'provides'
+ attribute or contact the CPAN admins to investigate (yet
+ another) workaround against "Safe" limitations.)},);$errors{$package}={parse_version=>$err->{line},infile=>$err->{file},}}}for ($package,$pp->{version},){if (!defined || /^\s*$/ || /\s/){delete$ppp->{$package};next}}$checked_in{$package}=$ppp->{$package}}return (wantarray && %errors)? (\%checked_in,\%errors): \%checked_in}sub _perm_check {my ($self,$package)=@_;my$userid=$self->{USERID};my$module=$self->{PERMISSIONS}->module_permissions($package);return 1 if!$module;return 1 if defined$module->m && $module->m eq $userid;return 1 if defined$module->f && $module->f eq $userid;return 1 if defined$module->c && grep {$_ eq $userid}@{$module->c};return}sub _parse_version {my$self=shift;use strict;my$pmfile=$self->{PMFILE};my$tmpfile=File::Spec->catfile(File::Spec->tmpdir,"ParsePMFile$$" .rand(1000));my$pmcp=$pmfile;for ($pmcp){s/([^\\](\\\\)*)@/$1\\@/g}my($v);{package main;my$pid;if ($self->{FORK}|| $FORK){$pid=fork();die "Can't fork: $!" unless defined$pid}if ($pid){waitpid($pid,0);if (open my$fh,'<',$tmpfile){$v=<$fh>}}else {my($comp)=Safe->new;my$eval=qq{
+ local(\$^W) = 0;
+ Parse::PMFile::_parse_version_safely("$pmcp");
+ };$comp->permit("entereval");$comp->share("*Parse::PMFile::_parse_version_safely");$comp->share("*version::new");$comp->share("*version::numify");$comp->share_from('main',['*version::','*charstar::','*Exporter::','*DynaLoader::']);$comp->share_from('version',['&qv']);$comp->permit(":base_math");$comp->deny(qw/enteriter iter unstack goto/);version->import('qv')if$self->{UNSAFE}|| $UNSAFE;{no strict;$v=($self->{UNSAFE}|| $UNSAFE)? eval$eval : $comp->reval($eval)}if ($@){my$err=$@;if (ref$err){if ($err->{line}=~ /([\$*])([\w\:\']*)\bVERSION\b.*?\=(.*)/){local($^W)=0;my ($sigil,$vstr)=($1,$3);$self->_restore_overloaded_stuff(1)if$err->{line}=~ /use\s+version\b|version\->|qv\(/;$v=($self->{UNSAFE}|| $UNSAFE)? eval$vstr : $comp->reval($vstr);$v=$$v if$sigil eq '*' && ref$v}if ($@ or!$v){$self->_verbose(1,sprintf("reval failed: err[%s] for eval[%s]",JSON::PP::encode_json($err),$eval,));$v=JSON::PP::encode_json($err)}}else {$v=JSON::PP::encode_json({openerr=>$err })}}if (defined$v){$v=$v->numify if ref($v)=~ /^version(::vpp)?$/}else {$v=""}if ($self->{FORK}|| $FORK){open my$fh,'>:utf8',$tmpfile;print$fh $v;exit 0}else {utf8::encode($v);$v=undef if defined$v &&!length$v;$comp->erase;$self->_restore_overloaded_stuff}}}unlink$tmpfile if ($self->{FORK}|| $FORK)&& -e $tmpfile;return$self->_normalize_version($v)}sub _restore_overloaded_stuff {my ($self,$used_version_in_safe)=@_;return if$self->{UNSAFE}|| $UNSAFE;no strict 'refs';no warnings 'redefine';my$restored;if ($INC{'version/vxs.pm'}){*{'version::(""'}=\&version::vxs::stringify;*{'version::(0+'}=\&version::vxs::numify;*{'version::(cmp'}=\&version::vxs::VCMP;*{'version::(<=>'}=\&version::vxs::VCMP;*{'version::(bool'}=\&version::vxs::boolean;$restored=1}if ($INC{'version/vpp.pm'}){{package charstar;overload->import}if (!$used_version_in_safe){package version::vpp;overload->import}unless ($restored){*{'version::(""'}=\&version::vpp::stringify;*{'version::(0+'}=\&version::vpp::numify;*{'version::(cmp'}=\&version::vpp::vcmp;*{'version::(<=>'}=\&version::vpp::vcmp;*{'version::(bool'}=\&version::vpp::vbool}*{'version::vpp::(""'}=\&version::vpp::stringify;*{'version::vpp::(0+'}=\&version::vpp::numify;*{'version::vpp::(cmp'}=\&version::vpp::vcmp;*{'version::vpp::(<=>'}=\&version::vpp::vcmp;*{'version::vpp::(bool'}=\&version::vpp::vbool;*{'charstar::(""'}=\&charstar::thischar;*{'charstar::(0+'}=\&charstar::thischar;*{'charstar::(++'}=\&charstar::increment;*{'charstar::(--'}=\&charstar::decrement;*{'charstar::(+'}=\&charstar::plus;*{'charstar::(-'}=\&charstar::minus;*{'charstar::(*'}=\&charstar::multiply;*{'charstar::(cmp'}=\&charstar::cmp;*{'charstar::(<=>'}=\&charstar::spaceship;*{'charstar::(bool'}=\&charstar::thischar;*{'charstar::(='}=\&charstar::clone;$restored=1}if (!$restored){*{'version::(""'}=\&version::stringify;*{'version::(0+'}=\&version::numify;*{'version::(cmp'}=\&version::vcmp;*{'version::(<=>'}=\&version::vcmp;*{'version::(bool'}=\&version::boolean}}sub _packages_per_pmfile {my$self=shift;my$ppp={};my$pmfile=$self->{PMFILE};my$filemtime=$self->{MTIME};my$version=$self->{VERSION};open my$fh,"<","$pmfile" or return$ppp;local $/="\n";my$inpod=0;PLINE: while (<$fh>){chomp;my($pline)=$_;$inpod=$pline =~ /^=(?!cut)/ ? 1 : $pline =~ /^=cut/ ? 0 : $inpod;next if$inpod;next if substr($pline,0,4)eq "=cut";$pline =~ s/\#.*//;next if$pline =~ /^\s*$/;if ($pline =~ /^__(?:END|DATA)__\b/ and $pmfile !~ /\.PL$/){last PLINE}my$pkg;my$strict_version;if ($pline =~ m{
+ # (.*) # takes too much time if $pline is long
+ (?<![*\$\\@%&]) # no sigils
+ \bpackage\s+
+ ([\w\:\']+)
+ \s*
+ (?: $ | [\}\;] | \{ | \s+($version::STRICT) )
+ }x){$pkg=$1;$strict_version=$2;if ($pkg eq "DB"){next PLINE}}if ($pkg){$pkg =~ s/\'/::/;next PLINE unless$pkg =~ /^[A-Za-z]/;next PLINE unless$pkg =~ /\w$/;next PLINE if$pkg eq "main";next PLINE if length($pkg)> 128;$ppp->{$pkg}{parsed}++;$ppp->{$pkg}{infile}=$pmfile;if ($self->_simile($pmfile,$pkg)){$ppp->{$pkg}{simile}=$pmfile;if ($self->_version_from_meta_ok){my$provides=$self->{META_CONTENT}{provides};if (exists$provides->{$pkg}){if (defined$provides->{$pkg}{version}){my$v=$provides->{$pkg}{version};if ($v =~ /[_\s]/ &&!$self->{ALLOW_DEV_VERSION}&&!$ALLOW_DEV_VERSION){next PLINE}unless (eval {$version=$self->_normalize_version($v);1}){$self->_verbose(1,"error with version in $pmfile: $@");next}$ppp->{$pkg}{version}=$version}else {$ppp->{$pkg}{version}="undef"}}}else {if (defined$strict_version){$ppp->{$pkg}{version}=$strict_version }else {$ppp->{$pkg}{version}=defined$version ? $version : ""}no warnings;if ($version eq 'undef'){$ppp->{$pkg}{version}=$version unless defined$ppp->{$pkg}{version}}else {$ppp->{$pkg}{version}=$version if$version > $ppp->{$pkg}{version}|| $version gt $ppp->{$pkg}{version}}}}else {$ppp->{$pkg}{version}=$version unless defined$ppp->{$pkg}{version}&& length($ppp->{$pkg}{version})}$ppp->{$pkg}{filemtime}=$filemtime}else {}}close$fh;$ppp}{no strict;sub _parse_version_safely {my($parsefile)=@_;my$result;local*FH;local $/="\n";open(FH,$parsefile)or die "Could not open '$parsefile': $!";my$inpod=0;while (<FH>){$inpod=/^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;next if$inpod || /^\s*#/;last if /^__(?:END|DATA)__\b/;chop;if (my ($ver)=/package \s+ \S+ \s+ (\S+) \s* [;{]/x){return$ver if version::is_lax($ver)}next unless /(?<!\\)([\$*])(([\w\:\']*)\bVERSION)\b.*(?<![!><=])\=(?![=>])/;my$current_parsed_line=$_;my$eval=qq{
+ package #
+ ExtUtils::MakeMaker::_version;
+
+ local $1$2;
+ \$$2=undef; do {
+ $_
+ }; \$$2
+ };local $^W=0;local$SIG{__WARN__}=sub {};$result=__clean_eval($eval);if ($@ or!defined$result){die +{eval=>$eval,line=>$current_parsed_line,file=>$parsefile,err=>$@,}}last}close FH;$result="undef" unless defined$result;if ((ref$result)=~ /^version(?:::vpp)?\b/){$result=$result->numify}return$result}}sub _filter_ppps {my($self,@ppps)=@_;my@res;MANI: for my$ppp (@ppps){if ($self->{META_CONTENT}){my$no_index=$self->{META_CONTENT}{no_index}|| $self->{META_CONTENT}{private};if (ref($no_index)eq 'HASH'){my%map=(package=>qr{\z},namespace=>qr{::},);for my$k (qw(package namespace)){next unless my$v=$no_index->{$k};my$rest=$map{$k};if (ref$v eq "ARRAY"){for my$ve (@$v){$ve =~ s|::$||;if ($ppp =~ /^$ve$rest/){$self->_verbose(1,"Skipping ppp[$ppp] due to ve[$ve]");next MANI}else {$self->_verbose(1,"NOT skipping ppp[$ppp] due to ve[$ve]")}}}else {$v =~ s|::$||;if ($ppp =~ /^$v$rest/){$self->_verbose(1,"Skipping ppp[$ppp] due to v[$v]");next MANI}else {$self->_verbose(1,"NOT skipping ppp[$ppp] due to v[$v]")}}}}else {$self->_verbose(1,"No keyword 'no_index' or 'private' in META_CONTENT")}}else {}push@res,$ppp}$self->_verbose(1,"Result of filter_ppps: res[@res]");@res}sub _simile {my($self,$file,$package)=@_;$file =~ s|.*/||;$file =~ s|\.pm(?:\.PL)?||;my$ret=$package =~ m/\b\Q$file\E$/;$ret ||= 0;unless ($ret){$ret=1 if lc$file eq 'version'}$self->_verbose(1,"Result of simile(): file[$file] package[$package] ret[$ret]\n");$ret}sub _normalize_version {my($self,$v)=@_;$v="undef" unless defined$v;my$dv=Dumpvalue->new;my$sdv=$dv->stringify($v,1);$self->_verbose(1,"Result of normalize_version: sdv[$sdv]\n");return$v if$v eq "undef";return$v if$v =~ /^\{.*\}$/;$v =~ s/^\s+//;$v =~ s/\s+\z//;if ($v =~ /_/){return$v }if (!version::is_lax($v)){return JSON::PP::encode_json({x_normalize=>'version::is_lax failed',version=>$v })}my$vv=eval {no warnings;version->new($v)->numify};if ($@){return JSON::PP::encode_json({x_normalize=>$@,version=>$v })}if ($vv eq $v){}else {my$forced=$self->_force_numeric($v);if ($forced eq $vv){}elsif ($forced =~ /^v(.+)/){$vv=version->new($1)->numify}else {if ($forced==$vv){$vv=$forced}}}return$vv}sub _force_numeric {my($self,$v)=@_;$v=$self->_readable($v);if ($v =~ /^(\+?)(\d*)(\.(\d*))?/ && (defined $2 && length $2 || defined $4 && length $4)){my$two=defined $2 ? $2 : "";my$three=defined $3 ? $3 : "";$v="$two$three"}$v}sub _version_from_meta_ok {my($self)=@_;return$self->{VERSION_FROM_META_OK}if exists$self->{VERSION_FROM_META_OK};my$c=$self->{META_CONTENT};return($self->{VERSION_FROM_META_OK}=0)unless$c->{provides};my ($mb_v)=(defined$c->{generated_by}? $c->{generated_by}: '')=~ /Module::Build version ([\d\.]+)/;return($self->{VERSION_FROM_META_OK}=1)unless$mb_v;return($self->{VERSION_FROM_META_OK}=1)if$mb_v eq '0.250.0';if ($mb_v >= 0.19 && $mb_v < 0.26 &&!keys %{$c->{provides}}){return($self->{VERSION_FROM_META_OK}=0)}return($self->{VERSION_FROM_META_OK}=1)}sub _verbose {my($self,$level,@what)=@_;warn@what if$level <= ((ref$self && $self->{VERBOSE})|| $VERBOSE)}sub _vcmp {my($self,$l,$r)=@_;local($^W)=0;$self->_verbose(9,"l[$l] r[$r]");return 0 if$l eq $r;for ($l,$r){s/_//g}$self->_verbose(9,"l[$l] r[$r]");for ($l,$r){next unless tr/.// > 1 || /^v/;s/^v?/v/;1 while s/\.0+(\d)/.$1/}$self->_verbose(9,"l[$l] r[$r]");if ($l=~/^v/ <=> $r=~/^v/){for ($l,$r){next if /^v/;$_=$self->_float2vv($_)}}$self->_verbose(9,"l[$l] r[$r]");my$lvstring="v0";my$rvstring="v0";if ($] >= 5.006 && $l =~ /^v/ && $r =~ /^v/){$lvstring=$self->_vstring($l);$rvstring=$self->_vstring($r);$self->_verbose(9,sprintf "lv[%vd] rv[%vd]",$lvstring,$rvstring)}return (($l ne "undef")<=> ($r ne "undef")|| $lvstring cmp $rvstring || $l <=> $r || $l cmp $r)}sub _vgt {my($self,$l,$r)=@_;$self->_vcmp($l,$r)> 0}sub _vlt {my($self,$l,$r)=@_;$self->_vcmp($l,$r)< 0}sub _vge {my($self,$l,$r)=@_;$self->_vcmp($l,$r)>= 0}sub _vle {my($self,$l,$r)=@_;$self->_vcmp($l,$r)<= 0}sub _vstring {my($self,$n)=@_;$n =~ s/^v// or die "Parse::PMFile::_vstring() called with invalid arg [$n]";pack "U*",split /\./,$n}sub _float2vv {my($self,$n)=@_;my($rev)=int($n);$rev ||= 0;my($mantissa)=$n =~ /\.(\d{1,12})/;$mantissa ||= 0;$mantissa .= "0" while length($mantissa)%3;my$ret="v" .$rev;while ($mantissa){$mantissa =~ s/(\d{1,3})// or die "Panic: length>0 but not a digit? mantissa[$mantissa]";$ret .= ".".int($1)}$ret =~ s/(\.0)+/.0/;$ret}sub _readable {my($self,$n)=@_;$n =~ /^([\w\-\+\.]+)/;return $1 if defined $1 && length($1)>0;if ($] < 5.006){$self->_verbose(9,"Suspicious version string seen [$n]\n");return$n}my$better=sprintf "v%vd",$n;$self->_verbose(9,"n[$n] better[$better]");return$better}1;
+PARSE_PMFILE
+
+$fatpacked{"String/ShellQuote.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_SHELLQUOTE';
package String::ShellQuote;use strict;use vars qw($VERSION @ISA @EXPORT);require Exporter;$VERSION='1.04';@ISA=qw(Exporter);@EXPORT=qw(shell_quote shell_quote_best_effort shell_comment_quote);sub croak {require Carp;goto&Carp::croak}sub _shell_quote_backend {my@in=@_;my@err=();if (0){require RS::Handy;print RS::Handy::data_dump(\@in)}return \@err,'' unless@in;my$ret='';my$saw_non_equal=0;for (@in){if (!defined $_ or $_ eq ''){$_="''";next}if (s/\x00//g){push@err,"No way to quote string containing null (\\000) bytes"}my$escape=0;if (/=/){if (!$saw_non_equal){$escape=1}}else {$saw_non_equal=1}if (m|[^\w!%+,\-./:=@^]|){$escape=1}if ($escape || (!$saw_non_equal && /=/)){s/'/'\\''/g;s|((?:'\\''){2,})|q{'"} . (q{'} x (length($1) / 4)) . q{"'}|ge;$_="'$_'";s/^''//;s/''$//}}continue {$ret .= "$_ "}chop$ret;return \@err,$ret}sub shell_quote {my ($rerr,$s)=_shell_quote_backend @_;if (@$rerr){my%seen;@$rerr=grep {!$seen{$_}++}@$rerr;my$s=join '',map {"shell_quote(): $_\n"}@$rerr;chomp$s;croak$s}return$s}sub shell_quote_best_effort {my ($rerr,$s)=_shell_quote_backend @_;return$s}sub shell_comment_quote {return '' unless @_;unless (@_==1){croak "Too many arguments to shell_comment_quote " ."(got " .@_ ." expected 1)"}local $_=shift;s/\n/\n#/g;return $_}1;
STRING_SHELLQUOTE
-$fatpacked{"aliased.pm"} = <<'ALIASED';
- package aliased;our$VERSION='0.31';$VERSION=eval$VERSION;require Exporter;@ISA=qw(Exporter);@EXPORT=qw(alias prefix);use strict;sub _croak {require Carp;Carp::croak(@_)}sub import {my ($class,$package,$alias,@import)=@_;if (@_ <= 1){$class->export_to_level(1);return}my$callpack=caller(0);_load_alias($package,$callpack,@import);_make_alias($package,$callpack,$alias)}sub _get_alias {my$package=shift;$package =~ s/.*(?:::|')//;return$package}sub _make_alias {my ($package,$callpack,$alias)=@_;$alias ||=_get_alias($package);my$destination=$alias =~ /::/ ? $alias : "$callpack\::$alias";no strict 'refs';*{$destination}=sub () {$package}}sub _load_alias {my ($package,$callpack,@import)=@_;my$sigdie=$SIG{__DIE__};{my$code=@import==0 ? "package $callpack; use $package;" : "package $callpack; use $package (\@import)";eval$code;if (my$error=$@){$SIG{__DIE__}=$sigdie;_croak($error)}$sigdie=$SIG{__DIE__}if defined$SIG{__DIE__}}$SIG{__DIE__}=$sigdie if defined$sigdie;return$package}sub alias {my ($package,@import)=@_;my$callpack=scalar caller(0);return _load_alias($package,$callpack,@import)}sub prefix {my ($class)=@_;return sub {my ($name)=@_;my$callpack=caller(0);if (not @_){return _load_alias($class,$callpack)}elsif (@_==1 && defined$name){return _load_alias("${class}::$name",$callpack)}else {_croak("Too many arguments to prefix('$class')")}}}1;
-ALIASED
-
-$fatpacked{"lib/core/only.pm"} = <<'LIB_CORE_ONLY';
+$fatpacked{"lib/core/only.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LIB_CORE_ONLY';
package lib::core::only;use strict;use warnings FATAL=>'all';use Config;sub import {@INC=@Config{qw(privlibexp archlibexp)};return}1;
LIB_CORE_ONLY
-$fatpacked{"local/lib.pm"} = <<'LOCAL_LIB';
- use strict;use warnings;package local::lib;use 5.008001;use File::Spec ();use File::Path ();use Config;our$VERSION='1.008011';our@KNOWN_FLAGS=qw(--self-contained --deactivate --deactivate-all);sub DEACTIVATE_ONE () {1}sub DEACTIVATE_ALL () {2}sub INTERPOLATE_ENV () {1}sub LITERAL_ENV () {0}sub import {my ($class,@args)=@_;my$perl5lib=$ENV{PERL5LIB}|| '';my%arg_store;for my$arg (@args){if ($arg =~ /−/){die <<'DEATH'}elsif(grep {$arg eq $_}@KNOWN_FLAGS){(my$flag=$arg)=~ s/--//;$arg_store{$flag}=1}elsif($arg =~ /^--/){die "Unknown import argument: $arg"}else {$arg_store{path}=$arg}}if($arg_store{'self-contained'}){die "FATAL: The local::lib --self-contained flag has never worked reliably and the original author, Mark Stosberg, was unable or unwilling to maintain it. As such, this flag has been removed from the local::lib codebase in order to prevent misunderstandings and potentially broken builds. The local::lib authors recommend that you look at the lib::core::only module shipped with this distribution in order to create a more robust environment that is equivalent to what --self-contained provided (although quite possibly not what you originally thought it provided due to the poor quality of the documentation, for which we apologise).\n"}my$deactivating=0;if ($arg_store{deactivate}){$deactivating=DEACTIVATE_ONE}if ($arg_store{'deactivate-all'}){$deactivating=DEACTIVATE_ALL}$arg_store{path}=$class->resolve_path($arg_store{path});$class->setup_local_lib_for($arg_store{path},$deactivating);for (@INC){next if ref;m/(.*)/ and $_=$1}}sub pipeline;sub pipeline {my@methods=@_;my$last=pop(@methods);if (@methods){\sub {my ($obj,@args)=@_;$obj->${pipeline@methods}($obj->$last(@args))}}else {\sub {shift->$last(@_)}}}sub _uniq {my%seen;grep {!$seen{$_}++}@_}sub resolve_path {my ($class,$path)=@_;$class->${pipeline qw(resolve_relative_path resolve_home_path resolve_empty_path)}($path)}sub resolve_empty_path {my ($class,$path)=@_;if (defined$path){$path}else {'~/perl5'}}sub resolve_home_path {my ($class,$path)=@_;return$path unless ($path =~ /^~/);my ($user)=($path =~ /^~([^\/]+)/);my$tried_file_homedir;my$homedir=do {if (eval {require File::HomeDir}&& $File::HomeDir::VERSION >= 0.65){$tried_file_homedir=1;if (defined$user){File::HomeDir->users_home($user)}else {File::HomeDir->my_home}}else {if (defined$user){(getpwnam$user)[7]}else {if (defined$ENV{HOME}){$ENV{HOME}}else {(getpwuid $<)[7]}}}};unless (defined$homedir){require Carp;Carp::croak("Couldn't resolve homedir for " .(defined$user ? $user : 'current user').($tried_file_homedir ? '' : ' - consider installing File::HomeDir'))}$path =~ s/^~[^\/]*/$homedir/;$path}sub resolve_relative_path {my ($class,$path)=@_;$path=File::Spec->rel2abs($path)}sub setup_local_lib_for {my ($class,$path,$deactivating)=@_;my$interpolate=LITERAL_ENV;my@active_lls=$class->active_paths;$class->ensure_dir_structure_for($path);$path=Win32::GetShortPathName($path)if $^O eq 'MSWin32';if (!$deactivating){if (@active_lls && $active_lls[-1]eq $path){exit 0 if $0 eq '-';return}elsif (grep {$_ eq $path}@active_lls){$class->setup_env_hash_for($path,DEACTIVATE_ONE);$interpolate=INTERPOLATE_ENV}}if ($0 eq '-'){$class->print_environment_vars_for($path,$deactivating,$interpolate);exit 0}else {$class->setup_env_hash_for($path,$deactivating);my$arch_dir=$Config{archname};@INC=_uniq((map {(File::Spec->catdir($_,$arch_dir),$_)}split($Config{path_sep},$ENV{PERL5LIB})),@INC)}}sub install_base_bin_path {my ($class,$path)=@_;File::Spec->catdir($path,'bin')}sub install_base_perl_path {my ($class,$path)=@_;File::Spec->catdir($path,'lib','perl5')}sub install_base_arch_path {my ($class,$path)=@_;File::Spec->catdir($class->install_base_perl_path($path),$Config{archname})}sub ensure_dir_structure_for {my ($class,$path)=@_;unless (-d $path){warn "Attempting to create directory ${path}\n"}File::Path::mkpath($path);return}sub guess_shelltype {my$shellbin='sh';if(defined$ENV{'SHELL'}){my@shell_bin_path_parts=File::Spec->splitpath($ENV{'SHELL'});$shellbin=$shell_bin_path_parts[-1]}my$shelltype=do {local $_=$shellbin;if(/csh/){'csh'}else {'bourne'}};if (defined$ENV{'COMSPEC'}&& $^O ne 'cygwin'){my@shell_bin_path_parts=File::Spec->splitpath($ENV{'COMSPEC'});$shellbin=$shell_bin_path_parts[-1];$shelltype=do {local $_=$shellbin;if(/command\.com/){'win32'}elsif(/cmd\.exe/){'win32'}elsif(/4nt\.exe/){'win32'}else {$shelltype}}}return$shelltype}sub print_environment_vars_for {my ($class,$path,$deactivating,$interpolate)=@_;print$class->environment_vars_string_for($path,$deactivating,$interpolate)}sub environment_vars_string_for {my ($class,$path,$deactivating,$interpolate)=@_;my@envs=$class->build_environment_vars_for($path,$deactivating,$interpolate);my$out='';my$shelltype=$class->guess_shelltype;while (@envs){my ($name,$value)=(shift(@envs),shift(@envs));$value =~ s/(\\")/\\$1/g if defined$value;$out .= $class->${\"build_${shelltype}_env_declaration"}($name,$value)}return$out}sub build_bourne_env_declaration {my$class=shift;my($name,$value)=@_;return defined($value)? qq{export ${name}="${value}";\n} : qq{unset ${name};\n}}sub build_csh_env_declaration {my$class=shift;my($name,$value)=@_;return defined($value)? qq{setenv ${name} "${value}"\n} : qq{unsetenv ${name}\n}}sub build_win32_env_declaration {my$class=shift;my($name,$value)=@_;return defined($value)? qq{set ${name}=${value}\n} : qq{set ${name}=\n}}sub setup_env_hash_for {my ($class,$path,$deactivating)=@_;my%envs=$class->build_environment_vars_for($path,$deactivating,INTERPOLATE_ENV);@ENV{keys%envs}=values%envs}sub build_environment_vars_for {my ($class,$path,$deactivating,$interpolate)=@_;if ($deactivating==DEACTIVATE_ONE){return$class->build_deactivate_environment_vars_for($path,$interpolate)}elsif ($deactivating==DEACTIVATE_ALL){return$class->build_deact_all_environment_vars_for($path,$interpolate)}else {return$class->build_activate_environment_vars_for($path,$interpolate)}}my%ENV_LIST_VALUE_DEFAULTS=(interpolate=>INTERPOLATE_ENV,exists=>undef,filter=>sub {1},empty=>undef,);sub _env_list_value {my$options=shift;die(sprintf "unknown option '$_' at %s line %u\n",(caller)[1..2])for grep {!exists$ENV_LIST_VALUE_DEFAULTS{$_}}keys %$options;my%options=(%ENV_LIST_VALUE_DEFAULTS,%{$options});$options{exists}=$options{interpolate}==INTERPOLATE_ENV unless defined$options{exists};my%seen;my$value=join($Config{path_sep},map {ref $_ ? ($^O eq 'MSWin32' ? "%${$_}%" : "\$${$_}"): $_}grep {ref $_ || (defined $_ && length($_)> 0 &&!$seen{$_}++ && $options{filter}->($_)&& (!$options{exists}|| -e $_))}map {if (ref $_ eq 'SCALAR' && $options{interpolate}==INTERPOLATE_ENV){defined$ENV{${$_}}? (split /\Q$Config{path_sep}/,$ENV{${$_}}): ()}else {$_}}@_);return length($value)? $value : $options{empty}}sub build_activate_environment_vars_for {my ($class,$path,$interpolate)=@_;return (PERL_LOCAL_LIB_ROOT=>_env_list_value({interpolate=>$interpolate,exists=>0,empty=>'' },\'PERL_LOCAL_LIB_ROOT',$path,),PERL_MB_OPT=>"--install_base ${path}",PERL_MM_OPT=>"INSTALL_BASE=${path}",PERL5LIB=>_env_list_value({interpolate=>$interpolate,exists=>0,empty=>'' },$class->install_base_perl_path($path),\'PERL5LIB',),PATH=>_env_list_value({interpolate=>$interpolate,exists=>0,empty=>'' },$class->install_base_bin_path($path),\'PATH',),)}sub active_paths {my ($class)=@_;return ()unless defined$ENV{PERL_LOCAL_LIB_ROOT};return grep {$_ ne ''}split /\Q$Config{path_sep}/,$ENV{PERL_LOCAL_LIB_ROOT}}sub build_deactivate_environment_vars_for {my ($class,$path,$interpolate)=@_;my@active_lls=$class->active_paths;if (!grep {$_ eq $path}@active_lls){warn "Tried to deactivate inactive local::lib '$path'\n";return ()}my$perl_path=$class->install_base_perl_path($path);my$arch_path=$class->install_base_arch_path($path);my$bin_path=$class->install_base_bin_path($path);my%env=(PERL_LOCAL_LIB_ROOT=>_env_list_value({exists=>0,},grep {$_ ne $path}@active_lls),PERL5LIB=>_env_list_value({exists=>0,filter=>sub {$_ ne $perl_path && $_ ne $arch_path},},\'PERL5LIB',),PATH=>_env_list_value({exists=>0,filter=>sub {$_ ne $bin_path},},\'PATH',),);if ($active_lls[-1]eq $path){my$new_top=$active_lls[-2];$env{PERL_MB_OPT}=defined($new_top)? "--install_base ${new_top}" : undef;$env{PERL_MM_OPT}=defined($new_top)? "INSTALL_BASE=${new_top}" : undef}return%env}sub build_deact_all_environment_vars_for {my ($class,$path,$interpolate)=@_;my@active_lls=$class->active_paths;my%perl_paths=map {($class->install_base_perl_path($_)=>1,$class->install_base_arch_path($_)=>1)}@active_lls;my%bin_paths=map {($class->install_base_bin_path($_)=>1,)}@active_lls;my%env=(PERL_LOCAL_LIB_ROOT=>undef,PERL_MM_OPT=>undef,PERL_MB_OPT=>undef,PERL5LIB=>_env_list_value({exists=>0,filter=>sub {!scalar grep {exists$perl_paths{$_}}$_[0]},},\'PERL5LIB'),PATH=>_env_list_value({exists=>0,filter=>sub {!scalar grep {exists$bin_paths{$_}}$_[0]},},\'PATH'),);return%env}1;
+$fatpacked{"local/lib.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCAL_LIB';
+ package local::lib;use 5.006;use strict;use warnings;use Config;our$VERSION='2.000015';$VERSION=eval$VERSION;BEGIN {*_WIN32=($^O eq 'MSWin32' || $^O eq 'NetWare' || $^O eq 'symbian')? sub(){1}: sub(){0};*_USE_FSPEC=($^O eq 'MacOS' || $^O eq 'VMS' || $INC{'File/Spec.pm'})? sub(){1}: sub(){0}}our$_DIR_JOIN=_WIN32 ? '\\' : '/';our$_DIR_SPLIT=(_WIN32 || $^O eq 'cygwin')? qr{[\\/]} : qr{/};our$_ROOT=_WIN32 ? do {my$UNC=qr{[\\/]{2}[^\\/]+[\\/][^\\/]+};qr{^(?:$UNC|[A-Za-z]:|)$_DIR_SPLIT}}: qr{^/};our$_PERL;sub _cwd {my$drive=shift;if (!$_PERL){($_PERL)=$^X =~ /(.+)/;if (_is_abs($_PERL)){}elsif (-x $Config{perlpath}){$_PERL=$Config{perlpath}}else {($_PERL)=map {/(.*)/}grep {-x $_}map {join($_DIR_JOIN,$_,$_PERL)}split /\Q$Config{path_sep}\E/,$ENV{PATH}}}local@ENV{qw(PATH IFS CDPATH ENV BASH_ENV)};my$cmd=$drive ? "eval { Cwd::getdcwd(q($drive)) }" : 'getcwd';my$cwd=`"$_PERL" -MCwd -le "print $cmd"`;chomp$cwd;if (!length$cwd && $drive){$cwd=$drive}$cwd =~ s/$_DIR_SPLIT?$/$_DIR_JOIN/;$cwd}sub _catdir {if (_USE_FSPEC){require File::Spec;File::Spec->catdir(@_)}else {my$dir=join($_DIR_JOIN,@_);$dir =~ s{($_DIR_SPLIT)(?:\.?$_DIR_SPLIT)+}{$1}g;$dir}}sub _is_abs {if (_USE_FSPEC){require File::Spec;File::Spec->file_name_is_absolute($_[0])}else {$_[0]=~ $_ROOT}}sub _rel2abs {my ($dir,$base)=@_;return$dir if _is_abs($dir);$base=_WIN32 && $dir =~ s/^([A-Za-z]:)// ? _cwd("$1"): $base ? $base : _cwd;return _catdir($base,$dir)}sub import {my ($class,@args)=@_;push@args,@ARGV if $0 eq '-';my@steps;my%opts;my$shelltype;while (@args){my$arg=shift@args;if ($arg =~ /\xE2\x88\x92/ or $arg =~ /−/){die <<'DEATH'}elsif ($arg eq '--self-contained'){die <<'DEATH'}elsif($arg =~ /^--deactivate(?:=(.*))?$/){my$path=defined $1 ? $1 : shift@args;push@steps,['deactivate',$path]}elsif ($arg eq '--deactivate-all'){push@steps,['deactivate_all']}elsif ($arg =~ /^--shelltype(?:=(.*))?$/){$shelltype=defined $1 ? $1 : shift@args}elsif ($arg eq '--no-create'){$opts{no_create}=1}elsif ($arg =~ /^--/){die "Unknown import argument: $arg"}else {push@steps,['activate',$arg]}}if (!@steps){push@steps,['activate',undef]}my$self=$class->new(%opts);for (@steps){my ($method,@args)=@$_;$self=$self->$method(@args)}if ($0 eq '-'){print$self->environment_vars_string($shelltype);exit 0}else {$self->setup_local_lib}}sub new {my$class=shift;bless {@_},$class}sub clone {my$self=shift;bless {%$self,@_},ref$self}sub inc {$_[0]->{inc}||= \@INC}sub libs {$_[0]->{libs}||= [\'PERL5LIB' ]}sub bins {$_[0]->{bins}||= [\'PATH' ]}sub roots {$_[0]->{roots}||= [\'PERL_LOCAL_LIB_ROOT' ]}sub extra {$_[0]->{extra}||= {}}sub no_create {$_[0]->{no_create}}my$_archname=$Config{archname};my$_version=$Config{version};my@_inc_version_list=reverse split / /,$Config{inc_version_list};my$_path_sep=$Config{path_sep};sub _as_list {my$list=shift;grep length,map {!(ref $_ && ref $_ eq 'SCALAR')? $_ : (defined$ENV{$$_}? split(/\Q$_path_sep/,$ENV{$$_}): ())}ref$list ? @$list : $list}sub _remove_from {my ($list,@remove)=@_;return @$list if!@remove;my%remove=map {$_=>1}@remove;grep!$remove{$_},_as_list($list)}my@_lib_subdirs=([$_version,$_archname],[$_version],[$_archname],(@_inc_version_list ? \@_inc_version_list : ()),[],);sub install_base_bin_path {my ($class,$path)=@_;return _catdir($path,'bin')}sub install_base_perl_path {my ($class,$path)=@_;return _catdir($path,'lib','perl5')}sub install_base_arch_path {my ($class,$path)=@_;_catdir($class->install_base_perl_path($path),$_archname)}sub lib_paths_for {my ($class,$path)=@_;my$base=$class->install_base_perl_path($path);return map {_catdir($base,@$_)}@_lib_subdirs}sub _mm_escape_path {my$path=shift;$path =~ s/\\/\\\\/g;if ($path =~ s/ /\\ /g){$path=qq{"$path"}}return$path}sub _mb_escape_path {my$path=shift;$path =~ s/\\/\\\\/g;return qq{"$path"}}sub installer_options_for {my ($class,$path)=@_;return (PERL_MM_OPT=>defined$path ? "INSTALL_BASE="._mm_escape_path($path): undef,PERL_MB_OPT=>defined$path ? "--install_base "._mb_escape_path($path): undef,)}sub active_paths {my ($self)=@_;$self=ref$self ? $self : $self->new;return grep {my$active_ll=$self->install_base_perl_path($_);grep {$_ eq $active_ll}@{$self->inc}}_as_list($self->roots)}sub deactivate {my ($self,$path)=@_;$self=$self->new unless ref$self;$path=$self->resolve_path($path);$path=$self->normalize_path($path);my@active_lls=$self->active_paths;if (!grep {$_ eq $path}@active_lls){warn "Tried to deactivate inactive local::lib '$path'\n";return$self}my%args=(bins=>[_remove_from($self->bins,$self->install_base_bin_path($path))],libs=>[_remove_from($self->libs,$self->install_base_perl_path($path))],inc=>[_remove_from($self->inc,$self->lib_paths_for($path))],roots=>[_remove_from($self->roots,$path)],);$args{extra}={$self->installer_options_for($args{roots}[0])};$self->clone(%args)}sub deactivate_all {my ($self)=@_;$self=$self->new unless ref$self;my@active_lls=$self->active_paths;my%args;if (@active_lls){%args=(bins=>[_remove_from($self->bins,map$self->install_base_bin_path($_),@active_lls)],libs=>[_remove_from($self->libs,map$self->install_base_perl_path($_),@active_lls)],inc=>[_remove_from($self->inc,map$self->lib_paths_for($_),@active_lls)],roots=>[_remove_from($self->roots,@active_lls)],)}$args{extra}={$self->installer_options_for(undef)};$self->clone(%args)}sub activate {my ($self,$path)=@_;$self=$self->new unless ref$self;$path=$self->resolve_path($path);$self->ensure_dir_structure_for($path)unless$self->no_create;$path=$self->normalize_path($path);my@active_lls=$self->active_paths;if (grep {$_ eq $path}@active_lls[1 .. $#active_lls]){$self=$self->deactivate($path)}my%args;if (!@active_lls || $active_lls[0]ne $path){%args=(bins=>[$self->install_base_bin_path($path),@{$self->bins}],libs=>[$self->install_base_perl_path($path),@{$self->libs}],inc=>[$self->lib_paths_for($path),@{$self->inc}],roots=>[$path,@{$self->roots}],)}$args{extra}={$self->installer_options_for($path)};$self->clone(%args)}sub normalize_path {my ($self,$path)=@_;$path=(Win32::GetShortPathName($path)|| $path)if $^O eq 'MSWin32';return$path}sub build_environment_vars_for {my$self=$_[0]->new->activate($_[1]);$self->build_environment_vars}sub build_activate_environment_vars_for {my$self=$_[0]->new->activate($_[1]);$self->build_environment_vars}sub build_deactivate_environment_vars_for {my$self=$_[0]->new->deactivate($_[1]);$self->build_environment_vars}sub build_deact_all_environment_vars_for {my$self=$_[0]->new->deactivate_all;$self->build_environment_vars}sub build_environment_vars {my$self=shift;(PATH=>join($_path_sep,_as_list($self->bins)),PERL5LIB=>join($_path_sep,_as_list($self->libs)),PERL_LOCAL_LIB_ROOT=>join($_path_sep,_as_list($self->roots)),%{$self->extra},)}sub setup_local_lib_for {my$self=$_[0]->new->activate($_[1]);$self->setup_local_lib}sub setup_local_lib {my$self=shift;require Carp::Heavy if$INC{'Carp.pm'};$self->setup_env_hash;@INC=@{$self->inc}}sub setup_env_hash_for {my$self=$_[0]->new->activate($_[1]);$self->setup_env_hash}sub setup_env_hash {my$self=shift;my%env=$self->build_environment_vars;for my$key (keys%env){if (defined$env{$key}){$ENV{$key}=$env{$key}}else {delete$ENV{$key}}}}sub print_environment_vars_for {print $_[0]->environment_vars_string_for(@_[1..$#_])}sub environment_vars_string_for {my$self=$_[0]->new->activate($_[1]);$self->environment_vars_string}sub environment_vars_string {my ($self,$shelltype)=@_;$shelltype ||= $self->guess_shelltype;my$extra=$self->extra;my@envs=(PATH=>$self->bins,PERL5LIB=>$self->libs,PERL_LOCAL_LIB_ROOT=>$self->roots,map {$_=>$extra->{$_}}sort keys %$extra,);$self->_build_env_string($shelltype,\@envs)}sub _build_env_string {my ($self,$shelltype,$envs)=@_;my@envs=@$envs;my$build_method="build_${shelltype}_env_declaration";my$out='';while (@envs){my ($name,$value)=(shift(@envs),shift(@envs));if (ref$value && @$value==1 && ref$value->[0]&& ref$value->[0]eq 'SCALAR' && ${$value->[0]}eq $name){next}$out .= $self->$build_method($name,$value)}my$wrap_method="wrap_${shelltype}_output";if ($self->can($wrap_method)){return$self->$wrap_method($out)}return$out}sub build_bourne_env_declaration {my ($class,$name,$args)=@_;my$value=$class->_interpolate($args,'${%s}',qr/["\\\$!`]/,'\\%s');if (!defined$value){return qq{unset $name;\n}}$value =~ s/(^|\G|$_path_sep)\$\{$name\}$_path_sep/$1\${$name}\${$name+$_path_sep}/g;$value =~ s/$_path_sep\$\{$name\}$/\${$name+$_path_sep}\${$name}/;qq{${name}="$value"; export ${name};\n}}sub build_csh_env_declaration {my ($class,$name,$args)=@_;my ($value,@vars)=$class->_interpolate($args,'${%s}','"','"\\%s"');if (!defined$value){return qq{unsetenv $name;\n}}my$out='';for my$var (@vars){$out .= qq{if ! \$?$name setenv $name '';\n}}my$value_without=$value;if ($value_without =~ s/(?:^|$_path_sep)\$\{$name\}(?:$_path_sep|$)//g){$out .= qq{if "\${$name}" != '' setenv $name "$value";\n};$out .= qq{if "\${$name}" == '' }}$out .= qq{setenv $name "$value_without";\n};return$out}sub build_cmd_env_declaration {my ($class,$name,$args)=@_;my$value=$class->_interpolate($args,'%%%s%%',qr(%),'%s');if (!$value){return qq{\@set $name=\n}}my$out='';my$value_without=$value;if ($value_without =~ s/(?:^|$_path_sep)%$name%(?:$_path_sep|$)//g){$out .= qq{\@if not "%$name%"=="" set "$name=$value"\n};$out .= qq{\@if "%$name%"=="" }}$out .= qq{\@set "$name=$value_without"\n};return$out}sub build_powershell_env_declaration {my ($class,$name,$args)=@_;my$value=$class->_interpolate($args,'$env:%s','"','`%s');if (!$value){return qq{Remove-Item -ErrorAction 0 Env:\\$name;\n}}my$maybe_path_sep=qq{\$(if("\$env:$name"-eq""){""}else{"$_path_sep"})};$value =~ s/(^|\G|$_path_sep)\$env:$name$_path_sep/$1\$env:$name"+$maybe_path_sep+"/g;$value =~ s/$_path_sep\$env:$name$/"+$maybe_path_sep+\$env:$name+"/;qq{\$env:$name = \$("$value");\n}}sub wrap_powershell_output {my ($class,$out)=@_;return$out || " \n"}sub build_fish_env_declaration {my ($class,$name,$args)=@_;my$value=$class->_interpolate($args,'$%s',qr/[\\"' ]/,'\\%s');if (!defined$value){return qq{set -e $name;\n}}$value =~ s/$_path_sep/ /g;qq{set -x $name $value;\n}}sub _interpolate {my ($class,$args,$var_pat,$escape,$escape_pat)=@_;return unless defined$args;my@args=ref$args ? @$args : $args;return unless@args;my@vars=map {$$_}grep {ref $_ eq 'SCALAR'}@args;my$string=join$_path_sep,map {ref $_ eq 'SCALAR' ? sprintf($var_pat,$$_): do {s/($escape)/sprintf($escape_pat, $1)/ge;$_}}@args;return wantarray ? ($string,\@vars): $string}sub pipeline;sub pipeline {my@methods=@_;my$last=pop(@methods);if (@methods){\sub {my ($obj,@args)=@_;$obj->${pipeline@methods}($obj->$last(@args))}}else {\sub {shift->$last(@_)}}}sub resolve_path {my ($class,$path)=@_;$path=$class->${pipeline qw(resolve_relative_path resolve_home_path resolve_empty_path)}($path);$path}sub resolve_empty_path {my ($class,$path)=@_;if (defined$path){$path}else {'~/perl5'}}sub resolve_home_path {my ($class,$path)=@_;$path =~ /^~([^\/]*)/ or return$path;my$user=$1;my$homedir=do {if (!length($user)&& defined$ENV{HOME}){$ENV{HOME}}else {require File::Glob;File::Glob::bsd_glob("~$user",File::Glob::GLOB_TILDE())}};unless (defined$homedir){require Carp;require Carp::Heavy;Carp::croak("Couldn't resolve homedir for " .(defined$user ? $user : 'current user'))}$path =~ s/^~[^\/]*/$homedir/;$path}sub resolve_relative_path {my ($class,$path)=@_;_rel2abs($path)}sub ensure_dir_structure_for {my ($class,$path)=@_;unless (-d $path){warn "Attempting to create directory ${path}\n"}require File::Basename;my@dirs;while(!-d $path){push@dirs,$path;$path=File::Basename::dirname($path)}mkdir $_ for reverse@dirs;return}sub guess_shelltype {my$shellbin =defined$ENV{SHELL}? ($ENV{SHELL}=~ /([\w.]+)$/)[-1]: ($^O eq 'MSWin32' && exists$ENV{'!EXITCODE'})? 'bash' : ($^O eq 'MSWin32' && $ENV{PROMPT}&& $ENV{COMSPEC})? ($ENV{COMSPEC}=~ /([\w.]+)$/)[-1]: ($^O eq 'MSWin32' &&!$ENV{PROMPT})? 'powershell.exe' : 'sh';for ($shellbin){return /csh$/ ? 'csh' : /fish/ ? 'fish' : /command(?:\.com)?$/i ? 'cmd' : /cmd(?:\.exe)?$/i ? 'cmd' : /4nt(?:\.exe)?$/i ? 'cmd' : /powershell(?:\.exe)?$/i ? 'powershell' : 'bourne'}}1;
WHOA THERE! It looks like you've got some fancy dashes in your commandline!
These are *not* the traditional -- dashes that software recognizes. You
probably got these by copy-pasting from the perldoc for this module as
@@ -415,48 +422,74 @@ $fatpacked{"local/lib.pm"} = <<'LOCAL_LIB';
terminal, but can happen elsewhere too. Please try again after replacing the
dashes with normal minus signs.
DEATH
+ FATAL: The local::lib --self-contained flag has never worked reliably and the
+ original author, Mark Stosberg, was unable or unwilling to maintain it. As
+ such, this flag has been removed from the local::lib codebase in order to
+ prevent misunderstandings and potentially broken builds. The local::lib authors
+ recommend that you look at the lib::core::only module shipped with this
+ distribution in order to create a more robust environment that is equivalent to
+ what --self-contained provided (although quite possibly not what you originally
+ thought it provided due to the poor quality of the documentation, for which we
+ apologise).
+ DEATH
LOCAL_LIB
-$fatpacked{"version.pm"} = <<'VERSION';
- package version;use 5.005_04;use strict;use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);$VERSION=0.9902;$CLASS='version';my$FRACTION_PART=qr/\.[0-9]+/;my$STRICT_INTEGER_PART=qr/0|[1-9][0-9]*/;my$LAX_INTEGER_PART=qr/[0-9]+/;my$STRICT_DOTTED_DECIMAL_PART=qr/\.[0-9]{1,3}/;my$LAX_DOTTED_DECIMAL_PART=qr/\.[0-9]+/;my$LAX_ALPHA_PART=qr/_[0-9]+/;my$STRICT_DECIMAL_VERSION=qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x;my$STRICT_DOTTED_DECIMAL_VERSION=qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x;$STRICT=qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x;my$LAX_DECIMAL_VERSION=qr/ $LAX_INTEGER_PART (?: \. | $FRACTION_PART $LAX_ALPHA_PART? )?
+$fatpacked{"parent.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARENT';
+ package parent;use strict;use vars qw($VERSION);$VERSION='0.228';sub import {my$class=shift;my$inheritor=caller(0);if (@_ and $_[0]eq '-norequire'){shift @_}else {for (my@filename=@_){if ($_ eq $inheritor){warn "Class '$inheritor' tried to inherit from itself\n"};s{::|'}{/}g;require "$_.pm"}}{no strict 'refs';push @{"$inheritor\::ISA"},@_}};"All your base are belong to us"
+PARENT
+
+$fatpacked{"version.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION';
+ package version;use 5.006002;use strict;use warnings::register;if ($] >= 5.015){warnings::register_categories(qw/version/)}use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);$VERSION=0.9912;$CLASS='version';{local$SIG{'__DIE__'};if (1){eval "use version::vpp $VERSION";die "$@" if ($@);push@ISA,"version::vpp";local $^W;*version::qv=\&version::vpp::qv;*version::declare=\&version::vpp::declare;*version::_VERSION=\&version::vpp::_VERSION;*version::vcmp=\&version::vpp::vcmp;*version::new=\&version::vpp::new;*version::numify=\&version::vpp::numify;*version::normal=\&version::vpp::normal;if ($] >= 5.009000){no strict 'refs';*version::stringify=\&version::vpp::stringify;*{'version::(""'}=\&version::vpp::stringify;*{'version::(<=>'}=\&version::vpp::vcmp;*version::parse=\&version::vpp::parse}}else {push@ISA,"version::vxs";local $^W;*version::declare=\&version::vxs::declare;*version::qv=\&version::vxs::qv;*version::_VERSION=\&version::vxs::_VERSION;*version::vcmp=\&version::vxs::VCMP;*version::new=\&version::vxs::new;*version::numify=\&version::vxs::numify;*version::normal=\&version::vxs::normal;if ($] >= 5.009000){no strict 'refs';*version::stringify=\&version::vxs::stringify;*{'version::(""'}=\&version::vxs::stringify;*{'version::(<=>'}=\&version::vxs::VCMP;*version::parse=\&version::vxs::parse}}}require version::regex;*version::is_lax=\&version::regex::is_lax;*version::is_strict=\&version::regex::is_strict;*LAX=\$version::regex::LAX;*STRICT=\$version::regex::STRICT;sub import {no strict 'refs';my ($class)=shift;unless ($class eq $CLASS){local $^W;*{$class.'::declare'}=\&{$CLASS.'::declare'};*{$class.'::qv'}=\&{$CLASS.'::qv'}}my%args;if (@_){map {$args{$_}=1}@_}else {%args=(qv=>1,'UNIVERSAL::VERSION'=>1,)}my$callpkg=caller();if (exists($args{declare})){*{$callpkg.'::declare'}=sub {return$class->declare(shift)}unless defined(&{$callpkg.'::declare'})}if (exists($args{qv})){*{$callpkg.'::qv'}=sub {return$class->qv(shift)}unless defined(&{$callpkg.'::qv'})}if (exists($args{'UNIVERSAL::VERSION'})){local $^W;*UNIVERSAL::VERSION =\&{$CLASS.'::_VERSION'}}if (exists($args{'VERSION'})){*{$callpkg.'::VERSION'}=\&{$CLASS.'::_VERSION'}}if (exists($args{'is_strict'})){*{$callpkg.'::is_strict'}=\&{$CLASS.'::is_strict'}unless defined(&{$callpkg.'::is_strict'})}if (exists($args{'is_lax'})){*{$callpkg.'::is_lax'}=\&{$CLASS.'::is_lax'}unless defined(&{$callpkg.'::is_lax'})}}1;
+VERSION
+
+$fatpacked{"version/regex.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION_REGEX';
+ package version::regex;use strict;use vars qw($VERSION $CLASS $STRICT $LAX);$VERSION=0.9912;my$FRACTION_PART=qr/\.[0-9]+/;my$STRICT_INTEGER_PART=qr/0|[1-9][0-9]*/;my$LAX_INTEGER_PART=qr/[0-9]+/;my$STRICT_DOTTED_DECIMAL_PART=qr/\.[0-9]{1,3}/;my$LAX_DOTTED_DECIMAL_PART=qr/\.[0-9]+/;my$LAX_ALPHA_PART=qr/_[0-9]+/;my$STRICT_DECIMAL_VERSION=qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x;my$STRICT_DOTTED_DECIMAL_VERSION=qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x;$STRICT=qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x;my$LAX_DECIMAL_VERSION=qr/ $LAX_INTEGER_PART (?: \. | $FRACTION_PART $LAX_ALPHA_PART? )?
|
$FRACTION_PART $LAX_ALPHA_PART?
/x;my$LAX_DOTTED_DECIMAL_VERSION=qr/
v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )?
|
$LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART?
- /x;$LAX=qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x;{local$SIG{'__DIE__'};eval "use version::vxs $VERSION";if ($@){eval "use version::vpp $VERSION";die "$@" if ($@);push@ISA,"version::vpp";local $^W;*version::qv=\&version::vpp::qv;*version::declare=\&version::vpp::declare;*version::_VERSION=\&version::vpp::_VERSION;*version::vcmp=\&version::vpp::vcmp;*version::new=\&version::vpp::new;if ($] >= 5.009000){no strict 'refs';*version::stringify=\&version::vpp::stringify;*{'version::(""'}=\&version::vpp::stringify;*{'version::(<=>'}=\&version::vpp::vcmp;*version::parse=\&version::vpp::parse}}else {push@ISA,"version::vxs";local $^W;*version::declare=\&version::vxs::declare;*version::qv=\&version::vxs::qv;*version::_VERSION=\&version::vxs::_VERSION;*version::vcmp=\&version::vxs::VCMP;*version::new=\&version::vxs::new;if ($] >= 5.009000){no strict 'refs';*version::stringify=\&version::vxs::stringify;*{'version::(""'}=\&version::vxs::stringify;*{'version::(<=>'}=\&version::vxs::VCMP;*version::parse=\&version::vxs::parse}}}sub import {no strict 'refs';my ($class)=shift;unless ($class eq 'version'){local $^W;*{$class.'::declare'}=\&version::declare;*{$class.'::qv'}=\&version::qv}my%args;if (@_){map {$args{$_}=1}@_}else {%args=(qv=>1,'UNIVERSAL::VERSION'=>1,)}my$callpkg=caller();if (exists($args{declare})){*{$callpkg.'::declare'}=sub {return$class->declare(shift)}unless defined(&{$callpkg.'::declare'})}if (exists($args{qv})){*{$callpkg.'::qv'}=sub {return$class->qv(shift)}unless defined(&{$callpkg.'::qv'})}if (exists($args{'UNIVERSAL::VERSION'})){local $^W;*UNIVERSAL::VERSION =\&version::_VERSION}if (exists($args{'VERSION'})){*{$callpkg.'::VERSION'}=\&version::_VERSION}if (exists($args{'is_strict'})){*{$callpkg.'::is_strict'}=\&version::is_strict unless defined(&{$callpkg.'::is_strict'})}if (exists($args{'is_lax'})){*{$callpkg.'::is_lax'}=\&version::is_lax unless defined(&{$callpkg.'::is_lax'})}}sub is_strict {defined $_[0]&& $_[0]=~ qr/ \A $STRICT \z /x}sub is_lax {defined $_[0]&& $_[0]=~ qr/ \A $LAX \z /x}1;
-VERSION
+ /x;$LAX=qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x;sub is_strict {defined $_[0]&& $_[0]=~ qr/ \A $STRICT \z /x}sub is_lax {defined $_[0]&& $_[0]=~ qr/ \A $LAX \z /x}1;
+VERSION_REGEX
-$fatpacked{"version/vpp.pm"} = <<'VERSION_VPP';
- package charstar;use overload ('""'=>\&thischar,'0+'=>\&thischar,'++'=>\&increment,'--'=>\&decrement,'+'=>\&plus,'-'=>\&minus,'*'=>\&multiply,'cmp'=>\&cmp,'<=>'=>\&spaceship,'bool'=>\&thischar,'='=>\&clone,);sub new {my ($self,$string)=@_;my$class=ref($self)|| $self;my$obj={string=>[split(//,$string)],current=>0,};return bless$obj,$class}sub thischar {my ($self)=@_;my$last=$#{$self->{string}};my$curr=$self->{current};if ($curr >= 0 && $curr <= $last){return$self->{string}->[$curr]}else {return ''}}sub increment {my ($self)=@_;$self->{current}++}sub decrement {my ($self)=@_;$self->{current}--}sub plus {my ($self,$offset)=@_;my$rself=$self->clone;$rself->{current}+= $offset;return$rself}sub minus {my ($self,$offset)=@_;my$rself=$self->clone;$rself->{current}-= $offset;return$rself}sub multiply {my ($left,$right,$swapped)=@_;my$char=$left->thischar();return$char * $right}sub spaceship {my ($left,$right,$swapped)=@_;unless (ref($right)){$right=$left->new($right)}return$left->{current}<=> $right->{current}}sub cmp {my ($left,$right,$swapped)=@_;unless (ref($right)){if (length($right)==1){return$left->thischar cmp $right}$right=$left->new($right)}return$left->currstr cmp $right->currstr}sub bool {my ($self)=@_;my$char=$self->thischar;return ($char ne '')}sub clone {my ($left,$right,$swapped)=@_;$right={string=>[@{$left->{string}}],current=>$left->{current},};return bless$right,ref($left)}sub currstr {my ($self,$s)=@_;my$curr=$self->{current};my$last=$#{$self->{string}};if (defined($s)&& $s->{current}< $last){$last=$s->{current}}my$string=join('',@{$self->{string}}[$curr..$last]);return$string}package version::vpp;use strict;use POSIX qw/locale_h/;use locale;use vars qw ($VERSION @ISA @REGEXS);$VERSION=0.9902;use overload ('""'=>\&stringify,'0+'=>\&numify,'cmp'=>\&vcmp,'<=>'=>\&vcmp,'bool'=>\&vbool,'+'=>\&vnoop,'-'=>\&vnoop,'*'=>\&vnoop,'/'=>\&vnoop,'+='=>\&vnoop,'-='=>\&vnoop,'*='=>\&vnoop,'/='=>\&vnoop,'abs'=>\&vnoop,);eval "use warnings";if ($@){eval '
- package
- warnings;
- sub enabled {return $^W;}
- 1;
- '}my$VERSION_MAX=0x7FFFFFFF;use constant TRUE=>1;use constant FALSE=>0;sub isDIGIT {my ($char)=shift->thischar();return ($char =~ /\d/)}sub isALPHA {my ($char)=shift->thischar();return ($char =~ /[a-zA-Z]/)}sub isSPACE {my ($char)=shift->thischar();return ($char =~ /\s/)}sub BADVERSION {my ($s,$errstr,$error)=@_;if ($errstr){$$errstr=$error}return$s}sub prescan_version {my ($s,$strict,$errstr,$sqv,$ssaw_decimal,$swidth,$salpha)=@_;my$qv=defined$sqv ? $$sqv : FALSE;my$saw_decimal=defined$ssaw_decimal ? $$ssaw_decimal : 0;my$width=defined$swidth ? $$swidth : 3;my$alpha=defined$salpha ? $$salpha : FALSE;my$d=$s;if ($qv && isDIGIT($d)){goto dotted_decimal_version}if ($d eq 'v'){$d++;if (isDIGIT($d)){$qv=TRUE}else {return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)")}dotted_decimal_version: if ($strict && $d eq '0' && isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)")}while (isDIGIT($d)){$d++}if ($d eq '.'){$saw_decimal++;$d++}else {if ($strict){return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)")}else {goto version_prescan_finish}}{my$i=0;my$j=0;while (isDIGIT($d)){$i++;while (isDIGIT($d)){$d++;$j++;if ($strict && $j > 3){return BADVERSION($s,$errstr,"Invalid version format (maximum 3 digits between decimals)")}}if ($d eq '_'){if ($strict){return BADVERSION($s,$errstr,"Invalid version format (no underscores)")}if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)")}$d++;$alpha=TRUE}elsif ($d eq '.'){if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)")}$saw_decimal++;$d++}elsif (!isDIGIT($d)){last}$j=0}if ($strict && $i < 2){return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)")}}}else {my$j=0;if ($strict){if ($d eq '.'){return BADVERSION($s,$errstr,"Invalid version format (0 before decimal required)")}if ($d eq '0' && isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)")}}if ($d eq '-'){return BADVERSION($s,$errstr,"Invalid version format (negative version number)")}while (isDIGIT($d)){$d++}if ($d eq '.'){$saw_decimal++;$d++}elsif (!$d || $d eq ';' || isSPACE($d)|| $d eq '}'){if ($d==$s){return BADVERSION($s,$errstr,"Invalid version format (version required)")}goto version_prescan_finish}elsif ($d==$s){return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)")}elsif ($d eq '_'){if ($strict){return BADVERSION($s,$errstr,"Invalid version format (no underscores)")}elsif (isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (alpha without decimal)")}else {return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)")}}elsif ($d){return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)")}if ($d &&!isDIGIT($d)&& ($strict ||!($d eq ';' || isSPACE($d)|| $d eq '}'))){return BADVERSION($s,$errstr,"Invalid version format (fractional part required)")}while (isDIGIT($d)){$d++;$j++;if ($d eq '.' && isDIGIT($d-1)){if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)")}if ($strict){return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions must begin with 'v')")}$d=$s;$qv=TRUE;goto dotted_decimal_version}if ($d eq '_'){if ($strict){return BADVERSION($s,$errstr,"Invalid version format (no underscores)")}if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)")}if (!isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)")}$width=$j;$d++;$alpha=TRUE}}}version_prescan_finish: while (isSPACE($d)){$d++}if ($d &&!isDIGIT($d)&& (!($d eq ';' || $d eq '}'))){return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)")}if (defined$sqv){$$sqv=$qv}if (defined$swidth){$$swidth=$width}if (defined$ssaw_decimal){$$ssaw_decimal=$saw_decimal}if (defined$salpha){$$salpha=$alpha}return$d}sub scan_version {my ($s,$rv,$qv)=@_;my$start;my$pos;my$last;my$errstr;my$saw_decimal=0;my$width=3;my$alpha=FALSE;my$vinf=FALSE;my@av;$s=new charstar$s;while (isSPACE($s)){$s++}$last=prescan_version($s,FALSE,\$errstr,\$qv,\$saw_decimal,\$width,\$alpha);if ($errstr){if ($s ne 'undef'){use Carp;Carp::croak($errstr)}}$start=$s;if ($s eq 'v'){$s++}$pos=$s;if ($qv){$$rv->{qv}=$qv}if ($alpha){$$rv->{alpha}=$alpha}if (!$qv && $width < 3){$$rv->{width}=$width}while (isDIGIT($pos)){$pos++}if (!isALPHA($pos)){my$rev;for (;;){$rev=0;{my$end=$pos;my$mult=1;my$orev;if (!$qv && $s > $start && $saw_decimal==1){$mult *= 100;while ($s < $end){$orev=$rev;$rev += $s * $mult;$mult /= 10;if ((abs($orev)> abs($rev))|| (abs($rev)> $VERSION_MAX)){warn("Integer overflow in version %d",$VERSION_MAX);$s=$end - 1;$rev=$VERSION_MAX;$vinf=1}$s++;if ($s eq '_'){$s++}}}else {while (--$end >= $s){$orev=$rev;$rev += $end * $mult;$mult *= 10;if ((abs($orev)> abs($rev))|| (abs($rev)> $VERSION_MAX)){warn("Integer overflow in version");$end=$s - 1;$rev=$VERSION_MAX;$vinf=1}}}}push@av,$rev;if ($vinf){$s=$last;last}elsif ($pos eq '.'){$s=++$pos}elsif ($pos eq '_' && isDIGIT($pos+1)){$s=++$pos}elsif ($pos eq ',' && isDIGIT($pos+1)){$s=++$pos}elsif (isDIGIT($pos)){$s=$pos}else {$s=$pos;last}if ($qv){while (isDIGIT($pos)){$pos++}}else {my$digits=0;while ((isDIGIT($pos)|| $pos eq '_')&& $digits < 3){if ($pos ne '_'){$digits++}$pos++}}}}if ($qv){my$len=$#av;$len=2 - $len;while ($len-- > 0){push@av,0}}if ($vinf){$$rv->{original}="v.Inf";$$rv->{vinf}=1}elsif ($s > $start){$$rv->{original}=$start->currstr($s);if ($qv && $saw_decimal==1 && $start ne 'v'){$$rv->{original}='v' .$$rv->{original}}}else {$$rv->{original}='0';push(@av,0)}$$rv->{version}=\@av;if ($s eq 'undef'){$s += 5}return$s}sub new {my ($class,$value)=@_;unless (defined$class){require Carp;Carp::croak('Usage: version::new(class, version)')}my$self=bless ({},ref ($class)|| $class);my$qv=FALSE;if (ref($value)&& eval('$value->isa("version")')){$self->{version}=[@{$value->{version}}];$self->{qv}=1 if$value->{qv};$self->{alpha}=1 if$value->{alpha};$self->{original}=''.$value->{original};return$self}my$currlocale=setlocale(LC_ALL);if (localeconv()->{decimal_point}eq ','){$value =~ tr/,/./}if (not defined$value or $value =~ /^undef$/){push @{$self->{version}},0;$self->{original}="0";return ($self)}if ($#_==2){$value=$_[2];$qv=TRUE}$value=_un_vstring($value);if ($value =~ /\d+.?\d*e[-+]?\d+/){$value=sprintf("%.9f",$value);$value =~ s/(0+)$//}my$s=scan_version($value,\$self,$qv);if ($s){warn("Version string '%s' contains invalid data; " ."ignoring: '%s'",$value,$s)}return ($self)}*parse=\&new;sub numify {my ($self)=@_;unless (_verify($self)){require Carp;Carp::croak("Invalid version object")}my$width=$self->{width}|| 3;my$alpha=$self->{alpha}|| "";my$len=$#{$self->{version}};my$digit=$self->{version}[0];my$string=sprintf("%d.",$digit);for (my$i=1 ;$i < $len ;$i++ ){$digit=$self->{version}[$i];if ($width < 3){my$denom=10**(3-$width);my$quot=int($digit/$denom);my$rem=$digit - ($quot * $denom);$string .= sprintf("%0".$width."d_%d",$quot,$rem)}else {$string .= sprintf("%03d",$digit)}}if ($len > 0){$digit=$self->{version}[$len];if ($alpha && $width==3){$string .= "_"}$string .= sprintf("%0".$width."d",$digit)}else {$string .= sprintf("000")}return$string}sub normal {my ($self)=@_;unless (_verify($self)){require Carp;Carp::croak("Invalid version object")}my$alpha=$self->{alpha}|| "";my$len=$#{$self->{version}};my$digit=$self->{version}[0];my$string=sprintf("v%d",$digit);for (my$i=1 ;$i < $len ;$i++ ){$digit=$self->{version}[$i];$string .= sprintf(".%d",$digit)}if ($len > 0){$digit=$self->{version}[$len];if ($alpha){$string .= sprintf("_%0d",$digit)}else {$string .= sprintf(".%0d",$digit)}}if ($len <= 2){for ($len=2 - $len;$len!=0;$len-- ){$string .= sprintf(".%0d",0)}}return$string}sub stringify {my ($self)=@_;unless (_verify($self)){require Carp;Carp::croak("Invalid version object")}return exists$self->{original}? $self->{original}: exists$self->{qv}? $self->normal : $self->numify}sub vcmp {require UNIVERSAL;my ($left,$right,$swap)=@_;my$class=ref($left);unless (UNIVERSAL::isa($right,$class)){$right=$class->new($right)}if ($swap){($left,$right)=($right,$left)}unless (_verify($left)){require Carp;Carp::croak("Invalid version object")}unless (_verify($right)){require Carp;Carp::croak("Invalid version format")}my$l=$#{$left->{version}};my$r=$#{$right->{version}};my$m=$l < $r ? $l : $r;my$lalpha=$left->is_alpha;my$ralpha=$right->is_alpha;my$retval=0;my$i=0;while ($i <= $m && $retval==0){$retval=$left->{version}[$i]<=> $right->{version}[$i];$i++}if ($retval==0 && $l==$r && $left->{version}[$m]==$right->{version}[$m]&& ($lalpha || $ralpha)){if ($lalpha &&!$ralpha){$retval=-1}elsif ($ralpha &&!$lalpha){$retval=+1}}if ($retval==0 && $l!=$r){if ($l < $r){while ($i <= $r && $retval==0){if ($right->{version}[$i]!=0){$retval=-1}$i++}}else {while ($i <= $l && $retval==0){if ($left->{version}[$i]!=0){$retval=+1}$i++}}}return$retval}sub vbool {my ($self)=@_;return vcmp($self,$self->new("0"),1)}sub vnoop {require Carp;Carp::croak("operation not supported with version object")}sub is_alpha {my ($self)=@_;return (exists$self->{alpha})}sub qv {my$value=shift;my$class='version';if (@_){$class=ref($value)|| $value;$value=shift}$value=_un_vstring($value);$value='v'.$value unless$value =~ /(^v|\d+\.\d+\.\d)/;my$obj=version->new($value);return bless$obj,$class}*declare=\&qv;sub is_qv {my ($self)=@_;return (exists$self->{qv})}sub _verify {my ($self)=@_;if (ref($self)&& eval {exists$self->{version}}&& ref($self->{version})eq 'ARRAY'){return 1}else {return 0}}sub _is_non_alphanumeric {my$s=shift;$s=new charstar$s;while ($s){return 0 if isSPACE($s);return 1 unless (isALPHA($s)|| isDIGIT($s)|| $s =~ /[.-]/);$s++}return 0}sub _un_vstring {my$value=shift;if (length($value)>= 3 && $value !~ /[._]/ && _is_non_alphanumeric($value)){my$tvalue;if ($] ge 5.008_001){$tvalue=_find_magic_vstring($value);$value=$tvalue if length$tvalue}elsif ($] ge 5.006_000){$tvalue=sprintf("v%vd",$value);if ($tvalue =~ /^v\d+(\.\d+){2,}$/){$value=$tvalue}}}return$value}sub _find_magic_vstring {my$value=shift;my$tvalue='';require B;my$sv=B::svref_2object(\$value);my$magic=ref($sv)eq 'B::PVMG' ? $sv->MAGIC : undef;while ($magic){if ($magic->TYPE eq 'V'){$tvalue=$magic->PTR;$tvalue =~ s/^v?(.+)$/v$1/;last}else {$magic=$magic->MOREMAGIC}}return$tvalue}sub _VERSION {my ($obj,$req)=@_;my$class=ref($obj)|| $obj;no strict 'refs';if (exists$INC{"$class.pm"}and not %{"$class\::"}and $] >= 5.008){require Carp;Carp::croak("$class defines neither package nor VERSION" ."--version check failed")}my$version=eval "\$$class\::VERSION";if (defined$version){local $^W if $] <= 5.008;$version=version::vpp->new($version)}if (defined$req){unless (defined$version){require Carp;my$msg=$] < 5.006 ? "$class version $req required--this is only version " : "$class does not define \$$class\::VERSION" ."--version check failed";if ($ENV{VERSION_DEBUG}){Carp::confess($msg)}else {Carp::croak($msg)}}$req=version::vpp->new($req);if ($req > $version){require Carp;if ($req->is_qv){Carp::croak(sprintf ("%s version %s required--"."this is only version %s",$class,$req->normal,$version->normal))}else {Carp::croak(sprintf ("%s version %s required--"."this is only version %s",$class,$req->stringify,$version->stringify))}}}return defined$version ? $version->stringify : undef}1;
+$fatpacked{"version/vpp.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION_VPP';
+ package charstar;use overload ('""'=>\&thischar,'0+'=>\&thischar,'++'=>\&increment,'--'=>\&decrement,'+'=>\&plus,'-'=>\&minus,'*'=>\&multiply,'cmp'=>\&cmp,'<=>'=>\&spaceship,'bool'=>\&thischar,'='=>\&clone,);sub new {my ($self,$string)=@_;my$class=ref($self)|| $self;my$obj={string=>[split(//,$string)],current=>0,};return bless$obj,$class}sub thischar {my ($self)=@_;my$last=$#{$self->{string}};my$curr=$self->{current};if ($curr >= 0 && $curr <= $last){return$self->{string}->[$curr]}else {return ''}}sub increment {my ($self)=@_;$self->{current}++}sub decrement {my ($self)=@_;$self->{current}--}sub plus {my ($self,$offset)=@_;my$rself=$self->clone;$rself->{current}+= $offset;return$rself}sub minus {my ($self,$offset)=@_;my$rself=$self->clone;$rself->{current}-= $offset;return$rself}sub multiply {my ($left,$right,$swapped)=@_;my$char=$left->thischar();return$char * $right}sub spaceship {my ($left,$right,$swapped)=@_;unless (ref($right)){$right=$left->new($right)}return$left->{current}<=> $right->{current}}sub cmp {my ($left,$right,$swapped)=@_;unless (ref($right)){if (length($right)==1){return$left->thischar cmp $right}$right=$left->new($right)}return$left->currstr cmp $right->currstr}sub bool {my ($self)=@_;my$char=$self->thischar;return ($char ne '')}sub clone {my ($left,$right,$swapped)=@_;$right={string=>[@{$left->{string}}],current=>$left->{current},};return bless$right,ref($left)}sub currstr {my ($self,$s)=@_;my$curr=$self->{current};my$last=$#{$self->{string}};if (defined($s)&& $s->{current}< $last){$last=$s->{current}}my$string=join('',@{$self->{string}}[$curr..$last]);return$string}package version::vpp;use 5.006002;use strict;use warnings::register;use Config;use vars qw($VERSION $CLASS @ISA $LAX $STRICT $WARN_CATEGORY);$VERSION=0.9912;$CLASS='version::vpp';if ($] > 5.015){warnings::register_categories(qw/version/);$WARN_CATEGORY='version'}else {$WARN_CATEGORY='numeric'}require version::regex;*version::vpp::is_strict=\&version::regex::is_strict;*version::vpp::is_lax=\&version::regex::is_lax;*LAX=\$version::regex::LAX;*STRICT=\$version::regex::STRICT;use overload ('""'=>\&stringify,'0+'=>\&numify,'cmp'=>\&vcmp,'<=>'=>\&vcmp,'bool'=>\&vbool,'+'=>\&vnoop,'-'=>\&vnoop,'*'=>\&vnoop,'/'=>\&vnoop,'+='=>\&vnoop,'-='=>\&vnoop,'*='=>\&vnoop,'/='=>\&vnoop,'abs'=>\&vnoop,);sub import {no strict 'refs';my ($class)=shift;unless ($class eq $CLASS){local $^W;*{$class.'::declare'}=\&{$CLASS.'::declare'};*{$class.'::qv'}=\&{$CLASS.'::qv'}}my%args;if (@_){map {$args{$_}=1}@_}else {%args=(qv=>1,'UNIVERSAL::VERSION'=>1,)}my$callpkg=caller();if (exists($args{declare})){*{$callpkg.'::declare'}=sub {return$class->declare(shift)}unless defined(&{$callpkg.'::declare'})}if (exists($args{qv})){*{$callpkg.'::qv'}=sub {return$class->qv(shift)}unless defined(&{$callpkg.'::qv'})}if (exists($args{'UNIVERSAL::VERSION'})){no warnings qw/redefine/;*UNIVERSAL::VERSION =\&{$CLASS.'::_VERSION'}}if (exists($args{'VERSION'})){*{$callpkg.'::VERSION'}=\&{$CLASS.'::_VERSION'}}if (exists($args{'is_strict'})){*{$callpkg.'::is_strict'}=\&{$CLASS.'::is_strict'}unless defined(&{$callpkg.'::is_strict'})}if (exists($args{'is_lax'})){*{$callpkg.'::is_lax'}=\&{$CLASS.'::is_lax'}unless defined(&{$callpkg.'::is_lax'})}}my$VERSION_MAX=0x7FFFFFFF;use constant TRUE=>1;use constant FALSE=>0;sub isDIGIT {my ($char)=shift->thischar();return ($char =~ /\d/)}sub isALPHA {my ($char)=shift->thischar();return ($char =~ /[a-zA-Z]/)}sub isSPACE {my ($char)=shift->thischar();return ($char =~ /\s/)}sub BADVERSION {my ($s,$errstr,$error)=@_;if ($errstr){$$errstr=$error}return$s}sub prescan_version {my ($s,$strict,$errstr,$sqv,$ssaw_decimal,$swidth,$salpha)=@_;my$qv=defined$sqv ? $$sqv : FALSE;my$saw_decimal=defined$ssaw_decimal ? $$ssaw_decimal : 0;my$width=defined$swidth ? $$swidth : 3;my$alpha=defined$salpha ? $$salpha : FALSE;my$d=$s;if ($qv && isDIGIT($d)){goto dotted_decimal_version}if ($d eq 'v'){$d++;if (isDIGIT($d)){$qv=TRUE}else {return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)")}dotted_decimal_version: if ($strict && $d eq '0' && isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)")}while (isDIGIT($d)){$d++}if ($d eq '.'){$saw_decimal++;$d++}else {if ($strict){return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)")}else {goto version_prescan_finish}}{my$i=0;my$j=0;while (isDIGIT($d)){$i++;while (isDIGIT($d)){$d++;$j++;if ($strict && $j > 3){return BADVERSION($s,$errstr,"Invalid version format (maximum 3 digits between decimals)")}}if ($d eq '_'){if ($strict){return BADVERSION($s,$errstr,"Invalid version format (no underscores)")}if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)")}$d++;$alpha=TRUE}elsif ($d eq '.'){if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)")}$saw_decimal++;$d++}elsif (!isDIGIT($d)){last}$j=0}if ($strict && $i < 2){return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)")}}}else {my$j=0;if ($strict){if ($d eq '.'){return BADVERSION($s,$errstr,"Invalid version format (0 before decimal required)")}if ($d eq '0' && isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)")}}if ($d eq '-'){return BADVERSION($s,$errstr,"Invalid version format (negative version number)")}while (isDIGIT($d)){$d++}if ($d eq '.'){$saw_decimal++;$d++}elsif (!$d || $d eq ';' || isSPACE($d)|| $d eq '}'){if ($d==$s){return BADVERSION($s,$errstr,"Invalid version format (version required)")}goto version_prescan_finish}elsif ($d==$s){return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)")}elsif ($d eq '_'){if ($strict){return BADVERSION($s,$errstr,"Invalid version format (no underscores)")}elsif (isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (alpha without decimal)")}else {return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)")}}elsif ($d){return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)")}if ($d &&!isDIGIT($d)&& ($strict ||!($d eq ';' || isSPACE($d)|| $d eq '}'))){return BADVERSION($s,$errstr,"Invalid version format (fractional part required)")}while (isDIGIT($d)){$d++;$j++;if ($d eq '.' && isDIGIT($d-1)){if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)")}if ($strict){return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions must begin with 'v')")}$d=$s;$qv=TRUE;goto dotted_decimal_version}if ($d eq '_'){if ($strict){return BADVERSION($s,$errstr,"Invalid version format (no underscores)")}if ($alpha){return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)")}if (!isDIGIT($d+1)){return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)")}$width=$j;$d++;$alpha=TRUE}}}version_prescan_finish: while (isSPACE($d)){$d++}if ($d &&!isDIGIT($d)&& (!($d eq ';' || $d eq '}'))){return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)")}if ($saw_decimal > 1 && ($d-1)eq '.'){return BADVERSION($s,$errstr,"Invalid version format (trailing decimal)")}if (defined$sqv){$$sqv=$qv}if (defined$swidth){$$swidth=$width}if (defined$ssaw_decimal){$$ssaw_decimal=$saw_decimal}if (defined$salpha){$$salpha=$alpha}return$d}sub scan_version {my ($s,$rv,$qv)=@_;my$start;my$pos;my$last;my$errstr;my$saw_decimal=0;my$width=3;my$alpha=FALSE;my$vinf=FALSE;my@av;$s=new charstar$s;while (isSPACE($s)){$s++}$last=prescan_version($s,FALSE,\$errstr,\$qv,\$saw_decimal,\$width,\$alpha);if ($errstr){if ($s ne 'undef'){require Carp;Carp::croak($errstr)}}$start=$s;if ($s eq 'v'){$s++}$pos=$s;if ($qv){$$rv->{qv}=$qv}if ($alpha){$$rv->{alpha}=$alpha}if (!$qv && $width < 3){$$rv->{width}=$width}while (isDIGIT($pos)){$pos++}if (!isALPHA($pos)){my$rev;for (;;){$rev=0;{my$end=$pos;my$mult=1;my$orev;if (!$qv && $s > $start && $saw_decimal==1){$mult *= 100;while ($s < $end){$orev=$rev;$rev += $s * $mult;$mult /= 10;if ((abs($orev)> abs($rev))|| (abs($rev)> $VERSION_MAX)){warn("Integer overflow in version %d",$VERSION_MAX);$s=$end - 1;$rev=$VERSION_MAX;$vinf=1}$s++;if ($s eq '_'){$s++}}}else {while (--$end >= $s){$orev=$rev;$rev += $end * $mult;$mult *= 10;if ((abs($orev)> abs($rev))|| (abs($rev)> $VERSION_MAX)){warn("Integer overflow in version");$end=$s - 1;$rev=$VERSION_MAX;$vinf=1}}}}push@av,$rev;if ($vinf){$s=$last;last}elsif ($pos eq '.'){$pos++;if ($qv){while ($pos eq '0'){$pos++}}$s=$pos}elsif ($pos eq '_' && isDIGIT($pos+1)){$s=++$pos}elsif ($pos eq ',' && isDIGIT($pos+1)){$s=++$pos}elsif (isDIGIT($pos)){$s=$pos}else {$s=$pos;last}if ($qv){while (isDIGIT($pos)){$pos++}}else {my$digits=0;while ((isDIGIT($pos)|| $pos eq '_')&& $digits < 3){if ($pos ne '_'){$digits++}$pos++}}}}if ($qv){my$len=$#av;$len=2 - $len;while ($len-- > 0){push@av,0}}if ($vinf){$$rv->{original}="v.Inf";$$rv->{vinf}=1}elsif ($s > $start){$$rv->{original}=$start->currstr($s);if ($qv && $saw_decimal==1 && $start ne 'v'){$$rv->{original}='v' .$$rv->{original}}}else {$$rv->{original}='0';push(@av,0)}$$rv->{version}=\@av;if ($s eq 'undef'){$s += 5}return$s}sub new {my$class=shift;unless (defined$class or $#_ > 1){require Carp;Carp::croak('Usage: version::new(class, version)')}my$self=bless ({},ref ($class)|| $class);my$qv=FALSE;if ($#_==1){$qv=TRUE}my$value=pop;if (ref($value)&& eval('$value->isa("version")')){$self->{version}=[@{$value->{version}}];$self->{qv}=1 if$value->{qv};$self->{alpha}=1 if$value->{alpha};$self->{original}=''.$value->{original};return$self}if (not defined$value or $value =~ /^undef$/){push @{$self->{version}},0;$self->{original}="0";return ($self)}if (ref($value)=~ m/ARRAY|HASH/){require Carp;Carp::croak("Invalid version format (non-numeric data)")}$value=_un_vstring($value);if ($Config{d_setlocale}){use POSIX qw/locale_h/;use if$Config{d_setlocale},'locale';my$currlocale=setlocale(LC_ALL);if (localeconv()->{decimal_point}eq ','){$value =~ tr/,/./}}if ($value =~ /\d+.?\d*e[-+]?\d+/){$value=sprintf("%.9f",$value);$value =~ s/(0+)$//}my$s=scan_version($value,\$self,$qv);if ($s){warn("Version string '%s' contains invalid data; " ."ignoring: '%s'",$value,$s)}return ($self)}*parse=\&new;sub numify {my ($self)=@_;unless (_verify($self)){require Carp;Carp::croak("Invalid version object")}my$width=$self->{width}|| 3;my$alpha=$self->{alpha}|| "";my$len=$#{$self->{version}};my$digit=$self->{version}[0];my$string=sprintf("%d.",$digit);if ($alpha and warnings::enabled()){warnings::warn($WARN_CATEGORY,'alpha->numify() is lossy')}for (my$i=1 ;$i < $len ;$i++ ){$digit=$self->{version}[$i];if ($width < 3){my$denom=10**(3-$width);my$quot=int($digit/$denom);my$rem=$digit - ($quot * $denom);$string .= sprintf("%0".$width."d_%d",$quot,$rem)}else {$string .= sprintf("%03d",$digit)}}if ($len > 0){$digit=$self->{version}[$len];if ($alpha && $width==3){$string .= "_"}$string .= sprintf("%0".$width."d",$digit)}else {$string .= sprintf("000")}return$string}sub normal {my ($self)=@_;unless (_verify($self)){require Carp;Carp::croak("Invalid version object")}my$alpha=$self->{alpha}|| "";my$qv=$self->{qv}|| "";my$len=$#{$self->{version}};my$digit=$self->{version}[0];my$string=sprintf("v%d",$digit);for (my$i=1 ;$i < $len ;$i++ ){$digit=$self->{version}[$i];$string .= sprintf(".%d",$digit)}if ($len > 0){$digit=$self->{version}[$len];if ($alpha){$string .= sprintf("_%0d",$digit)}else {$string .= sprintf(".%0d",$digit)}}if ($len <= 2){for ($len=2 - $len;$len!=0;$len-- ){$string .= sprintf(".%0d",0)}}return$string}sub stringify {my ($self)=@_;unless (_verify($self)){require Carp;Carp::croak("Invalid version object")}return exists$self->{original}? $self->{original}: exists$self->{qv}? $self->normal : $self->numify}sub vcmp {require UNIVERSAL;my ($left,$right,$swap)=@_;my$class=ref($left);unless (UNIVERSAL::isa($right,$class)){$right=$class->new($right)}if ($swap){($left,$right)=($right,$left)}unless (_verify($left)){require Carp;Carp::croak("Invalid version object")}unless (_verify($right)){require Carp;Carp::croak("Invalid version format")}my$l=$#{$left->{version}};my$r=$#{$right->{version}};my$m=$l < $r ? $l : $r;my$lalpha=$left->is_alpha;my$ralpha=$right->is_alpha;my$retval=0;my$i=0;while ($i <= $m && $retval==0){$retval=$left->{version}[$i]<=> $right->{version}[$i];$i++}if ($retval==0 && $l==$r && $left->{version}[$m]==$right->{version}[$m]&& ($lalpha || $ralpha)){if ($lalpha &&!$ralpha){$retval=-1}elsif ($ralpha &&!$lalpha){$retval=+1}}if ($retval==0 && $l!=$r){if ($l < $r){while ($i <= $r && $retval==0){if ($right->{version}[$i]!=0){$retval=-1}$i++}}else {while ($i <= $l && $retval==0){if ($left->{version}[$i]!=0){$retval=+1}$i++}}}return$retval}sub vbool {my ($self)=@_;return vcmp($self,$self->new("0"),1)}sub vnoop {require Carp;Carp::croak("operation not supported with version object")}sub is_alpha {my ($self)=@_;return (exists$self->{alpha})}sub qv {my$value=shift;my$class=$CLASS;if (@_){$class=ref($value)|| $value;$value=shift}$value=_un_vstring($value);$value='v'.$value unless$value =~ /(^v|\d+\.\d+\.\d)/;my$obj=$CLASS->new($value);return bless$obj,$class}*declare=\&qv;sub is_qv {my ($self)=@_;return (exists$self->{qv})}sub _verify {my ($self)=@_;if (ref($self)&& eval {exists$self->{version}}&& ref($self->{version})eq 'ARRAY'){return 1}else {return 0}}sub _is_non_alphanumeric {my$s=shift;$s=new charstar$s;while ($s){return 0 if isSPACE($s);return 1 unless (isALPHA($s)|| isDIGIT($s)|| $s =~ /[.-]/);$s++}return 0}sub _un_vstring {my$value=shift;if (length($value)>= 1 && $value !~ /[,._]/ && _is_non_alphanumeric($value)){my$tvalue;if ($] >= 5.008_001){$tvalue=_find_magic_vstring($value);$value=$tvalue if length$tvalue}elsif ($] >= 5.006_000){$tvalue=sprintf("v%vd",$value);if ($tvalue =~ /^v\d+(\.\d+)*$/){$value=$tvalue}}}return$value}sub _find_magic_vstring {my$value=shift;my$tvalue='';require B;my$sv=B::svref_2object(\$value);my$magic=ref($sv)eq 'B::PVMG' ? $sv->MAGIC : undef;while ($magic){if ($magic->TYPE eq 'V'){$tvalue=$magic->PTR;$tvalue =~ s/^v?(.+)$/v$1/;last}else {$magic=$magic->MOREMAGIC}}return$tvalue}sub _VERSION {my ($obj,$req)=@_;my$class=ref($obj)|| $obj;no strict 'refs';if (exists$INC{"$class.pm"}and not %{"$class\::"}and $] >= 5.008){require Carp;Carp::croak("$class defines neither package nor VERSION" ."--version check failed")}my$version=eval "\$$class\::VERSION";if (defined$version){local $^W if $] <= 5.008;$version=version::vpp->new($version)}if (defined$req){unless (defined$version){require Carp;my$msg=$] < 5.006 ? "$class version $req required--this is only version " : "$class does not define \$$class\::VERSION" ."--version check failed";if ($ENV{VERSION_DEBUG}){Carp::confess($msg)}else {Carp::croak($msg)}}$req=version::vpp->new($req);if ($req > $version){require Carp;if ($req->is_qv){Carp::croak(sprintf ("%s version %s required--"."this is only version %s",$class,$req->normal,$version->normal))}else {Carp::croak(sprintf ("%s version %s required--"."this is only version %s",$class,$req->stringify,$version->stringify))}}}return defined$version ? $version->stringify : undef}1;
VERSION_VPP
s/^ //mg for values %fatpacked;
-unshift @INC, sub {
- if (my $fat = $fatpacked{$_[1]}) {
- if ($] < 5.008) {
- return sub {
- return 0 unless length $fat;
- $fat =~ s/^([^\n]*\n?)//;
- $_ = $1;
- return 1;
- };
+my $class = 'FatPacked::'.(0+\%fatpacked);
+no strict 'refs';
+*{"${class}::files"} = sub { keys %{$_[0]} };
+
+if ($] < 5.008) {
+ *{"${class}::INC"} = sub {
+ if (my $fat = $_[0]{$_[1]}) {
+ return sub {
+ return 0 unless length $fat;
+ $fat =~ s/^([^\n]*\n?)//;
+ $_ = $1;
+ return 1;
+ };
+ }
+ return;
+ };
+}
+
+else {
+ *{"${class}::INC"} = sub {
+ if (my $fat = $_[0]{$_[1]}) {
+ open my $fh, '<', \$fat
+ or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
+ return $fh;
}
- open my $fh, '<', \$fat
- or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
- return $fh;
- }
- return
-};
+ return;
+ };
+}
-} # END OF FATPACK CODE
+unshift @INC, bless \%fatpacked, $class;
+ } # END OF FATPACK CODE
@@ -487,6 +520,7 @@ cpanm - get, unpack build and install modules from CPAN
cpanm --installdeps . # install all the deps for the current directory
cpanm -L extlib Plack # install Plack and all non-core deps into extlib
cpanm --mirror http://cpan.cpantesters.org/ DBI # use the fast-syncing mirror
+ cpanm --from https://cpan.metacpan.org/ Plack # use only the HTTPS mirror
=head1 COMMANDS
@@ -555,23 +589,6 @@ Download and unpack the distribution and then open the directory with
your shell. Handy to poke around the source code or do manual
testing.
-=item -U, --uninstall
-
-B<EXPERIMENTAL>: Uninstalls the modules. Will remove the distribution
-files from your library path using the C<.packlist> file.
-
-When used with C<-l> or C<-L>, only the files under the local::lib
-directory will be removed.
-
-B<NOTE>: If you have the "dual-life" module in multiple locations
-(i.e. C<site_perl> and C<perl> library path, with perl 5.12 or later),
-only the files in C<site_perl> will be deleted.
-
-If the distribution has bin scripts and man, they will be kept in case
-the core installation still references that, although there's no
-guarantee that the script will continue working as expected with the
-older version of .pm files.
-
=item -h, --help
Displays the help message.
@@ -651,12 +668,24 @@ directory C<extlib>, which can be loaded from your application with:
use local::lib '/path/to/extlib';
+Note that this option does B<NOT> reliably work with perl installations
+supplied by operating system vendors that strips standard modules from perl,
+such as RHEL, Fedora and CentOS, B<UNLESS> you also install packages supplying
+all the modules that have been stripped. For these systems you will probably
+want to install the C<perl-core> meta-package which does just that.
+
=item --self-contained
When examining the dependencies, assume no non-core modules are
installed on the system. Handy if you want to bundle application
dependencies in one directory so you can distribute to other machines.
+=item --exclude-vendor
+
+Don't include modules installed under the 'vendor' paths when searching for
+core modules when the C<--self-contained> flag is in effect. This restores
+the behaviour from before version 1.7023
+
=item --mirror
Specifies the base URL for the CPAN mirror to use, such as
@@ -683,11 +712,27 @@ DB and MetaCPAN.
Select this option if you are using a local mirror of CPAN, such as
minicpan when you're offline, or your own CPAN index (a.k.a darkpan).
-B<Tip:> It might be useful if you name these mirror options with your
-shell aliases, like:
+=item --from, -M
+
+ cpanm -M https://cpan.metacpan.org/
+ cpanm --from https://cpan.metacpan.org/
+
+Use the given mirror URL and its index as the I<only> source to search
+and download modules from.
+
+It works similar to C<--mirror> and C<--mirror-only> combined, with a
+small difference: unlike C<--mirror> which I<appends> the URL to the
+list of mirrors, C<--from> (or C<-M> for short) uses the specified URL
+as its I<only> source to download index and modules from. This makes
+the option always override the default mirror, which might have been
+set via global options such as the one set by C<PERL_CPANM_OPT>
+environment variable.
- alias minicpanm='cpanm --mirror ~/minicpan --mirror-only'
- alias darkpan='cpanm --mirror http://mycompany.example.com/DPAN --mirror-only'
+B<Tip:> It might be useful if you name these options with your shell
+aliases, like:
+
+ alias minicpanm='cpanm --from ~/minicpan'
+ alias darkpan='cpanm --from http://mycompany.example.com/DPAN'
=item --mirror-index
@@ -698,6 +743,10 @@ for module search index.
B<EXPERIMENTAL>: Specifies an alternate URI for CPAN MetaDB index lookups.
+=item --metacpan
+
+Prefers MetaCPAN API over CPAN MetaDB.
+
=item --cpanfile
B<EXPERIMENTAL>: Specified an alternate path for cpanfile to search for,
@@ -899,7 +948,7 @@ directory.
If you try to uninstall a module in C<perl> directory (i.e. core
module), an error will be thrown.
-A dialog wil be prompted to confirm the files to be deleted. If you pass
+A dialog will be prompted to confirm the files to be deleted. If you pass
C<-f> option as well, the dialog will be skipped and uninstallation
will be forced.
@@ -942,9 +991,10 @@ CHECKSUMS and SIGNATURES (if found). Defaults to false.
=item --report-perl-version
-Whether it report the locally installed perl version to the various
-web server as part of User-Agent. Defaults to true, and you can disable
-it by using C<--no-report-perl-version>.
+Whether it reports the locally installed perl version to the various
+web server as part of User-Agent. Defaults to true unless CI related
+environment variables such as C<TRAVIS>, C<CI> or C<AUTOMATED_TESTING>
+is enabled. You can disable it by using C<--no-report-perl-version>.
=item --auto-cleanup
@@ -992,7 +1042,7 @@ L<App::cpanminus>
=head1 COPYRIGHT
-Copyright 2010 Tatsuhiko Miyagawa.
+Copyright 2010- Tatsuhiko Miyagawa.
=head1 AUTHOR
diff --git a/bin/fiksgatami/load-norwegian-contacts b/bin/fiksgatami/load-norwegian-contacts
index b73778848..ed382d6fc 100755
--- a/bin/fiksgatami/load-norwegian-contacts
+++ b/bin/fiksgatami/load-norwegian-contacts
@@ -54,13 +54,13 @@ while (<FP>) {
$categories = $defcategories;
}
# dbh()->do("INSERT INTO contacts (area_id, email, editor, whenedited, note, confirmed, deleted)
-# VALUES (?, ?, 'import', ms_current_timestamp(), 'Initial import', 'false', 'false')",
+# VALUES (?, ?, 'import', current_timestamp, 'Initial import', 'false', 'false')",
# {}, $id, $email);
# } else {
for my $category (split(/,\s*/, $categories)) {
print " Category '$category'\n";
dbh()->do("INSERT INTO contacts (area_id, email, category, editor, whenedited, note, confirmed, deleted)
- VALUES (?, ?, ?, 'import', ms_current_timestamp(), 'Initial import', 'true', 'false')",
+ VALUES (?, ?, ?, 'import', current_timestamp, 'Initial import', 'true', 'false')",
{}, $id, $email, $category);
}
# }
diff --git a/bin/fixmystreet.com/import-categories b/bin/fixmystreet.com/import-categories
index e9008b93f..fe4c2e027 100755
--- a/bin/fixmystreet.com/import-categories
+++ b/bin/fixmystreet.com/import-categories
@@ -70,7 +70,7 @@ sub add_categories {
dbh()->do("insert into contacts
(area_id, category, email, editor, whenedited, note, confirmed, deleted)
values
- (?, ?, ?, 'import', ms_current_timestamp(), 'Initial copy', ?, 'f')", {},
+ (?, ?, ?, 'import', current_timestamp, 'Initial copy', ?, 'f')", {},
$id, $_, $email, ($confirmed ? 1 : 0)
);
}
diff --git a/bin/fixmystreet.com/load-contacts b/bin/fixmystreet.com/load-contacts
index b18699db1..78bb77e8f 100755
--- a/bin/fixmystreet.com/load-contacts
+++ b/bin/fixmystreet.com/load-contacts
@@ -42,7 +42,7 @@ while (<FP>) {
s/\r?\n//g;
my ($id, $email) = split /,/;
dbh()->do("INSERT INTO contacts (area_id, email, editor, whenedited, note)
- VALUES (?, ?, 'import', ms_current_timestamp(), 'Initial import')",
+ VALUES (?, ?, 'import', current_timestamp, 'Initial import')",
{}, $id, $email);
}
dbh()->commit();
diff --git a/bin/fixmystreet.com/showcouncilrates b/bin/fixmystreet.com/showcouncilrates
index 1dacae597..a3465c575 100755
--- a/bin/fixmystreet.com/showcouncilrates
+++ b/bin/fixmystreet.com/showcouncilrates
@@ -38,7 +38,6 @@ my $stats = dbh()->selectall_arrayref($query, { Slice => {} });
my @councils;
foreach my $row (@$stats) {
if ($row->{council}) {
- $row->{council} =~ s/\|.*//g;
my @council_ids = split(/,/, $row->{council});
push(@councils, @council_ids);
$row->{council} = \@council_ids;
diff --git a/bin/geocode b/bin/geocode
index 2559f7a3c..f6bf79149 100755
--- a/bin/geocode
+++ b/bin/geocode
@@ -12,10 +12,23 @@ geocode - commandline tool to test geocoders
$ bin/geocode --cobrand=bromley "Glebe Rd"
# ... if you want to use config that you have in conf/general.bing.yml
- $ bin/geocode --override-config=general.bing --cobrand=bromley "Glebe Rd"
+ $ bin/geocode --override-config=general.yml.bing --cobrand=bromley "Glebe Rd"
+
+ # ... if your config only has a single entry in ALLOWED_COBRANDS
+ $ bin/geocode --override-config=general.yml.zurich "Im eisernen Zeit"
## ... output from geocoder
+=head1 OPTIONS
+
+ --help|h show this help
+ --use-cache use the configured GEO_CACHE (default OFF)
+
+ # the following options take a string argument:
+ --geocoder e.g. OSM/Bing/Google/Zurich
+ --cobrand (default, bromley, zurich etc.)
+ --override-config e.g. conf/general.yml
+
=cut
use strict;
@@ -32,6 +45,7 @@ BEGIN {
use Data::Dumper;
use Pod::Usage;
use feature 'say';
+use File::Temp 'tempdir';
use Getopt::Long;
@@ -41,13 +55,12 @@ GetOptions \%options,
'geocoder=s',
'help|h',
'cobrand=s',
- 'override-config=s';
+ 'override-config=s',
+ 'use-cache';
my $s = join ' ', @ARGV
or pod2usage(0);
-pod2usage(0) unless $options{cobrand};
-
local $ENV{FMS_OVERRIDE_CONFIG} = $options{'override-config'} if $options{'override-config'};
eval 'use FixMyStreet';
@@ -63,22 +76,41 @@ my $geocoder_type = $options{geocoder} || do {
} or pod2usage(0);
my $geocoder_name = "FixMyStreet::Geocode::${geocoder_type}";
+chomp $geocoder_name;
my $code_ref = $geocoder_name->can('string')
or die "$geocoder_name is not a valid geocoder?";
-my @allowed_cobrands = FixMyStreet::Cobrand->get_allowed_cobrands();
+my @allowed_cobrands = @{ FixMyStreet::Cobrand->get_allowed_cobrands() };
+
+my $cobrand_option = $options{cobrand}
+ || do {
+ $allowed_cobrands[0]->{moniker} if scalar @allowed_cobrands == 1;
+ } or pod2usage(0);
-my $cobrand_name = FixMyStreet::Cobrand->get_class_for_moniker($options{cobrand});
+my $cobrand_name = FixMyStreet::Cobrand->get_class_for_moniker($cobrand_option);
my $cobrand = $cobrand_name->new();
say "USING COBRAND $cobrand_name";
-if ($cobrand->moniker ne lc($options{cobrand})) {
- say "!!! asked for $options{cobrand}";
+if ($cobrand->moniker ne lc($cobrand_option)) {
+ say "!!! asked for $cobrand_option";
say "!!! Check ALLOWED_COBRANDS setting in conf/general.yml (or supplied --override-config file)";
say Dumper(\@allowed_cobrands);
}
+say "USING GEOCODER $geocoder_name "
+ . ( $options{'use-cache'} ?
+ 'WITH ' . FixMyStreet->config('GEO_CACHE') :
+ 'WITHOUT cache');
+
my $c = FixMyStreet::App->new();
$c->stash->{cobrand} = $cobrand;
-say Dumper( $code_ref->( $s, $c ) );
+FixMyStreet::override_config({
+ # if we're not using cache, then set GEO_CACHE to a temporary directory
+ $options{'use-cache'} ?
+ () :
+ ( GEO_CACHE => (tempdir( CLEANUP => 1 ) . '/') ),
+}, sub {
+ my $result = $code_ref->( $s, $c );
+ say Dumper $result;
+});
diff --git a/bin/gettext-extract b/bin/gettext-extract
index c1f3d384e..ca37e9d6d 100755
--- a/bin/gettext-extract
+++ b/bin/gettext-extract
@@ -9,6 +9,11 @@
cd "$(dirname $(readlink -f $BASH_SOURCE))/.."
+# Install required code if needed
+vendor/bin/carton install --path local-gettext --cpanfile locale/cpanfile --deployment
+export PATH="local-gettext/bin:$PATH"
+export PERL5LIB="local-gettext/lib/perl5:local/lib/perl5"
+
# File to write to, clear it to start with
PO=locale/FixMyStreet.po
rm -f $PO
diff --git a/bin/install_perl_modules b/bin/install_perl_modules
index 409fd054e..d757facb6 100755
--- a/bin/install_perl_modules
+++ b/bin/install_perl_modules
@@ -2,20 +2,15 @@
set -e
-DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd | sed -e 's/\/bin$//' )"
+DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd | sed -e 's/\/bin$//' )"
-$DIR/bin/cpanm -l $DIR/local-carton Carton
-
-export PATH=$DIR/local-carton/bin:$PATH
-export PERL5LIB=$DIR/local-carton/lib/perl5
-
-carton install --deployment --without uk --without zurich --without open311-endpoint
+$DIR/vendor/bin/carton install --deployment --without uk --without zurich --without open311-endpoint
if ! perl -MImage::Magick -e 'exit()' >/dev/null 2>&1
then
read -p "Image::Magick is not installed. Do you want to attempt to install it?" yn
case $yn in
- [Yy]* ) $DIR/local-carton/bin/carton install Image::Magick;;
+ [Yy]* ) $DIR/vendor/bin/carton install Image::Magick;;
* ) echo 'You will need to install it for FixMyStreet to work';;
esac
fi
diff --git a/bin/make_css b/bin/make_css
index 3a1fca1a7..87126ef28 100755
--- a/bin/make_css
+++ b/bin/make_css
@@ -11,16 +11,16 @@
COMPASS=compass
SASS=sass
-DIR=$(cd "$(dirname "$0")" && pwd -P)
-PARENT=$(cd "$DIR"/../.. && pwd)
+DIR=$(cd "$(dirname "$0")" >/dev/null && pwd -P)
+PARENT=$(cd "$DIR"/../.. >/dev/null && pwd)
if [ -f "$PARENT/gem-bin/compass" ]; then
COMPASS=$PARENT/gem-bin/compass
SASS=$PARENT/gem-bin/sass
fi
-DIRECTORY=$(cd "$DIR"/../web && pwd)
+DIRECTORY=$(cd "$DIR"/../web >/dev/null && pwd)
-DIRS=${@:-`find $DIRECTORY -name "*.scss" -exec dirname {} \; | uniq`}
+DIRS=${@:-`find -L $DIRECTORY -name "*.scss" -exec dirname {} \; | uniq`}
for dir in $DIRS; do
if [ -e "$dir/config.rb" ]; then
diff --git a/bin/make_css_watch b/bin/make_css_watch
index 2ae287429..d15fa3a81 100755
--- a/bin/make_css_watch
+++ b/bin/make_css_watch
@@ -45,8 +45,7 @@ if (-f "$gem_bin/compass") {
sub title {
my $what = shift;
- # TODO, check if xtitle is installed and if so, run following command:
- # system 'xtitle', $what;
+ print "\033]2;$what\007\n";
}
say sprintf "Watching [%s] for %s", (join ',' => @dirs), $filter;
@@ -92,6 +91,7 @@ while ( my @events = $watcher->wait_for_events() ) {
'--style' => 'compressed',
$dir;
}
+ title "$dir updated";
}
title 'watching';
}
diff --git a/bin/problem-creation-graph b/bin/problem-creation-graph
index c3d10f934..3e46777f4 100755
--- a/bin/problem-creation-graph
+++ b/bin/problem-creation-graph
@@ -10,12 +10,12 @@ use strict;
use warnings;
require 5.8.0;
+my $DIR;
BEGIN {
use File::Basename qw(dirname);
use File::Spec;
- my $d = dirname(File::Spec->rel2abs($0));
- chdir "$d/..";
- require "$d/../setenv.pl";
+ $DIR = dirname(dirname(File::Spec->rel2abs($0)));
+ require "$DIR/setenv.pl";
}
use File::Temp qw(tempfile);
@@ -113,6 +113,6 @@ $gp .= <<END;
"< awk 'BEGIN { n = 0 } { n += \$2; print \$1, \$2, n; }' $sources{unconfirmed}" using 1:3 axes x1y2 with lines lt 0 title "cumulative total number of problems"
END
-open(my $gnuplot, '|-', "GDFONTPATH=/usr/share/fonts/truetype/ttf-bitstream-vera gnuplot > web/fms-live-creation$config{extension} 2> /dev/null");
+open(my $gnuplot, '|-', "GDFONTPATH=/usr/share/fonts/truetype/ttf-bitstream-vera gnuplot > $DIR/web/fms-live-creation$config{extension} 2> /dev/null") or die $!;
$gnuplot->print($gp);
close $gnuplot;
diff --git a/bin/problems-filed-graph b/bin/problems-filed-graph
index abfe0cf1a..a930e4346 100755
--- a/bin/problems-filed-graph
+++ b/bin/problems-filed-graph
@@ -10,12 +10,12 @@ use strict;
use warnings;
require 5.8.0;
+my $DIR;
BEGIN {
use File::Basename qw(dirname);
use File::Spec;
- my $d = dirname(File::Spec->rel2abs($0));
- chdir "$d/..";
- require "$d/../setenv.pl";
+ $DIR = dirname(dirname(File::Spec->rel2abs($0)));
+ require "$DIR/setenv.pl";
}
use File::Temp qw(tempfile);
@@ -62,6 +62,6 @@ my $gp = <<END;
plot "$source" using 1:2 with lines axes x1y2 lt 3 title "FixMyStreet problem reports"
END
-open(my $gnuplot, '|-', "GDFONTPATH=/usr/share/fonts/truetype/ttf-bitstream-vera gnuplot > web/fms-live-line$config{extension} 2> /dev/null");
+open(my $gnuplot, '|-', "GDFONTPATH=/usr/share/fonts/truetype/ttf-bitstream-vera gnuplot > $DIR/web/fms-live-line$config{extension} 2> /dev/null") or die $!;
$gnuplot->print($gp);
close $gnuplot;
diff --git a/bin/send-comments b/bin/send-comments
index fabf2b633..fbbd57891 100755
--- a/bin/send-comments
+++ b/bin/send-comments
@@ -130,12 +130,12 @@ while ( my $body = $bodies->next ) {
if ( $id ) {
$comment->update( {
external_id => $id,
- whensent => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
} );
} else {
$comment->update( {
send_fail_count => $comment->send_fail_count + 1,
- send_fail_timestamp => \'ms_current_timestamp()',
+ send_fail_timestamp => \'current_timestamp',
send_fail_reason => 'Failed to post over Open311',
} );
}
diff --git a/bin/setup-contacts b/bin/setup-contacts
new file mode 100755
index 000000000..d562ae71d
--- /dev/null
+++ b/bin/setup-contacts
@@ -0,0 +1,204 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+require 5.8.0;
+use feature 'say';
+
+BEGIN {
+ use File::Basename qw(dirname);
+ use File::Spec;
+ my $d = dirname(File::Spec->rel2abs($0));
+ require "$d/../setenv.pl";
+}
+
+use FixMyStreet::App;
+
+my $moniker = $ARGV[0];
+
+my $c = FixMyStreet::App->new();
+my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($moniker)->new({ c => $c });
+$c->stash->{cobrand} = $cobrand;
+
+die "Not a staging site, bailing out" unless $c->config->{STAGING_SITE}; # TODO, allow override via --force
+say "Applying contacts for $cobrand";
+
+
+ensure_bodies();
+setup_contacts();
+
+=head2 setup_contacts, ensure_bodies
+
+routines to update extra data for contacts. These can be called by
+a script:
+
+ bin/setup-contacts zurich
+
+=cut
+
+sub ensure_bodies {
+ my @bodies = $cobrand->body_details_data;
+
+ my $bodies_rs = $c->model('DB::Body');
+
+ for my $body (@bodies) {
+ # following should work (having added Unique name/parent constraint, but doesn't)
+ # $bodies_rs->find_or_create( $body, { $parent ? ( key => 'body_name_parent_key' ) : () } );
+ # let's keep it simple and just allow unique names
+ next if $bodies_rs->search({ name => $body->{name} })->count;
+ if (my $area_id = delete $body->{area_id}) {
+ $body->{body_areas} = [ { area_id => $area_id } ];
+ }
+ my $parent = $body->{parent};
+ if ($parent and ! ref $parent) {
+ $body->{parent} = { name => $parent };
+ }
+ $bodies_rs->find_or_create( $body );
+ }
+}
+
+sub setup_contacts {
+ die "Not a staging site, bailing out" unless $c->config->{STAGING_SITE}; # TODO, allow override via --force
+
+ my @contact_details = $cobrand->contact_details_data;
+
+ for my $detail (@contact_details) {
+ update_contact( $detail, $description );
+ }
+}
+
+sub update_contact {
+ my ($contact_data, $description) = @_;
+
+ my $contact_rs = $c->model('DB::Contact');
+
+ my $category = $contact_data->{category} or die "No category provided";
+ $description ||= "Update contact";
+
+ my $contact = ensure_contact($contact_data, $description)
+ or return; # e.g. nothing returned if deleted
+
+ if (my $fields = $contact_data->{fields}) {
+
+ my @fields = map { get_field_extra($_) } @$fields;
+ my $note = sprintf 'Fields edited by automated script%s', $description ? " ($description)" : '';
+ $contact->set_extra_fields(@fields);
+ $contact->set_inflated_columns({
+ confirmed => 1,
+ deleted => 0,
+ editor => 'automated script',
+ whenedited => \'NOW()',
+ note => "Updated fields $description",
+ });
+ $contact->update;
+ }
+}
+
+sub ensure_contact {
+ my ($contact_data, $description) = @_;
+
+ my $category = $contact_data->{category} or die "No category provided";
+ $description ||= "Ensure contact exists $category";
+
+ my $email = temp_email_to_update(); # will only be set if newly created
+
+ my $body = get_body_for_contact($contact_data) or die "No body found for $category";
+
+ my $contact_rs = $c->model('DB::Contact');
+
+ my $category_details = $contact_data->{category_details} || {};
+
+ if (my $old_name = delete $contact_data->{rename_from}) {
+ if (my $old_category = $contact_rs->find({
+ category => $old_name,
+ , body => $body,
+ })) {
+ $old_category->update({
+ category => $category,
+ whenedited => \'NOW()',
+ note => "Renamed $description",
+ %{ $category_details || {} },
+ });
+ return $old_category;
+ }
+ }
+
+ if ($contact_data->{delete}) {
+ my $contact = $contact_rs->search({
+ body_id => $body->id,
+ category => $category,
+ deleted => 0
+ });
+ if ($contact->count) {
+ print sprintf "Deleting: %s\n", $category;
+ $contact->update({
+ deleted => 1,
+ editor => 'automated script',
+ whenedited => \'NOW()',
+ note => "Deleted by script $description",
+ });
+ }
+ return;
+ }
+
+ return $contact_rs->find_or_create(
+ {
+ body => $body,
+ category => $category,
+
+ confirmed => 1,
+ deleted => 0,
+ email => $email,
+ editor => 'automated script',
+ note => 'created by automated script',
+ send_method => '',
+ whenedited => \'NOW()',
+ %{ $category_details || {} },
+ },
+ {
+ key => 'contacts_body_id_category_idx'
+ }
+ );
+}
+
+sub get_field_extra {
+ my ($field) = @_;
+
+ my %default = (
+ variable => 'true',
+ order => '1',
+ required => 'no',
+ datatype => 'string',
+ datatype_description => 'a string',
+ );
+
+ if (($field->{datatype} || '') eq 'boolean') {
+ %default = (
+ %default,
+ datatype => 'singlevaluelist',
+ datatype_description => 'Yes or No',
+ values => { value => [
+ { key => ['No'], name => ['No'] },
+ { key => ['Yes'], name => ['Yes'] },
+ ] },
+ );
+ }
+
+ return { %default, %$field };
+}
+
+sub temp_email_to_update { 'test@example.com' }
+
+sub get_body_for_contact {
+ my ($contact_data) = @_;
+ if (my $body_name = $contact_data->{body_name}) {
+ return $c->model('DB::Body')->find({ name => $body_name });
+ }
+ if ($cobrand->can('contact_details_data_body_default')) {
+ return $cobrand->contact_details_data_body_default;
+ }
+ return;
+ # TODO: for UK Councils use
+ # $c->model('DB::Body')->find(id => $cobrand->council_id);
+ # # NB: (or better that's the area in BodyAreas)
+}
diff --git a/bin/site-specific-install.sh b/bin/site-specific-install.sh
index 75b016bb5..4c39a1bd7 100644
--- a/bin/site-specific-install.sh
+++ b/bin/site-specific-install.sh
@@ -1,7 +1,7 @@
#!/bin/sh
# Set this to the version we want to check out
-VERSION=${VERSION_OVERRIDE:-v1.6.1}
+VERSION=${VERSION_OVERRIDE:-v1.7}
PARENT_SCRIPT_URL=https://github.com/mysociety/commonlib/blob/master/bin/install-site.sh
diff --git a/bin/update-all-reports b/bin/update-all-reports
index f6cd34210..0627cedc2 100755
--- a/bin/update-all-reports
+++ b/bin/update-all-reports
@@ -57,8 +57,7 @@ while ( my @problem = $problems->next ) {
$problem{bodies} = 0;
} else {
# Add to bodies it was sent to
- (my $bodies = $problem{bodies_str}) =~ s/\|.*$//;
- @bodies = split( /,/, $bodies );
+ @bodies = split( /,/, $problem{bodies_str} );
$problem{bodies} = scalar @bodies;
}
foreach my $body ( @bodies ) {
diff --git a/bin/update-schema b/bin/update-schema
index ce193f29c..1af08b002 100755
--- a/bin/update-schema
+++ b/bin/update-schema
@@ -95,8 +95,8 @@ sub get_statements {
next if /^--/; # Ignore comments
$s .= $_;
# Functions may have semicolons within them
- $in_function = 1 if /create function/i;
- $in_function = 0 if /language 'plpgsql'/i;
+ $in_function = 1 if /create (or replace )?function/i;
+ $in_function = 0 if /language (sql|'plpgsql')/i;
if ($s =~ /;/ && !$in_function) {
push @statements, $s;
$s = '';
@@ -195,6 +195,12 @@ else {
# By querying the database schema, we can see where we're currently at
# (assuming schema change files are never half-applied, which should be the case)
sub get_db_version {
+ return '0038' if column_exists('admin_log', 'time_spent');
+ return '0037' if table_exists('response_templates');
+ return '0036' if constraint_contains('problem_cobrand_check', 'a-z0-9_');
+ return '0035' if column_exists('problem', 'bodies_missing');
+ return '0034' if ! function_exists('ms_current_timestamp');
+ return '0033' if ! function_exists('angle_between');
return '0032' if table_exists('moderation_original_data');
return '0031' if column_exists('body', 'external_url');
return '0030' if ! constraint_exists('admin_log_action_check');
@@ -254,3 +260,15 @@ sub constraint_exists {
return dbh()->selectrow_array('select count(*) from pg_constraint where conname = ?', {}, $constraint);
}
+# Returns true if a check constraint contains a certain string
+sub constraint_contains {
+ my ( $constraint, $check ) = @_;
+ my ($consrc) = dbh()->selectrow_array('select consrc from pg_constraint where conname = ?', {}, $constraint);
+ return $consrc =~ /$check/;
+}
+
+# Returns true if a function exists
+sub function_exists {
+ my $fn = shift;
+ return dbh()->selectrow_array('select count(*) from pg_proc where proname = ?', {}, $fn);
+}
diff --git a/conf/general.yml-example b/conf/general.yml-example
index ee68b5cd6..f16d63c70 100644
--- a/conf/general.yml-example
+++ b/conf/general.yml-example
@@ -120,9 +120,7 @@ BING_MAPS_API_KEY: ''
# bing_culture: <culture code, see http://msdn.microsoft.com/en-us/library/hh441729.aspx>
# bing_country: <country name, only accept results that match this>
#
-# If using Google, you can use:
-# centre: "<lat>,<lon>"
-# span: "<lat span>,<lon span>"
+# If using Google, you can use bounds, plus:
# google_country: <.ccTLD to restrict results to>
# lang: <language for results>
#
diff --git a/cpanfile b/cpanfile
index 649878230..16d431884 100644
--- a/cpanfile
+++ b/cpanfile
@@ -43,6 +43,7 @@ requires 'DBIx::Class::ResultSet';
requires 'DBIx::Class::Schema::Loader';
requires 'Digest::MD5';
requires 'Digest::SHA';
+requires 'Email::MIME';
requires 'Email::Send';
requires 'Email::Send::SMTP';
requires 'Email::Simple';
@@ -67,6 +68,7 @@ requires 'Math::Trig';
requires 'Module::Pluggable';
requires 'Moose';
requires 'namespace::autoclean';
+requires 'Net::DNS::Resolver';
requires 'Net::Domain::TLD';
requires 'Net::SMTP::SSL';
requires 'Net::SMTP::TLS';
@@ -89,9 +91,6 @@ requires 'YAML';
feature 'uk', 'FixMyStreet.com specific requirements' => sub {
# East Hampshire
requires 'SOAP::Lite';
- # Barnet
- # TODO: This can perhaps be removed since Barnet switched to email for problem reports
- requires 'SOAP::WSDL';
};
feature 'open311-endpoint', 'Open311::Endpoint specific requirements' => sub {
@@ -104,7 +103,7 @@ feature 'open311-endpoint', 'Open311::Endpoint specific requirements' => sub {
};
feature 'zurich', 'Zueri wie neu specific requirements' => sub {
-# # Geocoder
+ # Geocoder
requires 'SOAP::Lite';
};
diff --git a/cpanfile.snapshot b/cpanfile.snapshot
index add5bc404..5bf0dc4ba 100644
--- a/cpanfile.snapshot
+++ b/cpanfile.snapshot
@@ -2584,6 +2584,63 @@ DISTRIBUTIONS
ExtUtils::MakeMaker 0
Test::More 0.47
Time::Local 0.000
+ Email-MIME-1.929
+ pathname: R/RJ/RJBS/Email-MIME-1.929.tar.gz
+ provides:
+ Email::MIME 1.929
+ Email::MIME::Creator 1.929
+ Email::MIME::Encode 1.929
+ Email::MIME::Header 1.929
+ Email::MIME::Modifier 1.929
+ requirements:
+ Carp 0
+ Email::Address 0
+ Email::MIME::ContentType 1.016
+ Email::MIME::Encodings 1.314
+ Email::MessageID 0
+ Email::Simple 2.102
+ Email::Simple::Creator 0
+ Email::Simple::Header 0
+ Encode 1.9801
+ ExtUtils::MakeMaker 0
+ MIME::Base64 0
+ MIME::Types 1.13
+ Scalar::Util 0
+ parent 0
+ perl 5.008001
+ strict 0
+ warnings 0
+ Email-MIME-ContentType-1.018
+ pathname: R/RJ/RJBS/Email-MIME-ContentType-1.018.tar.gz
+ provides:
+ Email::MIME::ContentType 1.018
+ requirements:
+ Carp 0
+ Exporter 5.57
+ ExtUtils::MakeMaker 0
+ strict 0
+ warnings 0
+ Email-MIME-Encodings-1.315
+ pathname: R/RJ/RJBS/Email-MIME-Encodings-1.315.tar.gz
+ provides:
+ Email::MIME::Encodings 1.315
+ requirements:
+ Carp 0
+ ExtUtils::MakeMaker 6.30
+ MIME::Base64 3.05
+ MIME::QuotedPrint 3.05
+ strict 0
+ warnings 0
+ Email-MessageID-1.405
+ pathname: R/RJ/RJBS/Email-MessageID-1.405.tar.gz
+ provides:
+ Email::MessageID 1.405
+ requirements:
+ ExtUtils::MakeMaker 6.30
+ Sys::Hostname 0
+ overload 0
+ strict 0
+ warnings 0
Email-Send-2.198
pathname: R/RJ/RJBS/Email-Send-2.198.tar.gz
provides:
@@ -2670,6 +2727,9 @@ DISTRIBUTIONS
pathname: S/SH/SHLOMIF/Error-0.17019.tar.gz
provides:
Error 0.17019
+ Error::Simple 0.17019
+ Error::WarnDie undef
+ Error::subs undef
requirements:
Module::Build 0.39
Scalar::Util 0
@@ -3498,6 +3558,20 @@ DISTRIBUTIONS
ExtUtils::MakeMaker 6.52
Test::More 0.82
perl 5.00503
+ MIME-Lite-3.030
+ pathname: R/RJ/RJBS/MIME-Lite-3.030.tar.gz
+ provides:
+ MIME::Lite 3.030
+ MIME::Lite::IO_Handle 3.030
+ MIME::Lite::IO_Scalar 3.030
+ MIME::Lite::IO_ScalarArray 3.030
+ MIME::Lite::SMTP 3.030
+ MailTool undef
+ requirements:
+ Email::Date::Format 1.000
+ ExtUtils::MakeMaker 0
+ File::Basename 0
+ File::Spec 0
MIME-Types-1.38
pathname: M/MA/MARKOV/MIME-Types-1.38.tar.gz
provides:
@@ -3784,6 +3858,18 @@ DISTRIBUTIONS
vars 0
version 0.87
warnings 0
+ Module-Pluggable-4.7
+ pathname: S/SI/SIMONW/Module-Pluggable-4.7.tar.gz
+ provides:
+ Devel::InnerPackage 0.4
+ Module::Pluggable 4.7
+ Module::Pluggable::Object 4.6
+ requirements:
+ File::Basename 0
+ File::Spec 3.00
+ Module::Build 0.38
+ Test::More 0.62
+ if 0
Module-Runtime-0.013
pathname: Z/ZE/ZEFRAM/Module-Runtime-0.013.tar.gz
provides:
@@ -5077,6 +5163,7 @@ DISTRIBUTIONS
IO::Socket::SSL 0
LWP::UserAgent 0
MIME::Base64 0
+ MIME::Lite 0
MIME::Parser 0
Net::POP3 0
Scalar::Util 0
diff --git a/db/alert_types.sql b/db/alert_types.sql
index 4022ddaf7..471fd905f 100644
--- a/db/alert_types.sql
+++ b/db/alert_types.sql
@@ -93,7 +93,7 @@ values ('postcode_local_problems_state', '', '',
'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in (?)', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
--- New problems sent to a particular council
+-- New problems sent to a particular body
insert into alert_type
(ref, head_sql_query, head_table,
head_title, head_link, head_description,
@@ -107,8 +107,7 @@ values ('council_problems', '', '',
''fixed'', ''fixed - council'', ''fixed - user'', ''closed'',
''action scheduled'', ''not responsible'', ''duplicate'', ''unable to fix'',
''internal referral'' ) AND
- (bodies_str like ''%''||?||''%'' or bodies_str is null) and
- areas like ''%,''||?||'',%''',
+ regexp_split_to_array(bodies_str, '','') && ARRAY[?]',
'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-council'
);
@@ -128,7 +127,7 @@ values ('ward_problems', '', '',
''fixed'', ''fixed - council'', ''fixed - user'', ''closed'',
''action scheduled'', ''not responsible'', ''duplicate'', ''unable to fix'',
''internal referral'' ) AND
- (bodies_str like ''%''||?||''%'' or bodies_str is null) and
+ (regexp_split_to_array(bodies_str, '','') && ARRAY[?] or bodies_str is null) and
areas like ''%,''||?||'',%''',
'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-ward'
diff --git a/db/alert_types_eha.pl b/db/alert_types_eha.pl
deleted file mode 100644
index b090522e6..000000000
--- a/db/alert_types_eha.pl
+++ /dev/null
@@ -1,28 +0,0 @@
-# This file is only here so that the strings from alert_types_eha.sql
-# get into the .po translation file.
-
-# New problems anywhere on the site
- _('New reports on reportemptyhomes.com'),
-
-# New fixed problems anywhere on the site
- _('Properties recently reported as put back to use on reportemptyhomes.com'),
- _('The latest properties reported back to use by users'),
-
-# New problems around a location
- _('New local reports on reportemptyhomes.com'),
- _('The latest local reports reported by users'),
-
-# New problems around a postcode
- _('New reports on reportemptyhomes.com near {{POSTCODE}}'),
-
-# New problems sent to a particular council
- _('New reports to {{COUNCIL}} on reportemptyhomes.com'),
- _('The latest reports for {{COUNCIL}} reported by users'),
-
-# New problems within a particular ward sent to a particular council
- _('New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com'),
- _('The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users'),
-
-# New problems within a particular voting area (ward, constituency, whatever)
- _('New reports within {{NAME}}\'s boundary on reportemptyhomes.com'),
- _('The latest reports within {{NAME}}\'s boundary reported by users'),
diff --git a/db/alert_types_eha.sql b/db/alert_types_eha.sql
deleted file mode 100644
index e4ec0c986..000000000
--- a/db/alert_types_eha.sql
+++ /dev/null
@@ -1,95 +0,0 @@
--- New updates on a particular problem report
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('new_updates', 'select * from problem where id=?', 'problem',
- 'Updates on {{title}}', '/', 'Updates on {{title}}',
- 'comment', 'comment.state=''confirmed''', 'created desc',
- 'Update by {{name}}', '/report/{{problem_id}}#comment_{{id}}', '{{text}}', 'alert-update');
-
--- New problems anywhere on the site
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('new_problems', '', '',
- 'New reports on reportemptyhomes.com', '/', 'The latest empty properties reported by users',
- 'problem', 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem');
-
--- New fixed problems anywhere on the site
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('new_fixed_problems', '', '',
- 'Properties recently reported as put back to use on reportemptyhomes.com', '/', 'The latest properties reported back to use by users',
- 'problem', 'problem.state in (''fixed'', ''sixed - council'', ''fixed - user'')', 'lastupdate desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem');
-
--- New problems around a location
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('local_problems', '', '',
- 'New local reports on reportemptyhomes.com', '/', 'The latest local reports reported by users',
- 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
-
--- New problems around a postcode
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('postcode_local_problems', '', '',
- 'New reports on reportemptyhomes.com near {{POSTCODE}}', '/', 'The latest local reports reported by users',
- 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
-
--- New problems sent to a particular council
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('council_problems', '', '',
- 'New reports to {{COUNCIL}} on reportemptyhomes.com', '/reports', 'The latest reports for {{COUNCIL}} reported by users',
- 'problem', 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and (bodies_str like ''%''||?||''%''
- or bodies_str is null) and areas like ''%,''||?||'',%''', 'created desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-council'
-);
-
--- New problems within a particular ward sent to a particular council
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('ward_problems', '', '',
- 'New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com', '/reports',
- 'The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users',
- 'problem', 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and (bodies_str like ''%''||?||''%''
- or bodies_str is null) and areas like ''%,''||?||'',%''', 'created desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-ward'
-);
-
--- New problems within a particular voting area (ward, constituency, whatever)
-insert into alert_type
-(ref, head_sql_query, head_table,
- head_title, head_link, head_description,
- item_table, item_where, item_order,
- item_title, item_link, item_description, template)
-values ('area_problems', '', '',
- 'New reports within {{NAME}}''s boundary on reportemptyhomes.com', '/reports',
- 'The latest reports within {{NAME}}''s boundary reported by users', 'problem',
- 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and areas like ''%,''||?||'',%''', 'created desc',
- '{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-area'
-);
-
diff --git a/db/downgrade_0037---0036.sql b/db/downgrade_0037---0036.sql
new file mode 100644
index 000000000..39f73b308
--- /dev/null
+++ b/db/downgrade_0037---0036.sql
@@ -0,0 +1 @@
+drop table response_templates;
diff --git a/db/downgrade_0038---0037.sql b/db/downgrade_0038---0037.sql
new file mode 100644
index 000000000..11a0d11ad
--- /dev/null
+++ b/db/downgrade_0038---0037.sql
@@ -0,0 +1,2 @@
+alter table admin_log
+ drop column time_spent;
diff --git a/db/rerun_dbic_loader.pl b/db/rerun_dbic_loader.pl
index 152d319b1..d7dfd1c10 100755
--- a/db/rerun_dbic_loader.pl
+++ b/db/rerun_dbic_loader.pl
@@ -13,7 +13,6 @@ use DBIx::Class::Schema::Loader qw/ make_schema_at /;
# create a exclude statement that filters out the table that we are not
# interested in
my @tables_to_ignore = (
- 'debugdate', #
'flickr_imported', #
'partial_user', #
'textmystreet', #
diff --git a/db/schema.sql b/db/schema.sql
index 5bac02bce..72fccd7f3 100644
--- a/db/schema.sql
+++ b/db/schema.sql
@@ -11,27 +11,6 @@ create table secret (
secret text not null
);
--- If a row is present, that is date which is "today". Used for debugging
--- to advance time without having to wait.
-create table debugdate (
- override_today date
-);
-
--- Returns the timestamp of current time, but with possibly overriden "today".
-create function ms_current_timestamp()
- returns timestamp as '
- declare
- today date;
- begin
- today = (select override_today from debugdate);
- if today is not null then
- return today + current_time;
- else
- return current_timestamp;
- end if;
- end;
-' language 'plpgsql';
-
-- table for sessions - needed by Catalyst::Plugin::Session::Store::DBIC
create table sessions (
id char(72) primary key,
@@ -153,6 +132,7 @@ create table problem (
latitude double precision not null,
longitude double precision not null,
bodies_str text, -- the body(s) we'll report this problem to
+ bodies_missing text, -- the body(s) we had no contact details for
areas text not null, -- the mapit areas this location is in
category text not null default 'Other',
title text not null,
@@ -171,7 +151,7 @@ create table problem (
external_team text,
-- Metadata
- created timestamp not null default ms_current_timestamp(),
+ created timestamp not null default current_timestamp,
confirmed timestamp,
state text not null check (
state = 'unconfirmed'
@@ -193,9 +173,9 @@ create table problem (
),
lang text not null default 'en-gb',
service text not null default '',
- cobrand text not null default '' check (cobrand ~* '^[a-z0-9]*$'),
- cobrand_data text not null default '' check (cobrand_data ~* '^[a-z0-9]*$'), -- Extra data used in cobranded versions of the site
- lastupdate timestamp not null default ms_current_timestamp(),
+ cobrand text not null default '' check (cobrand ~* '^[a-z0-9_]*$'),
+ cobrand_data text not null default '' check (cobrand_data ~* '^[a-z0-9_]*$'), -- Extra data used in cobranded versions of the site
+ lastupdate timestamp not null default current_timestamp,
whensent timestamp,
send_questionnaire boolean not null default 't',
extra text, -- extra fields required for open311
@@ -226,6 +206,8 @@ create table problem (
create index problem_state_latitude_longitude_idx on problem(state, latitude, longitude);
create index problem_user_id_idx on problem ( user_id );
create index problem_external_body_idx on problem(lower(external_body));
+create index problem_radians_latitude_longitude_idx on problem(radians(latitude), radians(longitude));
+create index problem_bodies_str_array_idx on problem USING gin(regexp_split_to_array(bodies_str, ','));
create table questionnaire (
id serial not null primary key,
@@ -242,17 +224,6 @@ create table questionnaire (
create index questionnaire_problem_id_idx on questionnaire using btree (problem_id);
--- angle_between A1 A2
--- Given two angles A1 and A2 on a circle expressed in radians, return the
--- smallest angle between them.
-create function angle_between(double precision, double precision)
- returns double precision as '
-select case
- when abs($1 - $2) > pi() then 2 * pi() - abs($1 - $2)
- else abs($1 - $2)
- end;
-' language sql immutable;
-
-- R_e
-- Radius of the earth, in km. This is something like 6372.8 km:
-- http://en.wikipedia.org/wiki/Earth_radius
@@ -274,11 +245,11 @@ create function problem_find_nearby(double precision, double precision, double p
-- table or results set in memory. That means we can't check the values of
-- the parameters, sadly.
-- Through sheer laziness, just use great-circle distance; that'll be off
- -- by ~0.1%:
- -- http://www.ga.gov.au/nmd/geodesy/datums/distance.jsp
+ -- by ~0.1%.
-- We index locations on lat/lon so that we can select the locations which lie
-- within a wedge of side about 2 * DISTANCE. That cuts down substantially
-- on the amount of work we have to do.
+ -- http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
'
-- trunc due to inaccuracies in floating point arithmetic
select problem.id,
@@ -292,9 +263,13 @@ create function problem_find_nearby(double precision, double precision, double p
longitude is not null and latitude is not null
and radians(latitude) > radians($1) - ($3 / R_e())
and radians(latitude) < radians($1) + ($3 / R_e())
- and (abs(radians($1)) + ($3 / R_e()) > pi() / 2 -- case where search pt is near pole
- or angle_between(radians(longitude), radians($2))
- < $3 / (R_e() * cos(radians($1 + $3 / R_e()))))
+ and (
+ abs(radians($1)) + ($3 / R_e()) > pi() / 2 -- case where search pt is near pole
+ or (
+ radians(longitude) > radians($2) - asin(sin($3 / R_e())/cos(radians($1)))
+ and radians(longitude) < radians($2) + asin(sin($3 / R_e())/cos(radians($1)))
+ )
+ )
-- ugly -- unable to use attribute name "distance" here, sadly
and R_e() * acos(trunc(
(sin(radians($1)) * sin(radians(latitude))
@@ -302,7 +277,7 @@ create function problem_find_nearby(double precision, double precision, double p
* cos(radians($2 - longitude)))::numeric, 14)
) < $3
order by distance desc
-' language sql; -- should be "stable" rather than volatile per default?
+' language sql stable;
-- Comments/q&a on problems.
@@ -313,7 +288,7 @@ create table comment (
anonymous bool not null,
name text, -- null means anonymous
website text,
- created timestamp not null default ms_current_timestamp(),
+ created timestamp not null default current_timestamp,
confirmed timestamp,
text text not null, -- as entered by comment author
photo bytea,
@@ -322,9 +297,9 @@ create table comment (
or state = 'confirmed'
or state = 'hidden'
),
- cobrand text not null default '' check (cobrand ~* '^[a-z0-9]*$'),
+ cobrand text not null default '' check (cobrand ~* '^[a-z0-9_]*$'),
lang text not null default 'en-gb',
- cobrand_data text not null default '' check (cobrand_data ~* '^[a-z0-9]*$'), -- Extra data used in cobranded versions of the site
+ cobrand_data text not null default '' check (cobrand_data ~* '^[a-z0-9_]*$'), -- Extra data used in cobranded versions of the site
mark_fixed boolean not null,
mark_open boolean not null default 'f',
problem_state text check (
@@ -361,7 +336,7 @@ create table token (
scope text not null,
token text not null,
data bytea not null,
- created timestamp not null default ms_current_timestamp(),
+ created timestamp not null default current_timestamp,
primary key (scope, token)
);
@@ -391,9 +366,9 @@ create table alert (
user_id int references users(id) not null,
confirmed integer not null default 0,
lang text not null default 'en-gb',
- cobrand text not null default '' check (cobrand ~* '^[a-z0-9]*$'),
- cobrand_data text not null default '' check (cobrand_data ~* '^[a-z0-9]*$'), -- Extra data used in cobranded versions of the site
- whensubscribed timestamp not null default ms_current_timestamp(),
+ cobrand text not null default '' check (cobrand ~* '^[a-z0-9_]*$'),
+ cobrand_data text not null default '' check (cobrand_data ~* '^[a-z0-9_]*$'), -- Extra data used in cobranded versions of the site
+ whensubscribed timestamp not null default current_timestamp,
whendisabled timestamp default null
);
create index alert_user_id_idx on alert ( user_id );
@@ -405,7 +380,7 @@ create index alert_whensubscribed_confirmed_cobrand_idx on alert(whensubscribed,
create table alert_sent (
alert_id integer not null references alert(id),
parameter text, -- e.g. Update ID for new updates
- whenqueued timestamp not null default ms_current_timestamp()
+ whenqueued timestamp not null default current_timestamp
);
create index alert_sent_alert_id_parameter_idx on alert_sent(alert_id, parameter);
@@ -450,9 +425,10 @@ create table admin_log (
),
object_id integer not null,
action text not null,
- whenedited timestamp not null default ms_current_timestamp(),
+ whenedited timestamp not null default current_timestamp,
user_id int references users(id) null,
- reason text not null default ''
+ reason text not null default '',
+ time_spent int not null default 0
);
create table moderation_original_data (
@@ -468,7 +444,7 @@ create table moderation_original_data (
anonymous bool not null,
-- Metadata
- created timestamp not null default ms_current_timestamp()
+ created timestamp not null default current_timestamp
);
create table user_body_permissions (
@@ -482,3 +458,12 @@ create table user_body_permissions (
),
unique(user_id, body_id, permission_type)
);
+
+create table response_templates (
+ id serial not null primary key,
+ body_id int references body(id) not null,
+ title text not null,
+ text text not null,
+ created timestamp not null default current_timestamp,
+ unique(body_id, title)
+);
diff --git a/db/schema_0032-moderation.sql b/db/schema_0032-moderation.sql
index b3caded1e..79be3a4c9 100644
--- a/db/schema_0032-moderation.sql
+++ b/db/schema_0032-moderation.sql
@@ -1,6 +1,8 @@
-- was created in previous versions of this branch
DROP TABLE IF EXISTS moderation_log;
+BEGIN;
+
alter table admin_log add column
user_id int references users(id) null;
@@ -34,3 +36,5 @@ create table user_body_permissions (
),
unique(user_id, body_id, permission_type)
);
+
+COMMIT;
diff --git a/db/schema_0033-speed-up-nearby.sql b/db/schema_0033-speed-up-nearby.sql
new file mode 100644
index 000000000..845f3c22e
--- /dev/null
+++ b/db/schema_0033-speed-up-nearby.sql
@@ -0,0 +1,47 @@
+begin;
+
+create index problem_radians_latitude_longitude_idx on problem(radians(latitude), radians(longitude));
+
+drop function angle_between(double precision, double precision);
+
+create or replace function problem_find_nearby(double precision, double precision, double precision)
+ returns setof problem_nearby_match as
+ -- Write as SQL function so that we don't have to construct a temporary
+ -- table or results set in memory. That means we can't check the values of
+ -- the parameters, sadly.
+ -- Through sheer laziness, just use great-circle distance; that'll be off
+ -- by ~0.1%.
+ -- We index locations on lat/lon so that we can select the locations which lie
+ -- within a wedge of side about 2 * DISTANCE. That cuts down substantially
+ -- on the amount of work we have to do.
+ -- http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
+'
+ -- trunc due to inaccuracies in floating point arithmetic
+ select problem.id,
+ R_e() * acos(trunc(
+ (sin(radians($1)) * sin(radians(latitude))
+ + cos(radians($1)) * cos(radians(latitude))
+ * cos(radians($2 - longitude)))::numeric, 14)
+ ) as distance
+ from problem
+ where
+ longitude is not null and latitude is not null
+ and radians(latitude) > radians($1) - ($3 / R_e())
+ and radians(latitude) < radians($1) + ($3 / R_e())
+ and (
+ abs(radians($1)) + ($3 / R_e()) > pi() / 2 -- case where search pt is near pole
+ or (
+ radians(longitude) > radians($2) - asin(sin($3 / R_e())/cos(radians($1)))
+ and radians(longitude) < radians($2) + asin(sin($3 / R_e())/cos(radians($1)))
+ )
+ )
+ -- ugly -- unable to use attribute name "distance" here, sadly
+ and R_e() * acos(trunc(
+ (sin(radians($1)) * sin(radians(latitude))
+ + cos(radians($1)) * cos(radians(latitude))
+ * cos(radians($2 - longitude)))::numeric, 14)
+ ) < $3
+ order by distance desc
+' language sql stable;
+
+commit;
diff --git a/db/schema_0034-remove-ms_current_timestamp.sql b/db/schema_0034-remove-ms_current_timestamp.sql
new file mode 100644
index 000000000..347099877
--- /dev/null
+++ b/db/schema_0034-remove-ms_current_timestamp.sql
@@ -0,0 +1,16 @@
+begin;
+
+drop table debugdate;
+
+ALTER TABLE problem ALTER COLUMN created SET DEFAULT current_timestamp;
+ALTER TABLE problem ALTER COLUMN lastupdate SET DEFAULT current_timestamp;
+ALTER TABLE comment ALTER COLUMN created SET DEFAULT current_timestamp;
+ALTER TABLE token ALTER COLUMN created SET DEFAULT current_timestamp;
+ALTER TABLE alert ALTER COLUMN whensubscribed SET DEFAULT current_timestamp;
+ALTER TABLE alert_sent ALTER COLUMN whenqueued SET DEFAULT current_timestamp;
+ALTER TABLE admin_log ALTER COLUMN whenedited SET DEFAULT current_timestamp;
+ALTER TABLE moderation_original_data ALTER COLUMN created SET DEFAULT current_timestamp;
+
+drop function ms_current_timestamp();
+
+commit;
diff --git a/db/schema_0035-bodies_str-tidying.sql b/db/schema_0035-bodies_str-tidying.sql
new file mode 100644
index 000000000..f5e1dbbdd
--- /dev/null
+++ b/db/schema_0035-bodies_str-tidying.sql
@@ -0,0 +1,31 @@
+begin;
+
+alter table problem add bodies_missing text;
+
+update problem
+ set bodies_missing = split_part(bodies_str, '|', 2),
+ bodies_str = split_part(bodies_str, '|', 1)
+ where bodies_str like '%|%';
+
+create index problem_bodies_str_array_idx on problem USING gin(regexp_split_to_array(bodies_str, ','));
+
+UPDATE alert_type set item_where =
+ 'problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'',
+ ''action scheduled'', ''not responsible'', ''duplicate'', ''unable to fix'',
+ ''internal referral'' ) AND
+ regexp_split_to_array(bodies_str, '','') && ARRAY[?]'
+ WHERE ref = 'council_problems';
+
+UPDATE alert_type set item_where =
+ 'problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'',
+ ''action scheduled'', ''not responsible'', ''duplicate'', ''unable to fix'',
+ ''internal referral'' ) AND
+ (regexp_split_to_array(bodies_str, '','') && ARRAY[?] or bodies_str is null) and
+ areas like ''%,''||?||'',%'''
+ WHERE ref = 'ward_problems';
+
+commit;
diff --git a/db/schema_0036-add-underscore-to-cobrand.sql b/db/schema_0036-add-underscore-to-cobrand.sql
new file mode 100644
index 000000000..7bc381e8e
--- /dev/null
+++ b/db/schema_0036-add-underscore-to-cobrand.sql
@@ -0,0 +1,17 @@
+BEGIN;
+
+ALTER TABLE problem DROP CONSTRAINT problem_cobrand_check;
+ALTER TABLE problem DROP CONSTRAINT problem_cobrand_data_check;
+ALTER TABLE comment DROP CONSTRAINT comment_cobrand_check;
+ALTER TABLE comment DROP CONSTRAINT comment_cobrand_data_check;
+ALTER TABLE alert DROP CONSTRAINT alert_cobrand_check;
+ALTER TABLE alert DROP CONSTRAINT alert_cobrand_data_check;
+
+ALTER TABLE problem ADD CONSTRAINT problem_cobrand_check CHECK (cobrand ~* '^[a-z0-9_]*$');
+ALTER TABLE problem ADD CONSTRAINT problem_cobrand_data_check CHECK (cobrand_data ~* '^[a-z0-9_]*$');
+ALTER TABLE comment ADD CONSTRAINT comment_cobrand_check CHECK (cobrand ~* '^[a-z0-9_]*$');
+ALTER TABLE comment ADD CONSTRAINT comment_cobrand_data_check CHECK (cobrand_data ~* '^[a-z0-9_]*$');
+ALTER TABLE alert ADD CONSTRAINT alert_cobrand_check CHECK (cobrand ~* '^[a-z0-9_]*$');
+ALTER TABLE alert ADD CONSTRAINT alert_cobrand_data_check CHECK (cobrand_data ~* '^[a-z0-9_]*$');
+
+COMMIT;
diff --git a/db/schema_0037-response-templates.sql b/db/schema_0037-response-templates.sql
new file mode 100644
index 000000000..4534e1e84
--- /dev/null
+++ b/db/schema_0037-response-templates.sql
@@ -0,0 +1,8 @@
+create table response_templates (
+ id serial not null primary key,
+ body_id int references body(id) not null,
+ title text not null,
+ text text not null,
+ created timestamp not null default current_timestamp,
+ unique(body_id, title)
+);
diff --git a/db/schema_0038-time-spent.sql b/db/schema_0038-time-spent.sql
new file mode 100644
index 000000000..093eb4086
--- /dev/null
+++ b/db/schema_0038-time-spent.sql
@@ -0,0 +1,2 @@
+alter table admin_log
+ add column time_spent int not null default 0;
diff --git a/locale/FixMyStreet.po b/locale/FixMyStreet.po
index afd40ef34..dfe0fb05a 100644
--- a/locale/FixMyStreet.po
+++ b/locale/FixMyStreet.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <team@fixmystreet.com>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623 perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628 perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr ""
@@ -25,11 +25,11 @@ msgstr ""
msgid " or "
msgstr ""
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35 templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr ""
-#: templates/web/base/admin/index.html:38 templates/web/zurich/admin/index.html:6
+#: templates/web/base/admin/index.html:37 templates/web/base/status/index.html:16 templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
@@ -37,11 +37,11 @@ msgstr ""
msgid "%d edits by %s"
msgstr ""
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34 templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr ""
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36 templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr ""
@@ -53,15 +53,47 @@ msgstr ""
msgid "%s - Summary reports"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr ""
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr ""
@@ -73,47 +105,48 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/base/admin/report_blocks.html:41 templates/web/base/admin/users.html:31
+msgid "(Email in abuse table)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/admin/report_edit-sdm.html:60 templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11 templates/web/base/admin/users.html:31
-msgid "(Email in abuse table)"
+#: templates/web/zurich/admin/report_edit-sdm.html:67 templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
msgstr ""
-#: templates/web/base/alert/_list.html:20 templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr ""
-#: templates/web/base/alert/_list.html:25 templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:12 templates/web/base/around/on_map_list_items.html:9 templates/web/fixmystreet/report/_item.html:27 templates/web/zurich/report/_item.html:21
+#: templates/web/base/report/_item.html:27 templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:10 templates/web/base/around/on_map_list_items.html:7 templates/web/fixmystreet/report/_item.html:25 templates/web/zurich/report/_item.html:19
+#: templates/web/base/report/_item.html:25 templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr ""
-#: templates/web/base/index.html:8 templates/web/base/index.html:9 templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:4 templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:199 templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200 templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr ""
@@ -121,23 +154,23 @@ msgstr ""
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2 templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr ""
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666 perllib/FixMyStreet/DB/Result/Problem.pm:410
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673 perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630 perllib/FixMyStreet/DB/Result/Problem.pm:416
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637 perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr ""
@@ -148,11 +181,13 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3 templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33 templates/web/zurich/admin/index.html:4
+#: templates/web/base/admin/index.html:32 templates/web/base/status/index.html:11 templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr ""
@@ -164,23 +199,19 @@ msgstr ""
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:51 templates/web/zurich/auth/general.html:51
+#: templates/web/base/auth/general.html:48 templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr ""
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
-#: templates/web/base/auth/general.html:37 templates/web/base/report/new/fill_in_details_form.html:122 templates/web/base/report/update-form.html:95 templates/web/fixmystreet/auth/general.html:37 templates/web/fixmystreet/auth/general.html:39 templates/web/fixmystreet/report/new/form_user_loggedout.html:15 templates/web/fixmystreet/report/update-form.html:89
+#: templates/web/base/auth/general.html:34 templates/web/base/report/new/fill_in_details_form.html:123 templates/web/base/report/update-form.html:96 templates/web/fixmystreet/report/new/form_user_loggedout.html:15 templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
msgstr ""
@@ -188,7 +219,7 @@ msgstr ""
msgid "About us"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:52 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:31 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:29
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:8 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:31 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:29
msgid "Action Scheduled"
msgstr ""
@@ -203,7 +234,7 @@ msgstr ""
msgid "Add a contact using the form below."
msgstr ""
-#: templates/web/base/admin/bodies.html:74 templates/web/base/admin/body-form.html:240 templates/web/zurich/admin/body-form.html:51
+#: templates/web/base/admin/bodies.html:74 templates/web/base/admin/body-form.html:240 templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -215,10 +246,14 @@ msgstr ""
msgid "Add user"
msgstr ""
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr ""
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr ""
@@ -231,15 +266,19 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/base/report/update-form.html:163 templates/web/fixmystreet/report/update-form.html:150
+#: templates/web/base/report/update-form.html:164 templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr ""
-#: templates/web/base/reports/index.html:3 templates/web/zurich/admin/stats.html:5 templates/web/zurich/reports/index.html:12
+#: templates/web/base/reports/index.html:3 templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr ""
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26 templates/web/zurich/admin/index-dm.html:12 templates/web/zurich/admin/stats.html:13 templates/web/zurich/footer.html:19 templates/web/zurich/nav_over_content.html:6
+#: templates/web/zurich/admin/stats.html:5
+msgid "All Reports as CSV"
+msgstr ""
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32 templates/web/zurich/admin/index-dm.html:12 templates/web/zurich/admin/stats.html:13 templates/web/zurich/footer.html:20 templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr ""
@@ -255,7 +294,7 @@ msgstr ""
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:36 templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr ""
@@ -263,15 +302,11 @@ msgstr ""
msgid "Anonymous"
msgstr ""
-#: templates/web/base/admin/report_edit.html:75 templates/web/base/admin/update_edit.html:23
+#: templates/web/base/admin/report_edit.html:57 templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr ""
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr ""
@@ -283,19 +318,23 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141 templates/web/zurich/admin/stats.html:36
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173 templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130 templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165 templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -315,11 +354,11 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192 perllib/FixMyStreet/Cobrand/Zurich.pm:301 templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276 perllib/FixMyStreet/Cobrand/Zurich.pm:392 templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -335,27 +374,31 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
-#: templates/web/base/admin/body.html:68 templates/web/base/admin/index.html:55 templates/web/base/report/new/category.html:10 templates/web/base/report/new/category_wrapper.html:3 templates/web/zurich/admin/body.html:14 templates/web/zurich/admin/index-dm.html:23 templates/web/zurich/admin/index-sdm.html:21 templates/web/zurich/admin/reports.html:13 templates/web/zurich/admin/stats.html:50
+#: templates/web/base/admin/body.html:68 templates/web/base/admin/index.html:61 templates/web/base/report/new/category.html:10 templates/web/base/report/new/category_wrapper.html:3 templates/web/zurich/admin/body.html:14 templates/web/zurich/admin/index-dm.html:23 templates/web/zurich/admin/index-sdm.html:21 templates/web/zurich/admin/reports.html:13 templates/web/zurich/admin/stats.html:50
msgid "Category"
msgstr ""
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59 templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
-#: templates/web/base/admin/body.html:138 templates/web/base/admin/category_edit.html:23 templates/web/base/admin/report_edit.html:74 templates/web/zurich/admin/body.html:43 templates/web/zurich/admin/report_edit-sdm.html:42 templates/web/zurich/admin/report_edit.html:140
+#: templates/web/base/admin/body.html:138 templates/web/base/admin/category_edit.html:23 templates/web/base/admin/report_edit.html:56 templates/web/zurich/admin/body.html:43 templates/web/zurich/admin/report_edit-sdm.html:70 templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr ""
-#: templates/web/base/auth/change_password.html:1 templates/web/base/auth/change_password.html:3 templates/web/base/auth/change_password.html:33 templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/auth/change_password.html:1 templates/web/base/auth/change_password.html:3 templates/web/base/auth/change_password.html:33 templates/web/base/my/my.html:17
msgid "Change password"
msgstr ""
@@ -388,35 +431,47 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65 templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
-#: templates/web/base/js/translation_strings.html:50 templates/web/fixmystreet/around/_report_banner.html:2
+#: templates/web/base/around/_report_banner.html:2 templates/web/base/js/translation_strings.html:50
msgid "Click map to report a problem"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141 templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:58 templates/web/base/admin/report_edit.html:60 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:144 templates/web/fixmystreet/report/banner.html:15 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:10 templates/web/zurich/admin/header.html:12 templates/web/zurich/admin/report_edit.html:95 templates/web/zurich/admin/report_edit.html:97 templates/web/zurich/admin/stats.html:31 templates/web/zurich/report/banner.html:13
-msgid "Closed"
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
-msgid "Closed by council"
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
msgstr ""
-#: templates/web/base/my/my.html:40 templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
msgstr ""
-#: templates/web/base/admin/problem_row.html:38
-msgid "Closed:"
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196 perllib/FixMyStreet/Cobrand/Zurich.pm:969 templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:15 templates/web/base/admin/report_blocks.html:25 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:144 templates/web/fixmystreet/report/banner.html:15 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:10 templates/web/zurich/admin/header.html:16 templates/web/zurich/admin/stats.html:31
+msgid "Closed"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:10 templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
+msgid "Closed by council"
+msgstr ""
+
+#: templates/web/base/admin/problem_row.html:38
+msgid "Closed:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:23 templates/web/zurich/admin/report_edit-sdm.html:33 templates/web/zurich/admin/report_edit.html:46
+#: templates/web/base/admin/report_edit.html:23
msgid "Co-ordinates:"
msgstr ""
@@ -424,19 +479,19 @@ msgstr ""
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91 templates/web/base/admin/update_edit.html:50
+#: templates/web/base/admin/report_edit.html:73 templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90 templates/web/base/admin/update_edit.html:49
+#: templates/web/base/admin/report_edit.html:72 templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199 templates/web/base/admin/config_page.html:1
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283 templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -444,7 +499,7 @@ msgstr ""
msgid "Confirm"
msgstr ""
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr ""
@@ -456,7 +511,7 @@ msgstr ""
msgid "Confirmation"
msgstr ""
-#: templates/web/base/admin/body.html:166 templates/web/base/admin/body.html:79 templates/web/base/admin/category_edit.html:37 templates/web/base/admin/category_edit.html:89 templates/web/zurich/admin/stats.html:40
+#: templates/web/base/admin/body.html:166 templates/web/base/admin/body.html:79 templates/web/base/admin/category_edit.html:37 templates/web/base/admin/category_edit.html:92 templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr ""
@@ -464,12 +519,13 @@ msgstr ""
msgid "Confirmed reports between %s and %s"
msgstr ""
-#: templates/web/base/admin/list_updates.html:39 templates/web/base/admin/problem_row.html:36 templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/list_updates.html:39 templates/web/base/admin/problem_row.html:36 templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr ""
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24 templates/web/base/open311/index.html:8 templates/web/base/static/privacy.html:10 templates/web/fixmystreet/contact/index.html:12
+msgid "Contact %s"
msgstr ""
#: templates/web/base/contact/index.html:1 templates/web/base/contact/index.html:2 templates/web/base/contact/submit.html:1 templates/web/fixmystreet/contact/index.html:1 templates/web/fixmystreet/contact/index.html:2
@@ -480,7 +536,11 @@ msgstr ""
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325 perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40 templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420 perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr ""
@@ -496,7 +556,7 @@ msgstr ""
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -508,7 +568,7 @@ msgstr ""
msgid "Count"
msgstr ""
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr ""
@@ -516,11 +576,15 @@ msgstr ""
msgid "Create category"
msgstr ""
-#: templates/web/base/admin/problem_row.html:34 templates/web/zurich/admin/list_updates.html:29 templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/template_edit.html:29
+msgid "Create template"
+msgstr ""
+
+#: templates/web/base/admin/problem_row.html:34 templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr ""
-#: templates/web/base/admin/list_updates.html:38 templates/web/base/admin/report_edit.html:82 templates/web/base/admin/update_edit.html:51 templates/web/zurich/admin/report_edit-sdm.html:47 templates/web/zurich/admin/report_edit.html:61 templates/web/zurich/admin/update_edit.html:29
+#: templates/web/base/admin/list_updates.html:38 templates/web/base/admin/report_edit.html:64 templates/web/base/admin/update_edit.html:51 templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr ""
@@ -528,10 +592,14 @@ msgstr ""
msgid "Current state"
msgstr ""
-#: templates/web/base/admin/bodies.html:5 templates/web/base/admin/index.html:16
+#: templates/web/base/admin/bodies.html:5 templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834 templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5 templates/web/base/dashboard/index.html:7
msgid "Dashboard"
msgstr ""
@@ -540,7 +608,11 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
-#: templates/web/base/admin/bodies.html:27 templates/web/base/admin/body.html:177 templates/web/base/admin/body.html:81 templates/web/base/admin/category_edit.html:42 templates/web/base/admin/category_edit.html:90
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878 templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
+#: templates/web/base/admin/bodies.html:27 templates/web/base/admin/body.html:177 templates/web/base/admin/body.html:81 templates/web/base/admin/category_edit.html:42 templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr ""
@@ -552,7 +624,7 @@ msgstr ""
msgid "Details"
msgstr ""
-#: templates/web/base/admin/report_edit.html:20 templates/web/base/report/new/fill_in_details_form.html:62 templates/web/zurich/admin/report_edit-sdm.html:25 templates/web/zurich/admin/report_edit.html:25 templates/web/zurich/admin/report_edit.html:35
+#: templates/web/base/admin/report_edit.html:20 templates/web/base/report/new/fill_in_details_form.html:62 templates/web/zurich/admin/report_edit-sdm.html:27 templates/web/zurich/admin/report_edit.html:29 templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr ""
@@ -560,19 +632,20 @@ msgstr ""
msgid "Devolved"
msgstr ""
-#: templates/web/base/admin/edit-league.html:8
-msgid "Diligency prize league table"
+#: templates/web/zurich/admin/report_edit-sdm.html:50 templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
msgstr ""
-#: templates/web/base/auth/general.html:32 templates/web/fixmystreet/auth/general.html:33 templates/web/fixmystreet/report/new/form_user_loggedout.html:11 templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31 templates/web/base/report/new/fill_in_details_form.html:114 templates/web/base/report/update-form.html:87 templates/web/fixmystreet/report/new/form_user_loggedout.html:11 templates/web/fixmystreet/report/update-form.html:86
+msgid "Do you have a %s password?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:46 templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr ""
@@ -580,7 +653,7 @@ msgstr ""
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:60 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:32 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:30
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:14 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:32 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:30
msgid "Duplicate"
msgstr ""
@@ -592,7 +665,7 @@ msgid ""
" "
msgstr ""
-#: templates/web/base/admin/list_updates.html:42 templates/web/base/admin/problem_row.html:41 templates/web/base/admin/users.html:33 templates/web/zurich/admin/problem_row.html:42
+#: templates/web/base/admin/list_updates.html:42 templates/web/base/admin/problem_row.html:41 templates/web/base/admin/users.html:33 templates/web/zurich/admin/problem_row.html:48 templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr ""
@@ -600,7 +673,7 @@ msgstr ""
msgid "Edit body details"
msgstr ""
-#: templates/web/base/admin/report_edit.html:1 templates/web/zurich/admin/report_edit-sdm.html:1 templates/web/zurich/admin/report_edit-sdm.html:4 templates/web/zurich/admin/report_edit.html:1 templates/web/zurich/admin/report_edit.html:5
+#: templates/web/base/admin/report_edit.html:1 templates/web/zurich/admin/report_edit-sdm.html:1 templates/web/zurich/admin/report_edit-sdm.html:5 templates/web/zurich/admin/report_edit.html:1 templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
msgstr ""
@@ -612,15 +685,15 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr ""
-#: templates/web/base/admin/bodies.html:23 templates/web/base/admin/category_edit.html:88 templates/web/base/admin/flagged.html:38 templates/web/base/admin/users.html:16 templates/web/fixmystreet/auth/general.html:21 templates/web/zurich/admin/body-form.html:9 templates/web/zurich/admin/body.html:15 templates/web/zurich/auth/general.html:24 templates/web/zurich/auth/general.html:54
+#: templates/web/base/admin/bodies.html:23 templates/web/base/admin/category_edit.html:91 templates/web/base/admin/flagged.html:38 templates/web/base/admin/users.html:16 templates/web/base/auth/general.html:22 templates/web/zurich/admin/body-form.html:9 templates/web/zurich/admin/body.html:15 templates/web/zurich/auth/general.html:24 templates/web/zurich/auth/general.html:54
msgid "Email"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr ""
@@ -636,7 +709,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr ""
@@ -648,31 +721,31 @@ msgstr ""
msgid "Email me updates"
msgstr ""
-#: templates/web/base/admin/category_edit.html:31 templates/web/base/admin/report_edit.html:80 templates/web/base/admin/update_edit.html:33 templates/web/base/admin/user-form.html:20 templates/web/base/alert/updates.html:13 templates/web/base/report/display.html:42 templates/web/zurich/admin/body.html:47 templates/web/zurich/admin/report_edit-sdm.html:44 templates/web/zurich/admin/report_edit.html:57
+#: templates/web/base/admin/category_edit.html:31 templates/web/base/admin/report_edit.html:62 templates/web/base/admin/update_edit.html:33 templates/web/base/admin/user-form.html:20 templates/web/base/alert/updates.html:13 templates/web/base/report/display.html:42 templates/web/zurich/admin/body.html:47
msgid "Email:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -699,7 +772,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -711,7 +784,7 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr ""
-#: templates/web/base/around/postcode_form.html:1 templates/web/base/around/postcode_form.html:2 templates/web/fixmystreet/around/postcode_form.html:10 templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5 templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr ""
@@ -719,11 +792,11 @@ msgstr ""
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64 templates/web/base/report/new/fill_in_details_form.html:151 templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152 templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:63 templates/web/fixmystreet/report/new/form_user_loggedout.html:75 templates/web/fixmystreet/report/update-form.html:123 templates/web/zurich/auth/general.html:65
+#: templates/web/base/auth/general.html:60 templates/web/fixmystreet/report/new/form_user_loggedout.html:75 templates/web/fixmystreet/report/update-form.html:123 templates/web/zurich/auth/general.html:65
msgid "Enter a password"
msgstr ""
@@ -731,10 +804,14 @@ msgstr ""
msgid "Enter details of the problem"
msgstr ""
-#: templates/web/base/auth/token.html:5 templates/web/base/errors/generic.html:1 templates/web/base/errors/generic.html:3 templates/web/base/tokens/abuse.html:1 templates/web/base/tokens/abuse.html:3 templates/web/base/tokens/error.html:1 templates/web/base/tokens/error.html:3
+#: templates/web/base/errors/generic.html:1 templates/web/base/errors/generic.html:3 templates/web/base/tokens/abuse.html:1 templates/web/base/tokens/abuse.html:3 templates/web/base/tokens/error.html:1 templates/web/base/tokens/error.html:3
msgid "Error"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14 templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
msgstr ""
@@ -747,11 +824,15 @@ msgstr ""
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181 perllib/FixMyStreet/Cobrand/Zurich.pm:922 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
-#: templates/web/base/admin/category_edit.html:27 templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/category_edit.html:27 templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr ""
@@ -763,7 +844,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55 templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr ""
@@ -771,47 +852,22 @@ msgstr ""
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr ""
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr ""
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71 templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55 templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:54 templates/web/base/admin/report_edit.html:55 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:144 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:34 templates/web/fixmystreet/report/banner.html:12 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:32
+#: templates/web/base/admin/index.html:61 templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:24 templates/web/base/admin/report_blocks.html:9 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:144 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:34 templates/web/fixmystreet/report/banner.html:12 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:32
msgid "Fixed"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr ""
-#: templates/web/base/my/my.html:35 templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr ""
@@ -820,11 +876,11 @@ msgstr ""
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197 templates/web/base/admin/users.html:19
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281 templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -840,7 +896,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94 templates/web/base/admin/user-form.html:52
+#: templates/web/base/admin/report_edit.html:76 templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr ""
@@ -856,7 +912,15 @@ msgstr ""
msgid "Forgotten your password?"
msgstr ""
-#: templates/web/base/faq/faq-en-gb.html:1 templates/web/base/static/privacy.html:1 templates/web/base/static/privacy.html:2
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
+#: templates/web/base/faq/faq-en-gb.html:1 templates/web/base/faq/faq-en-gb.html:13 templates/web/base/faq/faq-en-gb.html:6 templates/web/base/open311/index.html:6 templates/web/base/static/privacy.html:8 templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr ""
@@ -876,7 +940,7 @@ msgstr ""
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/base/alert/_list.html:83 templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
@@ -884,15 +948,15 @@ msgstr ""
msgid "Glad to hear it’s been fixed!"
msgstr ""
-#: templates/web/base/alert/index.html:34 templates/web/base/around/postcode_form.html:8 templates/web/fixmystreet/around/postcode_form.html:21 templates/web/zurich/admin/stats.html:26
+#: templates/web/base/alert/index.html:34 templates/web/base/around/postcode_form.html:16 templates/web/base/reports/_list-filters.html:28 templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr ""
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -900,27 +964,27 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37 templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:50 templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30 templates/web/zurich/faq/faq-de-ch.html:1 templates/web/zurich/footer.html:21 templates/web/zurich/nav_over_content.html:8
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38 templates/web/zurich/faq/faq-de-ch.html:1 templates/web/zurich/footer.html:22 templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr ""
-#: templates/web/base/alert/_list.html:6 templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58 templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63 templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:63 templates/web/base/admin/report_edit.html:64 templates/web/base/admin/update_edit.html:28 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:11 templates/web/zurich/admin/report_edit.html:86 templates/web/zurich/admin/report_edit.html:90 templates/web/zurich/admin/stats.html:32 templates/web/zurich/admin/update_edit.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915 templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:17 templates/web/base/admin/report_blocks.html:26 templates/web/base/admin/update_edit.html:28 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:11 templates/web/zurich/admin/stats.html:32 templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
msgstr ""
@@ -932,7 +996,7 @@ msgstr ""
msgid "Hide pins"
msgstr ""
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr ""
@@ -948,7 +1012,7 @@ msgstr ""
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -968,7 +1032,7 @@ msgstr ""
msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
msgstr ""
-#: templates/web/base/admin/flagged.html:14 templates/web/base/admin/list_updates.html:6 templates/web/base/admin/reports.html:11 templates/web/zurich/admin/index-dm.html:21 templates/web/zurich/admin/index-sdm.html:19 templates/web/zurich/admin/list_updates.html:28 templates/web/zurich/admin/list_updates.html:7 templates/web/zurich/admin/reports.html:11
+#: templates/web/base/admin/flagged.html:14 templates/web/base/admin/list_updates.html:6 templates/web/base/admin/reports.html:11 templates/web/zurich/admin/index-dm.html:21 templates/web/zurich/admin/index-sdm.html:19 templates/web/zurich/admin/list_updates.html:24 templates/web/zurich/admin/list_updates.html:38 templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr ""
@@ -984,18 +1048,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1004,15 +1056,14 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19 templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59 templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1039,7 +1090,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr ""
@@ -1059,7 +1110,7 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144 templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:51 templates/web/fixmystreet/report/banner.html:19 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:8 templates/web/zurich/admin/report_edit.html:99 templates/web/zurich/report/banner.html:15
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199 perllib/FixMyStreet/Cobrand/Zurich.pm:963 templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:7 templates/web/fixmystreet/report/banner.html:19 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:8
msgid "In progress"
msgstr ""
@@ -1067,7 +1118,7 @@ msgstr ""
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1079,11 +1130,11 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1091,7 +1142,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr ""
@@ -1099,11 +1150,11 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:50 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:143 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:31 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:29
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:5 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:143 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:31 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:29
msgid "Investigating"
msgstr ""
@@ -1115,7 +1166,15 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
-#: templates/web/base/auth/general.html:44 templates/web/base/report/new/fill_in_details_form.html:131 templates/web/base/report/update-form.html:104 templates/web/fixmystreet/auth/general.html:47 templates/web/fixmystreet/report/new/form_user_loggedout.html:28 templates/web/fixmystreet/report/update-form.html:102 templates/web/zurich/auth/general.html:40
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
+#: templates/web/base/auth/general.html:44 templates/web/base/report/new/fill_in_details_form.html:132 templates/web/base/report/update-form.html:105 templates/web/fixmystreet/report/new/form_user_loggedout.html:28 templates/web/fixmystreet/report/update-form.html:102 templates/web/zurich/auth/general.html:40
msgid "Keep me signed in on this computer"
msgstr ""
@@ -1123,7 +1182,7 @@ msgstr ""
msgid "Last editor"
msgstr ""
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr ""
@@ -1151,7 +1210,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr ""
@@ -1163,11 +1222,11 @@ msgstr ""
msgid "MAP"
msgstr ""
-#: templates/web/base/js/translation_strings.html:45 templates/web/base/maps/google-ol.html:13
+#: templates/web/base/js/translation_strings.html:45
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1187,6 +1246,14 @@ msgstr ""
msgid "Message"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr ""
@@ -1207,15 +1274,15 @@ msgstr ""
msgid "More problems nearby"
msgstr ""
-#: templates/web/base/admin/bodies.html:21 templates/web/base/admin/body-form.html:18 templates/web/base/admin/flagged.html:16 templates/web/base/admin/flagged.html:37 templates/web/base/admin/list_updates.html:7 templates/web/base/admin/reports.html:13 templates/web/base/admin/users.html:15 templates/web/base/reports/index.html:20 templates/web/fixmystreet/auth/general.html:53 templates/web/fixmystreet/report/new/form_user_loggedin.html:9 templates/web/fixmystreet/report/new/form_user_loggedout.html:44 templates/web/fixmystreet/report/update-form.html:138 templates/web/zurich/admin/body-form.html:4 templates/web/zurich/auth/general.html:60 templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/admin/bodies.html:21 templates/web/base/admin/body-form.html:18 templates/web/base/admin/flagged.html:16 templates/web/base/admin/flagged.html:37 templates/web/base/admin/list_updates.html:7 templates/web/base/admin/reports.html:13 templates/web/base/admin/users.html:15 templates/web/base/auth/general.html:50 templates/web/base/reports/index.html:20 templates/web/fixmystreet/report/new/form_user_loggedin.html:9 templates/web/fixmystreet/report/new/form_user_loggedout.html:44 templates/web/fixmystreet/report/update-form.html:138 templates/web/zurich/admin/body-form.html:4 templates/web/zurich/auth/general.html:60 templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr ""
-#: templates/web/base/admin/report_edit.html:79 templates/web/base/admin/update_edit.html:32 templates/web/base/admin/user-form.html:18 templates/web/zurich/admin/report_edit-sdm.html:43 templates/web/zurich/admin/report_edit.html:56 templates/web/zurich/admin/stats.html:41
+#: templates/web/base/admin/report_edit.html:61 templates/web/base/admin/update_edit.html:32 templates/web/base/admin/user-form.html:18 templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1227,20 +1294,24 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442 perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434 perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr ""
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+msgid "Nearly done! Now check your email&hellip;"
+msgstr ""
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1249,11 +1320,11 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55 templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113 templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1261,8 +1332,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr ""
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1289,39 +1360,19 @@ msgstr ""
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
+#: templates/web/zurich/admin/template_edit.html:9 templates/web/zurich/admin/templates.html:26
+msgid "New template"
msgstr ""
#: templates/web/base/pagination.html:13
msgid "Next"
msgstr ""
-#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82 templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88 templates/web/base/admin/category_edit.html:4 templates/web/base/admin/list_updates.html:32 templates/web/base/admin/list_updates.html:34 templates/web/base/admin/list_updates.html:35 templates/web/base/admin/problem_row.html:20 templates/web/base/admin/report_edit.html:77 templates/web/base/admin/report_edit.html:93 templates/web/base/admin/update_edit.html:25 templates/web/base/questionnaire/creator_fixed.html:16 templates/web/base/questionnaire/index.html:44 templates/web/base/questionnaire/index.html:83 templates/web/fixmystreet/questionnaire/index.html:102 templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82 templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88 templates/web/base/admin/category_edit.html:4 templates/web/base/admin/list_updates.html:32 templates/web/base/admin/list_updates.html:34 templates/web/base/admin/list_updates.html:35 templates/web/base/admin/problem_row.html:20 templates/web/base/admin/report_edit.html:59 templates/web/base/admin/report_edit.html:75 templates/web/base/admin/update_edit.html:25 templates/web/base/questionnaire/creator_fixed.html:16 templates/web/base/questionnaire/index.html:53 templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr ""
@@ -1349,18 +1400,10 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138 templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17 templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr ""
-
-#: templates/web/base/around/on_map_list_items.html:14 templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1375,7 +1418,7 @@ msgstr ""
msgid "No supporters"
msgstr ""
-#: templates/web/base/admin/report_edit.html:41 templates/web/zurich/admin/report_edit-sdm.html:46 templates/web/zurich/admin/report_edit.html:60
+#: templates/web/base/admin/report_edit.html:41
msgid "None"
msgstr ""
@@ -1387,11 +1430,15 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:59 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:33 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:31
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:13 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:33 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:31
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188 perllib/FixMyStreet/Cobrand/Zurich.pm:937 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1403,7 +1450,7 @@ msgstr ""
msgid "Not reported to council"
msgstr ""
-#: templates/web/base/admin/body.html:71 templates/web/base/admin/category_edit.html:92 templates/web/zurich/admin/body.html:17
+#: templates/web/base/admin/body.html:71 templates/web/base/admin/category_edit.html:95 templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr ""
@@ -1411,7 +1458,7 @@ msgstr ""
msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
msgstr ""
-#: templates/web/base/admin/body.html:186 templates/web/base/admin/category_edit.html:49 templates/web/zurich/admin/body.html:53
+#: templates/web/base/admin/body.html:186 templates/web/base/admin/category_edit.html:52 templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr ""
@@ -1419,22 +1466,18 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/base/report/new/fill_in_details_form.html:113 templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
-#: templates/web/fixmystreet/report/update-form.html:85
+#: templates/web/base/report/update-form.html:86 templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1463,7 +1506,7 @@ msgstr ""
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138 templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:49 templates/web/base/admin/report_edit.html:50 templates/web/base/admin/update_edit.html:28 templates/web/base/dashboard/index.html:142 templates/web/base/report/update-form.html:30 templates/web/fixmystreet/report/update-form.html:28 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:7 templates/web/zurich/admin/report_edit.html:86 templates/web/zurich/admin/report_edit.html:88 templates/web/zurich/admin/update_edit.html:18 templates/web/zurich/report/banner.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176 perllib/FixMyStreet/Cobrand/Zurich.pm:909 templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:23 templates/web/base/admin/report_blocks.html:4 templates/web/base/admin/update_edit.html:28 templates/web/base/dashboard/index.html:142 templates/web/base/report/update-form.html:30 templates/web/fixmystreet/report/update-form.html:28 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:7 templates/web/zurich/admin/update_edit.html:18
msgid "Open"
msgstr ""
@@ -1471,10 +1514,6 @@ msgstr ""
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30 templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr ""
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1491,22 +1530,18 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58 templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33 templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061 perllib/FixMyStreet/App/Controller/Report/New.pm:666 perllib/FixMyStreet/App/Controller/Report/New.pm:667 perllib/FixMyStreet/DB/Result/Problem.pm:565 perllib/FixMyStreet/DB/Result/Problem.pm:575 perllib/FixMyStreet/DB/Result/Problem.pm:585 perllib/FixMyStreet/DB/Result/Problem.pm:597 perllib/FixMyStreet/DB/ResultSet/Problem.pm:378 perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084 perllib/FixMyStreet/App/Controller/Report/New.pm:673 perllib/FixMyStreet/App/Controller/Report/New.pm:674 perllib/FixMyStreet/DB/Result/Problem.pm:570 perllib/FixMyStreet/DB/Result/Problem.pm:580 perllib/FixMyStreet/DB/Result/Problem.pm:590 perllib/FixMyStreet/DB/Result/Problem.pm:602 perllib/FixMyStreet/DB/ResultSet/Problem.pm:397 perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr ""
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr ""
@@ -1519,15 +1554,15 @@ msgstr ""
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:56 templates/web/fixmystreet/report/new/form_user_loggedout.html:68 templates/web/fixmystreet/report/update-form.html:116 templates/web/zurich/auth/general.html:32 templates/web/zurich/auth/general.html:63
+#: templates/web/base/auth/general.html:53 templates/web/fixmystreet/report/new/form_user_loggedout.html:68 templates/web/fixmystreet/report/update-form.html:116 templates/web/zurich/auth/general.html:32 templates/web/zurich/auth/general.html:63
msgid "Password (optional)"
msgstr ""
-#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/change_password.html:25 templates/web/base/auth/general.html:36
msgid "Password:"
msgstr ""
@@ -1535,7 +1570,7 @@ msgstr ""
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1543,15 +1578,23 @@ msgstr ""
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291 templates/web/base/admin/report_edit.html:81 templates/web/base/report/new/fill_in_details_form.html:197 templates/web/zurich/admin/report_edit-sdm.html:46 templates/web/zurich/admin/report_edit.html:60 templates/web/zurich/admin/stats.html:39
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306 templates/web/base/admin/report_edit.html:63 templates/web/base/report/new/fill_in_details_form.html:198 templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66 templates/web/fixmystreet/report/update-form.html:59 templates/web/zurich/admin/index-dm.html:29 templates/web/zurich/admin/index-sdm.html:24 templates/web/zurich/admin/reports.html:16 templates/web/zurich/admin/stats.html:37 templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66 templates/web/fixmystreet/report/update-form.html:59 templates/web/zurich/admin/index-dm.html:29 templates/web/zurich/admin/index-sdm.html:24 templates/web/zurich/admin/reports.html:16 templates/web/zurich/admin/stats.html:37 templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr ""
-#: templates/web/base/questionnaire/index.html:71 templates/web/base/report/new/fill_in_details_form.html:84 templates/web/base/report/update-form.html:62 templates/web/fixmystreet/questionnaire/index.html:91
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80 templates/web/base/report/new/fill_in_details_form.html:84 templates/web/base/report/update-form.html:62
msgid "Photo:"
msgstr ""
@@ -1563,14 +1606,10 @@ msgstr ""
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:51 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:143 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:9 templates/web/zurich/admin/index-dm.html:9 templates/web/zurich/admin/report_edit.html:86 templates/web/zurich/admin/report_edit.html:89
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949 perllib/FixMyStreet/Cobrand/Zurich.pm:955 templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:6 templates/web/base/dashboard/index.html:142 templates/web/base/dashboard/index.html:143 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:9 templates/web/zurich/admin/index-dm.html:9
msgid "Planned"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr ""
@@ -1579,15 +1618,15 @@ msgstr ""
msgid "Please check the passwords and try again"
msgstr ""
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr ""
-#: templates/web/base/auth/general.html:14 templates/web/base/auth/general.html:8 templates/web/fixmystreet/auth/general.html:10 templates/web/fixmystreet/auth/general.html:16 templates/web/zurich/auth/general.html:3 templates/web/zurich/auth/general.html:9
+#: templates/web/base/auth/general.html:10 templates/web/base/auth/general.html:16 templates/web/zurich/auth/general.html:3 templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:343 perllib/FixMyStreet/App/Controller/Report/New.pm:876 perllib/FixMyStreet/App/Controller/Report/New.pm:925 perllib/FixMyStreet/DB/Result/Problem.pm:412 templates/web/base/js/translation_strings.html:9
+#: perllib/FixMyStreet/App/Controller/Admin.pm:343 perllib/FixMyStreet/App/Controller/Report/New.pm:883 perllib/FixMyStreet/App/Controller/Report/New.pm:948 perllib/FixMyStreet/DB/Result/Problem.pm:412 templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
msgstr ""
@@ -1595,14 +1634,14 @@ msgstr ""
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
#: templates/web/base/contact/blurb.html:2 templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -1610,7 +1649,7 @@ msgstr ""
msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:346 perllib/FixMyStreet/DB/Result/Comment.pm:125 templates/web/base/js/translation_strings.html:2
+#: perllib/FixMyStreet/App/Controller/Admin.pm:346 perllib/FixMyStreet/DB/Result/Comment.pm:126 templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr ""
@@ -1618,15 +1657,15 @@ msgstr ""
msgid "Please enter a password"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113 perllib/FixMyStreet/DB/Result/Problem.pm:395 templates/web/base/js/translation_strings.html:3
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114 perllib/FixMyStreet/DB/Result/Problem.pm:395 templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048 perllib/FixMyStreet/App/Controller/Admin.pm:345 perllib/FixMyStreet/App/Controller/Admin.pm:995 perllib/FixMyStreet/DB/Result/User.pm:127 templates/web/base/js/translation_strings.html:12 templates/web/base/js/translation_strings.html:16
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084 perllib/FixMyStreet/App/Controller/Admin.pm:1137 perllib/FixMyStreet/App/Controller/Admin.pm:345 perllib/FixMyStreet/DB/Result/User.pm:127 templates/web/base/js/translation_strings.html:12 templates/web/base/js/translation_strings.html:16
msgid "Please enter a valid email"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Alert.pm:346 perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Alert.pm:346 perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr ""
@@ -1634,11 +1673,11 @@ msgstr ""
msgid "Please enter some details"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112 perllib/FixMyStreet/DB/Result/User.pm:124 templates/web/base/auth/general.html:13 templates/web/base/auth/general.html:8 templates/web/base/js/translation_strings.html:11 templates/web/base/js/translation_strings.html:15 templates/web/fixmystreet/auth/general.html:10 templates/web/fixmystreet/auth/general.html:15 templates/web/zurich/auth/general.html:3 templates/web/zurich/auth/general.html:8
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113 perllib/FixMyStreet/DB/Result/User.pm:124 templates/web/base/auth/general.html:10 templates/web/base/auth/general.html:15 templates/web/base/js/translation_strings.html:11 templates/web/base/js/translation_strings.html:15 templates/web/zurich/auth/general.html:3 templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr ""
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7 templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7 templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr ""
@@ -1650,7 +1689,7 @@ msgstr ""
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111 perllib/FixMyStreet/DB/Result/Comment.pm:122 perllib/FixMyStreet/DB/Result/Problem.pm:406 perllib/FixMyStreet/DB/Result/User.pm:120 templates/web/base/js/translation_strings.html:6
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112 perllib/FixMyStreet/DB/Result/Comment.pm:123 perllib/FixMyStreet/DB/Result/Problem.pm:406 perllib/FixMyStreet/DB/Result/User.pm:120 templates/web/base/js/translation_strings.html:6
msgid "Please enter your name"
msgstr ""
@@ -1682,7 +1721,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -1702,18 +1741,22 @@ msgstr ""
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124 perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124 perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+msgid "Please select a body."
+msgstr ""
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -1722,19 +1765,15 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177 perllib/FixMyStreet/App/Controller/Photo.pm:187 perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117 perllib/FixMyStreet/App/Model/PhotoSet.pm:145 perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr ""
@@ -1742,7 +1781,7 @@ msgstr ""
msgid "Please write your update here"
msgstr ""
-#: templates/web/base/contact/index.html:100 templates/web/base/report/update-form.html:109 templates/web/base/report/update-form.html:131 templates/web/base/report/update-form.html:72 templates/web/fixmystreet/contact/index.html:113 templates/web/fixmystreet/report/update-form.html:124 templates/web/fixmystreet/report/update-form.html:71 templates/web/fixmystreet/report/update-form.html:97
+#: templates/web/base/contact/index.html:100 templates/web/base/report/update-form.html:110 templates/web/base/report/update-form.html:132 templates/web/base/report/update-form.html:72 templates/web/fixmystreet/contact/index.html:113 templates/web/fixmystreet/report/update-form.html:124 templates/web/fixmystreet/report/update-form.html:71 templates/web/fixmystreet/report/update-form.html:97
msgid "Post"
msgstr ""
@@ -1758,19 +1797,27 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
-#: templates/web/base/admin/body.html:202 templates/web/base/admin/body.html:85 templates/web/base/admin/category_edit.html:45 templates/web/base/admin/report_edit.html:95
+#: templates/web/base/faq/faq-en-gb.html:7 templates/web/base/open311/index.html:7 templates/web/base/static/privacy.html:1 templates/web/base/static/privacy.html:2 templates/web/base/static/privacy.html:9 templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
+#: templates/web/base/admin/body.html:202 templates/web/base/admin/body.html:85 templates/web/base/admin/category_edit.html:45 templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59 templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr ""
@@ -1786,11 +1833,11 @@ msgstr ""
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47 templates/web/zurich/admin/index.html:9
+#: templates/web/base/admin/index.html:46 templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr ""
@@ -1806,11 +1853,11 @@ msgstr ""
msgid "Problems in this area"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:4 templates/web/fixmystreet/report/display.html:43
+#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:3 templates/web/fixmystreet/report/display.html:41
+#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr ""
@@ -1818,11 +1865,11 @@ msgstr ""
msgid "Problems recently reported fixed on FixMyStreet"
msgstr ""
-#: templates/web/base/alert/_list.html:19 templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139 perllib/FixMyStreet/Cobrand/UK.pm:207
+#: perllib/FixMyStreet/Cobrand/Default.pm:642 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139 perllib/FixMyStreet/Cobrand/UK.pm:207
msgid "Problems within %s"
msgstr ""
@@ -1830,18 +1877,15 @@ msgstr ""
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0 templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
+msgid "Problems within %s, %s"
msgstr ""
-#: templates/web/base/alert/_list.html:40 templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -1854,27 +1898,23 @@ msgstr ""
msgid "Provide an update"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155 templates/web/base/report/update-form.html:128 templates/web/fixmystreet/report/new/form_user_loggedout.html:71 templates/web/fixmystreet/report/update-form.html:119
+#: templates/web/base/report/new/fill_in_details_form.html:156 templates/web/base/report/update-form.html:129 templates/web/fixmystreet/report/new/form_user_loggedout.html:71 templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195 templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245 templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77 templates/web/zurich/admin/stats.html:38
+#: templates/web/zurich/admin/report_edit.html:121 templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
-#: templates/web/base/questionnaire/completed.html:1 templates/web/base/questionnaire/index.html:0 templates/web/base/questionnaire/index.html:14 templates/web/base/questionnaire/index.html:4 templates/web/fixmystreet/questionnaire/index.html:0 templates/web/fixmystreet/questionnaire/index.html:15 templates/web/fixmystreet/questionnaire/index.html:33 templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/completed.html:1 templates/web/base/questionnaire/index.html:0 templates/web/base/questionnaire/index.html:12 templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr ""
@@ -1890,7 +1930,7 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21 templates/web/base/around/display_location.html:1 templates/web/base/around/display_location.html:3 templates/web/base/report/display.html:50 templates/web/base/reports/_rss.html:1 templates/web/fixmystreet/alert/_list.html:22 templates/web/fixmystreet/alert/updates.html:9 templates/web/fixmystreet/report/display.html:58
+#: templates/web/base/alert/_list.html:22 templates/web/base/around/display_location.html:1 templates/web/base/around/display_location.html:3 templates/web/base/report/display.html:50 templates/web/base/reports/_rss.html:1 templates/web/fixmystreet/alert/updates.html:9 templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
msgstr ""
@@ -1910,7 +1950,7 @@ msgstr ""
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21 templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -1918,7 +1958,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138 perllib/FixMyStreet/Cobrand/UK.pm:214
+#: perllib/FixMyStreet/Cobrand/Default.pm:643 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138 perllib/FixMyStreet/Cobrand/UK.pm:214
msgid "RSS feed of problems within %s"
msgstr ""
@@ -1938,15 +1978,16 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0 templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+msgid "Recent local problems, %s"
msgstr ""
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30 templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr ""
@@ -1954,19 +1995,23 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110 templates/web/base/admin/update_edit.html:62 templates/web/zurich/admin/update_edit.html:35
+#: templates/web/base/admin/report_edit.html:92 templates/web/base/admin/update_edit.html:62 templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22 templates/web/fixmystreet/header_logo.html:2 templates/web/zurich/footer.html:17 templates/web/zurich/nav_over_content.html:4
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26 templates/web/fixmystreet/header_logo.html:2 templates/web/zurich/footer.html:18 templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
@@ -1974,7 +2019,7 @@ msgstr ""
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -1982,55 +2027,51 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11 templates/web/fixmystreet/around/intro.html:1 templates/web/zurich/around/intro.html:1
+#: templates/web/base/around/intro.html:1 templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580 templates/web/base/contact/index.html:50 templates/web/fixmystreet/contact/index.html:65
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585 templates/web/base/contact/index.html:50 templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
-#: templates/web/base/admin/questionnaire.html:5 templates/web/base/questionnaire/index.html:53 templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/admin/questionnaire.html:5 templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603 templates/web/base/contact/index.html:52 templates/web/fixmystreet/contact/index.html:67
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608 templates/web/base/contact/index.html:52 templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58 templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2038,11 +2079,15 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1 templates/web/base/around/around_index.html:3 templates/web/base/js/translation_strings.html:41 templates/web/base/report/new/fill_in_details.html:0 templates/web/base/report/new/fill_in_details.html:5 templates/web/fixmystreet/around/around_index.html:2 templates/web/zurich/report/new/fill_in_details_form.html:2
+#: templates/web/zurich/admin/report_edit-sdm.html:36 templates/web/zurich/admin/report_edit.html:55
+msgid "Reported:"
+msgstr ""
+
+#: templates/web/base/around/index.html:2 templates/web/base/js/translation_strings.html:41 templates/web/base/report/new/fill_in_details.html:0 templates/web/base/report/new/fill_in_details.html:5 templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193 perllib/FixMyStreet/Cobrand/Zurich.pm:294 templates/web/zurich/header.html:60
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277 perllib/FixMyStreet/Cobrand/Zurich.pm:384 templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2054,18 +2099,18 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1 templates/web/zurich/admin/template_edit.html:4 templates/web/zurich/admin/templates.html:1 templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2078,19 +2123,23 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392 perllib/FixMyStreet/App/Controller/Admin.pm:1403 templates/web/base/admin/report_edit.html:106 templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495 perllib/FixMyStreet/App/Controller/Admin.pm:1500 templates/web/base/admin/report_edit.html:88 templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392 templates/web/base/admin/report_edit.html:107 templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495 templates/web/base/admin/report_edit.html:89 templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
-#: templates/web/base/js/translation_strings.html:46
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:46 templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
-#: templates/web/base/admin/body.html:208 templates/web/base/admin/category_edit.html:81 templates/web/zurich/admin/body.html:59
+#: templates/web/base/admin/body.html:208 templates/web/base/admin/category_edit.html:84 templates/web/zurich/admin/body.html:59 templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2102,7 +2151,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2130,19 +2179,23 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8 templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+msgid "Sent report back"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89 templates/web/zurich/admin/stats.html:45
+#: templates/web/base/admin/report_edit.html:71 templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2150,7 +2203,7 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192 templates/web/base/report/update-form.html:157 templates/web/fixmystreet/report/new/form_user_loggedin.html:23 templates/web/fixmystreet/report/new/form_user_loggedout.html:59 templates/web/fixmystreet/report/update-form.html:146
+#: templates/web/base/report/new/fill_in_details_form.html:193 templates/web/base/report/update-form.html:158 templates/web/fixmystreet/report/new/form_user_loggedin.html:23 templates/web/fixmystreet/report/new/form_user_loggedout.html:59 templates/web/fixmystreet/report/update-form.html:146
msgid "Show my name publicly"
msgstr ""
@@ -2162,26 +2215,18 @@ msgstr ""
msgid "Show pins"
msgstr ""
-#: templates/web/base/auth/general.html:3 templates/web/base/auth/general.html:49 templates/web/fixmystreet/auth/general.html:4 templates/web/fixmystreet/auth/general.html:43 templates/web/fixmystreet/auth/general.html:64 templates/web/zurich/auth/general.html:18 templates/web/zurich/auth/general.html:35
+#: templates/web/base/auth/general.html:3 templates/web/base/auth/general.html:40 templates/web/base/auth/general.html:61 templates/web/zurich/auth/general.html:18 templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr ""
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr ""
-
-#: templates/web/base/auth/general.html:1 templates/web/fixmystreet/auth/general.html:1 templates/web/zurich/auth/general.html:1
+#: templates/web/base/auth/general.html:1 templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr ""
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30 templates/web/zurich/auth/sign_out.html:1
+#: templates/web/base/auth/sign_out.html:1 templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2196,7 +2241,8 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
-#: perllib/FixMyStreet/App/View/Email.pm:32 perllib/FixMyStreet/App/View/Web.pm:43
+#. ('Optional comment for translator')
+#: perllib/FixMyStreet/App/View/Email.pm:32 perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2204,18 +2250,26 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214 perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37 perllib/FixMyStreet/Geocode/FixaMinGata.pm:56 perllib/FixMyStreet/Geocode/Google.pm:47 perllib/FixMyStreet/Geocode/OSM.pm:48
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221 perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37 perllib/FixMyStreet/Geocode/FixaMinGata.pm:56 perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
-#: perllib/FixMyStreet/Geocode/Bing.pm:34 perllib/FixMyStreet/Geocode/Google.pm:44 perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Bing.pm:34 perllib/FixMyStreet/Geocode/Google.pm:45 perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2224,11 +2278,11 @@ msgstr ""
msgid "State"
msgstr ""
-#: templates/web/base/admin/report_edit.html:47 templates/web/base/admin/update_edit.html:27 templates/web/base/report/update-form.html:28 templates/web/zurich/admin/report_edit-sdm.html:53 templates/web/zurich/admin/report_edit.html:84 templates/web/zurich/admin/update_edit.html:17
+#: templates/web/base/admin/report_edit.html:47 templates/web/base/admin/update_edit.html:27 templates/web/base/report/update-form.html:28 templates/web/zurich/admin/report_edit-sdm.html:73 templates/web/zurich/admin/report_edit.html:101 templates/web/zurich/admin/report_edit.html:155 templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198 perllib/FixMyStreet/Cobrand/Zurich.pm:308 templates/web/base/admin/stats.html:1 templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282 perllib/FixMyStreet/Cobrand/Zurich.pm:387 templates/web/base/admin/stats.html:1 templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2240,7 +2294,11 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25 templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2252,23 +2310,23 @@ msgstr ""
msgid "Subject"
msgstr ""
-#: templates/web/base/admin/report_edit.html:19 templates/web/base/contact/index.html:88 templates/web/base/report/new/fill_in_details_form.html:53 templates/web/zurich/admin/report_edit.html:34
+#: templates/web/base/admin/report_edit.html:19 templates/web/base/contact/index.html:88 templates/web/base/report/new/fill_in_details_form.html:53 templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
-#: templates/web/base/questionnaire/creator_fixed.html:19 templates/web/base/report/new/fill_in_details_form.html:136 templates/web/base/report/new/fill_in_details_form.html:158 templates/web/base/report/new/fill_in_details_form.html:96 templates/web/fixmystreet/report/new/form_user_loggedin.html:36 templates/web/fixmystreet/report/new/form_user_loggedout.html:23 templates/web/fixmystreet/report/new/form_user_loggedout.html:76 templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/base/questionnaire/creator_fixed.html:19 templates/web/base/report/new/fill_in_details_form.html:137 templates/web/base/report/new/fill_in_details_form.html:159 templates/web/base/report/new/fill_in_details_form.html:96 templates/web/fixmystreet/report/new/form_user_loggedin.html:36 templates/web/fixmystreet/report/new/form_user_loggedout.html:23 templates/web/fixmystreet/report/new/form_user_loggedout.html:76 templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113 templates/web/base/admin/update_edit.html:65 templates/web/base/admin/user-form.html:56 templates/web/zurich/admin/report_edit-sdm.html:64 templates/web/zurich/admin/report_edit.html:221 templates/web/zurich/admin/update_edit.html:38
+#: templates/web/base/admin/report_edit.html:95 templates/web/base/admin/update_edit.html:65 templates/web/base/admin/user-form.html:56 templates/web/zurich/admin/report_edit-sdm.html:137 templates/web/zurich/admin/report_edit.html:268 templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88 templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:6 templates/web/zurich/admin/index-dm.html:23 templates/web/zurich/admin/index-dm.html:6 templates/web/zurich/admin/index-sdm.html:21 templates/web/zurich/admin/report_edit.html:86 templates/web/zurich/admin/report_edit.html:87 templates/web/zurich/admin/reports.html:13 templates/web/zurich/report/banner.html:9
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171 perllib/FixMyStreet/Cobrand/Zurich.pm:902 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:6 templates/web/zurich/admin/index-dm.html:23 templates/web/zurich/admin/index-dm.html:6 templates/web/zurich/admin/index-sdm.html:21 templates/web/zurich/admin/reports.html:13
msgid "Submitted"
msgstr ""
@@ -2276,11 +2334,11 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97 templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191 perllib/FixMyStreet/Cobrand/Zurich.pm:293 templates/web/base/admin/bodies.html:25 templates/web/base/admin/index.html:1 templates/web/zurich/admin/index-dm.html:1 templates/web/zurich/admin/index-sdm.html:1 templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12 templates/web/zurich/header.html:57
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275 perllib/FixMyStreet/Cobrand/Zurich.pm:383 templates/web/base/admin/bodies.html:25 templates/web/base/admin/index.html:1 templates/web/base/status/index.html:1 templates/web/base/status/index.html:3 templates/web/zurich/admin/index-dm.html:1 templates/web/zurich/admin/index-sdm.html:1 templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13 templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2288,7 +2346,7 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2296,7 +2354,15 @@ msgstr ""
msgid "Survey Results"
msgstr ""
-#: templates/web/base/admin/list_updates.html:12 templates/web/zurich/admin/list_updates.html:10 templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394 templates/web/zurich/header.html:77
+msgid "Templates"
+msgstr ""
+
+#: templates/web/base/admin/list_updates.html:12 templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -2304,7 +2370,7 @@ msgstr ""
msgid "Text only version"
msgstr ""
-#: templates/web/base/admin/update_edit.html:20 templates/web/zurich/admin/update_edit.html:12
+#: templates/web/base/admin/update_edit.html:20 templates/web/zurich/admin/template_edit.html:24 templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2324,7 +2390,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2332,7 +2398,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2348,19 +2414,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -2398,27 +2464,15 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1 templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3 templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60 perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60 perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -2434,10 +2488,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -2458,20 +2508,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -2486,7 +2524,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14 templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -2494,7 +2532,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -2504,19 +2542,19 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
-#: templates/web/base/reports/_problem-list.html:15
+#: templates/web/base/around/on_map_list_items.html:12 templates/web/base/my/_problem-list.html:8 templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136 perllib/FixMyStreet/App/Controller/Dashboard.pm:59
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137 perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762 perllib/FixMyStreet/App/Controller/Report/Update.pm:134 templates/web/base/auth/general.html:23 templates/web/fixmystreet/auth/general.html:25 templates/web/zurich/auth/general.html:28
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769 perllib/FixMyStreet/App/Controller/Report/Update.pm:134 templates/web/base/auth/general.html:26 templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -2528,7 +2566,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -2566,15 +2604,15 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902 perllib/FixMyStreet/App/Controller/Report/New.pm:972 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142 perllib/FixMyStreet/Cobrand/UK.pm:43
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925 perllib/FixMyStreet/App/Controller/Report/New.pm:995 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142 perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
msgstr ""
@@ -2586,7 +2624,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -2610,51 +2648,59 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131 perllib/FixMyStreet/Cobrand/Zurich.pm:132 templates/web/zurich/report/_main.html:14
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168 perllib/FixMyStreet/Cobrand/Zurich.pm:169 templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194 templates/web/base/admin/timeline.html:1
+#: templates/web/zurich/admin/report_edit-sdm.html:123 templates/web/zurich/admin/report_edit-sdm.html:76 templates/web/zurich/admin/report_edit.html:104 templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278 templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
-#: templates/web/base/admin/flagged.html:15 templates/web/base/admin/reports.html:12
+#: templates/web/base/admin/flagged.html:15 templates/web/base/admin/reports.html:12 templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55 templates/web/base/admin/questionnaire.html:24 templates/web/base/admin/stats.html:24 templates/web/base/admin/stats.html:43 templates/web/zurich/admin/stats.html:30
+#: templates/web/base/admin/index.html:61 templates/web/base/admin/questionnaire.html:24 templates/web/base/admin/stats.html:24 templates/web/base/admin/stats.html:43 templates/web/zurich/admin/stats.html:30
msgid "Total"
msgstr ""
@@ -2666,11 +2712,11 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:59 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:33 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:31
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:12 templates/web/base/report/update-form.html:30 templates/web/base/report/update-form.html:33 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:31
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48 templates/web/base/admin/report_edit.html:64 templates/web/base/admin/update_edit.html:28 templates/web/zurich/admin/report_edit-sdm.html:45 templates/web/zurich/admin/report_edit.html:58 templates/web/zurich/admin/update_edit.html:18
+#: templates/web/base/admin/report_blocks.html:1 templates/web/base/admin/report_blocks.html:19 templates/web/base/admin/update_edit.html:28 templates/web/zurich/admin/report_edit-sdm.html:64 templates/web/zurich/admin/report_edit.html:92 templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -2686,7 +2732,7 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103 perllib/FixMyStreet/App/Controller/Report.pm:109 perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -2706,11 +2752,11 @@ msgstr ""
msgid "Update below added by %s at %s"
msgstr ""
-#: templates/web/base/admin/body-form.html:240 templates/web/zurich/admin/body-form.html:51
+#: templates/web/base/admin/body-form.html:240 templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -2742,15 +2788,15 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014 perllib/FixMyStreet/App/Controller/Admin.pm:1058 perllib/FixMyStreet/App/Controller/Admin.pm:808 perllib/FixMyStreet/App/Controller/Admin.pm:956 perllib/FixMyStreet/Cobrand/Zurich.pm:556 perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045 perllib/FixMyStreet/App/Controller/Admin.pm:1103 perllib/FixMyStreet/App/Controller/Admin.pm:1147 perllib/FixMyStreet/App/Controller/Admin.pm:822 perllib/FixMyStreet/Cobrand/Zurich.pm:771 perllib/FixMyStreet/Cobrand/Zurich.pm:796 perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
-#: templates/web/base/admin/list_updates.html:2 templates/web/base/report/update.html:3 templates/web/fixmystreet/report/update.html:5 templates/web/zurich/admin/list_updates.html:24 templates/web/zurich/report/updates.html:2
+#: templates/web/base/admin/list_updates.html:2 templates/web/base/report/update.html:3 templates/web/fixmystreet/report/update.html:5 templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -2758,23 +2804,24 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0 templates/web/base/report/display.html:5 templates/web/fixmystreet/report/display.html:0 templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+msgid "Updates to this problem, %s"
msgstr ""
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30 templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48 templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -2782,15 +2829,15 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196 perllib/FixMyStreet/Cobrand/Zurich.pm:307 templates/web/base/admin/flagged.html:29 templates/web/zurich/header.html:69
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280 perllib/FixMyStreet/Cobrand/Zurich.pm:399 templates/web/base/admin/flagged.html:29 templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374 perllib/FixMyStreet/App/Controller/Admin.pm:404 perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382 perllib/FixMyStreet/App/Controller/Admin.pm:412 perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
-#: templates/web/base/admin/report_edit.html:18 templates/web/base/admin/update_edit.html:18 templates/web/zurich/admin/report_edit-sdm.html:21 templates/web/zurich/admin/report_edit.html:20 templates/web/zurich/admin/update_edit.html:10
+#: templates/web/base/admin/report_edit.html:18 templates/web/base/admin/update_edit.html:18 templates/web/zurich/admin/report_edit-sdm.html:21 templates/web/zurich/admin/report_edit.html:22 templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -2810,15 +2857,15 @@ msgstr ""
msgid "Wards of this council"
msgstr ""
-#: templates/web/base/alert/choose.html:6 templates/web/base/around/around_index.html:16 templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/alert/choose.html:6 templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -2830,7 +2877,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -2854,11 +2901,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87 templates/web/zurich/admin/body.html:18
+#: templates/web/base/admin/category_edit.html:90 templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -2866,7 +2917,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -2874,15 +2925,19 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192 perllib/FixMyStreet/Cobrand/Zurich.pm:932 templates/web/zurich/admin/header.html:1 templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78 templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -2898,7 +2953,7 @@ msgstr ""
msgid "Year"
msgstr ""
-#: templates/web/base/admin/bodies.html:66 templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82 templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88 templates/web/base/admin/category_edit.html:5 templates/web/base/admin/flagged.html:47 templates/web/base/admin/list_updates.html:32 templates/web/base/admin/list_updates.html:34 templates/web/base/admin/list_updates.html:35 templates/web/base/admin/problem_row.html:20 templates/web/base/admin/report_edit.html:76 templates/web/base/admin/report_edit.html:93 templates/web/base/admin/update_edit.html:24 templates/web/base/admin/users.html:31 templates/web/base/questionnaire/creator_fixed.html:14 templates/web/base/questionnaire/index.html:42 templates/web/base/questionnaire/index.html:81 templates/web/fixmystreet/questionnaire/index.html:100 templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/admin/bodies.html:66 templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82 templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88 templates/web/base/admin/category_edit.html:5 templates/web/base/admin/flagged.html:47 templates/web/base/admin/list_updates.html:32 templates/web/base/admin/list_updates.html:34 templates/web/base/admin/list_updates.html:35 templates/web/base/admin/problem_row.html:20 templates/web/base/admin/report_edit.html:58 templates/web/base/admin/report_edit.html:75 templates/web/base/admin/update_edit.html:24 templates/web/base/admin/users.html:31 templates/web/base/questionnaire/creator_fixed.html:14 templates/web/base/questionnaire/index.html:51 templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr ""
@@ -2953,7 +3008,7 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68 templates/web/base/report/new/fill_in_details_form.html:75 templates/web/fixmystreet/questionnaire/index.html:88 templates/web/fixmystreet/report/new/fill_in_details_form.html:73 templates/web/zurich/report/new/fill_in_details_form.html:58
+#: templates/web/base/questionnaire/index.html:77 templates/web/base/report/new/fill_in_details_form.html:75 templates/web/fixmystreet/report/new/fill_in_details_form.html:73
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -2961,6 +3016,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4 templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
msgstr ""
@@ -2977,15 +3036,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -2996,27 +3051,23 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr ""
-#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15 templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0 templates/web/fixmystreet/my/my.html:15 templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15 templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr ""
-#: templates/web/fixmystreet/alert/_list.html:89 templates/web/fixmystreet/alert/updates.html:19 templates/web/fixmystreet/alert/updates.html:22 templates/web/fixmystreet/contact/index.html:91 templates/web/fixmystreet/report/display.html:62 templates/web/fixmystreet/report/display.html:64 templates/web/fixmystreet/report/new/form_user_loggedin.html:3 templates/web/fixmystreet/report/new/form_user_loggedout.html:1 templates/web/fixmystreet/report/update-form.html:76 templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/base/alert/_list.html:89 templates/web/fixmystreet/alert/updates.html:19 templates/web/fixmystreet/alert/updates.html:22 templates/web/fixmystreet/contact/index.html:91 templates/web/fixmystreet/report/display.html:62 templates/web/fixmystreet/report/display.html:64 templates/web/fixmystreet/report/new/form_user_loggedin.html:3 templates/web/fixmystreet/report/new/form_user_loggedout.html:1 templates/web/fixmystreet/report/update-form.html:76 templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27 templates/web/fixmystreet/report/update-form.html:82 templates/web/zurich/auth/general.html:30 templates/web/zurich/auth/general.html:58
+#: templates/web/base/auth/general.html:28 templates/web/fixmystreet/report/update-form.html:82 templates/web/zurich/auth/general.html:30 templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr ""
-
-#: templates/web/base/alert/_list.html:92 templates/web/base/report/new/fill_in_details_form.html:106 templates/web/base/report/update-form.html:81
+#: templates/web/base/report/new/fill_in_details_form.html:106 templates/web/base/report/update-form.html:81
msgid "Your email:"
msgstr ""
@@ -3024,15 +3075,15 @@ msgstr ""
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54 templates/web/fixmystreet/contact/index.html:84 templates/web/fixmystreet/report/new/form_user_loggedin.html:18 templates/web/fixmystreet/report/new/form_user_loggedout.html:54 templates/web/fixmystreet/report/update-form.html:142 templates/web/zurich/auth/general.html:61 templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/base/auth/general.html:51 templates/web/fixmystreet/contact/index.html:84 templates/web/fixmystreet/report/new/form_user_loggedin.html:18 templates/web/fixmystreet/report/new/form_user_loggedout.html:54 templates/web/fixmystreet/report/update-form.html:142 templates/web/zurich/auth/general.html:61 templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59 templates/web/base/contact/index.html:73 templates/web/base/report/new/fill_in_details_form.html:185 templates/web/base/report/update-form.html:151
+#: templates/web/base/contact/index.html:73 templates/web/base/report/new/fill_in_details_form.html:186 templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:42 templates/web/fixmystreet/report/new/form_user_loggedout.html:22 templates/web/fixmystreet/report/update-form.html:96 templates/web/zurich/auth/general.html:34
+#: templates/web/base/auth/general.html:39 templates/web/fixmystreet/report/new/form_user_loggedout.html:22 templates/web/fixmystreet/report/update-form.html:96 templates/web/zurich/auth/general.html:34
msgid "Your password"
msgstr ""
@@ -3040,19 +3091,15 @@ msgstr ""
msgid "Your password has been changed"
msgstr ""
-#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27 templates/web/fixmystreet/report/new/form_user_loggedout.html:63 templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27 templates/web/fixmystreet/report/new/form_user_loggedout.html:63 templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr ""
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3060,19 +3107,27 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:3
+msgid "all reports"
+msgstr ""
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:5
+msgid "closed reports"
+msgstr ""
+
#: templates/web/base/reports/body.html:6 templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:32 templates/web/zurich/admin/report_edit-sdm.html:40 templates/web/zurich/admin/report_edit.html:54
+#: templates/web/base/admin/report_edit.html:32
msgid "didn't use map"
msgstr ""
-#: templates/web/base/alert/index.html:33 templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/alert/index.html:33 templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3080,15 +3135,19 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34 templates/web/zurich/admin/index.html:5
+#: templates/web/base/reports/_list-filters.html:6
+msgid "fixed reports"
+msgstr ""
+
+#: templates/web/base/admin/index.html:33 templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr ""
-#: templates/web/fixmystreet/report/_item.html:17 templates/web/zurich/report/_item.html:16
+#: templates/web/base/report/_item.html:17 templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr ""
@@ -3132,11 +3191,11 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130 templates/web/base/admin/questionnaire.html:15 templates/web/base/admin/questionnaire.html:16
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129 templates/web/base/admin/questionnaire.html:15 templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
-#: templates/web/base/alert/_list.html:87 templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr ""
@@ -3144,7 +3203,7 @@ msgstr ""
msgid "or locate me automatically"
msgstr ""
-#: templates/web/base/admin/report_edit.html:28 templates/web/base/admin/report_edit.html:30 templates/web/zurich/admin/report_edit-sdm.html:27 templates/web/zurich/admin/report_edit-sdm.html:29 templates/web/zurich/admin/report_edit-sdm.html:36 templates/web/zurich/admin/report_edit-sdm.html:38 templates/web/zurich/admin/report_edit.html:27 templates/web/zurich/admin/report_edit.html:29 templates/web/zurich/admin/report_edit.html:38 templates/web/zurich/admin/report_edit.html:40 templates/web/zurich/admin/report_edit.html:50 templates/web/zurich/admin/report_edit.html:52
+#: templates/web/base/admin/report_edit.html:28 templates/web/base/admin/report_edit.html:30 templates/web/zurich/admin/report_edit-sdm.html:30 templates/web/zurich/admin/report_edit-sdm.html:32 templates/web/zurich/admin/report_edit-sdm.html:53 templates/web/zurich/admin/report_edit-sdm.html:55 templates/web/zurich/admin/report_edit.html:32 templates/web/zurich/admin/report_edit.html:34 templates/web/zurich/admin/report_edit.html:48 templates/web/zurich/admin/report_edit.html:50 templates/web/zurich/admin/report_edit.html:72 templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3156,7 +3215,7 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59 templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64 templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3168,15 +3227,19 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
-#: templates/web/base/admin/report_edit.html:32 templates/web/zurich/admin/report_edit-sdm.html:40 templates/web/zurich/admin/report_edit.html:54
+#: templates/web/base/reports/_list-filters.html:4
+msgid "unfixed reports"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:32
msgid "used map"
msgstr ""
@@ -3199,7 +3262,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -3213,7 +3276,7 @@ msgid_plural "%d supporters"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -3234,7 +3297,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -3255,7 +3318,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
diff --git a/locale/ar.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/ar.UTF-8/LC_MESSAGES/FixMyStreet.po
index 639319418..f109312a7 100644
--- a/locale/ar.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/ar.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -5,24 +5,25 @@
#
# Translators:
# Abdullah Aldebas <demo@adebas.net>, 2015
+# Khaled Saleem Baleesh <Kbaleesh@gmail.com>, 2015
# Omar Duhaiby <3omarz@gmail.com>, 2015
# Turki Alhajjaji <thugrh@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
-"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Arabic (http://www.transifex.com/projects/p/fixmystreet/language/ar/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-10-22 20:28+0000\n"
+"Last-Translator: Khaled Saleem Baleesh <Kbaleesh@gmail.com>\n"
+"Language-Team: Arabic (http://www.transifex.com/mysociety/fixmystreet/language/ar/)\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "Ùˆ"
@@ -33,13 +34,15 @@ msgstr "Ùˆ"
#: templates/web/base/report/new/councils_text_some.html:22
#: templates/web/base/report/new/councils_text_some.html:5
msgid " or "
-msgstr "او"
+msgstr "أو"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d تنبيهات مؤكدة ، %d غير مؤكدة"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d معلومات الاتصال &ndash; %d مؤكدة, %d غير مؤكدة"
@@ -48,32 +51,66 @@ msgstr "%d معلومات الاتصال &ndash; %d مؤكدة, %d غير مؤك
msgid "%d edits by %s"
msgstr "%d تم التعديل بواسطة %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d تحديثات مباشرة"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
-msgstr ""
+msgstr "%d الأسئلة المرسلة &ndash; %d المجابة (%s%%)"
#: templates/web/base/pagination.html:10
msgid "%d to %d of %d"
-msgstr ""
+msgstr "%d إلى %d من %d"
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:23
msgid "%s - Summary reports"
-msgstr "%s - التقرير المختصر"
+msgstr "%s - ملخص التقارير"
+
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
+msgstr "%s ref:&nbsp;%s"
+
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
msgstr ""
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, تم التقرير إلى %s"
@@ -83,61 +120,57 @@ msgstr ""
#: perllib/FixMyStreet/Map/OSM.pm:42
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
-msgstr ""
+msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> المساهمون"
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr ""
+#: templates/web/base/admin/report_blocks.html:41
+#: templates/web/base/admin/users.html:31
+msgid "(Email in abuse table)"
+msgstr "(البريد ÙÙŠ لائحة المسيئين)"
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
-#: templates/web/base/admin/users.html:31
-msgid "(Email in abuse table)"
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
msgstr ""
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
-msgstr ""
+msgstr "(Ø§Ù„Ù…Ø³Ø§ÙØ© Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠØ© التي تغطي مايقارب 200ØŒ000 نسمة)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "الخيار الأخر للملخصات المرسلة RSS يمكن تعديلها ، حسب"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(مغلق)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(تم إصلاحها)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "( مثل الكتابة على الجدران ØŒ رمي Ø§Ù„Ù†ÙØ§ÙŠØ§Øª ÙÙŠ الاماكن الغير مخصصة ØŒ بلاطات Ø§Ø±ØµÙØ© مكسورة او انارة الشوارع)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
-msgstr "(لم ترسل الى الجهة)"
+msgstr "(لم ترسل الى الجهة المسئولة)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(إختياري)"
@@ -145,25 +178,24 @@ msgstr "(إختياري)"
msgid "(public)"
msgstr "(عام)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
-msgstr ""
+msgstr "(أرسل لكليهما)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(لن نقوم بعرض بريدك الإلكتروني او رقم هاتÙÙƒ المحمول)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(لن نقوم بعرض بريدك الإلكتروني)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
-msgstr "--قم بإختيار تصنيÙ--"
+msgstr "--إختر تصنيÙ--"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- إختر نوع العقار--"
@@ -176,64 +208,60 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
-msgstr ""
+msgstr "<strong>%d</strong> المشاكل الحالية"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:39
msgid "<strong>No</strong> Let me confirm my report by email"
-msgstr ""
+msgstr "<strong>لا</strong> دعني أؤكّد بلاغي بالبريد"
#: templates/web/fixmystreet/report/update-form.html:112
msgid "<strong>No</strong> Let me confirm my update by email"
-msgstr ""
+msgstr "<strong>لا</strong> دعني أؤكّد تحديثي بالبريد"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
-msgstr ""
+msgstr "<strong>لا</strong> دعني أسجّل دخولي بالبريد"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr ""
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
-msgstr ""
+msgstr "<strong>لا</strong> دعني أؤكّد بلاغي عبر البريد:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
-msgstr ""
+msgstr "<strong>لا</strong> دعني أؤكّد تحديثي عبر البريد:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
-msgstr ""
+msgstr "<strong>نعم</strong> لدي كلمة المرور"
#: templates/web/base/static/about-en-gb.html:1
#: templates/web/base/static/about-en-gb.html:3
msgid "About us"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:29
msgid "Action Scheduled"
-msgstr ""
+msgstr "نشاط تم جدولته"
#: templates/web/base/admin/body-form.html:3
#: templates/web/base/admin/body-form.html:4
@@ -245,26 +273,31 @@ msgstr ""
#: templates/web/base/admin/body.html:56
msgid "Add a contact using the form below."
-msgstr ""
+msgstr "أض٠عنوان اتصال عبر النموذج التالي."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
#: templates/web/base/admin/body.html:116
#: templates/web/zurich/admin/body.html:31
msgid "Add new category"
-msgstr ""
+msgstr "Ø£Ø¶Ù ØªØµÙ†ÙŠÙØ§Ù‹"
#: templates/web/base/admin/users.html:47
msgid "Add user"
msgstr "Ø¥Ø¶Ø§ÙØ© مستخدم"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
-msgstr ""
+msgstr "Ø£ÙØ¶ÙŠÙ %s"
+
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "ÙÙŠ إنتظار المشرÙين"
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
@@ -272,27 +305,31 @@ msgstr "مرة اخرى:"
#: templates/web/base/admin/timeline.html:35
msgid "Alert %d created for %s, type %s, parameters %s / %s"
-msgstr ""
+msgstr "تحذير %d أنشيء لـ %s، نوع %s، معاملات %s \\ %s"
#: templates/web/base/admin/timeline.html:37
msgid "Alert %d disabled (created %s)"
-msgstr ""
+msgstr "التحذير %d ألغي ØªÙØ¹ÙŠÙ„Ù‡ (أنشيء %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
-msgstr ""
+msgstr "نبهني بأحدث المستجدات"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "كل التقرير"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "كل التقرير"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "كل التقارير"
@@ -300,11 +337,11 @@ msgstr "كل التقارير"
#: templates/web/base/admin/stats.html:5
#: templates/web/zurich/admin/stats.html:8
msgid "All reports between %s and %s"
-msgstr ""
+msgstr "كل البلاغات بين %s و %s"
#: templates/web/base/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
-msgstr ""
+msgstr "كل المعلومات التي تقدمها سترسل إلى"
#: templates/web/base/report/new/councils_text_all.html:2
#: templates/web/base/report/new/councils_text_all.html:4
@@ -313,28 +350,23 @@ msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:11
msgid "All the information you provide here will be sent to <strong>%s</strong>."
-msgstr ""
+msgstr "كل المعلومات التي تقدمها سترسل إلى <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
-msgstr ""
+msgstr "تحديث أشار أن هذه المشكلة تم إصلاحها."
#: templates/web/base/admin/list_updates.html:32
#: templates/web/base/admin/problem_row.html:20
msgid "Anonymous"
msgstr "مجهول"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "مجهول:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "هل انت مطور ؟"
@@ -342,31 +374,34 @@ msgstr "هل انت مطور ؟"
#: templates/web/base/admin/body.html:16
#: templates/web/zurich/admin/body-form.html:24
msgid "Area covered"
-msgstr "المنطقة مغطاة"
+msgstr "المنطقة المغطاة"
#: templates/web/base/admin/bodies.html:15
#: templates/web/base/admin/body.html:60
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "عين إلى تصني٠آخر:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
-msgstr ""
+msgstr "عين إلى تصني٠آخر:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
-msgstr ""
+msgstr "عين إلى %s"
#: templates/web/base/open311/index.html:84
msgid "At most %d requests are returned in each query. The returned requests are ordered by requested_datetime, so to get all requests, do several searches with rolling start_date and end_date."
@@ -374,7 +409,7 @@ msgstr ""
#: templates/web/base/open311/index.html:76
msgid "At the moment only searching for and looking at reports work."
-msgstr ""
+msgstr "حاليا مايعمل هو البحث ورؤية البلاغات Ùقط."
#: perllib/FixMyStreet/DB/Result/Problem.pm:373
#: templates/web/zurich/report/_item.html:11
@@ -385,12 +420,12 @@ msgstr "ÙÙŠ إنتظار المشرÙين"
msgid "Back"
msgstr "الخلÙ"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "حظر البريد الإلكتروني"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -410,12 +445,16 @@ msgstr ""
msgid "By Date"
msgstr "بالتاريخ"
-#: templates/web/fixmystreet/around/_report_banner.html:8
-msgid "Can't see the map? <em>Skip this step</em>"
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
msgstr ""
+#: templates/web/base/around/_report_banner.html:5
+msgid "Can't see the map? <em>Skip this step</em>"
+msgstr "لا يمكنك رؤية الخريطة؟ <em>تجاوز هذه الخطوة</em>"
+
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -424,29 +463,30 @@ msgstr ""
#: templates/web/zurich/admin/reports.html:13
#: templates/web/zurich/admin/stats.html:50
msgid "Category"
-msgstr ""
+msgstr "تصنيÙ"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
-msgstr ""
+msgstr "تصني٠معدل الإصلاحات لمشاكل مضت عليها 4 أسابيع"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
-msgstr ""
+msgstr "تصنيÙ:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
-msgstr ""
+msgstr "تصنيÙ: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "تغيير كلمة المرور"
@@ -455,12 +495,16 @@ msgid ""
"Check <strong>confirmed</strong> to indicate that this contact has been confirmed as correct.\n"
" If you are not sure of the origin or validity of the contact, leave this unchecked."
msgstr ""
+"حدد <strong>تم تأكيده</strong> للإشارة أن عنوان الإتصال هذا قد تم تأكيده.\n"
+"إذا لم تكن متأكدأ من مصدر أو صلاحية عنوان الإتصال, اترك هذ الخيار بل تحديد."
#: templates/web/base/admin/body.html:171
msgid ""
"Check <strong>deleted</strong> to remove the category from use. \n"
" It will not appear as an available category in the drop-down menu on the report-a-problem page."
msgstr ""
+"حدد <strong>محذوÙ</strong> لحذ٠هذا التصنيÙ.\n"
+"هذ التصني٠لن يكون Ù…ØªÙˆÙØ±Ø§ ÙÙŠ القائمة المنسدلة ÙÙŠ ØµÙØ­Ø© إبلاغ-عن-مشكلة."
#: templates/web/base/admin/body.html:191
msgid ""
@@ -472,61 +516,74 @@ msgid ""
" interest in displaying the report. In the UK, we've used this for services like requesting an extra rubbish bin\n"
" at a specific address."
msgstr ""
+"حدد <strong>خاص</strong> إذا البلاغ ÙÙŠ هذا التصني٠<strong>لايتوجب أن يكون ظاهرا ÙÙŠ الموقع</strong>.\n"
+"<br>\n"
+"هذا الخيار مناسب للمشاكل التي تسمح للمستخدمين الإبلاغ للجهات المسئولة, لكنها ليست مهمة لعامة الناس\n"
+"لتعرض كبلاغ. ÙÙŠ المملكة المتحدة، نستخدمها للخدمات مثل طلب حاوية Ù†ÙØ§ÙŠØ§Øª\n"
+"إضاÙية لعنوان محدد."
#: templates/web/base/admin/body.html:130
msgid ""
"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+"اختر اسم <strong>تصنيÙ</strong> يكون منطقيا لعامة الناس (مثل، \"أخدود\"ØŒ \"إنارة الطريق\") ومساعد.\n"
+"للجهات المسئولة أيضا. هذه سو٠تظهر ÙÙŠ القائمة المنسدلة من ØµÙØ­Ø© إبلاغ-عن-مشكلة."
+
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
-msgstr ""
+msgstr "اضغط هنا أو ادخل كـ يوم\\شهر\\سنة"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "اضغط على الخريطة للإبلاغ عن مشكلة"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "مغلق"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
-msgstr "مغلق من الجهة"
-
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "تقارير مغلقة"
+msgstr "مغلق من الجهة المسئولة"
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "مغلق:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "إحداثيات"
@@ -534,22 +591,22 @@ msgstr "إحداثيات"
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "إعدادت"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -557,7 +614,7 @@ msgstr ""
msgid "Confirm"
msgstr "تأكيد"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "أكد الحساب"
@@ -577,24 +634,29 @@ msgstr "تأكيد"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "مؤكد"
#: templates/web/base/admin/stats.html:5
msgid "Confirmed reports between %s and %s"
-msgstr ""
+msgstr "البلاغات المؤكدة بين %s و %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "مؤكد:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr ""
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "إتصل بنا"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -607,16 +669,22 @@ msgstr "إتصل بنا"
#: templates/web/base/contact/index.html:6
#: templates/web/fixmystreet/contact/index.html:20
msgid "Contact the team"
-msgstr ""
+msgstr "اتصل Ø¨ÙØ±ÙŠÙ‚ العمل"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "إحداثيات"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
-msgstr ""
+msgstr "لم يتمكن من إيجاد المستخدم"
#: templates/web/base/js/translation_strings.html:37
msgid "Could not look up location"
-msgstr ""
+msgstr "لم يتمكن من إيجاد الموقع"
#: templates/web/base/admin/list_updates.html:9
msgid "Council"
@@ -628,7 +696,7 @@ msgstr ""
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -643,112 +711,127 @@ msgstr ""
msgid "Count"
msgstr ""
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
-msgstr ""
+msgstr "انشئ بلاغ"
#: templates/web/base/admin/body.html:208
#: templates/web/zurich/admin/body.html:59
msgid "Create category"
-msgstr ""
+msgstr "انشء تصنيÙ"
+
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "انشئ بلاغ"
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
-msgstr ""
+msgstr "تم الإنشاء"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
-msgstr ""
+msgstr "تم الإنشاء:"
#: templates/web/base/admin/stats.html:31
msgid "Current state"
-msgstr ""
+msgstr "الوضع الحالي"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
+msgstr "حاليا لايوجد جهات مسئولة تم إنشائها."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
msgstr ""
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
-msgstr ""
+msgstr "ØµÙØ­Ø© المستخدم"
#: templates/web/zurich/admin/stats.html:35
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
-msgstr ""
+msgstr "محذوÙ"
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:51
#: templates/web/zurich/admin/index-dm.html:22
#: templates/web/zurich/admin/index-sdm.html:20
#: templates/web/zurich/admin/reports.html:12
msgid "Description"
-msgstr ""
+msgstr "الوصÙ"
#: templates/web/base/js/translation_strings.html:34
#: templates/web/zurich/report/new/fill_in_details_form.html:42
msgid "Details"
-msgstr ""
+msgstr "Ø§Ù„ØªÙØ§ØµÙŠÙ„"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
-msgstr ""
+msgstr "Ø§Ù„ØªÙØ§ØµÙŠÙ„:"
#: templates/web/base/admin/body.html:87
msgid "Devolved"
msgstr ""
-#: templates/web/base/admin/edit-league.html:8
-msgid "Diligency prize league table"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
msgstr ""
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
-msgstr ""
+#, fuzzy
+msgid "Do you have a %s password?"
+msgstr "هل لديك كلمة مرور لـ FixMySteet؟"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
-msgstr ""
+msgstr "لا أعلم"
#: templates/web/fixmystreet/contact/index.html:118
msgid "Don't like forms?"
-msgstr ""
+msgstr "هل تحب النماذج؟"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:30
msgid "Duplicate"
-msgstr ""
+msgstr "مكرر"
#: templates/web/base/admin/body.html:106
msgid ""
@@ -757,115 +840,117 @@ msgid ""
" This means you can add many categories even if you only have one contact for the body.\n"
" "
msgstr ""
+"كل عنوان اتصال لجهة مسؤولة له تصنيÙ, حيث يكون معروض للعامة.\n"
+"يمكن Ù„Ù„ØªØµÙ†ÙŠÙØ§Øª Ø§Ù„Ù…Ø®ØªÙ„ÙØ© أن <strong>تمتلك Ù†ÙØ³ عنوان الاتصال</strong> (عنوان بريد إلكتروني).\n"
+"هذا يعني أنه يمكنك Ø¥Ø¶Ø§ÙØ© ما تشاء من Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª حتى ولو كنت تملك عنوان اتصال واحد للجهة المسئولة."
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
-msgstr ""
+msgstr "تعديل"
#: templates/web/base/admin/body.html:220
#: templates/web/zurich/admin/body.html:71
msgid "Edit body details"
-msgstr ""
+msgstr "تعديل ØªÙØ§ØµÙŠÙ„ الجهة المسئولة"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
-msgstr ""
+msgstr "تعديل المشكلة %d"
#: templates/web/base/admin/update_edit.html:1
#: templates/web/zurich/admin/update_edit.html:1
msgid "Editing update %d"
-msgstr ""
+msgstr "تعديل التحديث %d"
#: templates/web/base/admin/user_edit.html:1
msgid "Editing user %d"
-msgstr ""
+msgstr "تعديل المستخدم %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
-msgstr ""
+msgstr "المحرر"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
#: templates/web/zurich/auth/general.html:54
msgid "Email"
-msgstr ""
+msgstr "البريد الإلكتروني"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
-msgstr ""
+msgstr "البريد أضي٠إلى لائحة المسيئين"
#: templates/web/base/admin/body.html:155
msgid "Email address:"
-msgstr ""
+msgstr "عنوان البريد الإلكتروني:"
#: templates/web/base/tokens/confirm_alert.html:6
msgid "Email alert created"
-msgstr ""
+msgstr "تم إنشاء الإخطار بالبريد"
#: templates/web/base/tokens/confirm_alert.html:10
msgid "Email alert deleted"
-msgstr ""
+msgstr "تم حذ٠الإخطار بالبريد"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
-msgstr ""
+msgstr "البريد موجودا سابقا ÙÙŠ لائحة المسيئين"
#: templates/web/base/around/_updates.html:5
msgid "Email me new local problems"
-msgstr ""
+msgstr "راسلني عن المشاكل المحلية الجديدة"
#: templates/web/base/report/display.html:38
msgid "Email me updates"
-msgstr ""
+msgstr "راسلني عن التحديثات"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
-msgstr ""
+msgstr "البريد الإلكتروني:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
-msgstr ""
+msgstr "البريد الإلكتروني: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
-msgstr ""
+msgstr "مكتب أو عقار تجاري مهجور"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
-msgstr ""
+msgstr "حانة مهجورة"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
-msgstr ""
+msgstr "مبنى عام مهجور - مدرسة، مستشÙى، إلخ."
#: templates/web/base/admin/body-form.html:162
#: templates/web/base/admin/body-form.html:163
@@ -886,54 +971,50 @@ msgstr ""
#: templates/web/base/admin/stats.html:70
msgid "End Date:"
-msgstr ""
+msgstr "تاريخ الإنتهاء:"
#: templates/web/base/admin/body-form.html:130
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
#: perllib/FixMyStreet/Cobrand/UK.pm:13
msgid "Enter a nearby UK postcode, or street name and area"
-msgstr ""
+msgstr "أدخل أقرب صندوق بريد بريطاني، أو اسم الشارع والحي"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:20
#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:21
msgid "Enter a nearby postcode, or street name and area"
-msgstr ""
+msgstr "أدخل أقرب صندوق بريد، أو اسم الشارع والحي"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
-msgstr ""
+msgstr "أدخل أقرب اسم شارع وحي"
#: perllib/FixMyStreet/Cobrand/ZeroTB.pm:7
msgid "Enter a nearby street name and area, postal code or district in Delhi"
-msgstr ""
+msgstr "أدخل أقرب اسم شارع وحي أو صندوق بريد أو منطقة ÙÙŠ دلهي"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
-msgstr ""
+msgstr "أدخل كلمة مرور جديدة:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
msgid "Enter a password"
-msgstr ""
+msgstr "أدخل كلمة المرور:"
#: templates/web/base/index-steps.html:26
msgid "Enter details of the problem"
-msgstr ""
+msgstr "أدخل ØªÙØ§ØµÙŠÙ„ البلاغ"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -941,78 +1022,67 @@ msgstr ""
#: templates/web/base/tokens/error.html:1
#: templates/web/base/tokens/error.html:3
msgid "Error"
+msgstr "خطأ"
+
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
msgstr ""
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
-msgstr ""
+msgstr "مثال لصندوق البريد %s"
#: templates/web/base/open311/index.html:94
msgid "Examples:"
-msgstr ""
+msgstr "أمثلة:"
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
-msgstr ""
+msgstr "أشرح ما الخطأ، وبالضبط أين هو، وكم من المدة وهو هناك..."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "رابط خارجي"
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
-msgstr ""
+msgstr "رابط خارجي"
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
-msgstr ""
+msgstr "بيانات إضاÙية:"
#: templates/web/base/contact/submit.html:13
msgid "Failed to send message"
-msgstr ""
+msgstr "ÙØ´Ù„ ÙÙŠ إرسال الرسالة"
#: templates/web/zurich/admin/index-dm.html:33
#: templates/web/zurich/admin/index-sdm.html:30
msgid "Filter report list"
-msgstr ""
+msgstr "ترشيح قائمة البلاغات"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
-msgstr ""
+msgstr "أول مرة"
#: templates/web/base/admin/body.html:48
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
-msgstr ""
-
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr ""
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
+msgstr "أصلح شارعي"
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1021,57 +1091,52 @@ msgstr ""
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:32
msgid "Fixed"
-msgstr ""
+msgstr "تم إصلاحها"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
-msgstr ""
-
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr ""
+msgstr "تم إصلاحها - المستخدم"
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
-msgstr ""
+msgstr "تم إصلاحها:"
#: templates/web/base/admin/body-form.html:89
#: templates/web/zurich/admin/body-form.html:36
msgid "Flag as deleted"
-msgstr ""
+msgstr "مشار كمحذوÙ"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
-msgstr ""
+msgstr "مستخدم مشار إليه"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
-msgstr ""
+msgstr "مشار إليهم"
#: templates/web/base/admin/flagged.html:1
msgid "Flagged reports and users"
-msgstr ""
+msgstr "بلاغات ومستخدمين مشار إليهم"
#: templates/web/base/admin/user-form.html:46
msgid "Flagged users are listed on the <a href='%s'>flagged</a> page."
-msgstr ""
+msgstr "المستخدمين المشار إليهم مدرجين بقائمة ÙÙŠ ØµÙØ­Ø© <a href='%s'>المشار إليهم</a>"
#: templates/web/base/admin/flagged.html:31
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
-msgstr ""
+msgstr "المستخدمين المشار إليهم غير محظورين بأي طريقة، هذه Ùقط لائحة بالمستخدمين المحددين للإنتباه لهم"
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
-msgstr ""
+msgstr "مشار إليه:"
#: templates/web/base/reports/_ward-list.html:3
#: templates/web/fixmystreet/reports/_ward-list.html:4
@@ -1080,18 +1145,29 @@ msgstr ""
#: templates/web/base/admin/body-form.html:65
msgid "For more information, see <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>How FixMyStreet uses Mapit</a>."
-msgstr ""
+msgstr "للمزيد من المعلومات، راجع <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>كي٠أصلح شارعي يستخدم الخريطة</a>."
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:32
#: templates/web/fixmystreet/report/update-form.html:106
msgid "Forgotten your password?"
+msgstr "هل نسيت كلمة المرور؟"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
msgstr ""
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
-msgstr ""
+msgstr "الأسئلة الشائعة"
#: templates/web/base/open311/index.html:136
msgid "GeoRSS on Google Maps"
@@ -1100,39 +1176,38 @@ msgstr ""
#: templates/web/fixmystreet/around/_updates.html:3
#: templates/web/fixmystreet/report/display.html:35
msgid "Get updates"
-msgstr ""
+msgstr "احصل على التحديثات"
#: templates/web/fixmystreet/reports/_rss.html:3
#: templates/web/fixmystreet/reports/_rss.html:9
msgid "Get updates of %s problems"
-msgstr ""
+msgstr "احصل على التحديثات لـ %s من المشاكل"
#: templates/web/fixmystreet/reports/_rss.html:11
#: templates/web/fixmystreet/reports/_rss.html:3
msgid "Get updates of problems in this %s"
-msgstr ""
+msgstr "احصل على التحديثات للمشاكل ÙÙŠ هذه %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
#: templates/web/base/questionnaire/completed.html:14
msgid "Glad to hear it’s been fixed!"
-msgstr ""
+msgstr "سعيد لسماع أنها أصلحت!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
-msgstr ""
+msgstr "اذهب"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
-msgstr ""
+msgstr "هل تريد أن ترسل سؤال؟"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1140,87 +1215,83 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
-msgstr ""
+msgstr "هل أصلحت هذه المشكلة؟"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
-msgstr ""
+msgstr "المساعدة"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
-msgstr ""
+msgstr "هذه أنواع التحذيرات للمشاكل المحلية &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
-msgstr ""
+msgstr "مرحبا %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
-msgstr ""
+msgstr "مخÙÙŠ"
#: templates/web/base/around/display_location.html:65
msgid "Hide old"
-msgstr ""
+msgstr "أخÙÙŠ القديم"
#: templates/web/base/around/display_location.html:60
msgid "Hide pins"
-msgstr ""
+msgstr "أخÙÙŠ المثبتة"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
-msgstr ""
+msgstr "السجل"
#: templates/web/base/js/translation_strings.html:31
msgid "Home"
-msgstr ""
+msgstr "البداية"
#: templates/web/base/index-steps.html:1
msgid "How to report a problem"
-msgstr ""
+msgstr "كي٠تبلغ عن مشكلة"
#: templates/web/base/js/translation_strings.html:33
msgid "How to send successful reports"
-msgstr ""
+msgstr "كي٠ترسل بلاغات ناجحة"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
-msgstr ""
+msgstr "آس٠لايمكنك تأكيد البلاغات الغير مؤكدة."
#: templates/web/base/tokens/confirm_problem.html:23
#: templates/web/base/tokens/confirm_problem.html:27
msgid "I just reported a problem on @fixmystreet"
-msgstr ""
+msgstr "لقد أبلغت الآن عن مشكلة على @fixmystreet"
#: templates/web/base/tokens/confirm_update.html:19
#: templates/web/base/tokens/confirm_update.html:23
msgid "I just updated a problem on @fixmystreet"
-msgstr ""
+msgstr "لقد حدثت الآن مشكلة على @fixmystreet"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:96
msgid "I'm afraid we couldn't locate your problem in the database.\n"
-msgstr ""
+msgstr "نعتذر لك لم نستطع تحديد مشكلتك ÙÙŠ قاعدة البيانات.\n"
#: perllib/FixMyStreet/App/Controller/Tokens.pm:327
msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
@@ -1231,8 +1302,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr ""
@@ -1250,37 +1321,24 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
-msgstr ""
+msgstr "إذا حصلت على معلومات أكثر عن حالة مشكلتك, الرجاء العودة للموقع ووضع تحديث لذلك."
#: templates/web/base/report/new/councils_text_none.html:2
#: templates/web/base/report/new/councils_text_none.html:8
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
-msgstr ""
+msgstr "إذا كنت تستخدم البريد الإلكتروني عن طريق Ø§Ù„Ù…ØªØµÙØ­ أو لديك مرشح للارسائل الغير هامة، ربما تود تÙقد مجلد الرسائل الغير هامة: بعض الأحيان، رسائلنا يشار إليها بذلك."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1310,7 +1368,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr ""
@@ -1335,14 +1393,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr ""
@@ -1350,7 +1407,7 @@ msgstr ""
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1362,12 +1419,12 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1375,7 +1432,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr ""
@@ -1383,12 +1440,12 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1406,10 +1463,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1421,7 +1487,7 @@ msgstr ""
msgid "Last editor"
msgstr ""
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr ""
@@ -1456,7 +1522,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr ""
@@ -1469,13 +1535,12 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr ""
+msgstr "اشر كمرسلة"
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1493,6 +1558,14 @@ msgstr ""
msgid "Message"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr ""
@@ -1520,27 +1593,25 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr ""
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1553,21 +1624,25 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr ""
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+msgid "Nearly done! Now check your email&hellip;"
+msgstr ""
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1576,12 +1651,12 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1589,8 +1664,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr ""
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1617,37 +1692,18 @@ msgstr ""
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+msgid "New template"
msgstr ""
#: templates/web/base/pagination.html:13
msgid "Next"
-msgstr ""
+msgstr "التالي"
#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
@@ -1656,14 +1712,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr ""
@@ -1681,7 +1735,7 @@ msgstr ""
#: templates/web/base/admin/edit-league.html:17
msgid "No edits have yet been made."
-msgstr ""
+msgstr "لم تحدث أي تعديلات."
#: templates/web/base/admin/flagged.html:25
msgid "No flagged problems found."
@@ -1691,20 +1745,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr ""
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1719,11 +1764,9 @@ msgstr ""
#: templates/web/base/report/_support.html:2
#: templates/web/base/report/_support.html:4
msgid "No supporters"
-msgstr ""
+msgstr "لا يوجد داعمون"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr ""
@@ -1736,8 +1779,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1745,7 +1788,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1758,7 +1808,7 @@ msgid "Not reported to council"
msgstr ""
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr ""
@@ -1768,31 +1818,29 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr ""
#: templates/web/base/open311/index.html:73
msgid "Note: <strong>%s</strong>"
-msgstr ""
+msgstr "ملاحظة: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1822,20 +1870,18 @@ msgstr ""
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr ""
@@ -1843,11 +1889,6 @@ msgstr ""
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr ""
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1864,32 +1905,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr ""
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr ""
@@ -1904,12 +1939,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1918,6 +1953,7 @@ msgid "Password (optional)"
msgstr ""
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr ""
@@ -1925,7 +1961,7 @@ msgstr ""
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1934,11 +1970,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr ""
@@ -1949,14 +1983,21 @@ msgstr ""
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr ""
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr ""
@@ -1968,22 +2009,18 @@ msgstr ""
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr ""
@@ -1993,22 +2030,20 @@ msgstr ""
msgid "Please check the passwords and try again"
msgstr ""
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr ""
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2018,7 +2053,7 @@ msgstr ""
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2026,7 +2061,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2035,7 +2070,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr ""
@@ -2046,15 +2081,15 @@ msgstr ""
msgid "Please enter a password"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2062,7 +2097,7 @@ msgid "Please enter a valid email"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr ""
@@ -2071,23 +2106,21 @@ msgstr ""
msgid "Please enter some details"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
-msgstr ""
+msgstr "الرجاء إدخال عنوان بريدك الإلكتروني"
#: templates/web/base/js/translation_strings.html:25
msgid "Please enter your first name"
@@ -2098,8 +2131,8 @@ msgstr ""
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2138,7 +2171,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2161,19 +2194,23 @@ msgstr ""
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+msgid "Please select a body."
+msgstr ""
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2182,21 +2219,17 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr ""
@@ -2205,8 +2238,8 @@ msgid "Please write your update here"
msgstr ""
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2227,24 +2260,38 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
-msgstr ""
+msgstr "مشكلة"
#: templates/web/base/admin/timeline.html:22
msgid "Problem %d created"
@@ -2258,12 +2305,12 @@ msgstr ""
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr ""
@@ -2279,12 +2326,10 @@ msgstr ""
msgid "Problems in this area"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr ""
@@ -2293,12 +2338,11 @@ msgstr ""
msgid "Problems recently reported fixed on FixMyStreet"
msgstr ""
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2310,23 +2354,19 @@ msgstr ""
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
+msgid "Problems within %s, %s"
msgstr ""
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
-msgstr ""
+msgstr "عنوان الملكية:"
#: templates/web/base/report/new/category.html:8
msgid "Property type:"
@@ -2337,39 +2377,31 @@ msgstr ""
msgid "Provide an update"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr ""
@@ -2385,12 +2417,11 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2416,8 +2447,7 @@ msgstr ""
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -2425,7 +2455,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2455,50 +2485,55 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Recent local problems, %s"
+msgstr "المشاكل المبلغة حديثا"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
-msgstr ""
+msgstr "المشاكل المبلغة حديثا"
#: templates/web/zurich/report/new/notes.html:5
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
#: templates/web/fixmystreet/report/display.html:32
msgid "Report abuse"
-msgstr ""
+msgstr "الإبلاغ عن إساءة"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2507,63 +2542,59 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "تم البلاغ"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
-msgstr ""
+msgstr "تم البلاغ ÙÙŠ التصني٠%s بواسطة %s ÙÙŠ %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2571,18 +2602,22 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "تم البلاغ"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2595,18 +2630,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2621,26 +2659,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2653,7 +2697,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2685,20 +2729,23 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+msgid "Sent report back"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2707,8 +2754,8 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2724,37 +2771,26 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr ""
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr ""
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
-msgstr ""
+msgstr "سجل الدخول أو أنشئ حساب جديد"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
-msgstr ""
+msgstr "بعض Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª قد تتطلب معلومات إضاÙية."
#: templates/web/base/admin/body-form.html:149
#: templates/web/base/admin/body-form.html:150
@@ -2767,8 +2803,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2776,24 +2813,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2809,16 +2853,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2832,7 +2877,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2847,47 +2897,44 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
-msgstr ""
+msgstr "تم Ø§Ø¶Ø§ÙØªÙ‡Ø§"
#: templates/web/base/alert/updates.html:17
#: templates/web/base/report/display.html:46
@@ -2896,18 +2943,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2918,17 +2966,26 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
#: templates/web/base/admin/questionnaire.html:1
msgid "Survey Results"
+msgstr "نتائج Ø§Ù„ØªØµÙØ­"
+
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "احصل على التحديثات"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -2937,6 +2994,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2958,7 +3016,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2966,7 +3024,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2984,19 +3042,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3038,30 +3096,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -3079,10 +3125,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3103,20 +3145,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3133,8 +3163,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3145,7 +3174,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3156,23 +3185,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3183,9 +3213,9 @@ msgstr ""
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:272
msgid "There was a problem with your update. Please try again."
-msgstr ""
+msgstr "حدثت مشكلة مع تحديثك. الرجاء المحاولة مرة آخرى."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3225,16 +3255,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3248,7 +3278,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3275,55 +3305,67 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3339,8 +3381,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3348,11 +3390,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3369,13 +3411,15 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
#: templates/web/fixmystreet/report/update-form.html:19
msgid "Update"
-msgstr ""
+msgstr "تحديث"
#: templates/web/base/admin/timeline.html:33
msgid "Update %s created for problem %d; by %s"
@@ -3392,11 +3436,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3431,24 +3475,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3456,27 +3500,29 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "احصل على التحديثات لـ %s من المشاكل"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3484,23 +3530,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3524,16 +3570,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3547,7 +3592,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3572,11 +3617,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3585,7 +3634,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3593,16 +3642,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3628,22 +3683,20 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:17
#: templates/web/fixmystreet/report/update-form.html:91
msgid "Yes I have a password"
-msgstr ""
+msgstr "نعم لدي كلمة المرور"
#: templates/web/base/contact/index.html:39
#: templates/web/fixmystreet/contact/index.html:54
@@ -3699,11 +3752,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3712,6 +3763,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3732,15 +3787,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3751,18 +3802,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr ""
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr ""
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3771,22 +3820,17 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr ""
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3796,24 +3840,23 @@ msgstr ""
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3826,19 +3869,15 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr ""
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3846,23 +3885,31 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "كل التقارير"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "تقارير مغلقة"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr ""
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3871,17 +3918,22 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "بلاغات تم إصلاحها"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr ""
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr ""
@@ -3926,14 +3978,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr ""
@@ -3943,16 +3994,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3965,8 +4016,8 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3982,17 +4033,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "بلاغات تم إصلاحها"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4020,7 +4074,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4042,7 +4096,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4075,7 +4129,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4108,7 +4162,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4129,3 +4183,39 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(لا تقلق &mdash; سو٠نبقي تحذيرك بينما تتÙقد بريدك.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(لا تقلق &mdash; سو٠نبقي بلاغك للمشكلة بينما تتÙقد بريدك)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(لا تقلق &mdash; سو٠نبقي تحديثك بينما تتÙقد بريدك.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>إذا كنت لا تستطيع رؤية الخريطة، <a href='%s' rel='nofollow'> ÙØªØ¬Ø§ÙˆØ² هذه الخطوة</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>لا</strong>، لا أرغب، دعني أسجّل دخولي بالبريد:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "هل أنت <strong>مطور</strong>ØŸ هل تود المساهمة ÙÙŠ FixMyStreetØŸ"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "أقرب المشاكل <small>(within&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "اتصل بـ FixMyStreet"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "إدارة أصلح شارعي:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "إذا لم ØªÙØ¹Ù„ØŒ تحذيرك لن يتم ØªÙØ¹ÙŠÙ„Ù‡."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "إذا لم ØªÙØ¹Ù„ØŒ مشكلتك لن يتم إدراجها."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "إذا لم ØªÙØ¹Ù„ØŒ تحديثك لن يتم إدراجه."
diff --git a/locale/bg_BG.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/bg_BG.UTF-8/LC_MESSAGES/FixMyStreet.po
index bfab19002..05a28019d 100644
--- a/locale/bg_BG.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/bg_BG.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -10,18 +10,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/fixmystreet/language/bg_BG/)\n"
+"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/mysociety/fixmystreet/language/bg_BG/)\n"
"Language: bg_BG\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "и"
@@ -34,11 +34,13 @@ msgstr "и"
msgid " or "
msgstr "или"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d потвърдени извеÑтиÑ, %d непотвърдени"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d връзка Ñ Ð¾Ð±Ñ‰Ð¸Ð½Ð°Ñ‚Ð° &ndash; %d потвърдени, %d непотвърдени"
@@ -47,11 +49,13 @@ msgstr "%d връзка Ñ Ð¾Ð±Ñ‰Ð¸Ð½Ð°Ñ‚Ð° &ndash; %d потвърдени, %d
msgid "%d edits by %s"
msgstr "%d редиктарано от %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d обновÑване в реално време"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d изпратени анкети &ndash; %d отговорени (%s%%)"
@@ -64,15 +68,49 @@ msgstr "%d до %d от %d"
msgid "%s - Summary reports"
msgstr "%s - Обобщена Ñправка"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr "ÐŸÐ¾Ð¿Ñ€Ð°Ð²Ð¸Ð¡Ð¾Ñ„Ð¸Ñ Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ð²Ð° възможноÑти за изпращане на извеÑÑ‚Ð¸Ñ Ð¿Ð¾ RSS и имейл за Ñигналите подадени на териториÑта на СофиÑ, включително и Ñигнали за определен квартал или район или за вÑички Ñигнали намиращи Ñе в близоÑÑ‚ до определено меÑтоположение."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr "ÐŸÐ¾Ð¿Ñ€Ð°Ð²Ð¸Ð¡Ð¾Ñ„Ð¸Ñ Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ð²Ð° възможноÑти за изпращане на извеÑÑ‚Ð¸Ñ Ð¿Ð¾ RSS и имейл за Ñигналите подадени на териториÑта на СофиÑ, включително и Ñигнали за определен квартал или район или за вÑички Ñигнали намиращи Ñе в близоÑÑ‚ до определено меÑтоположение."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s номер:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s квартал, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, Ñъобщено на %s"
@@ -84,59 +122,57 @@ msgstr "%s, в %s квартал"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Ðе Ñе притеÑнÑвайте &mdash; задържаме извеÑтието докато проверÑвате имейла Ñи.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Ðе Ñе притеÑнÑвайте &mdash; задържаме подаването на Ñигнала докато проверÑвате имейла Ñи.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Ðе Ñе притеÑнÑвайте &mdash; задържаме актуализациÑта докато проверÑвате имейла Ñи.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Имейлът е маркиран като подаващ обидни Ñигнали)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Име"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Телефонен номер"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(разÑтоÑние, което покрива грубо 7 500 жители)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(като алтернатива RSS емиÑиите могат да бъдат перÑонализирани"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(затворен)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(поправен)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(като графити, дупки по улицата, Ñчупено улично оÑветление)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(не е изпратен към общината)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(незадължително)"
@@ -144,25 +180,24 @@ msgstr "(незадължително)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(изпратен към двата района)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(ние никога не показваме Ð²Ð°ÑˆÐ¸Ñ Ð¸Ð¼ÐµÐ¹Ð» или телефонен номер)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(ние никога не показваме Ð²Ð°ÑˆÐ¸Ñ Ð¸Ð¼ÐµÐ¹Ð»)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Изберете ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Изберете подходÑщ тип --"
@@ -175,12 +210,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Ðко не виждате картата, <a href='%s' rel='nofollow'>пропуÑнете тази Ñтъпка</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> отворени Ñигнали"
@@ -193,28 +230,22 @@ msgstr "<strong>Ðе</strong> Ðека Ð¿Ð¾Ñ‚Ð²ÑŠÑ€Ð´Ñ Ñигнала чрез
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Ðе</strong> Ðека Ð¿Ð¾Ñ‚Ð²ÑŠÑ€Ð´Ñ Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñта чрез имейл"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Ðе</strong> Ðека да влÑза в ÑиÑтемата чрез имейл"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Ðе</strong> Ðека да влÑза в ÑиÑтемата чрез имейл"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Ðе</strong> Ðека да Ð¿Ð¾Ñ‚Ð²ÑŠÑ€Ð´Ñ Ñигнала чрез имейл"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Ðе</strong> Ðека Ð¿Ð¾Ñ‚Ð²ÑŠÑ€Ð´Ñ Ð¿Ñ€Ð¾Ð¼Ñната чрез имейл:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -225,8 +256,8 @@ msgstr "<strong>Да</strong> Имам парола"
msgid "About us"
msgstr "За наÑ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -251,7 +282,7 @@ msgstr "Добавете контакт като използвате форма
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Добавете район"
@@ -264,10 +295,15 @@ msgstr "ДобавÑне на нова категориÑ"
msgid "Add user"
msgstr "Добавете потребител"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Добавено %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Очакващ преглед"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Отново:"
@@ -280,21 +316,25 @@ msgstr "Създадено извеÑтие %d за %s, тип %s, Ñ Ð¿Ð°Ñ€Ð°Ð¼
msgid "Alert %d disabled (created %s)"
msgstr "ИзвеÑтието %d е изключено (Ñъздадено на %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "ИзвеÑÑ‚Ñвай ме за бъдещи актуализиации"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Вички Ñигнали"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Вички Ñигнали"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Ð’Ñички Ñигнали"
@@ -317,8 +357,7 @@ msgstr "ЦÑлата информациÑ, коÑто предоÑтавите Ñ
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "ЦÑлата информациÑ, коÑто предоÑтавите тук, ще бъде изпратена на <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Този Ñигнал е маркиран като поправен."
@@ -327,16 +366,12 @@ msgstr "Този Ñигнал е маркиран като поправен."
msgid "Anonymous"
msgstr "Ðнонимен"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Ðнонимен:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Ðко Ñте програмиÑÑ‚?"
@@ -351,22 +386,25 @@ msgstr "ТериториÑта е обхваната"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "ПрехвърлÑне към външна община:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "ПрехвърлÑне към друга категориÑ:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "ПрехвърлÑне към външна община:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "ПрехвърлÑне към подразделение:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Прехвърлен на %s"
@@ -387,12 +425,12 @@ msgstr "Очакващ преглед"
msgid "Back"
msgstr "Ðазад"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Забрана на имейл адреÑа"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Райони"
@@ -412,12 +450,16 @@ msgstr "Район:"
msgid "By Date"
msgstr "По дата"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Ðе виждате картата? <em>ПропуÑнете тази Ñтъпка</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -428,27 +470,28 @@ msgstr "Ðе виждате картата? <em>ПропуÑнете тази Ñ
msgid "Category"
msgstr "КатегориÑ"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Сигнали подадени преди повече от 4 Ñедмици"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "КатегориÑ:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "КатегориÑ: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "ПромÑна на парола"
@@ -490,54 +533,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr "Изберете име на <strong>категориÑта</strong>, което е ÑмиÑлено едновременно, както за гражданите, така и за общината. Категориите Ñе поÑвÑват като ÑпиÑък за избор при подаване на Ñигнал. "
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Изберете дата или Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ - dd/mm/yyyy"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Щракнете върху картата, за да Ñъобщите за проблем"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Затворен"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Затворен от общината"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Затворени Ñигнали"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Затворени:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Други Ñигнали в близоÑÑ‚ <small>(within&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Координати:"
@@ -545,22 +594,22 @@ msgstr "Координати:"
msgid "Cobrand"
msgstr "МеÑтна имплементциÑ"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° меÑтната имплементциÑ:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "МеÑтна имплементциÑ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "КонфигурациÑ"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Задайте крайна точка"
@@ -568,7 +617,7 @@ msgstr "Задайте крайна точка"
msgid "Confirm"
msgstr "Потвърждаване"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Потвърждаване на акаунта"
@@ -588,7 +637,7 @@ msgstr "Потвърждение"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Потвърдено"
@@ -599,13 +648,18 @@ msgstr "Потвърдени Ñигнали между %s и %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Потвърдени:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Свържете Ñе Ñ ÐµÐºÐ¸Ð¿Ð° на ПоправиСофиÑ"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Връзка Ñ Ð½Ð°Ñ"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -620,8 +674,14 @@ msgstr "Връзка Ñ Ð½Ð°Ñ"
msgid "Contact the team"
msgstr "Връзка Ñ Ñ‚Ð¸Ð¼Ð°"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Координати:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "ПотребителÑÑ‚ не е намерен"
@@ -639,7 +699,7 @@ msgstr "Община"
msgid "Council contacts for %s"
msgstr "Контакти на общината за %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "входÑщ номер в общината:&nbsp;%s"
@@ -654,7 +714,7 @@ msgstr "Община:"
msgid "Count"
msgstr "Брой"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Подай Ñигнал"
@@ -663,17 +723,19 @@ msgstr "Подай Ñигнал"
msgid "Create category"
msgstr "Създай категориÑ"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Подай Ñигнал"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Създаден"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Създадени:"
@@ -683,10 +745,15 @@ msgid "Current state"
msgstr "Текущо ÑÑŠÑтоÑние"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Ð’ момента нÑма Ñъздадени Райони."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -696,11 +763,16 @@ msgstr "Табло"
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Изтрит"
@@ -718,9 +790,9 @@ msgstr "ИнформациÑ"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "ИнформациÑ:"
@@ -728,23 +800,27 @@ msgstr "ИнформациÑ:"
msgid "Devolved"
msgstr "Прехвърлен"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "картата не е била използвана"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Таблица Ñ Ñ€Ð°Ð¹Ð¾Ð½Ð¸Ñ‚Ðµ в СофиÑ"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr ""
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Имате ли парола за Ñайта?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Ðе знам"
@@ -752,8 +828,8 @@ msgstr "Ðе знам"
msgid "Don't like forms?"
msgstr "Ðе обичате форми?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -776,7 +852,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Редактиране"
@@ -787,7 +864,7 @@ msgstr "Редактиране на информациÑта за района"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -802,15 +879,15 @@ msgstr "Редактиране на актуализациÑта %d"
msgid "Editing user %d"
msgstr "Редактиране на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Редактирано от"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -818,7 +895,7 @@ msgstr "Редактирано от"
msgid "Email"
msgstr "Имейл"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Имейлът е добавен в ÑпиÑъка ÑÑŠÑ Ð·Ð»Ð¾ÑƒÐ¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸"
@@ -834,7 +911,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Имейлът е в ÑпиÑъка ÑÑŠÑ Ð·Ð»Ð¾ÑƒÐ¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸"
@@ -847,38 +924,36 @@ msgid "Email me updates"
msgstr "Съобщавай ми за промени"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Имейл:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Имейл: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -907,7 +982,7 @@ msgstr "Крайна дата:"
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -920,10 +995,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr "Въведете пощенÑки код или име на улица в близоÑÑ‚ до ваÑ"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Въведете име на улица в близоÑÑ‚ до ваÑ"
@@ -931,13 +1004,12 @@ msgstr "Въведете име на улица в близоÑÑ‚ до ваÑ"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Въведете нова парола:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -948,7 +1020,6 @@ msgstr "Въведете парола"
msgid "Enter details of the problem"
msgstr "Въведете Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° проблема"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -958,6 +1029,10 @@ msgstr "Въведете Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° проблема"
msgid "Error"
msgstr "Грешка"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -971,12 +1046,19 @@ msgstr "Примери:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Допълнителни данни:"
@@ -989,8 +1071,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Филтриране на ÑпиÑъка ÑÑŠÑ Ñигнали"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "За първи път"
@@ -998,36 +1079,14 @@ msgstr "За първи път"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "ПоправиСофиÑ"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "ÐдминиÑтратор на ПоправиСофиÑ:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr "ÐŸÐ¾Ð¿Ñ€Ð°Ð²Ð¸Ð¡Ð¾Ñ„Ð¸Ñ Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ð²Ð° възможноÑти за изпращане на извеÑÑ‚Ð¸Ñ Ð¿Ð¾ RSS и имейл за Ñигналите подадени на териториÑта на СофиÑ, включително и Ñигнали за определен квартал или район или за вÑички Ñигнали намиращи Ñе в близоÑÑ‚ до определено меÑтоположение."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1038,21 +1097,16 @@ msgstr ""
msgid "Fixed"
msgstr "Поправено"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Поправени - община"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Поправени - потребител"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Поправени Ñигнали"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Поправени:"
@@ -1062,11 +1116,11 @@ msgstr "Поправени:"
msgid "Flag as deleted"
msgstr "Означен като \"изтрит\""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Означаване на потребител"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Означен"
@@ -1083,7 +1137,7 @@ msgstr "Означените потребители Ñа изброени на Ñ
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Означените потребители нÑмат реÑтрикции. Това е ÑпиÑък Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ð¸, които Ñа поÑтавени под наблюдение."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Означен:"
@@ -1102,9 +1156,22 @@ msgstr "За повече информацич вижте <a href='http://fixmy
msgid "Forgotten your password?"
msgstr "Забравена парола?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "ПрехвърлÑне към външна община:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "ПрехвърлÑне към външна община:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "ЧеÑто задавани въпроÑи"
@@ -1127,8 +1194,7 @@ msgstr "ИзтеглÑне на актуализациите на %s ÑигнаÐ
msgid "Get updates of problems in this %s"
msgstr "ИзтеглÑне на актуализациите за Ñигналите в %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "ИзтеглÑне на RSS емиÑии"
@@ -1137,17 +1203,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "ТърÑи"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Ще изпратите ли анкетата?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Графика на Ñъздадените Ñигнали по ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²ÑŠÐ² времето"
@@ -1155,43 +1221,39 @@ msgstr "Графика на Ñъздадените Ñигнали по ÑтатÑ
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Редовете в тъмноÑиво показват общини, към които в момента не може да Ñе изпращат директно Ñигнали."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Този проблем поправен ли е?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
"Подавали ли Ñте Ñигнал за нередноÑÑ‚ към общината преди или Ñега \n"
"подавате за първи път?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Помощ"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Това Ñа типовете извеÑÑ‚Ð¸Ñ Ð·Ð° нови Ñигнали за &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Здравей %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1205,7 +1267,7 @@ msgstr "Скрий Ñтарите"
msgid "Hide pins"
msgstr "Скрий кабърчетата"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "ИÑториÑ"
@@ -1221,7 +1283,7 @@ msgstr "Как да Ñигнализирате за проблем"
msgid "How to send successful reports"
msgstr "Как да подавате Ñигнали уÑпешно"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Ðе можете да потвърдите непотвърден през имейла Ñигнал"
@@ -1248,8 +1310,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "â„–"
@@ -1267,18 +1329,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Ð’ противен Ñлучай, уведомлениÑата нÑма да бъдат активирани."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Ð’ противен Ñлучай, вашиÑÑ‚ проблем нÑма да бъде публикуван."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Ð’ противен Ñлучай, вашата Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ñма да бъде публикувана."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1288,16 +1338,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Ðко Ñигнализирате за проблем тук, той ще бъде доÑтъпен публично, но Ñигналът <strong>нÑма</strong> да бъде изпратен към общината."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Ðко използвате уеб мейл клиент или имате наÑтроени филтри за нежелана поща, Ð¼Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ папките ÑÑŠÑ Ñпам/нежелана поща. ПонÑкога ÑъобщениÑта ни биват маркирани като Ñпам."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Ðко желаете да коментирате публично проблема, Ð¼Ð¾Ð»Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²ÐµÑ‚Ðµ го тук \n"
"(Ð¼Ð¾Ð»Ñ Ð¸Ð¼Ð°Ð¹Ñ‚Ðµ предвид, че тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ñма да бъде изпратена на общината)."
@@ -1329,7 +1379,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "ÐеÑъщеÑтвуващ номер"
@@ -1354,14 +1404,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Ð’ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° обработка"
@@ -1369,7 +1418,7 @@ msgstr "Ð’ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° обработка"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1381,12 +1430,12 @@ msgstr "Включи непотвърдените Ñигнали"
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Вътрешни бележки"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Вътрешен номер"
@@ -1394,7 +1443,7 @@ msgstr "Вътрешен номер"
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "ÐевÑрна дата"
@@ -1402,12 +1451,12 @@ msgstr "ÐевÑрна дата"
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "ÐевÑрна дата"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1425,10 +1474,19 @@ msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ <a href=\"%s\">Ñтраницата Ñ Ñ‡ÐµÑ
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1440,7 +1498,7 @@ msgstr "Запомни ме"
msgid "Last editor"
msgstr "ПоÑледно редактирано от"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "ПоÑледно обновено:"
@@ -1475,7 +1533,7 @@ msgstr "RSS и имейл извеÑÑ‚Ð¸Ñ Ð·Ð° Ñигнали"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "RSS и имейл извеÑÑ‚Ð¸Ñ Ð·Ð° Ñигнали за ‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "ИзвеÑтиÑ"
@@ -1488,14 +1546,12 @@ msgid "MAP"
msgstr "Карта"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "маркиран като \"затворен\""
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1513,6 +1569,16 @@ msgstr ""
msgid "Message"
msgstr "Съобщение"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "ПрехвърлÑне към външна община:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "ПрехвърлÑне към външна община:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Съобщение:"
@@ -1540,27 +1606,25 @@ msgstr "Още Ñигнали наоколо"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Име"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Име:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Име: %s"
@@ -1573,21 +1637,26 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ имейл адреÑа"
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ имейл адреÑа"
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Ðови <br>Ñигнали"
@@ -1596,12 +1665,12 @@ msgstr "Ðови <br>Ñигнали"
msgid "New body added"
msgstr "Районът е добавен"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "КатегориÑта е добавена"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1609,8 +1678,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr "Ðов Ñигнал в ПоправиСофиÑ"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1637,33 +1706,15 @@ msgstr ""
msgid "New reports"
msgstr "Ðови Ñигнали"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Ðово ÑÑŠÑтоÑние"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Ðова актуализациÑ"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Ðово ÑÑŠÑтоÑние"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1676,14 +1727,12 @@ msgstr "Слеващ"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Ðе"
@@ -1711,20 +1760,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "ÐÑма повече актуализации"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "ÐÑма намерен Ñигнал."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Ð’Ñе още нÑма подадени Ñигнали."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "ÐÑма намерени резултати"
@@ -1742,8 +1782,6 @@ msgid "No supporters"
msgstr ""
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr ""
@@ -1756,8 +1794,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1765,7 +1803,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1778,7 +1823,7 @@ msgid "Not reported to council"
msgstr "Съгналът не е подаден към общината"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Бележка"
@@ -1788,7 +1833,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Бележка:"
@@ -1797,22 +1842,20 @@ msgstr "Бележка:"
msgid "Note: <strong>%s</strong>"
msgstr "Бележка: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Сега да изпратим Ð’Ð°ÑˆÐ¸Ñ Ñигнал&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Сега да изпратим Ð’Ð°ÑˆÐ¸Ñ Ñигнал&hellip; имате ли парола за ПоправиСофиÑ?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Изпратете актуализациÑта&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Сега да изпратим Ð’Ð°ÑˆÐ¸Ñ Ñигнал&hellip; имате ли парола за Ñайта?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "ОК"
@@ -1842,20 +1885,18 @@ msgstr "Стари <br>Ñигнали"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Отворен"
@@ -1863,11 +1904,6 @@ msgstr "Отворен"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Отворени Ñигнали"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1884,32 +1920,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Или можете да Ñе абонирате за вÑички извеÑÑ‚Ð¸Ñ Ð½Ð° териториÑта на Ð¡Ð¾Ñ„Ð¸Ñ Ð¸Ð»Ð¸ Ñамо за района, в който Ñе намирате."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Други"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "СобÑтвеник"
@@ -1924,12 +1954,12 @@ msgstr "Страницата не е намерена"
msgid "Parent"
msgstr "Община"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "ЧаÑтичен"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1938,6 +1968,7 @@ msgid "Password (optional)"
msgstr "Парола (незадължително)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Парола:"
@@ -1945,7 +1976,7 @@ msgstr "Парола:"
msgid "Permalink"
msgstr "Връзка"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Телефонен номер"
@@ -1954,11 +1985,9 @@ msgstr "Телефонен номер"
msgid "Phone number (optional)"
msgstr "Телефонен номер (незадължително)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Телефон:"
@@ -1969,14 +1998,23 @@ msgstr "Телефон:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Снимка"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ðµ необходима"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ðµ необходима"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Снимка:"
@@ -1988,22 +2026,18 @@ msgstr "Снимки на Ñкоро подадени Ñигнали"
msgid "Place pin on map"
msgstr "ПоÑтавете кабърче върху картата"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Планирани"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "ÐœÐ¾Ð»Ñ <a class=\"tab_link\" href=\"#report\">погледнете</a> актуализациите."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "ÐœÐ¾Ð»Ñ Ð±ÑŠÐ´ÐµÑ‚Ðµ учтиви, кратки и Ñе придържайте към темата."
@@ -2013,22 +2047,20 @@ msgstr "ÐœÐ¾Ð»Ñ Ð±ÑŠÐ´ÐµÑ‚Ðµ учтиви, кратки и Ñе придържÐ
msgid "Please check the passwords and try again"
msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ паролите и пробвайте отново"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ имейл адреÑа"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ дали Ñте въвели коректен имейл адреÑ"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2038,15 +2070,16 @@ msgstr "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ категориÑ"
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"ÐœÐ¾Ð»Ñ <strong>ÐЕ</strong> подавайте Ñигнали през тази форма. \n"
@@ -2059,7 +2092,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "ÐœÐ¾Ð»Ñ Ð½Ðµ обиждайте никого - обиждайки Общината, Вие обезценÑвате уÑлугата за вÑички потребители."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ñъобщение"
@@ -2070,15 +2103,15 @@ msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ñъобщение"
msgid "Please enter a password"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ парола"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ тема"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2086,7 +2119,7 @@ msgid "Please enter a valid email"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ валиден имейл"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ валиден имейл адреÑ"
@@ -2095,21 +2128,19 @@ msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ валиден имейл адреÑ"
msgid "Please enter some details"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ информациÑ"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ имейл"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ имейл адреÑ"
@@ -2122,8 +2153,8 @@ msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ име"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ цÑлото Ñи име, общината Ñе нуждае от тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ - ако не желаете името Ви да Ñе поÑвÑва на Ñайта, Ð¼Ð¾Ð»Ñ Ð¼Ð°Ñ…Ð½ÐµÑ‚Ðµ отметката по-долу"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2162,7 +2193,7 @@ msgstr "ÐœÐ¾Ð»Ñ Ð¿Ð¾Ð¿ÑŠÐ»Ð½ÐµÑ‚Ðµ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° проблема."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "ÐœÐ¾Ð»Ñ Ð¿Ð¾Ð¿ÑŠÐ»Ð½ÐµÑ‚Ðµ формата Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° проблема и опишете меÑтоположението възможно най-точно."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "ÐœÐ¾Ð»Ñ Ð¾Ñ‚Ð±ÐµÐ»ÐµÐ¶ÐµÑ‚Ðµ дали бихте иÑкали да учаÑтвате в друга анкета"
@@ -2185,19 +2216,24 @@ msgstr ""
msgid "Please note:"
msgstr "Забележка:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ñ‰Ð¾ отварÑте Ñигнала отново."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ приложете Ñнимка."
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "ÐœÐ¾Ð»Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€ÐµÑ‚Ðµ дали нÑкога Ñте подавали Ñигнал към общината преди."
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Изберете район"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ начин на извеÑÑ‚Ñване"
@@ -2206,21 +2242,17 @@ msgstr "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ начин на извеÑÑ‚Ñване"
msgid "Please select the type of alert you want"
msgstr "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ тип извеÑтиÑ, които бихте иÑкали да получаваме"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "ÐœÐ¾Ð»Ñ Ð¿Ð¾Ñочете дали проблемът е бил разрешен или не"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "ÐœÐ¾Ð»Ñ Ð¿Ð¾Ð³Ð»ÐµÐ´Ð½ÐµÑ‚Ðµ актуализациите."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "ÐœÐ¾Ð»Ñ ÐºÐ°Ñ‡Ð²Ð°Ð¹Ñ‚Ðµ Ñамо JPEG изображениÑ"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ñъобщение"
@@ -2229,8 +2261,8 @@ msgid "Please write your update here"
msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ новото Ñъобщение тук"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2251,22 +2283,36 @@ msgstr "Публикувано от %s (<strong>%s</strong>) в %s"
msgid "Posted by %s at %s"
msgstr "Публикувано от %s в %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Предишно"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Лично"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Сигнал"
@@ -2282,12 +2328,12 @@ msgstr "Сигналът %s е потвърден"
msgid "Problem %s sent to council %s"
msgstr "Сигналът %s е подаден към общината %s "
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "РазделÑне на Ñигналите по ÑтатуÑи"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Сигналът е маркиран като отворен."
@@ -2303,12 +2349,10 @@ msgstr "Сигнали"
msgid "Problems in this area"
msgstr "Други Ñигнали на тази териториÑ"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Други Ñигнали наоколо"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Сигнали отбелÑзани върху картата"
@@ -2317,12 +2361,11 @@ msgstr "Сигнали отбелÑзани върху картата"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Проблеми Ñигнализирани Ñкоро в Ñайта"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Сигнали в Ñ€Ð°Ð´Ð¸ÑƒÑ Ð¾Ñ‚ %.1fкм от това меÑтоположение"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2334,20 +2377,17 @@ msgstr "Сигнали в %s"
msgid "Problems within %s ward"
msgstr "Сигнали в квартал %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Сигнали в обÑега на %s"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Сигнали в %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Сигнали в границите на:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð° имота:"
@@ -2361,39 +2401,31 @@ msgstr "Тип на имота:"
msgid "Provide an update"
msgstr "Въведете Ð¸Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° актуализиране"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Използването на потребителÑко име е опционално, но това ще ви позволи по-леÑно да подавате Ñигнали и да публикувате Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ актуализации."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Използването на парола е по избор, но това ще ви позволи по-леÑно да подавате Ñигнали и да публикувате и променÑте актуализации."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Публичен отговор:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Публикувай Ñнимка"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Публикувай отговора"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Ðнкета"
@@ -2409,12 +2441,11 @@ msgstr "Ðнкетата %d за проблем %d е изпратена"
msgid "Questionnaire filled in by problem reporter"
msgstr "Ðнкетата е попълнена от потребителÑ, подал Ñигнала"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2440,8 +2471,7 @@ msgstr "RSS абонамент за %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS абонамент за %s, в квартал %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS абонамент за поÑледни проблеми наоколо"
@@ -2449,7 +2479,7 @@ msgstr "RSS абонамент за поÑледни проблеми наоко
msgid "RSS feed of problems in this %s"
msgstr "RSS абонамент за проблеми в този %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2479,17 +2509,18 @@ msgstr "RSS абонамент за актуализации по този прÐ
msgid "Receive email when updates are left on this problem."
msgstr "Получаване на имейл при Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° проблема."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "ПоÑледни проблеми наоколо"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "ÐаÑкоро <br>поправени"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "ÐаÑкоро добавени Ñигнали"
@@ -2497,23 +2528,28 @@ msgstr "ÐаÑкоро добавени Ñигнали"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Помнете, че \"ПоправиСофиÑ\" Ñлужи за подаване на Ñигнали за физичеÑки проблеми, които могат да бъдат поправени. Ðко ВашиÑÑ‚ проблем не Ñпада към Ð½Ð¸ÐºÐ¾Ñ Ð¾Ñ‚ категориите, поÑочени в Ñайта, Ð¼Ð¾Ð»Ñ Ð¾Ð±ÑŠÑ€Ð½ÐµÑ‚Ðµ Ñе директно към Общината."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Премахване на означението"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Премахване на Ñнимката (необратимо дейÑтвие)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð½Ð° потребителÑ"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Подайте Ñигнал"
@@ -2522,7 +2558,7 @@ msgstr "Подайте Ñигнал"
msgid "Report abuse"
msgstr "Сигнализирай за неподходÑщо Ñъдържание"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Сигнал за %s "
@@ -2531,83 +2567,82 @@ msgstr "Сигнал за %s "
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Сигнализирай, разгледай или коментирай проблеми"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Подавал Ñъм и преди"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Подавал Ñъм и преди"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Сигналът е подаден в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Сигналът е подаден анонимно в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ %s в %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Сигналът е подаден в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ %s от %s в %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Сигналът е подаден анонимно чрез %s в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ %s в %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Сигналът е подаден чрез %s в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ %s от %s в %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Сигналът е подаден в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ %s "
+msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Сигнали"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Сигнализиране за проблем"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Сигнали"
@@ -2620,18 +2655,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr "Сигнали чакащи одобрение"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Сигнали означени върху картата"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Публикувани Ñигнали"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Препращане на Ñигнал"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Правилното мÑÑто ли е това?"
@@ -2646,26 +2684,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Завъртане налÑво"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Завъртане надÑÑно"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Запази промените"
@@ -2678,7 +2722,7 @@ msgstr "ТърÑене на Сигнали"
msgid "Search Users"
msgstr "ТърÑене на Потребители"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "ТърÑене на Ñигнали"
@@ -2710,20 +2754,25 @@ msgstr "Изберете Ñъответната община, за да разг
msgid "Select an area"
msgstr "Изберете териториÑ"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Изберете кой тип извеÑÑ‚Ð¸Ñ Ð±Ð¸Ñ…Ñ‚Ðµ иÑкали да получавате и щракнете бутона за RSS емиÑии или въведете имейл адреÑ, за да Ñе абонирате за имейл извеÑтиÑ."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Отворени Ñигнали"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Сигналът е подаден към %s преди %s"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Изпратени:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "УÑлуга:"
@@ -2732,8 +2781,8 @@ msgstr "УÑлуга:"
msgid "Share"
msgstr "Сподели"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2749,34 +2798,23 @@ msgid "Show pins"
msgstr "Покажи кабърчетата"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Вход"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Вход Ñ Ð¸Ð¼ÐµÐ¹Ð»"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Влезте или Ñъздайте акаунт"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Изход"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Вход като %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "ÐÑкои категории може да Ñе нуждаÑÑ‚ от допълнителна информациÑ."
@@ -2792,8 +2830,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "ÐÑкои Ñнимки от Ñигнали подадени наÑкоро"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2801,24 +2840,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Ðачална дата:"
@@ -2834,16 +2880,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2857,7 +2904,12 @@ msgstr "СтатуÑ"
msgid "Still open, via questionnaire, %s"
msgstr "Ð’Ñе още отворен, от анкета, %s "
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2872,45 +2924,42 @@ msgstr "Тема"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Тема:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Изпращане"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Изпращане на промените"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Изпращане на анкетата"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Сигналът е потвърден"
@@ -2921,18 +2970,19 @@ msgstr "Сигналът е потвърден"
msgid "Subscribe"
msgstr "Ðбониране"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Ðбониране за извеÑÑ‚Ñване по имейл"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Обобщение"
@@ -2943,7 +2993,7 @@ msgstr "Обобщение"
msgid "Summary reports"
msgstr "Обобщена Ñправка"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Проучване"
@@ -2951,9 +3001,18 @@ msgstr "Проучване"
msgid "Survey Results"
msgstr "Резултати от проучване"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Ðктуализации"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "ТекÑÑ‚"
@@ -2962,6 +3021,7 @@ msgid "Text only version"
msgstr "ВерÑÐ¸Ñ Ñамо Ñ Ñ‚ÐµÐºÑÑ‚"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "ТекÑÑ‚:"
@@ -2983,7 +3043,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð·Ð° предоÑтавената Ñнимка. Тъй като Ñе нуждаем от меÑтоложението на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼, Ð¼Ð¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ð±Ð»Ð¸Ð·Ð¾ в полето по-горе&nbsp;:"
@@ -2991,7 +3051,7 @@ msgstr "Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð·Ð° предоÑтавената Ñнимка. ТъÐ
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "БлагодарÑ! Радваме Ñе, че този проблем е бил разрешен! Бихме иÑкли да Ви питаме подавали ли Ñте Ñигнали към общината и преди?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Прикачването на изображение е неуÑпешно (%s). ÐœÐ¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹Ñ‚Ðµ отново."
@@ -3009,20 +3069,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr "ÐœÐ¾Ð»Ñ Ð´Ð° ни извините, този пощенÑки код не беше разпознат."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Сигналът ще бъде препратен."
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Сигналът ще бъде препратен."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Сигналът не може да бъде разгледан %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Този Ñигнал е бил изтрит от ПоправиСофиÑ."
@@ -3064,30 +3123,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Това <strong>може</strong> да отнеме нÑколко минути &mdash; <em>молÑ</em> бъдете търпеливи."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "Бихте могли да помогнете на Общината давайки възможно най-пълната информациÑ, Ñ ÐºÐ¾Ñто разполагате. ÐœÐ¾Ð»Ñ Ð¾Ð¿Ð¸ÑˆÐµÑ‚Ðµ точното меÑтонахождение на проблема, от какво еÑтеÑтво е, от колко време ÑъщеÑтвува, кратко опиÑание. По възможноÑÑ‚ прикачете и Ñнимка на проблема, ако разполагате Ñ Ñ‚Ð°ÐºÐ°Ð²Ð°."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñигнала можете да намерите в Ñледващата ÑекциÑ."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "ОпиÑанието на Ð²Ð°ÑˆÐ¸Ñ Ñигнал е доÑтъпно от дÑÑната Ñтрана на тази Ñтраница."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Грешката беше: %s"
@@ -3105,10 +3152,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr "Ðай-новите Ñигнали подадени от потребители"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Ðай-новите Ñигнали подадени от потребители"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Ðай-новите Ñигнали за {{COUNCIL}} подадени от потребители"
@@ -3129,20 +3172,8 @@ msgstr "ПоÑледни проблеми Ñигнализирани като п
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "ПоÑледни Ñигнали за {{COUNCIL}} подадени от потребителите"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "ПоÑледни Ñигнали за {{COUNCIL}} обхващаша квартал {{WARD}} подадени от потребителите"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3159,8 +3190,7 @@ msgstr "Паролите не Ñъвпадат"
msgid "The requested URL '%s' was not found on this server"
msgstr "ТърÑениÑÑ‚ Ð°Ð´Ñ€ÐµÑ '%s' не беше намерен на този Ñървър"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Можете да получавате извеÑÑ‚Ð¸Ñ Ð½Ð° базата на предварително дефинирано разÑтоÑние"
@@ -3171,7 +3201,7 @@ msgstr "Можете да получавате извеÑÑ‚Ð¸Ñ Ð½Ð° базатÐ
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3184,23 +3214,24 @@ msgstr ""
"ПотребителÑкото <strong>име</strong> е видимо публично в Ñигналите, които не Ñа маркирани като <em>анонимни</em>.\n"
"Имената не Ñа уникални."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Възникна проблем при визуализирането на Ñтраницата Ñ Ð²Ñички Ñигнали. ÐœÐ¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹Ñ‚Ðµ по-къÑно."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Възникна проблем при визуализирането на Ñтраницата. ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð±Ð²Ð°Ð¹Ñ‚Ðµ по-къÑно."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Възникна проблем Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñта имейл/парола. Ðко не можете да Ñи Ñпомните паролата или нÑмате такава, Ð¼Ð¾Ð»Ñ Ð¿Ð¾Ð¿ÑŠÐ»Ð½ÐµÑ‚Ðµ ÑекциÑта &lsquo;влизане чрез имейл&rsquo;."
@@ -3213,7 +3244,7 @@ msgstr "Възникна проблем Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñта имейл/Ð
msgid "There was a problem with your update. Please try again."
msgstr "Възникна проблем Ñ Ð²Ð°ÑˆÐ°Ñ‚Ð° актуализациÑ. ÐœÐ¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹Ñ‚Ðµ отново."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Възникна проблем Ñ Ð²Ð°ÑˆÐ°Ñ Ñигнал. ÐœÐ¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹Ñ‚Ðµ отново."
@@ -3253,16 +3284,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Този имейл е изпратен към двете общини покриващи адреÑа на Ñигнала, тъй като Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð½Ðµ е го е категоризирал. ÐœÐ¾Ð»Ñ Ð½Ðµ го взимайте под внимание ако не Ñте правилната община, коÑто е отговорна за този Ñигнал или ни Ñъобщете под каква ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ð¿Ð°Ð´Ð° този Ñигнал, така че да може да Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð¼ в ÑиÑтемата."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Този имейл е изпратен до нÑколко общини покриващи адреÑа на Ñигнала, тъй като категориÑта на Ñигнала Ñъвпада Ñ Ð²Ñички Ñ‚ÑÑ…. ÐœÐ¾Ð»Ñ Ð½Ðµ го взимайте под внимание ако не Ñте правилната община задължена за този тип проблеми."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3276,7 +3307,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr "Това е обобщение на вÑички Ñигнали в Ñайта."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "Това може да е резултат от на оÑтарÑл или използва адреÑ, както и от грешно копиране на адреÑа."
@@ -3303,55 +3334,69 @@ msgstr "Този проблем е в Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° обработка."
msgid "This problem is old and of unknown status."
msgstr "Този Ñигнал е Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтен ÑтатуÑ."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Този Ñигнал е означен ÑÑŠÑ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ñ‚Ð²Ð¾Ñ€ÐµÐ½."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Този Ñигнал е означен ÑÑŠÑ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð¿Ñ€Ð°Ð²ÐµÐ½."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Този Ñигнал е означен ÑÑŠÑ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Тази Ñтраница Ñъдържа и Ñнимка, изпратена от Ð½Ð°ÑˆÐ¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Времева линиÑ"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Заглавие"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "За да <strong> подадете Ñигнал</strong>, щракнете върху картата на точното меÑтоположение."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Заглавие"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "За да получите нови извеÑтиÑ, Ð¼Ð¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ пощенÑки код или име на улица."
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "За да получите нови извеÑтиÑ, Ð¼Ð¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ пощенÑки код или име на улица."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "За да видите точното меÑтоположение на проблема върху картата"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3367,8 +3412,8 @@ msgstr "Опитайте отново"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3376,11 +3421,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Ðепотвърден"
@@ -3397,7 +3442,9 @@ msgstr ""
msgid "Unknown error"
msgstr "Ðепозната грешка"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3420,11 +3467,11 @@ msgid "Update below added by %s at %s"
msgstr "Ðктуализирано от %s на %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3459,24 +3506,24 @@ msgstr "ÐктуализациÑ:"
msgid "Updated"
msgstr "Ðктуализирано!"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Ðктуализирано!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Ðктуализации"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3484,27 +3531,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr "Ðктуализиране на {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "ИзтеглÑне на актуализациите на %s Ñигналите "
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Потребител"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "използвана е била картата"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3512,23 +3562,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Потребители"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Ðктуализиране на ÑтойноÑтите"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3552,16 +3602,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Ðамерихме повече от едно Ñъвпадение за Вашето меÑтонахождение. Показват Ñе до 10 ÑъвпадениÑ, Ð¼Ð¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹Ñ‚Ðµ търÑене по друг критерий, ако вашето меÑтоположение, не е Ñред показаните."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Изпратили Ñме Ви имейл, за да потвърдите Ñъздаването на профил."
@@ -3575,7 +3624,7 @@ msgstr "Ðие никога не показваме Ð²Ð°ÑˆÐ¸Ñ Ð¸Ð¼ÐµÐ¹Ð»"
msgid "We never show your email address or phone number."
msgstr "Ðие никога не показваме Ð²Ð°ÑˆÐ¸Ñ Ð¸Ð¼ÐµÐ¹Ð» или телефонен номер."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3602,11 +3651,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Редактирано на:"
@@ -3615,7 +3668,7 @@ msgstr "Редактирано на:"
msgid "When sent"
msgstr "Изпратен"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3623,16 +3676,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Бихте ли иÑкали да получите още една анкета Ñлед 4 Ñедмици, за да ви напомни да проверите ÑтатуÑа?"
@@ -3658,15 +3717,13 @@ msgstr "Година"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Да"
@@ -3729,11 +3786,9 @@ msgstr "Вие отказахте; Ð¼Ð¾Ð»Ñ Ð¿Ð¾Ð¿ÑŠÐ»Ð½ÐµÑ‚Ðµ полето по
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Вече Ñте попълнили тази анкета. Ðко имате въпроÑ, Ð¼Ð¾Ð»Ñ <a href='%s'>Ñвържете Ñе Ñ Ð½Ð°Ñ</a>, или <a href='%s'>прегледайте Ñигнала</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Вече Ñте прикачили Ñнимка към този Ñигнал. Ðко прикачите нова, то Ñ‚Ñ Ñ‰Ðµ замени ÑъщеÑтвуващата."
@@ -3742,6 +3797,10 @@ msgstr "Вече Ñте прикачили Ñнимка към този Ñигн
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Вече Ñте прикачили Ñнимка към актуализациÑта, прикачайки нова ще замените предходната."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3762,15 +3821,11 @@ msgstr "УÑпешно пoтвърдихте ВашиÑÑ‚ имейл адреÑ.
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "УÑпешно влÑзохте в ÑиÑтемата; Ð¼Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ и потвърдете коректноÑтта на данните Ñи:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Ð’Ñе още нÑмате подадени Ñигнали. <a href=\"%s\">Подайте Ñигнал.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ‚Ðµ адреÑа, който ви беше изпратен на емейл адреÑа."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Ðеобходимо е да <a href=\"%s\">добавите райони</a> (като общини) преди да е възможно подаването на Ñигнали."
@@ -3784,18 +3839,16 @@ msgstr ""
"категории проблеми, които те обÑлужват (като повреда на Ð¿ÑŠÑ‚Ñ Ð¸Ð»Ð¸ наработещо \n"
"улично оÑветление), както и контакти (като имейл адреÑ), на който Ñигналите Ñе изпращат."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "ÐаиÑтина ли иÑкате да го изпратите отново?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Вашите Сигнали"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3804,22 +3857,17 @@ msgstr "Вашите Сигнали"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Имейл"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Имейл адреÑ"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Имейл адреÑ:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3829,24 +3877,23 @@ msgstr "Имейл:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Вашата Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‰Ðµ бъде използва Ñамо ÑпрÑмо нашата <a href=\"/privacy\">Политика за поверителноÑÑ‚</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Име"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Име:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3859,19 +3906,15 @@ msgstr "Паролата Ви беше променена уÑпешно"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Телефонен номер"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "ВашиÑÑ‚ Ñигнал"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Вашите Ñигнали"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Ðктуализации"
@@ -3879,23 +3922,31 @@ msgstr "Ðктуализации"
msgid "Your&nbsp;email:"
msgstr "ВашиÑÑ‚&nbsp;имейл:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Ð’Ñички Ñигнали"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "от %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Затворени Ñигнали"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "община"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "картата не е била използвана"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "напр. ‘%s’ или ‘%s’"
@@ -3904,17 +3955,22 @@ msgstr "напр. ‘%s’ или ‘%s’"
msgid "edit user"
msgstr "Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð½Ð° потребителÑ"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Поправени Ñигнали"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "от %d различни потребители"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "ПоÑледно обновено %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "преди по-малко от минута"
@@ -3959,14 +4015,13 @@ msgstr "маркиран като \"планиран\""
msgid "marked as unable to fix"
msgstr "марикарн като \"непоправим\""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "нÑма информациÑ"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "или"
@@ -3976,16 +4031,16 @@ msgstr "или ме намери автоматично"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "първоначално въведен: &ldquo;%s&rdquo;"
@@ -3998,8 +4053,8 @@ msgstr "други територии:"
msgid "reopened"
msgstr "отново отворен"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "излизане"
@@ -4015,17 +4070,20 @@ msgstr "меÑтната община"
msgid "there is no pin shown as the user did not use the map"
msgstr "мÑÑтото не е било отбелÑзано на картата от потребителÑ"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "този тип Ñигнали"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "днеÑ"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Поправени Ñигнали"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "използвана е била картата"
@@ -4049,7 +4107,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> подаден наÑкоро"
msgstr[1] "<big>%s</big> подадени наÑкоро"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4063,7 +4121,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d поддръжник"
msgstr[1] "%d поддръжници"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4084,7 +4142,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Ð’Ñе още нÑмаме Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° общината, коÑто ÑтопаниÑва тази териториÑ."
msgstr[1] "Ð’Ñе още нÑмаме Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° общините, които ÑтопаниÑват тази териториÑ."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4105,7 +4163,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big>поправени през Ð¸Ð·Ð¼Ð¸Ð½Ð°Ð»Ð¸Ñ Ð¼ÐµÑец"
msgstr[1] "<big>%s</big>поправени през Ð¸Ð·Ð¼Ð¸Ð½Ð°Ð»Ð¸Ñ Ð¼ÐµÑец"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4119,5 +4177,104 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Ð’Ñе още <strong>нÑмаме</strong> Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° общината, коÑто ÑтопаниÑва тази териториÑ."
msgstr[1] "Ð’Ñе още <strong>нÑмаме</strong> Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° общините, които ÑтопаниÑват тази териториÑ."
-#~ msgid "For council(s):"
-#~ msgstr "За общината/ите:"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Ðе Ñе притеÑнÑвайте &mdash; задържаме извеÑтието докато проверÑвате имейла Ñи.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Ðе Ñе притеÑнÑвайте &mdash; задържаме подаването на Ñигнала докато проверÑвате имейла Ñи.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Ðе Ñе притеÑнÑвайте &mdash; задържаме актуализациÑта докато проверÑвате имейла Ñи.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Ðко не виждате картата, <a href='%s' rel='nofollow'>пропуÑнете тази Ñтъпка</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Ðе</strong> Ðека да влÑза в ÑиÑтемата чрез имейл"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Други Ñигнали в близоÑÑ‚ <small>(within&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Свържете Ñе Ñ ÐµÐºÐ¸Ð¿Ð° на ПоправиСофиÑ"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "ÐдминиÑтратор на ПоправиСофиÑ:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Ð’ противен Ñлучай, уведомлениÑата нÑма да бъдат активирани."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Ð’ противен Ñлучай, вашиÑÑ‚ проблем нÑма да бъде публикуван."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Ð’ противен Ñлучай, вашата Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ñма да бъде публикувана."
+
+#~ msgid "New update:"
+#~ msgstr "Ðова актуализациÑ"
+
+#~ msgid "No problems found."
+#~ msgstr "ÐÑма намерен Ñигнал."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Ð’Ñе още нÑма подадени Ñигнали."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Сега да изпратим Ð’Ð°ÑˆÐ¸Ñ Ñигнал&hellip; имате ли парола за ПоправиСофиÑ?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Сега да изпратим Ð’Ð°ÑˆÐ¸Ñ Ñигнал&hellip; имате ли парола за Ñайта?"
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "ÐœÐ¾Ð»Ñ <a class=\"tab_link\" href=\"#report\">погледнете</a> актуализациите."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "ÐœÐ¾Ð»Ñ Ð¿Ð¾Ð³Ð»ÐµÐ´Ð½ÐµÑ‚Ðµ актуализациите."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Сигнали в обÑега на %s"
+
+#~ msgid "Publish the response"
+#~ msgstr "Публикувай отговора"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Сигнали означени върху картата"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Вход Ñ Ð¸Ð¼ÐµÐ¹Ð»"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Вход като %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "Това <strong>може</strong> да отнеме нÑколко минути &mdash; <em>молÑ</em> бъдете търпеливи."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñигнала можете да намерите в Ñледващата ÑекциÑ."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "ОпиÑанието на Ð²Ð°ÑˆÐ¸Ñ Ñигнал е доÑтъпно от дÑÑната Ñтрана на тази Ñтраница."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Ðай-новите Ñигнали подадени от потребители"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "ПоÑледни Ñигнали за {{COUNCIL}} подадени от потребителите"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "ПоÑледни Ñигнали за {{COUNCIL}} обхващаша квартал {{WARD}} подадени от потребителите"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "За да <strong> подадете Ñигнал</strong>, щракнете върху картата на точното меÑтоположение."
+
+#~ msgid "User"
+#~ msgstr "Потребител"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "ÐœÐ¾Ð»Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ‚Ðµ адреÑа, който ви беше изпратен на емейл адреÑа."
+
+#~ msgid "Your email address:"
+#~ msgstr "Имейл адреÑ:"
+
+#~ msgid "Your report"
+#~ msgstr "ВашиÑÑ‚ Ñигнал"
diff --git a/locale/cpanfile b/locale/cpanfile
new file mode 100644
index 000000000..09fb3c4c6
--- /dev/null
+++ b/locale/cpanfile
@@ -0,0 +1 @@
+requires 'Locale::Maketext::Lexicon';
diff --git a/locale/cpanfile.snapshot b/locale/cpanfile.snapshot
new file mode 100644
index 000000000..85f67bb01
--- /dev/null
+++ b/locale/cpanfile.snapshot
@@ -0,0 +1,88 @@
+# carton snapshot format: version 1.0
+DISTRIBUTIONS
+ ExtUtils-MakeMaker-7.06
+ pathname: B/BI/BINGOS/ExtUtils-MakeMaker-7.06.tar.gz
+ provides:
+ ExtUtils::Command 7.06
+ ExtUtils::Command::MM 7.06
+ ExtUtils::Liblist 7.06
+ ExtUtils::Liblist::Kid 7.06
+ ExtUtils::MM 7.06
+ ExtUtils::MM_AIX 7.06
+ ExtUtils::MM_Any 7.06
+ ExtUtils::MM_BeOS 7.06
+ ExtUtils::MM_Cygwin 7.06
+ ExtUtils::MM_DOS 7.06
+ ExtUtils::MM_Darwin 7.06
+ ExtUtils::MM_MacOS 7.06
+ ExtUtils::MM_NW5 7.06
+ ExtUtils::MM_OS2 7.06
+ ExtUtils::MM_QNX 7.06
+ ExtUtils::MM_UWIN 7.06
+ ExtUtils::MM_Unix 7.06
+ ExtUtils::MM_VMS 7.06
+ ExtUtils::MM_VOS 7.06
+ ExtUtils::MM_Win32 7.06
+ ExtUtils::MM_Win95 7.06
+ ExtUtils::MY 7.06
+ ExtUtils::MakeMaker 7.06
+ ExtUtils::MakeMaker::Config 7.06
+ ExtUtils::MakeMaker::Locale 7.06
+ ExtUtils::MakeMaker::_version 7.06
+ ExtUtils::MakeMaker::charstar 7.06
+ ExtUtils::MakeMaker::version 7.06
+ ExtUtils::MakeMaker::version::regex 7.06
+ ExtUtils::MakeMaker::version::vpp 7.06
+ ExtUtils::Mkbootstrap 7.06
+ ExtUtils::Mksymlists 7.06
+ ExtUtils::testlib 7.06
+ MM 7.06
+ MY 7.06
+ requirements:
+ Data::Dumper 0
+ DirHandle 0
+ Encode 0
+ ExtUtils::MakeMaker 0
+ File::Basename 0
+ File::Spec 0.8
+ Pod::Man 0
+ perl 5.006
+ Locale-Maketext-1.26
+ pathname: T/TO/TODDR/Locale-Maketext-1.26.tar.gz
+ provides:
+ Locale::Maketext 1.26
+ Locale::Maketext::Guts 1.20
+ Locale::Maketext::GutsLoader 1.20
+ requirements:
+ ExtUtils::MakeMaker 0
+ I18N::LangTags 0.31
+ I18N::LangTags::Detect 0
+ Test::More 0
+ Locale-Maketext-Lexicon-1.00
+ pathname: D/DR/DRTECH/Locale-Maketext-Lexicon-1.00.tar.gz
+ provides:
+ Locale::Maketext::Extract 1.00
+ Locale::Maketext::Extract::Plugin::Base 1.00
+ Locale::Maketext::Extract::Plugin::FormFu 1.00
+ Locale::Maketext::Extract::Plugin::FormFu::Extractor 1.00
+ Locale::Maketext::Extract::Plugin::Generic 1.00
+ Locale::Maketext::Extract::Plugin::Haml 1.00
+ Locale::Maketext::Extract::Plugin::Mason 1.00
+ Locale::Maketext::Extract::Plugin::PPI 1.00
+ Locale::Maketext::Extract::Plugin::Perl 1.00
+ Locale::Maketext::Extract::Plugin::TT2 1.00
+ Locale::Maketext::Extract::Plugin::TT2::Directive 1.00
+ Locale::Maketext::Extract::Plugin::TT2::Parser 1.00
+ Locale::Maketext::Extract::Plugin::TextTemplate 1.00
+ Locale::Maketext::Extract::Plugin::TextTemplate::Parser 1.00
+ Locale::Maketext::Extract::Plugin::YAML 1.00
+ Locale::Maketext::Extract::Plugin::YAML::Extractor 1.00
+ Locale::Maketext::Extract::Run 1.00
+ Locale::Maketext::Lexicon 1.00
+ Locale::Maketext::Lexicon::Auto 1.00
+ Locale::Maketext::Lexicon::Gettext 1.00
+ Locale::Maketext::Lexicon::Msgcat 1.00
+ Locale::Maketext::Lexicon::Tie 1.00
+ requirements:
+ ExtUtils::MakeMaker 6.30
+ Locale::Maketext 1.17
diff --git a/locale/cs_CZ.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/cs_CZ.UTF-8/LC_MESSAGES/FixMyStreet.po
index eb1b863c3..e9fc8231f 100644
--- a/locale/cs_CZ.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/cs_CZ.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -8,18 +8,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:32+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/fixmystreet/language/cs_CZ/)\n"
+"Language-Team: Czech (Czech Republic) (http://www.transifex.com/mysociety/fixmystreet/language/cs_CZ/)\n"
"Language: cs_CZ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " a "
@@ -32,11 +32,13 @@ msgstr " a "
msgid " or "
msgstr " nebo "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d potvrzených upozornění, %d nepotvrzených"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d úředních kontaktů -%d potvrzených, %d nepotvrzených"
@@ -45,11 +47,13 @@ msgstr "%d úředních kontaktů -%d potvrzených, %d nepotvrzených"
msgid "%d edits by %s"
msgstr "%d úprav od %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d online aktualizace"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d dotazníky zaslány -%d odpovědělo (%s %%)"
@@ -62,15 +66,62 @@ msgstr "%d až %d z %d"
msgid "%s - Summary reports"
msgstr "%s -Souhrnné reporty"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet má Å™adu RSS kanálů a e-mailových upozornÄ›ní na místních problémy, vÄetnÄ› \n"
+" upozornÄ›ní pro vÅ¡echny problémy v rámci urÄitého oddÄ›lení nebo úřadu, nebo se vÅ¡emi problémy \n"
+" v urÄité vzdálenosti k dané lokalitÄ›."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet má Å™adu RSS kanálů a e-mailových upozornÄ›ní na místních problémy, vÄetnÄ› \n"
+" upozornÄ›ní pro vÅ¡echny problémy v rámci urÄitého oddÄ›lení nebo úřadu, nebo se vÅ¡emi problémy \n"
+" v urÄité vzdálenosti k dané lokalitÄ›."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref: %s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"FixMyStreet posílá hlášení různých kategorií problémů\n"
+"přísluÅ¡ným úřadům, takže problémy uvnitÅ™ hranic urÄitého okrsku \n"
+"se nemusí shodovat s problémy zaslanými tomuto úřadu. Například, graffiti hlášení \n"
+"bude zasláno do okresního zastupitelstva, takže se objeví v obou okresního \n"
+"Rady & rsquo; s upozornění, ale objeví se pouze v \"v rámci hranice \" alert \n"
+"na krajský úřad."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s, oddělení, %"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, nahlášeno %s"
@@ -82,59 +133,57 @@ msgstr "% S, v% s oddělení"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Nemějte obavy - upozornění bude uchováno do doby potvrzení e-mailem.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Nemějte obavy - hlášení bude uchováno do doby potvrzení e-mailem.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Nemějte obavy - hlášení bude uchováno do doby potvrzení e-mailem.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(E-mailů v tabulce zneužívání)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Vaše jméno a příjmení"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "VaÅ¡e telefonní Äíslo:"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(Standardní vzdálenost, která pokrývá zhruba 10.000 lidí)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(Alternativně RSS zdroj lze přizpůsobit, v rámci"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(uzavřené)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(vyřešeno)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(napÅ™. graffiti, rozbité pouliÄní osvÄ›tlení, díry v komunikacích a pod. )"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(není odesláno na úřad)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(volitelnÄ›)"
@@ -142,25 +191,24 @@ msgstr "(volitelnÄ›)"
msgid "(public)"
msgstr "(veřejné)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(odesláno dvoum??)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(váš email a telefonní Äíslo nebudou nikde zveÅ™ejnÄ›ny)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(váš email nebude nezveřejněn)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Vyberte kategorii --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Vyberte typ nemovitosti --"
@@ -176,12 +224,14 @@ msgstr ""
" To je pravdÄ›podobnÄ› proÄ je \"area covered\" prázdná (níže).<br>\n"
" Asi upravte <code>MAPIT_TYPES</code> ve vaÅ¡em konfiguraÄním souboru."
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Pokud nevidíte mapu, <a href='%s' rel='nofollow'>vynechte tento krok</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong>Nevyřešená hlášení"
@@ -194,28 +244,22 @@ msgstr "<strong>Ne</strong> Potvrdím hlášení e-mailem"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Ne</strong> Potvrdím aktualizaci e-mailem"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Ne</strong> přihlásím se pomocí e-mailu"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Ne</strong>, přihlásím se pomocí e-mailu:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Ne</strong>, Potvrdím hlášení prostřednictvím emailu:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Ne</strong>, potvrdím aktualizaci pomocí e-mailu:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -226,8 +270,8 @@ msgstr "<strong>Ano</strong> Mám heslo"
msgid "About us"
msgstr "O nás"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -252,7 +296,7 @@ msgstr "Přidejte kontakt pomocí formuláře níže."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Zadejte instituci"
@@ -265,10 +309,15 @@ msgstr "Přidat novou kategorii"
msgid "Add user"
msgstr "Přidat Uživatele"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Přidáno %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Čeká se na moderování"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Opětovně:"
@@ -281,21 +330,25 @@ msgstr "Upozornění %d vytvořené pro %s, typu %s, parametry %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Upozornění %d zrušeno (vytvořeno %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Upozorněte mě na budoucí aktualizace"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Všechna hlášení"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Všechna hlášení"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Všechna hlášení"
@@ -318,8 +371,7 @@ msgstr "Veškeré vámi poskytnuté informace budou zaslány "
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Veškeré vámi poskytnuté informace budou zaslány <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Hlášení bylo oznaÄeno za vyÅ™eÅ¡ené."
@@ -328,16 +380,12 @@ msgstr "Hlášení bylo oznaÄeno za vyÅ™eÅ¡ené."
msgid "Anonymous"
msgstr "Anonimní"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonymní:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Jste <strong>vývojář</strong>? Nechcete se přidat a podpořit FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Jste vývojář?"
@@ -352,22 +400,25 @@ msgstr "Oblast pokrytí"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr "Vzhledem k tomu, že je ve stavu 'staging site' a %s je 'nepravda', budou reporty vypracované na těchto stránkách zaslány uživateli, který nahlásil problém a ne kontaktu uvedenému v nastavení dané oblasti a kategorie."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "PÅ™iÅ™aÄte externí instituci:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "PÅ™iÅ™aÄte jinou kategorii:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "PÅ™iÅ™aÄte externí instituci:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "PÅ™iÅ™aÄte oddÄ›lení:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Přířazeno: %s"
@@ -388,12 +439,12 @@ msgstr "Čeká se na moderování"
msgid "Back"
msgstr "Zpět"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Zakázat emailovou adresu"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Subjekty"
@@ -413,12 +464,16 @@ msgstr "Subjekt:"
msgid "By Date"
msgstr "Podle datumu"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Nevidíte mapu? <em>vynechte tento krok</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -429,27 +484,28 @@ msgstr "Nevidíte mapu? <em>vynechte tento krok</em>"
msgid "Category"
msgstr "Katetorie"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Category fix rate for problems > 4 týdny staré"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategorie:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategorie: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Změnit heslo"
@@ -494,54 +550,60 @@ msgstr ""
"Jméno <strong> kategorie </strong> zvolte tak, aby dávalo smysl pro veÅ™ejnost (napÅ™, \"Díra v silnici \", \"PouliÄní osvÄ›tlení \"), ale je užiteÄné \n"
" i pro daný úřad. Názvy kategorií se objeví v rozbalovací nabídce na stránce Nahlásit problém."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Klikněte sem nebo vložte dd/mm/rrrr"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klikněte na mapu a nahlaste problém"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Uzavřena"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Uzavřena úřadem"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Uzavřená hlášení"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Uzavřena:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Nejbližší hlášení <small>( v okolí %s km)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Souřadnice:"
@@ -549,22 +611,22 @@ msgstr "Souřadnice:"
msgid "Cobrand"
msgstr "Motiv"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Data motivu:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Motiv:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Nastavení"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Nastavení Endpointu"
@@ -572,7 +634,7 @@ msgstr "Nastavení Endpointu"
msgid "Confirm"
msgstr "Potvrdit"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Potvrdit úÄet"
@@ -592,7 +654,7 @@ msgstr "Potvrzení"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Potvrzeno"
@@ -603,13 +665,18 @@ msgstr "Potvrzená hlášení od %s do %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Potvrzeno:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontaktujte FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontaktujte nás"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -624,8 +691,14 @@ msgstr "Kontaktujte nás"
msgid "Contact the team"
msgstr "Kontaktujte nás!"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Souřadnice:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Uživatele nelze najít"
@@ -643,7 +716,7 @@ msgstr "Úřad"
msgid "Council contacts for %s"
msgstr "Kontakty na úřad %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "Äíslo jednací:&nbsp;%s"
@@ -658,7 +731,7 @@ msgstr "Úřad:"
msgid "Count"
msgstr "PoÄet"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Vytvořit report"
@@ -667,17 +740,19 @@ msgstr "Vytvořit report"
msgid "Create category"
msgstr "Vytvořit kategorii"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Vytvořit report"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Vytvořeno"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Vytvořeno:"
@@ -687,10 +762,15 @@ msgid "Current state"
msgstr "Aktuální stav"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Doposud nebyl vytvořen žádný subjekt."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -700,11 +780,16 @@ msgstr "Přehledy"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Odbavované úřadem do 5 pracovních dnů"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Smazána"
@@ -722,9 +807,9 @@ msgstr "Podrobnosti"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Podrobnosti:"
@@ -732,23 +817,27 @@ msgstr "Podrobnosti:"
msgid "Devolved"
msgstr "Předáno"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "bez mapy"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Tabulka Vížěhů"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Máte FixMyBarangay heslo?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Máte FixMyStreet heslo?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Není známo"
@@ -756,8 +845,8 @@ msgstr "Není známo"
msgid "Don't like forms?"
msgstr "Nechcete řešit formulářem?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -776,7 +865,8 @@ msgstr "Každému kontaktu daného subjektu můžeme přidělit kategorii, kter
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Upravit"
@@ -787,7 +877,7 @@ msgstr "Editace podrobností subjektu"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -802,15 +892,15 @@ msgstr "Úpravy aktualizace %d"
msgid "Editing user %d"
msgstr "Aktualizace uživatele %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Úprava"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -818,7 +908,7 @@ msgstr "Úprava"
msgid "Email"
msgstr "E-Mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "E-mail přidán do seznamu zneužívání"
@@ -834,7 +924,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "E-mail je již v seznamu zneužívání"
@@ -847,38 +937,36 @@ msgid "Email me updates"
msgstr "Zašlete aktualizace mailem"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-mail:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "E-mail: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Prázdný byt nebo mesonet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Prázdný dům nebo bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "ZavÅ™ená kancelář nebo komerÄní prostory"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Zavřená hospoda nebo bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Prázdná veřejná budova - škola, nemocnice a tp."
@@ -907,7 +995,7 @@ msgstr "KoneÄné datum:"
msgid "Endpoint"
msgstr "Endpoint"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Zadejte název ulice"
@@ -920,10 +1008,8 @@ msgstr "Zadejte nejbližší PSČ, název ulice nebo oblasti"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Zadejte blízké poÅ¡tovní smÄ›rovací Äíslo nebo název ulice Äi oblasti"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Zadejte PSČ, název ulice nebo název oblasti"
@@ -931,13 +1017,12 @@ msgstr "Zadejte PSČ, název ulice nebo název oblasti"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Zadejte nejbližší název ulice, oblasti, PSÄŒ nebo katastrální Äásti"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Zadejte nové heslo:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -948,7 +1033,6 @@ msgstr "Zadejte heslo"
msgid "Enter details of the problem"
msgstr "UveÄte podrobnosti daného problému"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -958,6 +1042,10 @@ msgstr "UveÄte podrobnosti daného problému"
msgid "Error"
msgstr "Chyba"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -971,12 +1059,19 @@ msgstr "Příklady:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "Vysvětlete, co je špatně a kde, případně jak dlouho to již trvá a tp. ..."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Doplňující data:"
@@ -989,8 +1084,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Filtrovat seznam hlášení"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Poprvé"
@@ -998,45 +1092,14 @@ msgstr "Poprvé"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Pro opravu vyberte <strong>oblast pokrytí</strong> v Äásti <em>Editace podrobností subjektu</em> ve formuláři níže."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet administrace:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreet má Å™adu RSS kanálů a e-mailových upozornÄ›ní na místních problémy, vÄetnÄ› \n"
-" upozornÄ›ní pro vÅ¡echny problémy v rámci urÄitého oddÄ›lení nebo úřadu, nebo se vÅ¡emi problémy \n"
-" v urÄité vzdálenosti k dané lokalitÄ›."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"FixMyStreet posílá hlášení různých kategorií problémů\n"
-"přísluÅ¡ným úřadům, takže problémy uvnitÅ™ hranic urÄitého okrsku \n"
-"se nemusí shodovat s problémy zaslanými tomuto úřadu. Například, graffiti hlášení \n"
-"bude zasláno do okresního zastupitelstva, takže se objeví v obou okresního \n"
-"Rady & rsquo; s upozornění, ale objeví se pouze v \"v rámci hranice \" alert \n"
-"na krajský úřad."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1047,21 +1110,16 @@ msgstr ""
msgid "Fixed"
msgstr "Vyřešené"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "vyřešené - Úřad"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Vyřešené - Uživatel"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Hlášení - Vyřešené"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Vyřešené:"
@@ -1071,11 +1129,11 @@ msgstr "Vyřešené:"
msgid "Flag as deleted"
msgstr "OznaÄené za smazané"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Sledovat uživatele"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "UrÄeno ke sledování"
@@ -1092,7 +1150,7 @@ msgstr "Takto oznaÄení uživatelé jsou v seznamu na této <a href='%s'>strán
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "OznaÄení uživatelé nejsou žádným způsobem omezováni. Je to jen seznam uživatelů, kteří byli oznaÄeni k Vaší pozornosti."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Sledováno:"
@@ -1111,9 +1169,22 @@ msgstr "Více informací naleznete v Älánku <a href='http://fixmystreet.org/cu
msgid "Forgotten your password?"
msgstr "Zapomněli jste své heslo?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "PÅ™iÅ™aÄte externí instituci:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "PÅ™iÅ™aÄte externí instituci:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Často kladené dotazy"
@@ -1136,8 +1207,7 @@ msgstr "Získat aktualizace hlášení %s "
msgid "Get updates of problems in this %s"
msgstr "Získat aktualizace hlášení %s "
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Přihlásit se k odběru RSS kanálu"
@@ -1146,17 +1216,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "OK"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Odeslat dotazník?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Graf hlášení v Äase a jejich stavů"
@@ -1164,41 +1234,37 @@ msgstr "Graf hlášení v Äase a jejich stavů"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Å edÄ› oznaÄené řádky jsou úřady, které již existují."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Byl tento problém vyřešen?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Už jste někdy před tím hlásili problém úřadu a nebo je toto Vaše hlášení poprvé?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Nápověda"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Možnosti pro upozornění na lokální problém pro oblast &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Přihlášená osoba: %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1212,7 +1278,7 @@ msgstr "Skrýt staré"
msgid "Hide pins"
msgstr "Schovat znaÄky"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historie"
@@ -1228,7 +1294,7 @@ msgstr "Jak nahlásit problém"
msgid "How to send successful reports"
msgstr "Anleitung"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Bohužel nemůžete potvrdit nepotvrzená hlášení."
@@ -1255,8 +1321,8 @@ msgstr "Bohužel nelze ověřit platnost. Pokud jste kopírovali URL adresu z e
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1278,18 +1344,6 @@ msgstr ""
"Pokud dva nebo více subjektů působí ve stejné lokalitě, FixMyStreet spojuje identické kategorie do jedné\n"
" položky menu. Pokud to tak chcete, ujistěte se, že jména kategorie v těchto subjektech jsou totožná."
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Pokud to neuděláte, vaše upozornění nebude aktivováno."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Pokud to neuděláte, Vaše hlášení nebude odesláno."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Pokud to neuděláte, Vaše aktualizace nebude odeslána."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1299,16 +1353,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Pokud zde zadáte své hlášení, nadpis a podrobnosti hlášení budou veÅ™ejné, ale hlášení <strong>nebude</strong> doruÄeno na úřad."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Pokud používáte webový e-mail, nebo máte zapnutý filtr <em>nevyžádané poÅ¡ty</em>, zkontrolujte si <em>hromadnou</em> a <em>spam</em> složky. ObÄas jsou naÅ¡e zprávy jsou tímto způsobem oznaÄovány."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Pokud chcete zanechat veřejnou aktualizaci tohoto hlášení, zadejte ji prosím zde\n"
"(Takovéto aktualizace nebudou zaslány na úřad). Například, jakou máte\n"
@@ -1344,7 +1398,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Neplatné ID"
@@ -1369,14 +1423,13 @@ msgstr "V tabulce zneužívání?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "KromÄ› toho, tyto atributy, které nejsou souÄástí specifikace Open311 v2 jsou vráceny: agency_sent_datetime název (také vrácený jako souÄást popisu), interface_used, comment_count, requestor_name (přítomný pouze tehdy, pokud žadatel povolen název, který bude zobrazen na této stránce) ,"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "v řešení"
@@ -1384,7 +1437,7 @@ msgstr "v řešení"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Zahrnuty osobní údaje hlasatele problému"
@@ -1396,12 +1449,12 @@ msgstr "VÄetnÄ› nepotvrzených hlášení"
msgid "Incorrect has_photo value \"%s\""
msgstr "Chybná has_photo hodnota \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Interní poznámky"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Interní postoupení"
@@ -1409,7 +1462,7 @@ msgstr "Interní postoupení"
msgid "Invalid agency_responsible value %s"
msgstr "Chybná agency_responsible hodnota %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Chybný koneÄný datum"
@@ -1417,12 +1470,12 @@ msgstr "Chybný koneÄný datum"
msgid "Invalid format %s specified."
msgstr "Chybný formát %s specified."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Chybné poÄáteÄní datum"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1440,10 +1493,19 @@ msgstr "Často bývá nejrychlejší <a href=\"%s\">zkontrolovat naše Otázky
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1455,7 +1517,7 @@ msgstr "Ponechte mÄ› pÅ™ihlášeného na tomto poÄítaÄi"
msgid "Last editor"
msgstr "Poslední úpravy"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Poslední úpravy:"
@@ -1490,7 +1552,7 @@ msgstr "Lokální RSS kanály a mailové upozornění"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Lokální RSS kanály a mailové upozornění pro ‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Místní upozornění"
@@ -1503,14 +1565,12 @@ msgid "MAP"
msgstr "MAPA"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Mapa"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "oznaÄeno za uzavÅ™ené"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1528,6 +1588,16 @@ msgstr ""
msgid "Message"
msgstr "Zpráva"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "PÅ™iÅ™aÄte externí instituci:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "PÅ™iÅ™aÄte externí instituci:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Zpráva:"
@@ -1555,27 +1625,25 @@ msgstr "Další hlášení z okolí"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Jméno"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Jméno:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Jméno: %s"
@@ -1588,12 +1656,12 @@ msgstr "Nejbližší pojmenovaná ulice k umístÄ›né znaÄce na mapÄ› (automati
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Nejbližší PSÄŒ k umístÄ›né znaÄce na mapÄ› (automaticky generováno) %s (%sm away)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Nejbližší cesta k umístÄ›né znaÄce na mapÄ› (automaticky generováno pomocí Bing Mapy): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1601,10 +1669,15 @@ msgstr ""
"Nejbližší cesta k umístÄ›né znaÄce na mapÄ› (automaticky generováno pomocí Bing Mapy): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Téměř hotovo! Nyní zkontrolujte svůj e-mail ..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Téměř hotovo! Nyní zkontrolujte svůj e-mail ..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nová <br>hlášení"
@@ -1613,12 +1686,12 @@ msgstr "Nová <br>hlášení"
msgid "New body added"
msgstr "Přidán nový subjekt"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Do kategorie byl přidán nový kontakt"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Nová interní poznámka:"
@@ -1626,9 +1699,10 @@ msgstr "Nová interní poznámka:"
msgid "New local problems on FixMyStreet"
msgstr "Nové lokální hlášení na FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nová lokální hlášení na reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nová interní poznámka:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1654,33 +1728,15 @@ msgstr "Nová hlášení v oblasti {{NAME}} na FixMyStreet"
msgid "New reports"
msgstr "Nová hlášení"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nová hlášení pro {{COUNCIL}} , oblast {{WARD}} na reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nová hlášení na reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nová hlášení na reportemptyhomes.com v oblasti PSČ {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nová hlášení pro {{COUNCIL}} na reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nová hlášení pro oblast {{NAME}} na reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Nový stav"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Nové aktualizace:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Nový stav"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1693,14 +1749,12 @@ msgstr "Další"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Ne"
@@ -1728,20 +1782,11 @@ msgstr "Nebyla nalazena žádná sledovaná hlášení."
msgid "No flagged users found."
msgstr "Nebyli nalezeni žádní sledovaní uživatelé."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Žádné další aktualizace"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Nenalezena žádná hlášení."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Doposud nebylo nic nahlášeno."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Vráceno bez výsledku."
@@ -1761,8 +1806,6 @@ msgid "No supporters"
msgstr "Žádný podporovatel."
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Žádné"
@@ -1779,8 +1822,8 @@ msgstr ""
" V závislosti na implementaci, zaměstnanci institucí mohou mít přístup k přehledům (souhrny \n"
" aktivit jejich institucí), možnost smazat hlášení nebo nastavovat speciální stavy hlášení."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1788,7 +1831,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Nezodpovídá"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Nezodpovídá"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Není urÄeno pro naší oddÄ›lení"
@@ -1801,7 +1852,7 @@ msgid "Not reported to council"
msgstr "Na úřad nebylo hlášeno"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Poznámka"
@@ -1811,7 +1862,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Upozorňujeme, že když zahrnujeme nepotvrzená hlášení, používáme datum hlášení, kdy bylo vytvoÅ™eno. To vÅ¡ak nemusí být ve stejném mÄ›síci, kdy bylo potvrzeno a proto se poÄty mohou trochu liÅ¡it"
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Poznámka:"
@@ -1820,22 +1871,20 @@ msgstr "Poznámka:"
msgid "Note: <strong>%s</strong>"
msgstr "Poznámka: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "A teÄ staÄí hlášení odeslat"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "A nyní odešlete hlášení t&hellip; máte FixMyStreet heslo?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "A nyní pro odeslání aktualizace&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "A nyní pro odeslání aktualizace t&hellip; máte FixMyStreet heslo?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1865,20 +1914,18 @@ msgstr "Starší <br>hlášení"
msgid "One-line summary"
msgstr "jednořádkový nadpis"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Otevřený"
@@ -1886,11 +1933,6 @@ msgstr "Otevřený"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Otevřená hlášení"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1907,32 +1949,26 @@ msgstr "Úvodní webová stránka systému Open311"
msgid "Open311 specification"
msgstr "Specifikace systému Open311"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Nebo problémy hlášené subjektu:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Nebo se můžete pÅ™ihlásit k odbÄ›ru vÅ¡ech upozornÄ›ní na hlášení, které jsou v následujících oblastech úřadu Äi Äástí:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Ostatní"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Náš zdrojový kód je open source a <a href=\"http://github.com/mysociety/fixmystreet\">je dostupný na GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Vlastník"
@@ -1947,12 +1983,12 @@ msgstr "Stránka nenalezena"
msgid "Parent"
msgstr "Nadřazený subjekt"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "ČásteÄnÄ›"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1961,6 +1997,7 @@ msgid "Password (optional)"
msgstr "Heslo (volitelnÄ›)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Heslo:"
@@ -1968,7 +2005,7 @@ msgstr "Heslo:"
msgid "Permalink"
msgstr "Trvalý odkaz"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Telefonní Äíslo"
@@ -1977,11 +2014,9 @@ msgstr "Telefonní Äíslo"
msgid "Phone number (optional)"
msgstr "Telefonní Äíslo (volitelnÄ›)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefon:"
@@ -1992,14 +2027,23 @@ msgstr "Telefon:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Fotografie"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Tato informace je vyžadována"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Tato informace je vyžadována"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Fotografie:"
@@ -2011,22 +2055,18 @@ msgstr "Fotografie nedávných okolních hlášení"
msgid "Place pin on map"
msgstr "Umísti špendlík na mapu"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Plánováno"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "BuÄte prosím zdvoÅ™ilí, struÄní a vyjadÅ™ujte se k vÄ›ci."
@@ -2036,22 +2076,20 @@ msgstr "BuÄte prosím zdvoÅ™ilí, struÄní a vyjadÅ™ujte se k vÄ›ci."
msgid "Please check the passwords and try again"
msgstr "Zkontrolujte prosím hesla a zkuste znovu"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Zkontrolujte svůj mail"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Zkontrolujte, zda je vaše emailová adresa správná"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2061,15 +2099,16 @@ msgstr "Vyberte kategorii"
msgid "Please choose a property type"
msgstr "Zvolte typ nemovitosti"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Opravte prosím chyby uvedené níže"
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"<strong>Neposílejte</strong> hlášení problémů prostřednictvím tohoto formuláře: zprávy jsou zasílány\n"
@@ -2081,7 +2120,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Nezneužívejte tento nástroj - zneužívání vašeho úřadu znehodnocuje službu pro všechny uživatele."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "prosím zadejte zprávu"
@@ -2092,15 +2131,15 @@ msgstr "prosím zadejte zprávu"
msgid "Please enter a password"
msgstr "Prosím zadejte heslo"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Prosím zadejte název"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2108,7 +2147,7 @@ msgid "Please enter a valid email"
msgstr "Prosím zadejte platný e-mail"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Prosím zadejte platnou emailovou adresu"
@@ -2117,21 +2156,19 @@ msgstr "Prosím zadejte platnou emailovou adresu"
msgid "Please enter some details"
msgstr "Prosím zadejte podrobnosti"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Prosím zadejte váš e-mail"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Prosím zadejte vaši emailovou adresu"
@@ -2144,8 +2181,8 @@ msgstr "Zadejte vaše jméno"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Zadejte své celé jméno, úřad potÅ™ebuje tyto informace - jestliže si pÅ™ejete, aby VaÅ¡e jméno nebylo na webu zobrazeno, odÅ¡krtnÄ›nte ÄvereÄek níže"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2184,7 +2221,7 @@ msgstr "Prosím, vyplňte údaje o hlášeném problému."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Vyplňte prosím níže uvedený formulář s údaji o problému, a popište místo tak přesně, jak je to možné v poli podrobnosti."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "UveÄte, zda chcete dostat další dotazník"
@@ -2207,19 +2244,24 @@ msgstr "Vezměte prosím na vědomí, že vaše zpráva <strong> ještě nebyla
msgid "Please note:"
msgstr "Vezměte prosím na vědomí:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "UveÄte prosím nÄ›jaké vysvÄ›tlení, proÄ jste znovu otevÅ™eli toto hlášení"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "UveÄte prosím nÄ›jaký text, stejnÄ› jako fotografii"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Prosím, řekněte, jestli jste někdy předtím hlásili problémy na váš úřad"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Zvolte subjekt"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Prosím, vyberte kanál, který chcete"
@@ -2228,21 +2270,17 @@ msgstr "Prosím, vyberte kanál, který chcete"
msgid "Please select the type of alert you want"
msgstr "Vyberte typ upozornění, které chcete"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "UveÄte, prosím, zda byl Äi nebyl problém vyÅ™eÅ¡en"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Věnujte prosím pozornost aktualizacím, které zde byly zanechány."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Prosím, nahrávejte pouze obrázky ve formátu JPEG"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Napište zprávu"
@@ -2251,8 +2289,8 @@ msgid "Please write your update here"
msgstr "Aktuální informace doplňte prosím zde"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2273,22 +2311,36 @@ msgstr "Odesláno uživatelem %s (<strong>%s</strong>) v %s"
msgid "Posted by %s at %s"
msgstr "Odesláno uživatelem %s v %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Předcházející"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Ochrana osobních údajů"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Neveřejné"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Hlášení"
@@ -2304,12 +2356,12 @@ msgstr "Hlášení %s potvrzeno"
msgid "Problem %s sent to council %s"
msgstr "Hlášení %s bylo odesláno na úřad %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Členění hlášení podle stavu"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Hlášení bylo oznaÄeno za otevÅ™ené."
@@ -2325,12 +2377,10 @@ msgstr "Hlášení"
msgid "Problems in this area"
msgstr "Hlášení v této oblasti"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Hlášení v okolí"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Hlášení na mapě"
@@ -2339,12 +2389,11 @@ msgstr "Hlášení na mapě"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Hlášení oznaÄená za vyÅ™eÅ¡ená na serveru FixMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Hlášení v okolí %.1fkm od tohoto místa"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2356,20 +2405,17 @@ msgstr "Hlášení v oblasti %s"
msgid "Problems within %s ward"
msgstr "Hlášení v oblasti %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Hlášení v oblasti %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Hlášení v oblasti %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Hlášení uvnitř oblasti:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Nemovitosti na reportemptyhomes.com nahlášené k navrácení k opětovnému užívání"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Adresa nemovitosti:"
@@ -2383,39 +2429,31 @@ msgstr "Typ nemovitosti:"
msgid "Provide an update"
msgstr "Poskytněte aktuální informace"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Poskytnutí jména a hesla je volitelné, zato vám ale umožní snadněji nahlásit problémy, hlásit aktualizace a spravovat svá hlášení."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Poskytnutí hesla je volitelné, zato vám ale umožní snadněji nahlásit problémy, hlásit aktualizace a spravovat svá hlášení."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Veřejná reakce:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publikovaná fotografie"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publikovat reakci"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Dotazník"
@@ -2431,12 +2469,11 @@ msgstr "Dotazník %d poslal k hlášení %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Dotazník vyplňuje uživatel, který podal hlášení problému"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2462,8 +2499,7 @@ msgstr "RSS kanál pro %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS kanál pro %s, v oblasti %s "
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS kanál hlášení v okolí"
@@ -2471,7 +2507,7 @@ msgstr "RSS kanál hlášení v okolí"
msgid "RSS feed of problems in this %s"
msgstr "RSS kanál hlášení v oblasti %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2501,17 +2537,18 @@ msgstr "RSS kanál aktualizací tohoto hlášení"
msgid "Receive email when updates are left on this problem."
msgstr "Dostávat e-mail, když je hlášení aktualizováno."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Aktuální lokální hlášení, FixMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Aktuálně <br>vyřešené"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Nedávno nahlášené problémy"
@@ -2519,23 +2556,28 @@ msgstr "Nedávno nahlášené problémy"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Uvědomte si, že FixMyStreet je především pro hlášení fyzických problémů, které mohou být opraveny. Pokud váš problém není vhodný pro hlášení prostřednictvím tohoto webu, můžete se obrátit na váš úřad přímo pomocí jejich internetových stránek."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Odstranit příznak"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Odstranit fotografii (nelze vrátit zpět!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "editace uživatele"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Nahlásit problém"
@@ -2544,7 +2586,7 @@ msgstr "Nahlásit problém"
msgid "Report abuse"
msgstr "Nevhodný obsah"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Hlášení na webu %s"
@@ -2553,83 +2595,82 @@ msgstr "Hlášení na webu %s"
msgid "Report your problem"
msgstr "Nahlášení problému"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Hlášení, zobrazení a diskuse nad lokálními problémy"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Nahlášeno uživatelem"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Nahlášeno uživatelem %s, urÄeno pro %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Nahlášeno anonymně v %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Hlásil(a) jsem již dříve"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Nahlášeno uživatelem %s, urÄeno pro %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Nahlášeno uživatelem"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Nahlášeno v kategorii %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Nahlášeno anonymně v %s v kategorii %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Nahlášeno v kategorii %s uživatelem %s v %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Nahlášeno prostřednictvím %s anonymně v %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Nahlášeno prostřednictvím %s uživatelem %s v %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Nahlášeno prostřednictvím %s v kategorii %s anonymně v %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Nahlášeno prostřednictvím %s v kategorii %s uživatelem %s v %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Nahlášeno v kategorii %s"
+msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Nahlášeno uživatelem"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Hlášení problému"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Hlášení"
@@ -2642,18 +2683,21 @@ msgstr "Délka hlášení je omezena na %s znaků. Prosím, zkraťte své hláš
msgid "Reports awaiting approval"
msgstr "Hlášení Äekající na schválení"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Hlášení v mapě"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Publikovaná hlášení"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Znovu odeslané hlášení"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Správné místo?"
@@ -2668,26 +2712,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "OtoÄit doleva"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "OtoÄit doprava"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "Satelitní"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Uložit změny"
@@ -2700,7 +2750,7 @@ msgstr "Vyhledat hlášení"
msgid "Search Users"
msgstr "Vyhledat uživatele"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Vyhledat hlášení"
@@ -2732,20 +2782,25 @@ msgstr "Vyberte konkrétní instituce a"
msgid "Select an area"
msgstr "Zvolte oblast"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Vyberte, jaký typ upozornÄ›ní chcete a kliknÄ›te na tlaÄítko pro RSS kanály, nebo zadejte svou e-mailovou adresu k odbÄ›ru e-mailového upozornÄ›ní."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Otevřená hlášení"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "odesláno do %s o %s později"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Odeslat:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Služba:"
@@ -2754,8 +2809,8 @@ msgstr "Služba:"
msgid "Share"
msgstr "Sdílet"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2771,34 +2826,23 @@ msgid "Show pins"
msgstr "Zobrazit znaÄky"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Přihlásit se"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Přihlásit se pomocí e-mailu"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "PÅ™ihlaste se nebo si vytvoÅ™te úÄet"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Odhlásit se"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Přihlášen as %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Nekteré kategorie mohou vyžadovat dodateÄné informace."
@@ -2814,8 +2858,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "NÄ›které fotografie souÄasných hlášení"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Specifický název pro lokalizaci"
@@ -2823,24 +2868,32 @@ msgstr "Specifický název pro lokalizaci"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Je nám líto, že se zdá, že toto PSČ nepokrýváme."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Omlouváme se, došlo k chybě potvrzující váš problém."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Nemůžeme bohužel nalézt tuto lokalitu."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Omlouváme se, nelze lokalizovat. Zkuste ještě jednou."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Omlouváme se, nelze lokalizovat. Zkuste ještě jednou."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "PoÄáteÄní datum:"
@@ -2856,16 +2909,17 @@ msgstr "Stav"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Stav:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistiky"
@@ -2879,7 +2933,12 @@ msgstr "Stav"
msgid "Still open, via questionnaire, %s"
msgstr "Stále otevřeno, prostřednictvím dotazníku, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Podkategorie: %s"
@@ -2894,45 +2953,42 @@ msgstr "Předmět"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Předmět:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Odeslat"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Odeslat změny"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Odeslat dotazník"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Odesláno"
@@ -2943,18 +2999,19 @@ msgstr "Odesláno"
msgid "Subscribe"
msgstr "Přihlásit se k odběru"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Přihlásit se k odběru emailových upozornění"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Přehled"
@@ -2965,7 +3022,7 @@ msgstr "Přehled"
msgid "Summary reports"
msgstr "Souhrnný přehled"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Průzkum"
@@ -2973,9 +3030,18 @@ msgstr "Průzkum"
msgid "Survey Results"
msgstr "Výsledky průzkumu"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Aktualizace"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Text"
@@ -2984,6 +3050,7 @@ msgid "Text only version"
msgstr "Pouze textová verze"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Text:"
@@ -3005,7 +3072,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "DÄ›kujeme za nahrání fotografie. Nyní je tÅ™eba lokalizovat VaÅ¡e hlášení, proto prosím zadejte název nedaleké ulice nebo poÅ¡tovní smÄ›rovací Äíslo do pole nad & nbsp;: "
@@ -3013,7 +3080,7 @@ msgstr "DÄ›kujeme za nahrání fotografie. Nyní je tÅ™eba lokalizovat VaÅ¡e hlÃ
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Díky, rádi slyšíme, že to bylo vyřešeno! Můžeme se ještě zeptat, jestli jste někdy předtím hlásili úřadům problém?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Zdá se, že se obrázek nenahrál správně (%s), zkuste to prosím znovu."
@@ -3031,20 +3098,19 @@ msgstr "To místo se nezdá být v České republice; prosím zkuste to znovu."
msgid "That postcode was not recognised, sorry."
msgstr "Omlouváme se, ale poÅ¡tovní smÄ›rovací Äíslo nebylo rozpoznáno."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Hlášení bude nyní opět odesláno."
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Hlášení bude nyní opět odesláno."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Tento report nemůže být zobrazen na %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Toto hlášení bylo vyjmuto z FixMyStreet."
@@ -3092,30 +3158,18 @@ msgstr ""
"<strong>Název</strong> identifikuje subjekt (například, <em>Úřad mÄ›stské Äásti Praha 21</em>), \n"
" název může být zobrazen veřejně."
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Zaslání potvrzovacího e-mailu <strong> může </strong> trvat nÄ›kolik minut, & ndash; <em> prosím </em>, buÄte trpÄ›liví."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "Úřad nebude moci pomoci, pokud ve svém hlášení nezadáte dostatek podrobností. PopiÅ¡te, prosím, pÅ™esné umístÄ›ní problému (například na zdi), co tam je, jak dlouho to tam bylo a td. UveÄte popis vÄetnÄ› fotografie problému, pokud ji máte."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Podrobnosti vašeho hlášení jsou dostupné v záložce nahoře."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Podrobnosti vašeho hlášení jsou dostupné na pravé straně této stránky."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "Tabulka Vítězů ukazuje aktivity editorů (kdo editoval nejvíce záznamů)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Nastala chyba: %s"
@@ -3133,10 +3187,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr "Poslední lokální problémy od uživatelů"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Poslední lokální hlášení od uživatelů"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Poslední hlášení uživatelů pro {{COUNCIL}}"
@@ -3157,21 +3207,9 @@ msgstr "Poslední hlášení uživateli oznaÄená za vyÅ™eÅ¡ená"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Poslední hlášení uživatelů pro {{NAME}}"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Poslední nemovitosti hlášené uživateli jako zpět předané k užívání"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Poslední hlášení uživatelů pro {{COUNCIL}} "
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Poslední hlášení uživatelů pro {{COUNCIL}} v oblasti {{WARD}} "
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Poslední hlášení uživatelů pro {{NAME}}"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3187,8 +3225,7 @@ msgstr "Heslo se neshoduje"
msgid "The requested URL '%s' was not found on this server"
msgstr "Požadovaná adresa URL '%s' nebyla na tomto serveru nalezena"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Nejjednodušší upozornění je jedno z našich geografických:"
@@ -3199,7 +3236,7 @@ msgstr "Nejjednodušší upozornění je jedno z našich geografických:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "Souhrn a popisy budou také veÅ™ejné (ÄtÄ›te naÅ¡e<a href=\"/privacy\">zásady ochrany osobních údajů</a>)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Uživatel nemohl lokalizovat problém v mapě, ale je zobrazeno okolí lokality při zadání hlášení"
@@ -3212,23 +3249,24 @@ msgstr ""
"<strong> Jména </strong> uživatelů se objeví veÅ™ejnÄ› v hlášeních, která nebyla oznaÄena jako <em> anonymní</em>. \n"
" Jména nejsou nutnÄ› jedineÄná."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Nastal problém v zobrazení stránky Všechna hlášení. Prosím, zkuste později."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Nastal problém v zobrazení této stránky. Prosím, zkuste později."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Byl problém s kombinací e-mailu a hesla. Pokud si nemůžete vzpomenout na své heslo, nebo ho ještě nemáte, zadejte ho v sekci lsquo, přihlášení se prostřednictvím e-mailu & rsquo; tohoto formuláře."
@@ -3241,7 +3279,7 @@ msgstr "Nastal problém s kombinací Vaší e-mailové adresy a hesla. Prosím z
msgid "There was a problem with your update. Please try again."
msgstr "Nastal problém s vaší aktualizací. Prosím opakujte ještě jednou."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Nastal problém s vaším hlášením. Prosím, pÅ™eÄtÄ›te si informace níže."
@@ -3291,16 +3329,16 @@ msgstr ""
"Tomuto úřadu budou zasálána pouze hlášení o problémech, která jsou umístěna v <strong> oblasti pokrytí</strong>. \n"
" Úřad nebude dostávat žádné zprávy, pokud nepokrývá alespoň jednu vybranou oblast."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Tento e-mail byl odeslán na oba úřady působící v dané lokalitě, protože uživatel hlášení nekategorizoval. Prosím ignorujte, pokud nejste oprávněný úřad kompetentní řešit nahlášený problém nebo nám dejte vědět, jaká je to kategorie problémů a kdo jí má na starosti, my jí doplníme do našeho systému."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Tento e-mail byl odeslán na několik úřadů působících v dané lokalitě, protože zvolená kategorie hlášení je uvedena pro všechny z nich. Prosím ignorujte, pokud nejste oprávněný úřad kompetentní řešit nahlášený problém."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3314,7 +3352,7 @@ msgstr "Toto je vývojářský web; věci mohou kdykoli přestat fungovat, data
msgid "This is a summary of all reports on this site."
msgstr "Zde je souhrn všech hlášení na tomto webu."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "To může být proto, že odkaz je příliš starý nebo již použitý, nebo adresa nebyla správně zkopírována."
@@ -3341,55 +3379,69 @@ msgstr "Řešení hlášení probíhá"
msgid "This problem is old and of unknown status."
msgstr "Hlášení je zastaralé a není znám stav."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Hlášení Äeká na moderování operátorem."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Hlášení je aktuálnÄ› oznaÄené za uzavÅ™ené."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Hlášení je aktuálnÄ› oznaÄené za vyÅ™eÅ¡ené."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Hlášení je aktuálnÄ› oznaÄené za otevÅ™ené."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Hlášení bylo zasláno anonymně."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Webová stránka také obsahuje fotografii hlášení, poskytnutou uživatelem."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Časová osa"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Nadpis"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Pro <Strong> nahlášení problému </strong>, klikněte na mapě na správném místě."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Nadpis"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Pokud chcete zjistit, jaká místní upozornÄ›ní jsme pro Vás pÅ™ipravili, prosím, zadejte své poÅ¡tovní smÄ›rovací Äíslo nebo název ulice Äi oblasti"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Pokud chcete zjistit, jaká místní upozornÄ›ní jsme pro Vás pÅ™ipravili, prosím, zadejte své poÅ¡tovní smÄ›rovací Äíslo nebo název ulice Äi oblasti"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Pro zobrazení mapy přesného umístění tohoto problému"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3405,8 +3457,8 @@ msgstr "Opakujte znovu"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3414,11 +3466,11 @@ msgstr ""
msgid "Unable to fix"
msgstr "Nelze opravit"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Nepotvrzeno"
@@ -3435,7 +3487,9 @@ msgstr "Neznámý typ upozornění"
msgid "Unknown error"
msgstr "Neznámá chyba"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Neznámé ID hlášení"
@@ -3458,11 +3512,11 @@ msgid "Update below added by %s at %s"
msgstr "Aktualizace níže byly přidána uživatelem %s v %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Aktualizace subjektu"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Aktualizované ÄlenÄ›ní podle stavu"
@@ -3497,24 +3551,24 @@ msgstr "Aktualizace:"
msgid "Updated"
msgstr "Aktualizováno"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Aktualizováno!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Aktualizace"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "Aktualizace je omezena na %s znaků její délky. Prosím, zkraťte ji"
@@ -3522,27 +3576,30 @@ msgstr "Aktualizace je omezena na %s znaků její délky. Prosím, zkraťte ji"
msgid "Updates on {{title}}"
msgstr "Aktualizace hlášení {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Aktualizace tohoto hlášení, FixMyStreet"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "<strong> Poznámka </strong> slouží pro záznam ifnormací, které jsou zobrazeny pouze v administraci. Poznámky nejsou zobrazeny veřejně a nejsou odeslány subjektům."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Uživatel"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "použitá mapa"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Uživatel vyjmut ze sledování"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Uživatel sledován"
@@ -3550,23 +3607,23 @@ msgstr "Uživatel sledován"
msgid "User search finds matches in users' names and email addresses."
msgstr "Při vyhledávání byly nalezeny shody v uživatelských jménech nebo e-mailových adresách."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Uživatelé"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Hodnoty aktualizovány"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Zobrazit hlášení na serveru"
@@ -3590,16 +3647,15 @@ msgid "Wards of this council"
msgstr "Oddělení tohoto úřadu"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Našli jsme více než jednu shodu pro požadovanou lokalitu. Nabízíme až 10 možných lokalit. Upřesněte prosím vyhledávání, pokud zde požadovanou lokalitu nenaleznete."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Omlouváme se, nebyli jsme schopni potvrdit Váš úÄet."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Odeslali jsme Vámi e-mail s odkazem pro potvrzení vaÅ¡eho úÄtu."
@@ -3613,7 +3669,7 @@ msgstr "váš email nebude nezveřejněn"
msgid "We never show your email address or phone number."
msgstr "Váš email a telefonní Äíslo nebudou nikde zveÅ™ejnÄ›ny."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "UvÄ›domujeme si, že za tento problém by mohl být odpovÄ›dný % s; NicménÄ›, nemáme na nÄ› v souÄasné dobÄ› žádné kontaktní údaje. Pokud přísluÅ¡né kontakty znáte, sem s nimi. "
@@ -3638,11 +3694,15 @@ msgstr "Rádi bychom znali Váš názor, co si myslíte o tomto webu. StaÄí vy
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr "Co je to za problém, a kde to je?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Editováno:"
@@ -3651,7 +3711,7 @@ msgstr "Editováno:"
msgid "When sent"
msgstr "Odesláno:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Celý blok prázdných bytů"
@@ -3659,16 +3719,22 @@ msgstr "Celý blok prázdných bytů"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "V požadavku pro vyhledávání je možné hledat s parametrem 'agency_responsible' a omezit požadavky vrácené zpět do administrace. Hledaný výraz je administrativní ID poskytnuté službou<a href=\"%s\"> MaPit </a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "Chcete se podílet na rozvoji projektu FixMyStreet? Náš kód je open source a je k dispozici na <a href=\"http://fixmystreet.org\">fixmystreet.org </a>."
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Můžeme Vám za měsíc odeslat další dotazník, který Vám připomene zkontrolovat stav Vašeho hlášení?"
@@ -3694,15 +3760,13 @@ msgstr "Rok"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ano"
@@ -3767,11 +3831,9 @@ msgstr "Odmítnuto; vyplňte rámeÄek nahoÅ™e"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Na tento dotazník jste již odpověděli. Máte-li dotazy, prosím <a href='%s'>spojte se s námi</a>, nebo si můžete <a href='%s'>zobrazit hlášení</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Pro toto hlášení již máte připojenou fotografii, připojením další dojde k jejímu nahrazení."
@@ -3780,6 +3842,10 @@ msgstr "Pro toto hlášení již máte pÅ™ipojenou fotografii, pÅ™ipojením dalÅ
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Pro tuto aktualizaci již máte připojenou fotografii, připojením další dojde k jejímu nahrazení."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3800,15 +3866,11 @@ msgstr "Úspěšně jste potvrdili svou e-mailovou adresu."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Byli jste úspěšnÄ› pÅ™ihlášeni; zkontrolujte a potvrÄte zda jsou podrobnosti pÅ™esné:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Doposud jste nevytvořili žádné hlášení. <a href=\"%s\">Nahlaste problém nyní.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Musíte kliknout na link v emailové zprávě, kterou jsme Vám právě poslali."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Musíte <a href=\"%s\"> pÅ™idat nÄ›jaké subjekty </a> (například úřady Äi oddÄ›lení) kterým pak budou zasílány hlášení."
@@ -3822,18 +3884,16 @@ msgstr ""
" kategorie problémů, které mají v kompetenci Å™eÅ¡it (jako výmoly nebo pouliÄní osvÄ›tlení) \n"
" a kontakty (jako například e-mailovou adresu), na které budou zprávy jsou odesílány."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Chcete to skuteÄnÄ› znovu odeslat?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Vaše hlášení"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3842,22 +3902,17 @@ msgstr "Vaše hlášení"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Váš e-mail"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Vaše e-mailová adresa"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Vaše e-mailová adresa:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3867,24 +3922,23 @@ msgstr "Váš e-mail:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Vámi poskytnuté informace budou použity pouze v souladu se <a href=\"/privacy\">zásadami ochrany osobních údajů</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Vaše jméno a příjmení"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Vaše jméno:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3897,19 +3951,15 @@ msgstr "Vaše heslo bylo změněno"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "VaÅ¡e telefonní Äíslo:"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Vaše hlášení"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Vaše hlášení"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Vaše aktualizace"
@@ -3917,23 +3967,31 @@ msgstr "Vaše aktualizace"
msgid "Your&nbsp;email:"
msgstr "Váš e-mail:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Všechna hlášení"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "uživatelem %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Uzavřená hlášení"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "úřad"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "bez mapy"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "např. ‘%s’ nebo ‘%s’"
@@ -3942,17 +4000,22 @@ msgstr "např. ‘%s’ nebo ‘%s’"
msgid "edit user"
msgstr "editace uživatele"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Hlášení - Vyřešené"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "od %d různých uživatelů"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "naposledy upravené %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "méně než minutou"
@@ -3997,14 +4060,13 @@ msgstr "oznaÄené za naplánované"
msgid "marked as unable to fix"
msgstr "oznaÄené za nemožné spravit"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "neuvedeno"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "nebo"
@@ -4014,16 +4076,16 @@ msgstr "nebo mÄ› lokalizujte automaticky"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "původně zadáno: &ldquo;%s&rdquo;"
@@ -4036,8 +4098,8 @@ msgstr "ostatní oblasti:"
msgid "reopened"
msgstr "znovu otevřeno"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "odhlásit"
@@ -4053,17 +4115,20 @@ msgstr "místní úřad"
msgid "there is no pin shown as the user did not use the map"
msgstr "V mapÄ› se nenalézají žádné znaÄky hlášení od uživatelů"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "tento typ lokálního problému"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "dnes"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Hlášení - Vyřešené"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "použitá mapa"
@@ -4088,7 +4153,7 @@ msgstr[0] "<big>%s</big> aktuální hlášení"
msgstr[1] "<big>%s</big> aktuální hlášení"
msgstr[2] "<big>%s</big> aktuální hlášení"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4104,7 +4169,7 @@ msgstr[0] "%d podporovatel"
msgstr[1] "%d podporovatelé"
msgstr[2] "%d podporovatelů"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4128,7 +4193,7 @@ msgstr[0] "Doposud nemáme podrobnosti o úřadu pokrývající tuto lokalitu."
msgstr[1] "Doposud nemáme podrobnosti o úřadech pokrývající tuto lokalitu."
msgstr[2] "Doposud nemáme podrobnosti o úřadech pokrývající tuto lokalitu."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4152,7 +4217,7 @@ msgstr[0] "<big>%s</big> vyřešeno poslední měsíc"
msgstr[1] "<big>%s</big> vyřešeno poslední měsíc"
msgstr[2] "<big>%s</big> vyřešeno poslední měsíc"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4168,5 +4233,140 @@ msgstr[0] "Doposud <strong>nemáme</strong> podrobnosti o dalším úřadě, kt
msgstr[1] "Doposud <strong>nemáme</strong> podrobnosti o dalších úřadech, které jsou za tuto oblast zodpovědné."
msgstr[2] "Doposud <strong>nemáme</strong> podrobnosti o dalších úřadech, které jsou za tuto oblast zodpovědné."
-#~ msgid "For council(s):"
-#~ msgstr "Pro úřad(y):"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Nemějte obavy - upozornění bude uchováno do doby potvrzení e-mailem.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Nemějte obavy - hlášení bude uchováno do doby potvrzení e-mailem.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Nemějte obavy - hlášení bude uchováno do doby potvrzení e-mailem.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Pokud nevidíte mapu, <a href='%s' rel='nofollow'>vynechte tento krok</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Ne</strong>, přihlásím se pomocí e-mailu:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Jste <strong>vývojář</strong>? Nechcete se přidat a podpořit FixMyStreet?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Nejbližší hlášení <small>( v okolí %s km)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontaktujte FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Máte FixMyBarangay heslo?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet administrace:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Pokud to neuděláte, vaše upozornění nebude aktivováno."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Pokud to neuděláte, Vaše hlášení nebude odesláno."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Pokud to neuděláte, Vaše aktualizace nebude odeslána."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nová lokální hlášení na reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nová hlášení pro {{COUNCIL}} , oblast {{WARD}} na reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nová hlášení na reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nová hlášení na reportemptyhomes.com v oblasti PSČ {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nová hlášení pro {{COUNCIL}} na reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nová hlášení pro oblast {{NAME}} na reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Nové aktualizace:"
+
+#~ msgid "No problems found."
+#~ msgstr "Nenalezena žádná hlášení."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Doposud nebylo nic nahlášeno."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "A nyní odešlete hlášení t&hellip; máte FixMyStreet heslo?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "A nyní pro odeslání aktualizace t&hellip; máte FixMyStreet heslo?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Náš zdrojový kód je open source a <a href=\"http://github.com/mysociety/fixmystreet\">je dostupný na GitHub</a>."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Věnujte prosím pozornost aktualizacím, které zde byly zanechány."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Hlášení v oblasti %s, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Nemovitosti na reportemptyhomes.com nahlášené k navrácení k opětovnému užívání"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publikovat reakci"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Nahlášeno uživatelem %s, urÄeno pro %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Hlášení v mapě"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Přihlásit se pomocí e-mailu"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Přihlášen as %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "Zaslání potvrzovacího e-mailu <strong> může </strong> trvat nÄ›kolik minut, & ndash; <em> prosím </em>, buÄte trpÄ›liví."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Podrobnosti vašeho hlášení jsou dostupné v záložce nahoře."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Podrobnosti vašeho hlášení jsou dostupné na pravé straně této stránky."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Poslední lokální hlášení od uživatelů"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Poslední nemovitosti hlášené uživateli jako zpět předané k užívání"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Poslední hlášení uživatelů pro {{COUNCIL}} "
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Poslední hlášení uživatelů pro {{COUNCIL}} v oblasti {{WARD}} "
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Poslední hlášení uživatelů pro {{NAME}}"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Pro <Strong> nahlášení problému </strong>, klikněte na mapě na správném místě."
+
+#~ msgid "User"
+#~ msgstr "Uživatel"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Musíte kliknout na link v emailové zprávě, kterou jsme Vám právě poslali."
+
+#~ msgid "Your email address:"
+#~ msgstr "Vaše e-mailová adresa:"
+
+#~ msgid "Your report"
+#~ msgstr "Vaše hlášení"
diff --git a/locale/cy.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/cy.UTF-8/LC_MESSAGES/FixMyStreet.po
new file mode 100644
index 000000000..5b8009eca
--- /dev/null
+++ b/locale/cy.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -0,0 +1,4274 @@
+# FixMyStreet original .po file, autogenerated by gettext-extract.
+# Copyright (C) 2011 UK Citizens Online Democracy
+# This file is distributed under the same license as the main FixMyStreet code.
+# Matthew Somerville <matthew@mysociety.org>, 2011-06-03.
+#
+# Translators:
+# ciaran, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: fixmystreet\n"
+"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-08-12 14:08+0000\n"
+"Last-Translator: ciaran\n"
+"Language-Team: Welsh (http://www.transifex.com/mysociety/fixmystreet/language/cy/)\n"
+"Language: cy\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
+msgid " and "
+msgstr "a"
+
+#: templates/web/base/report/new/councils_text_all.html:2
+#: templates/web/base/report/new/councils_text_none.html:11
+#: templates/web/base/report/new/councils_text_none.html:2
+#: templates/web/base/report/new/councils_text_some.html:19
+#: templates/web/base/report/new/councils_text_some.html:22
+#: templates/web/base/report/new/councils_text_some.html:5
+msgid " or "
+msgstr "neu"
+
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
+msgid "%d confirmed alerts, %d unconfirmed"
+msgstr "%d hysbysiad wedi ei gadarnhau, %d heb ei gadarnhau"
+
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
+#: templates/web/zurich/admin/index.html:6
+msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
+msgstr ""
+
+#: templates/web/base/admin/edit-league.html:12
+msgid "%d edits by %s"
+msgstr ""
+
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
+msgid "%d live updates"
+msgstr "%d diweddariad byw"
+
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
+msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
+msgstr ""
+
+#: templates/web/base/pagination.html:10
+msgid "%d to %d of %d"
+msgstr "%d i %d o %d"
+
+#: templates/web/base/reports/body.html:0
+#: templates/web/base/reports/body.html:23
+msgid "%s - Summary reports"
+msgstr "%s - Adroddiadau"
+
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"Cynigia FixMyStreet amryw o ffrydiau RSS a hysbysiadau e-bost ar gyfer problemau lleol, gan gynnwys\n"
+"hysbysiadau am bob problem o fewn ward neu gyngor penodol, neu bob problem\n"
+"o fewn pellter penodol o leoliad penodol."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"Cynigia FixMyStreet amryw o ffrydiau RSS a hysbysiadau e-bost ar gyfer problemau lleol, gan gynnwys\n"
+"hysbysiadau am bob problem o fewn ward neu gyngor penodol, neu bob problem\n"
+"o fewn pellter penodol o leoliad penodol."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
+msgid "%s ref:&nbsp;%s"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
+msgid "%s ward, %s"
+msgstr "ward %s, %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
+msgid "%s, reported at %s"
+msgstr "%s, adroddwyd am %s"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:282 perllib/FixMyStreet/Cobrand/UK.pm:294
+msgid "%s, within %s ward"
+msgstr "%s, o fewn ward %s"
+
+#: perllib/FixMyStreet/Map/OSM.pm:42
+msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
+msgstr ""
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:41
+#: templates/web/base/admin/users.html:31
+msgid "(Email in abuse table)"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Eich enw"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Eich rhif ffôn"
+
+#: templates/web/base/alert/_list.html:24
+msgid "(a default distance which covers roughly 200,000 people)"
+msgstr ""
+
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
+msgstr "(fel arall gellir addasu'r ffrwd RSS, o fewn"
+
+#: templates/web/base/report/_item.html:27
+#: templates/web/zurich/report/_item.html:21
+msgid "(closed)"
+msgstr "(ar gau)"
+
+#: templates/web/base/report/_item.html:25
+#: templates/web/zurich/report/_item.html:19
+msgid "(fixed)"
+msgstr "(wedi trwsio)"
+
+#: templates/web/base/around/intro.html:2
+msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
+msgstr ""
+
+#: templates/web/base/report/_item.html:21
+msgid "(not sent to council)"
+msgstr "(heb ei anfon at y cyngor)"
+
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
+msgid "(optional)"
+msgstr "(dewisol)"
+
+#: templates/web/fixmystreet/report/public_label.html:1
+msgid "(public)"
+msgstr "(cyhoeddus)"
+
+#: templates/web/base/report/_item.html:20
+msgid "(sent to both)"
+msgstr "(anfonwyd i'r ddau)"
+
+#: templates/web/base/report/new/fill_in_details_form.html:194
+msgid "(we never show your email address or phone number)"
+msgstr "(ni ddatgelir eich cyfeiriad e-bost na rhif ffôn)"
+
+#: templates/web/base/report/update-form.html:159
+msgid "(we never show your email)"
+msgstr "(ni ddatgelir eich e-bost)"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/DB/Result/Problem.pm:410
+msgid "-- Pick a category --"
+msgstr "-- Dewiswch gategori --"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
+#: perllib/FixMyStreet/DB/Result/Problem.pm:416
+msgid "-- Pick a property type --"
+msgstr "-- Dewiswch fath o eiddo --"
+
+#: templates/web/base/admin/body-form.html:42
+#: templates/web/base/admin/body-form.html:43
+msgid ""
+"<code>MAPIT_URL</code> is set (<code>%s</code>) but no <code>MAPIT_TYPES</code>.<br>\n"
+" This is probably why \"area covered\" is empty (below).<br>\n"
+" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
+msgstr ""
+
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
+
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
+#: templates/web/zurich/admin/index.html:4
+msgid "<strong>%d</strong> live problems"
+msgstr "<strong>%d</strong> o broblemau byw"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:39
+msgid "<strong>No</strong> Let me confirm my report by email"
+msgstr "<strong>Nac oes</strong>, gadewch i fi gadarnhau'r adroddiad drwy e-bost"
+
+#: templates/web/fixmystreet/report/update-form.html:112
+msgid "<strong>No</strong> Let me confirm my update by email"
+msgstr "<strong>Nac oes</strong>, gadewch i fi gadarnhau'r diweddariad drwy e-bost"
+
+#: templates/web/base/auth/general.html:48
+#: templates/web/zurich/auth/general.html:51
+msgid "<strong>No</strong> let me sign in by email"
+msgstr "<strong>Nac oes</strong>, gadewch i fi fewngofnodi drwy e-bost"
+
+#: templates/web/base/report/new/fill_in_details_form.html:145
+msgid "<strong>No</strong>, let me confirm my report by email:"
+msgstr "<strong>Nac oes</strong>, gadewch i fi gadarnhau'r adroddiad drwy e-bost:"
+
+#: templates/web/base/report/update-form.html:118
+msgid "<strong>No</strong>, let me confirm my update by email:"
+msgstr "<strong>Nac oes</strong>, gadewch i fi gadarnhau'r diweddariad drwy e-bost:"
+
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
+#: templates/web/fixmystreet/report/update-form.html:89
+msgid "<strong>Yes</strong> I have a password"
+msgstr "<strong>Oes</strong>, mae gen i gyfrinair"
+
+#: templates/web/base/static/about-en-gb.html:1
+#: templates/web/base/static/about-en-gb.html:3
+msgid "About us"
+msgstr "Amdanom"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
+msgid "Action Scheduled"
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:3
+#: templates/web/base/admin/body-form.html:4
+msgid ""
+"Add a <strong>body</strong> for each administrative body, such as a council or department\n"
+" to which problem reports can be sent. You can add one or more contacts (for different\n"
+" categories of problem) to each body."
+msgstr ""
+
+#: templates/web/base/admin/body.html:56
+msgid "Add a contact using the form below."
+msgstr ""
+
+#: templates/web/base/admin/bodies.html:74
+#: templates/web/base/admin/body-form.html:240
+#: templates/web/zurich/admin/body-form.html:52
+msgid "Add body"
+msgstr "Ychwanegu corff"
+
+#: templates/web/base/admin/body.html:116
+#: templates/web/zurich/admin/body.html:31
+msgid "Add new category"
+msgstr "Ychwanegu categori newydd"
+
+#: templates/web/base/admin/users.html:47
+msgid "Add user"
+msgstr "Ychwanegu defnyddiwr"
+
+#: templates/web/base/my/my.html:52
+msgid "Added %s"
+msgstr "Ychwanegwyd %s"
+
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
+#: templates/web/base/auth/change_password.html:29
+msgid "Again:"
+msgstr "Eto:"
+
+#: templates/web/base/admin/timeline.html:35
+msgid "Alert %d created for %s, type %s, parameters %s / %s"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:37
+msgid "Alert %d disabled (created %s)"
+msgstr "Analluogwyd yr hysbysiad %d (créwyd %s)"
+
+#: templates/web/base/report/update-form.html:164
+#: templates/web/fixmystreet/report/update-form.html:150
+msgid "Alert me to future updates"
+msgstr "Rhoi gwybod am ddiweddariadau i ddod"
+
+#: templates/web/base/reports/index.html:3
+#: templates/web/zurich/reports/index.html:12
+msgid "All Reports"
+msgstr "Pob adroddiad"
+
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Pob adroddiad"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
+#: templates/web/zurich/admin/index-dm.html:12
+#: templates/web/zurich/admin/stats.html:13
+#: templates/web/zurich/footer.html:20
+#: templates/web/zurich/nav_over_content.html:6
+msgid "All reports"
+msgstr "Pob adroddiad"
+
+#: templates/web/base/admin/stats.html:5
+#: templates/web/zurich/admin/stats.html:8
+msgid "All reports between %s and %s"
+msgstr "Pob adroddiad rhwng %s a %s"
+
+#: templates/web/base/report/new/councils_text_some.html:2
+msgid "All the information you provide here will be sent to"
+msgstr "Anfonir yr holl wybodaeth a roddir yma at"
+
+#: templates/web/base/report/new/councils_text_all.html:2
+#: templates/web/base/report/new/councils_text_all.html:4
+#: templates/web/base/report/new/fill_in_details_form.html:12
+#: templates/web/base/report/new/fill_in_details_form.html:14
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:11
+msgid "All the information you provide here will be sent to <strong>%s</strong>."
+msgstr "Anfonir yr holl wybodaeth a roddir yma at <strong>%s</strong>."
+
+#: templates/web/base/questionnaire/index.html:45
+msgid "An update marked this problem as fixed."
+msgstr "Mae diweddariad wedi nodi'r broblem wedi ei thrwsio."
+
+#: templates/web/base/admin/list_updates.html:32
+#: templates/web/base/admin/problem_row.html:20
+msgid "Anonymous"
+msgstr "Dienw"
+
+#: templates/web/base/admin/report_edit.html:57
+#: templates/web/base/admin/update_edit.html:23
+msgid "Anonymous:"
+msgstr "Dienw:"
+
+#: templates/web/base/front/footer-marketing.html:16
+msgid "Are you a developer?"
+msgstr "Ydych chi'n ddatblygwr?"
+
+#: templates/web/base/admin/body-form.html:69
+#: templates/web/base/admin/body.html:16
+#: templates/web/zurich/admin/body-form.html:24
+msgid "Area covered"
+msgstr ""
+
+#: templates/web/base/admin/bodies.html:15
+#: templates/web/base/admin/body.html:60
+msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
+#: templates/web/zurich/admin/stats.html:36
+msgid "Assign to different category:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:211
+msgid "Assign to external body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:190
+msgid "Assign to subdivision:"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
+msgid "Assigned to %s"
+msgstr ""
+
+#: templates/web/base/open311/index.html:84
+msgid "At most %d requests are returned in each query. The returned requests are ordered by requested_datetime, so to get all requests, do several searches with rolling start_date and end_date."
+msgstr ""
+
+#: templates/web/base/open311/index.html:76
+msgid "At the moment only searching for and looking at reports work."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:373
+#: templates/web/zurich/report/_item.html:11
+msgid "Awaiting moderation"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:32
+msgid "Back"
+msgstr "Yn ôl"
+
+#: templates/web/base/admin/report_blocks.html:41
+msgid "Ban email address"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
+#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
+msgid "Bodies"
+msgstr "Cyrff"
+
+#: templates/web/base/admin/flagged.html:17
+#: templates/web/base/admin/reports.html:14
+#: templates/web/base/admin/users.html:17
+msgid "Body"
+msgstr "Corff"
+
+#: templates/web/base/admin/report_edit.html:34
+#: templates/web/base/admin/user-form.html:32
+msgid "Body:"
+msgstr "Corff:"
+
+#: templates/web/base/admin/stats.html:80
+msgid "By Date"
+msgstr "Yn ôl dyddiad"
+
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
+msgid "Can't see the map? <em>Skip this step</em>"
+msgstr ""
+
+#: templates/web/base/admin/body.html:68
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/report/new/category.html:10
+#: templates/web/base/report/new/category_wrapper.html:3
+#: templates/web/zurich/admin/body.html:14
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+#: templates/web/zurich/admin/stats.html:50
+msgid "Category"
+msgstr "Categori"
+
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
+msgid "Category fix rate for problems > 4 weeks old"
+msgstr ""
+
+#: templates/web/base/admin/body.html:138
+#: templates/web/base/admin/category_edit.html:23
+#: templates/web/base/admin/report_edit.html:56
+#: templates/web/zurich/admin/body.html:43
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
+msgid "Category:"
+msgstr "Categori:"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
+msgid "Category: %s"
+msgstr "Categori: %s"
+
+#: templates/web/base/auth/change_password.html:1
+#: templates/web/base/auth/change_password.html:3
+#: templates/web/base/auth/change_password.html:33
+#: templates/web/base/my/my.html:17
+msgid "Change password"
+msgstr "Newid cyfrinair"
+
+#: templates/web/base/admin/body.html:160
+msgid ""
+"Check <strong>confirmed</strong> to indicate that this contact has been confirmed as correct.\n"
+" If you are not sure of the origin or validity of the contact, leave this unchecked."
+msgstr ""
+
+#: templates/web/base/admin/body.html:171
+msgid ""
+"Check <strong>deleted</strong> to remove the category from use. \n"
+" It will not appear as an available category in the drop-down menu on the report-a-problem page."
+msgstr ""
+
+#: templates/web/base/admin/body.html:191
+msgid ""
+"Check <strong>private</strong> if reports in this category should <strong>never be displayed on the website</strong>.\n"
+" <br>\n"
+" Normally, categories are not private.\n"
+" <br>\n"
+" This is suitable for issues that you want to allow users to report to the body, but for which there is no public\n"
+" interest in displaying the report. In the UK, we've used this for services like requesting an extra rubbish bin\n"
+" at a specific address."
+msgstr ""
+
+#: templates/web/base/admin/body.html:130
+msgid ""
+"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
+" to the body too. These will appear in the drop-down menu on the report-a-problem page."
+msgstr ""
+
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:65
+#: templates/web/base/admin/stats.html:71
+msgid "Click here or enter as dd/mm/yyyy"
+msgstr "Cliciwch yma neu rhowch fel dd/mm/bbbb"
+
+#: templates/web/base/around/_report_banner.html:2
+#: templates/web/base/js/translation_strings.html:50
+msgid "Click map to report a problem"
+msgstr "Cliciwch ar y map i adrodd problem"
+
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:144
+#: templates/web/fixmystreet/report/banner.html:15
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:10
+#: templates/web/zurich/admin/header.html:16
+#: templates/web/zurich/admin/stats.html:31
+msgid "Closed"
+msgstr "Ar gau"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
+msgid "Closed by council"
+msgstr "Caewyd gan y cyngor"
+
+#: templates/web/base/admin/problem_row.html:38
+msgid "Closed:"
+msgstr "Ar gau:"
+
+#: templates/web/base/admin/report_edit.html:23
+msgid "Co-ordinates:"
+msgstr "Cyfesurynnau:"
+
+#: templates/web/base/admin/list_updates.html:10
+msgid "Cobrand"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:73
+#: templates/web/base/admin/update_edit.html:50
+msgid "Cobrand data:"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:72
+#: templates/web/base/admin/update_edit.html:49
+msgid "Cobrand:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
+#: templates/web/base/admin/config_page.html:1
+msgid "Configuration"
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:55
+msgid "Configure Endpoint"
+msgstr ""
+
+#: templates/web/base/admin/body.html:72
+msgid "Confirm"
+msgstr "Cadarnhau"
+
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
+msgid "Confirm account"
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:33
+#: templates/web/fixmystreet/report/update-form.html:107
+msgid "Confirm by email below, providing a new password at that point. When you confirm, your password will be updated."
+msgstr "Cadarnhewch drwy e-bost isod, gan ddarparu cyfrinair newydd bryd hynny. Diweddarir eich cyfrinair pan fyddwch yn cadarnhau."
+
+#: templates/web/base/questionnaire/creator_fixed.html:1
+#: templates/web/base/tokens/confirm_problem.html:1
+#: templates/web/base/tokens/confirm_update.html:1
+#: templates/web/zurich/tokens/confirm_problem.html:1
+#: templates/web/zurich/tokens/confirm_problem.html:3
+msgid "Confirmation"
+msgstr ""
+
+#: templates/web/base/admin/body.html:166
+#: templates/web/base/admin/body.html:79
+#: templates/web/base/admin/category_edit.html:37
+#: templates/web/base/admin/category_edit.html:92
+#: templates/web/zurich/admin/stats.html:40
+msgid "Confirmed"
+msgstr "Cadarnhawyd"
+
+#: templates/web/base/admin/stats.html:5
+msgid "Confirmed reports between %s and %s"
+msgstr "Adroddiadau a gadarnhawyd rhwng %s a %s"
+
+#: templates/web/base/admin/list_updates.html:39
+#: templates/web/base/admin/problem_row.html:36
+#: templates/web/base/admin/report_edit.html:65
+msgid "Confirmed:"
+msgstr "Cadarnhawyd:"
+
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Cysylltu â ni"
+
+#: templates/web/base/contact/index.html:1
+#: templates/web/base/contact/index.html:2
+#: templates/web/base/contact/submit.html:1
+#: templates/web/fixmystreet/contact/index.html:1
+#: templates/web/fixmystreet/contact/index.html:2
+msgid "Contact Us"
+msgstr "Cysylltu â ni"
+
+#: templates/web/base/contact/index.html:6
+#: templates/web/fixmystreet/contact/index.html:20
+msgid "Contact the team"
+msgstr "Cysylltu â'r tîm"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Cyfesurynnau:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
+msgid "Could not find user"
+msgstr "Methu dod o hyd i'r defnyddiwr"
+
+#: templates/web/base/js/translation_strings.html:37
+msgid "Could not look up location"
+msgstr "Methu dod o hyd i'r lleoliad"
+
+#: templates/web/base/admin/list_updates.html:9
+msgid "Council"
+msgstr "Cyngor"
+
+#: templates/web/base/admin/body.html:1
+#: templates/web/base/admin/category_edit.html:1
+#: templates/web/zurich/admin/body.html:1
+msgid "Council contacts for %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
+msgid "Council ref:&nbsp;%s"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:84
+msgid "Council:"
+msgstr "Cyngor:"
+
+#: templates/web/base/admin/stats.html:12
+#: templates/web/base/admin/stats.html:32
+#: templates/web/zurich/admin/stats.html:45
+#: templates/web/zurich/admin/stats.html:50
+msgid "Count"
+msgstr ""
+
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
+msgid "Create a report"
+msgstr "Creu adroddiad"
+
+#: templates/web/base/admin/body.html:208
+#: templates/web/zurich/admin/body.html:59
+msgid "Create category"
+msgstr "Creu categori"
+
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Creu adroddiad"
+
+#: templates/web/base/admin/problem_row.html:34
+#: templates/web/zurich/admin/templates.html:10
+msgid "Created"
+msgstr "Crëwyd"
+
+#: templates/web/base/admin/list_updates.html:38
+#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/update_edit.html:51
+#: templates/web/zurich/admin/update_edit.html:29
+msgid "Created:"
+msgstr "Crëwyd:"
+
+#: templates/web/base/admin/stats.html:31
+msgid "Current state"
+msgstr "Cyflwr presennol"
+
+#: templates/web/base/admin/bodies.html:5
+#: templates/web/base/admin/index.html:17
+msgid "Currently no bodies have been created."
+msgstr "Ar hyn o bryd does dim cyrff."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
+#: templates/web/base/dashboard/index.html:5
+#: templates/web/base/dashboard/index.html:7
+msgid "Dashboard"
+msgstr ""
+
+#: templates/web/zurich/admin/stats.html:35
+msgid "Dealt with by subdivision within 5 working days"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
+#: templates/web/base/admin/bodies.html:27
+#: templates/web/base/admin/body.html:177
+#: templates/web/base/admin/body.html:81
+#: templates/web/base/admin/category_edit.html:42
+#: templates/web/base/admin/category_edit.html:93
+msgid "Deleted"
+msgstr "Dilëwyd"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/admin/index-dm.html:22
+#: templates/web/zurich/admin/index-sdm.html:20
+#: templates/web/zurich/admin/reports.html:12
+msgid "Description"
+msgstr "Disgrifiad"
+
+#: templates/web/base/js/translation_strings.html:34
+#: templates/web/zurich/report/new/fill_in_details_form.html:42
+msgid "Details"
+msgstr "Manylion"
+
+#: templates/web/base/admin/report_edit.html:20
+#: templates/web/base/report/new/fill_in_details_form.html:62
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
+msgid "Details:"
+msgstr "Manylion:"
+
+#: templates/web/base/admin/body.html:87
+msgid "Devolved"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
+msgstr ""
+
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
+#: templates/web/fixmystreet/report/update-form.html:86
+#, fuzzy
+msgid "Do you have a %s password?"
+msgstr "Oes gennych chi gyfrinair FixMyStreet?"
+
+#: templates/web/base/questionnaire/index.html:55
+msgid "Don&rsquo;t know"
+msgstr ""
+
+#: templates/web/fixmystreet/contact/index.html:118
+msgid "Don't like forms?"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
+msgid "Duplicate"
+msgstr "Lluosogi"
+
+#: templates/web/base/admin/body.html:106
+msgid ""
+"Each contact for the body has a category, which is displayed to the public. \n"
+" Different categories <strong>can have the same contact</strong> (email address).\n"
+" This means you can add many categories even if you only have one contact for the body.\n"
+" "
+msgstr ""
+
+#: templates/web/base/admin/list_updates.html:42
+#: templates/web/base/admin/problem_row.html:41
+#: templates/web/base/admin/users.html:33
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
+msgid "Edit"
+msgstr "Golygu"
+
+#: templates/web/base/admin/body.html:220
+#: templates/web/zurich/admin/body.html:71
+msgid "Edit body details"
+msgstr "Golygu manylion y corff"
+
+#: templates/web/base/admin/report_edit.html:1
+#: templates/web/zurich/admin/report_edit-sdm.html:1
+#: templates/web/zurich/admin/report_edit-sdm.html:5
+#: templates/web/zurich/admin/report_edit.html:1
+#: templates/web/zurich/admin/report_edit.html:5
+msgid "Editing problem %d"
+msgstr "Golygu'r broblem %d"
+
+#: templates/web/base/admin/update_edit.html:1
+#: templates/web/zurich/admin/update_edit.html:1
+msgid "Editing update %d"
+msgstr "Golygu'r diweddariad %d"
+
+#: templates/web/base/admin/user_edit.html:1
+msgid "Editing user %d"
+msgstr "Golygu'r defnyddiwr %d"
+
+#: templates/web/base/admin/category_edit.html:94
+msgid "Editor"
+msgstr "Golygydd"
+
+#: templates/web/base/admin/bodies.html:23
+#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/flagged.html:38
+#: templates/web/base/admin/users.html:16
+#: templates/web/base/auth/general.html:22
+#: templates/web/zurich/admin/body-form.html:9
+#: templates/web/zurich/admin/body.html:15
+#: templates/web/zurich/auth/general.html:24
+#: templates/web/zurich/auth/general.html:54
+msgid "Email"
+msgstr "E-bost"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
+msgid "Email added to abuse list"
+msgstr "Ychwanegwyd yr e-bost at y rhestr camddefnydd"
+
+#: templates/web/base/admin/body.html:155
+msgid "Email address:"
+msgstr "Cyfeiriad e-bost:"
+
+#: templates/web/base/tokens/confirm_alert.html:6
+msgid "Email alert created"
+msgstr "Crëwyd hysbysiad e-bost"
+
+#: templates/web/base/tokens/confirm_alert.html:10
+msgid "Email alert deleted"
+msgstr "Dilëwyd hysbysiad e-bost"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
+msgid "Email already in abuse list"
+msgstr "E-bost eisoes yn y rhestr camddefnydd"
+
+#: templates/web/base/around/_updates.html:5
+msgid "Email me new local problems"
+msgstr "Rhoi gwybod i fi am broblemau lleol newydd drwy e-bost"
+
+#: templates/web/base/report/display.html:38
+msgid "Email me updates"
+msgstr "Anfon diweddariadau ataf drwy e-bost"
+
+#: templates/web/base/admin/category_edit.html:31
+#: templates/web/base/admin/report_edit.html:62
+#: templates/web/base/admin/update_edit.html:33
+#: templates/web/base/admin/user-form.html:20
+#: templates/web/base/alert/updates.html:13
+#: templates/web/base/report/display.html:42
+#: templates/web/zurich/admin/body.html:47
+msgid "Email:"
+msgstr "E-bost:"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
+msgid "Email: %s"
+msgstr "E-bost: %s"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
+msgid "Empty flat or maisonette"
+msgstr "Fflat wag"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
+msgid "Empty house or bungalow"
+msgstr "TÅ· neu fyngalo gwag"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
+msgid "Empty office or other commercial"
+msgstr "Swyddfa neu adeilad masnachol arall gwag"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
+msgid "Empty pub or bar"
+msgstr "Tafarn neu far gwag"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
+msgid "Empty public building - school, hospital, etc."
+msgstr "Adeilad cyhoeddus gwag - ysgol, ysbyty, ac ati."
+
+#: templates/web/base/admin/body-form.html:162
+#: templates/web/base/admin/body-form.html:163
+msgid ""
+"Enable <strong>Open311 update-sending</strong> if the endpoint will send and receive\n"
+" updates to existing reports. If you're not sure, it probably does not, so leave this unchecked.\n"
+" For more information, see \n"
+" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:222
+#: templates/web/base/admin/body-form.html:223
+msgid ""
+"Enable this <strong>can be devolved</strong> setting if one or more contacts have a \n"
+" different endpoint (and send method) from the body's. For example, if reports for some categories of\n"
+" problem must be emailed, while others can be sent over Open311."
+msgstr ""
+
+#: templates/web/base/admin/stats.html:70
+msgid "End Date:"
+msgstr "Dyddiad dod i ben:"
+
+#: templates/web/base/admin/body-form.html:130
+msgid "Endpoint"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
+msgid "Enter a Z&uuml;rich street name"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:13
+msgid "Enter a nearby UK postcode, or street name and area"
+msgstr "Rhowch god post DU, neu enw stryd ac ardal"
+
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:20
+#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:21
+msgid "Enter a nearby postcode, or street name and area"
+msgstr "Rhowch god post, neu enw stryd ac ardal"
+
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
+msgid "Enter a nearby street name and area"
+msgstr "Rhowch enw stryd ac ardal gerllaw"
+
+#: perllib/FixMyStreet/Cobrand/ZeroTB.pm:7
+msgid "Enter a nearby street name and area, postal code or district in Delhi"
+msgstr "Rhowch enw stryd ac ardal gerllaw, cod post neu ardal yn Delhi"
+
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
+msgid "Enter a new password:"
+msgstr "Rhowch gyfrinair newydd:"
+
+#: templates/web/base/auth/general.html:60
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
+#: templates/web/fixmystreet/report/update-form.html:123
+#: templates/web/zurich/auth/general.html:65
+msgid "Enter a password"
+msgstr "Rhowch gyfrinair"
+
+#: templates/web/base/index-steps.html:26
+msgid "Enter details of the problem"
+msgstr "Rhowch fanylion am y broblem"
+
+#: templates/web/base/errors/generic.html:1
+#: templates/web/base/errors/generic.html:3
+#: templates/web/base/tokens/abuse.html:1
+#: templates/web/base/tokens/abuse.html:3
+#: templates/web/base/tokens/error.html:1
+#: templates/web/base/tokens/error.html:3
+msgid "Error"
+msgstr "Gwall"
+
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
+#: templates/web/base/admin/body.html:14
+#: templates/web/base/admin/category_edit.html:18
+msgid "Example postcode %s"
+msgstr "Cod post enghreifftiol %s"
+
+#: templates/web/base/open311/index.html:94
+msgid "Examples:"
+msgstr "Enghraifft:"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
+msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
+msgstr "Esboniwch beth sy'n bod, ble'n union mae'r broblem, ac ers faint o amser mae hi yna..."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "URL allanol"
+
+#: templates/web/base/admin/body-form.html:81
+msgid "External URL"
+msgstr "URL allanol"
+
+#: templates/web/base/admin/category_edit.html:27
+#: templates/web/base/admin/report_edit.html:74
+msgid "Extra data:"
+msgstr "Data ychwanegol:"
+
+#: templates/web/base/contact/submit.html:13
+msgid "Failed to send message"
+msgstr "Methodd anfon neges"
+
+#: templates/web/zurich/admin/index-dm.html:33
+#: templates/web/zurich/admin/index-sdm.html:30
+msgid "Filter report list"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:64
+msgid "First time"
+msgstr "Tro cyntaf"
+
+#: templates/web/base/admin/body.html:48
+msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
+msgstr ""
+
+#: templates/web/base/header.html:26
+msgid "FixMyStreet"
+msgstr "FixMyStreet"
+
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:144
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:34
+#: templates/web/fixmystreet/report/banner.html:12
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:32
+msgid "Fixed"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
+msgid "Fixed - Council"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
+msgid "Fixed - User"
+msgstr ""
+
+#: templates/web/base/admin/problem_row.html:37
+msgid "Fixed:"
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:89
+#: templates/web/zurich/admin/body-form.html:36
+msgid "Flag as deleted"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:46
+msgid "Flag user"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
+#: templates/web/base/admin/users.html:19
+msgid "Flagged"
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:1
+msgid "Flagged reports and users"
+msgstr ""
+
+#: templates/web/base/admin/user-form.html:46
+msgid "Flagged users are listed on the <a href='%s'>flagged</a> page."
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:31
+msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:76
+#: templates/web/base/admin/user-form.html:52
+msgid "Flagged:"
+msgstr ""
+
+#: templates/web/base/reports/_ward-list.html:3
+#: templates/web/fixmystreet/reports/_ward-list.html:4
+msgid "Follow a ward link to view only reports within that ward."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:65
+msgid "For more information, see <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>How FixMyStreet uses Mapit</a>."
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:32
+#: templates/web/fixmystreet/report/update-form.html:106
+msgid "Forgotten your password?"
+msgstr "Wedi anghofio eich cyfrinair?"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
+#: templates/web/base/faq/faq-en-gb.html:1
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
+msgid "Frequently Asked Questions"
+msgstr "Cwestiynau a ofynnir yn aml"
+
+#: templates/web/base/open311/index.html:136
+msgid "GeoRSS on Google Maps"
+msgstr "GeoRSS ar Google Maps"
+
+#: templates/web/fixmystreet/around/_updates.html:3
+#: templates/web/fixmystreet/report/display.html:35
+msgid "Get updates"
+msgstr "Derbyn diweddariadau"
+
+#: templates/web/fixmystreet/reports/_rss.html:3
+#: templates/web/fixmystreet/reports/_rss.html:9
+msgid "Get updates of %s problems"
+msgstr "Derbyn diweddariadau am broblemau %s"
+
+#: templates/web/fixmystreet/reports/_rss.html:11
+#: templates/web/fixmystreet/reports/_rss.html:3
+msgid "Get updates of problems in this %s"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:82
+msgid "Give me an RSS feed"
+msgstr "Derbyn ffrwd RSS"
+
+#: templates/web/base/questionnaire/completed.html:14
+msgid "Glad to hear it’s been fixed!"
+msgstr "Mae'n dda gennym glywed y cafodd ei drwsio!"
+
+#: templates/web/base/alert/index.html:34
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
+#: templates/web/zurich/admin/stats.html:26
+msgid "Go"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:75
+msgid "Going to send questionnaire?"
+msgstr ""
+
+#: templates/web/base/admin/index.html:42
+msgid "Graph of problem creation by status over time"
+msgstr ""
+
+#: templates/web/base/reports/index.html:12
+msgid "Greyed-out lines are councils that no longer exist."
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:46
+msgid "Has this problem been fixed?"
+msgstr "Gafodd y broblem ei thrwsio?"
+
+#: templates/web/base/questionnaire/index.html:59
+msgid "Have you ever reported a problem to a council before, or is this your first time?"
+msgstr "Ydych chi wedi adrodd problem at y cyngor o'r blaen, neu ai dyma eich tro cyntaf?"
+
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
+#: templates/web/zurich/faq/faq-de-ch.html:1
+#: templates/web/zurich/footer.html:22
+#: templates/web/zurich/nav_over_content.html:8
+msgid "Help"
+msgstr "Cymorth"
+
+#: templates/web/base/alert/_list.html:8
+msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
+msgstr "Dyma'r mathau o hysbysiadau problemau lleol ar gyfer &lsquo;%s&rsquo;."
+
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
+msgid "Hi %s"
+msgstr "Helo %s"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
+#: templates/web/base/admin/update_edit.html:28
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:11
+#: templates/web/zurich/admin/stats.html:32
+#: templates/web/zurich/admin/update_edit.html:18
+msgid "Hidden"
+msgstr "Cudd"
+
+#: templates/web/base/around/display_location.html:65
+msgid "Hide old"
+msgstr "Cuddio'r hen rai"
+
+#: templates/web/base/around/display_location.html:60
+msgid "Hide pins"
+msgstr "Cuddio'r piniau"
+
+#: templates/web/base/admin/category_edit.html:87
+msgid "History"
+msgstr "Hanes"
+
+#: templates/web/base/js/translation_strings.html:31
+msgid "Home"
+msgstr "Hafan"
+
+#: templates/web/base/index-steps.html:1
+msgid "How to report a problem"
+msgstr "Sut i adrodd problem"
+
+#: templates/web/base/js/translation_strings.html:33
+msgid "How to send successful reports"
+msgstr "Sut i anfon adroddiadau llwyddiannus"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
+msgid "I am afraid you cannot confirm unconfirmed reports."
+msgstr "Yn anffodus, ni allwch gadarnhau adroddiadau heb eu cadarnhau."
+
+#: templates/web/base/tokens/confirm_problem.html:23
+#: templates/web/base/tokens/confirm_problem.html:27
+msgid "I just reported a problem on @fixmystreet"
+msgstr "Dwi newydd adrodd problem ar @fixmystreet"
+
+#: templates/web/base/tokens/confirm_update.html:19
+#: templates/web/base/tokens/confirm_update.html:23
+msgid "I just updated a problem on @fixmystreet"
+msgstr "Dwi newydd ddiweddaru problem ar @fixmystreet"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:96
+msgid "I'm afraid we couldn't locate your problem in the database.\n"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Tokens.pm:327
+msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:14
+#: templates/web/base/admin/list_updates.html:6
+#: templates/web/base/admin/reports.html:11
+#: templates/web/zurich/admin/index-dm.html:21
+#: templates/web/zurich/admin/index-sdm.html:19
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
+#: templates/web/zurich/admin/reports.html:11
+msgid "ID"
+msgstr "ID"
+
+#: templates/web/base/admin/body-form.html:24
+#: templates/web/base/admin/body-form.html:25
+msgid ""
+"Identify a <strong>parent</strong> if this body is itself part of another body.\n"
+" For basic installations, you don't need to join bodies in this way."
+msgstr ""
+
+#: templates/web/base/admin/body.html:133
+msgid ""
+"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
+" the menu. Make sure you use the same category name in the bodies if you want this to happen."
+msgstr ""
+
+#: templates/web/base/questionnaire/completed.html:8
+msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
+msgstr "Os cewch chi ragor o wybodaeth am statws eich problem, dychwelwch i'r wefan i adael diweddariad."
+
+#: templates/web/base/report/new/councils_text_none.html:2
+#: templates/web/base/report/new/councils_text_none.html:8
+msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
+msgstr "Os cyflwynwch chi broblem yma, bydd y pwnc a manylion y broblem yn gyhoeddus, ond <strong>ni</strong> chaiff y broblem ei hanfon at y cyngor."
+
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
+msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
+msgstr "Os ydych chi'n defnyddio e-bost drwy'r we neu os oes gennych chi hidlydd sothach, gwiriwch eich plygellau e-bost sothach: o bryd i'w gilydd, deuir o hyd i'n negeseuon yno."
+
+#: templates/web/base/questionnaire/index.html:68
+msgid ""
+"If you wish to leave a public update on the problem, please enter it here\n"
+"(please note it will not be sent to the council)."
+msgstr ""
+
+#: templates/web/base/admin/body.html:149
+msgid "If you're using <strong>a send method that is not email</strong>, enter the service ID (Open311) or equivalent identifier here."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:207
+#: templates/web/base/admin/body-form.html:208
+msgid ""
+"If you've enabled Open311 update-sending above, Open311 usually only accepts OPEN or CLOSED status in \n"
+" its updates. Enable <strong>extended Open311 stauses</strong> if you want to allow extra states to be passed.\n"
+" Check that your cobrand supports this feature before switching it on."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:194
+#: templates/web/base/admin/body-form.html:195
+msgid ""
+"If you've enabled Open311 update-sending above, enable <strong>suppression of alerts</strong> \n"
+" if you do <strong>not</strong> want that user to be notified whenever these updates are created."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:177
+#: templates/web/base/admin/body-form.html:178
+msgid ""
+"If you've enabled Open311 update-sending above, you must identify which \n"
+" FixMyStreet <strong>user</strong> will be attributed as the creator of those updates\n"
+" when they are shown on the site. Enter the ID (number) of that user."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
+msgid "Illegal ID"
+msgstr "ID annerbynniol"
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:100
+msgid "Illegal feed selection"
+msgstr ""
+
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:144
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
+msgid "In Progress"
+msgstr "Ar y gweill"
+
+#: templates/web/base/admin/flagged.html:39
+msgid "In abuse table?"
+msgstr ""
+
+#: templates/web/base/open311/index.html:88
+msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
+#: templates/web/fixmystreet/report/banner.html:19
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:8
+msgid "In progress"
+msgstr "Ar y gweill"
+
+#: templates/web/base/tokens/confirm_alert.html:11
+msgid "Inbox zero, here we come!"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:227
+msgid "Include reporter personal details"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:76
+msgid "Include unconfirmed reports"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:359
+msgid "Incorrect has_photo value \"%s\""
+msgstr ""
+
+#: templates/web/zurich/admin/list_updates.html:35
+msgid "Internal notes"
+msgstr "Nodiadau mewnol"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
+msgid "Internal referral"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:344
+msgid "Invalid agency_responsible value %s"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
+msgid "Invalid end date"
+msgstr "Dyddiad dod i ben annilys"
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:437
+msgid "Invalid format %s specified."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+msgid "Invalid start date"
+msgstr "Dyddiad cychwyn annilys"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:143
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
+msgid "Investigating"
+msgstr ""
+
+#: templates/web/fixmystreet/contact/blurb.html:8
+msgid "It's often quickest to <a href=\"%s\">check our FAQs</a> and see if the answer is there."
+msgstr ""
+
+#: templates/web/base/tokens/confirm_problem.html:14
+msgid "It’s on its way to the council right now."
+msgstr "Mae ar y ffordd i'r cyngor y funud hon."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
+#: templates/web/base/auth/general.html:44
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
+#: templates/web/fixmystreet/report/update-form.html:102
+#: templates/web/zurich/auth/general.html:40
+msgid "Keep me signed in on this computer"
+msgstr "Cadw fi wedi mewngofnodi ar y cyfrifiadur hwn"
+
+#: templates/web/base/admin/body.html:70
+#: templates/web/zurich/admin/body.html:16
+msgid "Last editor"
+msgstr "Golygydd diwethaf"
+
+#: templates/web/base/admin/report_edit.html:70
+msgid "Last update:"
+msgstr "Diweddariad diwethaf:"
+
+#: templates/web/base/admin/problem_row.html:39
+msgid "Last&nbsp;update:"
+msgstr "Diweddariad&nbsp;diwethaf:"
+
+#: templates/web/base/admin/body-form.html:229
+msgid "Leave this blank if all reports to this body should be sent using the same send method (e.g., \"%s\")."
+msgstr ""
+
+#: templates/web/base/admin/body.html:27
+msgid "List all reported problems"
+msgstr "Rhestru'r holl broblemau a adroddwyd"
+
+#: templates/web/base/report/new/category_wrapper.html:4
+msgid "Loading..."
+msgstr "Wrthi'n llwytho..."
+
+#: templates/web/base/alert/choose.html:1
+#: templates/web/base/alert/choose.html:3
+#: templates/web/base/alert/index.html:1 templates/web/base/alert/index.html:3
+#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:5
+#: templates/web/base/alert/updates.html:1
+#: templates/web/base/tokens/confirm_alert.html:1
+#: templates/web/fixmystreet/alert/updates.html:1
+msgid "Local RSS feeds and email alerts"
+msgstr "Ffrydiau RSS lleol a hysbysiadau e-bost"
+
+#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:12
+#: templates/web/base/alert/list.html:14 templates/web/base/alert/list.html:3
+msgid "Local RSS feeds and email alerts for ‘%s’"
+msgstr "Ffrydiau RSS lleol a hysbysiadau e-bost ar gyfer '%s'"
+
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
+msgid "Local alerts"
+msgstr "Hysbysiadau lleol"
+
+#: templates/web/base/index-steps.html:25
+msgid "Locate the problem on a map of the area"
+msgstr "Lleoli'r broblem ar fap o'r ardal"
+
+#: templates/web/base/js/translation_strings.html:43
+msgid "MAP"
+msgstr "MAP"
+
+#: templates/web/base/js/translation_strings.html:45
+msgid "Map"
+msgstr "Map"
+
+#: templates/web/base/admin/report_edit.html:68
+msgid "Mark as sent"
+msgstr "Nodi ei fod wedi'i anfon"
+
+#: templates/web/base/admin/user-form.html:44
+msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
+msgstr ""
+
+#: templates/web/base/reports/index.html:24
+msgid "Marked fixed/closed in the past eight weeks"
+msgstr ""
+
+#: templates/web/base/reports/index.html:25
+msgid "Marked fixed/closed more than eight weeks ago"
+msgstr ""
+
+#: templates/web/fixmystreet/contact/index.html:106
+msgid "Message"
+msgstr "Neges"
+
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
+#: templates/web/base/contact/index.html:97
+msgid "Message:"
+msgstr "Neges:"
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:445
+msgid "Missing jurisdiction_id"
+msgstr "jurisdiction_id coll"
+
+#: templates/web/zurich/admin/stats.html:34
+msgid "Moderated by division within one working day"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:11
+msgid "Month"
+msgstr "Mis"
+
+#: templates/web/base/report/display.html:34
+msgid "More problems nearby"
+msgstr "Rhagor o broblemau gerllaw"
+
+#: templates/web/base/admin/bodies.html:21
+#: templates/web/base/admin/body-form.html:18
+#: templates/web/base/admin/flagged.html:16
+#: templates/web/base/admin/flagged.html:37
+#: templates/web/base/admin/list_updates.html:7
+#: templates/web/base/admin/reports.html:13
+#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
+#: templates/web/base/reports/index.html:20
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
+#: templates/web/fixmystreet/report/update-form.html:138
+#: templates/web/zurich/admin/body-form.html:4
+#: templates/web/zurich/auth/general.html:60
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
+msgid "Name"
+msgstr "Enw"
+
+#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/update_edit.html:32
+#: templates/web/base/admin/user-form.html:18
+#: templates/web/zurich/admin/stats.html:41
+msgid "Name:"
+msgstr "Enw:"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
+msgid "Name: %s"
+msgstr "Enw: %s"
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:160
+#: perllib/FixMyStreet/Geocode/OSM.pm:145
+msgid "Nearest named road to the pin placed on the map (automatically generated using OpenStreetMap): %s%s"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:127
+msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
+msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
+msgid ""
+"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
+"\n"
+msgstr ""
+
+#: templates/web/zurich/email_sent.html:5
+msgid "Nearly Done! Now check your email..."
+msgstr "Bron yna! Nawr gwiriwch eich e-bost..."
+
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Bron yna! Nawr gwiriwch eich e-bost..."
+
+#: templates/web/base/reports/index.html:21
+msgid "New <br>problems"
+msgstr "Problemau <br>newydd"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:261
+msgid "New body added"
+msgstr "Ychwanegwyd corff newydd"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
+msgid "New category contact added"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
+msgid "New internal note:"
+msgstr "Nodyn mewnol newydd:"
+
+#: db/alert_types.pl:18 db/alert_types.pl:22
+msgid "New local problems on FixMyStreet"
+msgstr "Problemau lleol newydd ar FixMyStreet"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nodyn mewnol newydd:"
+
+#: db/alert_types.pl:38
+msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
+msgstr "Problemau newydd i {{COUNCIL}} o fewn ward {{WARD}} ar FixMyStreet"
+
+#: db/alert_types.pl:26 db/alert_types.pl:30
+msgid "New problems near {{POSTCODE}} on FixMyStreet"
+msgstr "Problemau newydd gerllaw {{POSTCODE}} ar FixMyStreet"
+
+#: db/alert_types.pl:10
+msgid "New problems on FixMyStreet"
+msgstr "Problemau newydd ar FixMyStreet"
+
+#: db/alert_types.pl:34
+msgid "New problems to {{COUNCIL}} on FixMyStreet"
+msgstr "Problemau newydd i {{COUNCIL}} ar FixMyStreet"
+
+#: db/alert_types.pl:42
+msgid "New problems within {{NAME}}'s boundary on FixMyStreet"
+msgstr "Problemau newydd o fewn ffiniau {{NAME}} ar FixMyStreet"
+
+#: templates/web/zurich/admin/index-sdm.html:4
+msgid "New reports"
+msgstr "Adroddiadau newydd"
+
+#: templates/web/base/admin/questionnaire.html:24
+msgid "New state"
+msgstr ""
+
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Diweddariad newydd:"
+
+#: templates/web/base/pagination.html:13
+msgid "Next"
+msgstr "Nesaf"
+
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
+#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
+#: templates/web/base/admin/category_edit.html:4
+#: templates/web/base/admin/list_updates.html:32
+#: templates/web/base/admin/list_updates.html:34
+#: templates/web/base/admin/list_updates.html:35
+#: templates/web/base/admin/problem_row.html:20
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/update_edit.html:25
+#: templates/web/base/questionnaire/creator_fixed.html:16
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
+msgid "No"
+msgstr ""
+
+#: templates/web/base/admin/user-form.html:33
+msgid "No body"
+msgstr "Dim corff"
+
+#: templates/web/base/admin/stats.html:85
+msgid "No council"
+msgstr "Dim cyngor"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:401
+msgid "No council selected"
+msgstr ""
+
+#: templates/web/base/admin/edit-league.html:17
+msgid "No edits have yet been made."
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:25
+msgid "No flagged problems found."
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:58
+msgid "No flagged users found."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
+msgid "No further updates"
+msgstr "Dim diweddariadau pellach"
+
+#: templates/web/base/js/translation_strings.html:38
+msgid "No result returned"
+msgstr "Dim canlyniadau"
+
+#: templates/web/base/admin/body-form.html:60
+#: templates/web/base/admin/body-form.html:61
+msgid ""
+"No specific areas are currently available, because the <code>MAPIT_URL</code> in\n"
+" your config file is not pointing to a live MapIt service."
+msgstr ""
+
+#: templates/web/base/report/_support.html:2
+#: templates/web/base/report/_support.html:4
+msgid "No supporters"
+msgstr "Dim cefnogwyr"
+
+#: templates/web/base/admin/report_edit.html:41
+msgid "None"
+msgstr "Dim"
+
+#: templates/web/base/admin/user-form.html:24
+#: templates/web/base/admin/user-form.html:25
+msgid ""
+"Normal (public) users should not be associated with any <strong>body</strong>.<br>\n"
+" Authorised staff users can be associated with the body they represent.<br>\n"
+" Depending on the implementation, staff users may have access to the dashboard (summary of\n"
+" activity across their body), the ability to hide reports or set special report statuses."
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:33
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:31
+msgid "Not Responsible"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
+msgid "Not for my subdivision"
+msgstr ""
+
+#: templates/web/base/admin/questionnaire.html:6
+msgid "Not reported before"
+msgstr ""
+
+#: templates/web/base/report/_main.html:62
+msgid "Not reported to council"
+msgstr ""
+
+#: templates/web/base/admin/body.html:71
+#: templates/web/base/admin/category_edit.html:95
+#: templates/web/zurich/admin/body.html:17
+msgid "Note"
+msgstr "Nodyn"
+
+#: templates/web/base/admin/stats.html:51
+msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
+msgstr ""
+
+#: templates/web/base/admin/body.html:186
+#: templates/web/base/admin/category_edit.html:52
+#: templates/web/zurich/admin/body.html:53
+msgid "Note:"
+msgstr "Nodyn:"
+
+#: templates/web/base/open311/index.html:73
+msgid "Note: <strong>%s</strong>"
+msgstr "Nodyn: <strong>%s</strong>"
+
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
+msgstr "Nawr i gyflwyno eich adroddiad&hellip;"
+
+#: templates/web/base/report/update-form.html:86
+#: templates/web/fixmystreet/report/update-form.html:85
+msgid "Now to submit your update&hellip;"
+msgstr "Nawr i gyflwyno eich diweddariad&hellip;"
+
+#: templates/web/base/js/translation_strings.html:42
+msgid "OK"
+msgstr "Iawn"
+
+#: templates/web/base/report/display.html:28
+#: templates/web/base/report/update.html:17
+msgid "Offensive? Unsuitable? Tell us"
+msgstr "Sarhaus? Anaddas? Dywedwch wrthym"
+
+#: templates/web/base/reports/index.html:23
+msgid "Old / unknown <br>problems"
+msgstr "Problemau <br>hen/anhysbys"
+
+#: templates/web/base/admin/questionnaire.html:24
+msgid "Old state"
+msgstr "Hen gyflwr"
+
+#: templates/web/base/reports/index.html:25
+msgid "Older <br>fixed"
+msgstr "Trwsiwyd <br>o'r blaen"
+
+#: templates/web/base/reports/index.html:22
+msgid "Older <br>problems"
+msgstr "Problemau <br>hÅ·n"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:45
+msgid "One-line summary"
+msgstr "Crynodeb byr"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
+#: templates/web/base/admin/update_edit.html:28
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/report/update-form.html:30
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:7
+#: templates/web/zurich/admin/update_edit.html:18
+msgid "Open"
+msgstr "Ar agor"
+
+#: templates/web/base/reports/index.html:22
+msgid "Open for more than four weeks, with an update within the past eight weeks"
+msgstr "Ar agor am fwy na phedair wythnos, gyda diweddariad o fewn yr wyth wythnos ddiwethaf"
+
+#: templates/web/base/reports/index.html:23
+msgid "Open, but not had any update in eight weeks"
+msgstr "Ar agor, ond heb ddiweddariad o fewn yr wyth wythnos ddiwethaf"
+
+#: templates/web/base/open311/index.html:70
+msgid "Open311 API for the mySociety FixMyStreet server"
+msgstr "API Open311 i weinydd mySociety FixMyStreet"
+
+#: templates/web/base/open311/index.html:80
+msgid "Open311 initiative web page"
+msgstr "gwefan menter Open311"
+
+#: templates/web/base/open311/index.html:81
+msgid "Open311 specification"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:60
+msgid "Or problems reported to:"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:36
+msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
+msgstr "Neu gallwch danysgrifio i hysbysiad yn seiliedig ar eich ward neu etholaeth:"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
+msgid "Other"
+msgstr ""
+
+#: templates/web/base/admin/list_updates.html:8
+msgid "Owner"
+msgstr ""
+
+#: templates/web/base/errors/page_error_404_not_found.html:1
+#: templates/web/base/errors/page_error_404_not_found.html:3
+msgid "Page Not Found"
+msgstr "Ni chanfuwyd y dudalen"
+
+#: templates/web/base/admin/body-form.html:31
+#: templates/web/zurich/admin/body-form.html:14
+msgid "Parent"
+msgstr "Rhiant"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
+msgid "Partial"
+msgstr "Rhannol"
+
+#: templates/web/base/auth/general.html:53
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
+#: templates/web/fixmystreet/report/update-form.html:116
+#: templates/web/zurich/auth/general.html:32
+#: templates/web/zurich/auth/general.html:63
+msgid "Password (optional)"
+msgstr "Cyfrinair (dewisol)"
+
+#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
+msgid "Password:"
+msgstr "Cyfrinair:"
+
+#: templates/web/base/js/translation_strings.html:48
+msgid "Permalink"
+msgstr "Dolen barhaol"
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
+msgid "Phone number"
+msgstr "Rhif ffôn"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:26
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:62
+msgid "Phone number (optional)"
+msgstr "Rhif ffôn (dewisol)"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
+#: templates/web/zurich/admin/stats.html:39
+msgid "Phone:"
+msgstr "Ffôn:"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/fixmystreet/report/update-form.html:59
+#: templates/web/zurich/admin/index-dm.html:29
+#: templates/web/zurich/admin/index-sdm.html:24
+#: templates/web/zurich/admin/reports.html:16
+#: templates/web/zurich/admin/stats.html:37
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
+msgid "Photo"
+msgstr "Llun"
+
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Mae'r wybodaeth hon yn ofynnol"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Mae'r wybodaeth hon yn ofynnol"
+
+#: templates/web/base/questionnaire/index.html:80
+#: templates/web/base/report/new/fill_in_details_form.html:84
+#: templates/web/base/report/update-form.html:62
+msgid "Photo:"
+msgstr "Llun:"
+
+#: templates/web/base/alert/list.html:26
+msgid "Photos of recent nearby reports"
+msgstr "Lluniau o adroddiadau diweddar gerllaw"
+
+#: templates/web/base/js/translation_strings.html:30
+msgid "Place pin on map"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:143
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:9
+#: templates/web/zurich/admin/index-dm.html:9
+msgid "Planned"
+msgstr ""
+
+#: templates/web/base/report/new/notes.html:5
+msgid "Please be polite, concise and to the point."
+msgstr "Byddwch yn gwrtais, yn gryno ac yn berthnasol."
+
+#: templates/web/base/auth/change_password.html:12
+#: templates/web/base/auth/change_password.html:17
+msgid "Please check the passwords and try again"
+msgstr ""
+
+#: templates/web/zurich/auth/token.html:16
+msgid "Please check your email"
+msgstr ""
+
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
+#: templates/web/zurich/auth/general.html:3
+#: templates/web/zurich/auth/general.html:9
+msgid "Please check your email address is correct"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:343
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
+#: perllib/FixMyStreet/DB/Result/Problem.pm:412
+#: templates/web/base/js/translation_strings.html:9
+msgid "Please choose a category"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:418
+msgid "Please choose a property type"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
+msgid "Please correct the errors below"
+msgstr ""
+
+#: templates/web/base/contact/blurb.html:2
+#: templates/web/fixmystreet/contact/blurb.html:12
+msgid ""
+"Please do <strong>not</strong> report problems through this form; messages go to\n"
+"the team behind this site, not a council. To report a problem,\n"
+"please <a href=\"/\">go to the front page</a> and follow the instructions."
+msgstr ""
+
+#: templates/web/base/report/new/notes.html:6
+msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users."
+msgstr "Peidiwch â bod yn sarhaus&nbsp;&mdash; byddai sarhau eich cyngor yn dibrisio'r gwasanaeth i bawb."
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:346
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
+#: templates/web/base/js/translation_strings.html:2
+msgid "Please enter a message"
+msgstr "Rhowch neges"
+
+#: templates/web/base/auth/change_password.html:12
+#: templates/web/base/auth/change_password.html:15
+#: templates/web/base/js/translation_strings.html:19
+msgid "Please enter a password"
+msgstr "Rhowch gyfrinair"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/DB/Result/Problem.pm:395
+#: templates/web/base/js/translation_strings.html:3
+msgid "Please enter a subject"
+msgstr "Rhowch bwnc"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
+#: perllib/FixMyStreet/DB/Result/User.pm:127
+#: templates/web/base/js/translation_strings.html:12
+#: templates/web/base/js/translation_strings.html:16
+msgid "Please enter a valid email"
+msgstr "Rhowch e-bost dilys"
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:346
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
+msgid "Please enter a valid email address"
+msgstr "Rhowch gyfeiriad e-bost dilys"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:398
+#: templates/web/base/js/translation_strings.html:4
+msgid "Please enter some details"
+msgstr "Rhowch fanylion"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/DB/Result/User.pm:124
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
+#: templates/web/base/js/translation_strings.html:11
+#: templates/web/base/js/translation_strings.html:15
+#: templates/web/zurich/auth/general.html:3
+#: templates/web/zurich/auth/general.html:8
+msgid "Please enter your email"
+msgstr "Rhowch eich e-bost"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
+msgid "Please enter your email address"
+msgstr "Rhowch eich cyfeiriad e-bost"
+
+#: templates/web/base/js/translation_strings.html:25
+msgid "Please enter your first name"
+msgstr "Rhowch eich enw cyntaf"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:318
+#: templates/web/base/js/translation_strings.html:7
+msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
+msgstr "Rhowch eich enw llawn, mae angen y wybodaeth hon ar y cyngor – os na hoffech ddatgelu eich enw ar y wefan, dad-diciwch y blwch isod"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
+#: perllib/FixMyStreet/DB/Result/Problem.pm:406
+#: perllib/FixMyStreet/DB/Result/User.pm:120
+#: templates/web/base/js/translation_strings.html:6
+msgid "Please enter your name"
+msgstr "Rhowch eich enw"
+
+#: templates/web/base/js/translation_strings.html:22
+msgid "Please enter your phone number"
+msgstr "Rhowch eich rhif ffôn"
+
+#: templates/web/base/js/translation_strings.html:26
+msgid "Please enter your second name"
+msgstr "Rhowch eich cyfenw"
+
+#: templates/web/base/js/translation_strings.html:24
+msgid "Please enter your title"
+msgstr "Rhowch eich teitl"
+
+#: templates/web/base/auth/sign_out.html:5
+#: templates/web/zurich/auth/sign_out.html:5
+msgid "Please feel free to <a href=\"%s\">sign in again</a>, or go back to the <a href=\"/\">front page</a>."
+msgstr "Croeso i chi <a href=\"%s\">ailfewngofnodi</a>, neu fynd yn ôl i'r <a href=\"/\">hafan</a>."
+
+#: templates/web/base/report/new/fill_in_details_text.html:1
+#: templates/web/base/report/new/fill_in_details_text.html:8
+msgid "Please fill in details of the problem below."
+msgstr "Rhowch fanylion am y broblem isod."
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:46
+msgid "Please fill in details of the problem."
+msgstr "Rhowch fanylion am y broblem."
+
+#: templates/web/base/report/new/fill_in_details_form.html:28
+#: templates/web/fixmystreet/report/new/sidebar.html:7
+#: templates/web/zurich/report/new/fill_in_details_form.html:20
+msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
+msgid "Please indicate whether you'd like to receive another questionnaire"
+msgstr ""
+
+#: templates/web/fixmystreet/report/updates-sidebar-notes.html:4
+msgid "Please note that updates are not sent to the council."
+msgstr "Noder na chaiff diweddariadau eu hanfon at y cyngor."
+
+#: templates/web/base/report/update-form.html:7
+msgid "Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:8
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:21
+#: templates/web/zurich/report/new/fill_in_details_form.html:11
+msgid "Please note your report has <strong>not yet been sent</strong>. Choose a category and add further information below, then submit."
+msgstr ""
+
+#: templates/web/base/report/new/notes.html:1
+#: templates/web/zurich/report/new/notes.html:1
+msgid "Please note:"
+msgstr "Noder:"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
+msgid "Please provide some explanation as to why you're reopening this report"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
+msgid "Please provide some text as well as a photo"
+msgstr "Rhowch destun yn ogystal â llun"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
+msgid "Please say whether you've ever reported a problem to your council before"
+msgstr "Dywedwch wrthym a ydych wedi adrodd problem i'ch cyngor o'r blaen"
+
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Dewiswch y ffrwd hoffech chi ei chael"
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:80
+msgid "Please select the feed you want"
+msgstr "Dewiswch y ffrwd hoffech chi ei chael"
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:118
+msgid "Please select the type of alert you want"
+msgstr "Dewiswch pa fath o hysbysiad hoffech chi ei gael"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
+msgid "Please state whether or not the problem has been fixed"
+msgstr "Dywedwch a gafodd y broblem ei thrwsio"
+
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
+msgid "Please upload a JPEG image only"
+msgstr "Uwchlwythwch lun JPEG yn unig"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
+msgid "Please write a message"
+msgstr "Ysgrifennwch neges"
+
+#: templates/web/fixmystreet/report/update-form.html:23
+msgid "Please write your update here"
+msgstr "Ysgrifennwch eich diweddariad yma"
+
+#: templates/web/base/contact/index.html:100
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
+#: templates/web/base/report/update-form.html:72
+#: templates/web/fixmystreet/contact/index.html:113
+#: templates/web/fixmystreet/report/update-form.html:124
+#: templates/web/fixmystreet/report/update-form.html:71
+#: templates/web/fixmystreet/report/update-form.html:97
+msgid "Post"
+msgstr ""
+
+#: templates/web/base/report/updates.html:15
+msgid "Posted anonymously at %s"
+msgstr "Postiwyd yn ddienw am %s"
+
+#: templates/web/base/report/updates.html:22
+msgid "Posted by %s (<strong>%s</strong>) at %s"
+msgstr "Postiwyd gan %s (<strong>%s</strong>) am %s"
+
+#: templates/web/base/report/updates.html:24
+msgid "Posted by %s at %s"
+msgstr "Postiwyd gan %s am %s"
+
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
+#: templates/web/base/pagination.html:7
+msgid "Previous"
+msgstr "Blaenorol"
+
+#: templates/web/fixmystreet/footer.html:41
+msgid "Privacy"
+msgstr "Preifatrwydd"
+
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
+#: templates/web/base/admin/body.html:202
+#: templates/web/base/admin/body.html:85
+#: templates/web/base/admin/category_edit.html:45
+#: templates/web/base/admin/report_edit.html:77
+msgid "Private"
+msgstr "Preifat"
+
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
+msgid "Problem"
+msgstr "Problem"
+
+#: templates/web/base/admin/timeline.html:22
+msgid "Problem %d created"
+msgstr "Crëwyd y broblem %d"
+
+#: templates/web/base/admin/timeline.html:24
+msgid "Problem %s confirmed"
+msgstr "Cadarnhawyd y broblem %s"
+
+#: templates/web/base/admin/timeline.html:26
+msgid "Problem %s sent to council %s"
+msgstr "Anfonwyd y broblem %s at y cyngor"
+
+#: templates/web/base/admin/index.html:46
+#: templates/web/zurich/admin/index.html:9
+msgid "Problem breakdown by state"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
+msgid "Problem marked as open."
+msgstr ""
+
+#: templates/web/base/admin/questionnaire.html:21
+msgid "Problem state change based on survey results"
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:10
+msgid "Problems"
+msgstr "Problemau"
+
+#: templates/web/base/around/_updates.html:1
+msgid "Problems in this area"
+msgstr "Problemau yn yr ardal hon"
+
+#: templates/web/fixmystreet/report/display.html:43
+msgid "Problems nearby"
+msgstr "Problemau gerllaw"
+
+#: templates/web/fixmystreet/report/display.html:41
+msgid "Problems on the map"
+msgstr "Problemau ar y map"
+
+#: db/alert_types.pl:14
+msgid "Problems recently reported fixed on FixMyStreet"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:21
+msgid "Problems within %.1fkm of this location"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
+#: perllib/FixMyStreet/Cobrand/UK.pm:207
+msgid "Problems within %s"
+msgstr "Problemau yn %s"
+
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:128
+#: perllib/FixMyStreet/Cobrand/UK.pm:221
+msgid "Problems within %s ward"
+msgstr "Problemau yn ward %s"
+
+#. ("First %s is the body name, second %s the site name")
+#: templates/web/base/reports/body.html:0
+#: templates/web/base/reports/body.html:24
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemau yn %s"
+
+#: templates/web/base/alert/_list.html:42
+msgid "Problems within the boundary of:"
+msgstr "Problemau o fewn ffiniau:"
+
+#: templates/web/base/admin/report_edit.html:45
+msgid "Property address:"
+msgstr "Cyfeiriad yr eiddo:"
+
+#: templates/web/base/report/new/category.html:8
+msgid "Property type:"
+msgstr "Math o eiddo:"
+
+#: templates/web/base/report/update-form.html:3
+#: templates/web/fixmystreet/report/update-form.html:4
+msgid "Provide an update"
+msgstr "Darparu diweddariad"
+
+#: templates/web/base/auth/general.html:56
+msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
+msgstr "Mae darparu enw a chyfrinair yn ddewisol, ond bydd yn eich galluogi i adrodd problemau'n haws, gadael diweddariadau a rheoli eich adroddiadau."
+
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
+#: templates/web/fixmystreet/report/update-form.html:119
+msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
+msgstr "Mae darparu cyfrinair yn ddewisol, ond bydd yn eich galluogi i adrodd problemau'n haws, gadael diweddariadau a rheoli eich adroddiadau."
+
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
+msgid "Public response:"
+msgstr "Ymateb cyhoeddus:"
+
+#: templates/web/zurich/admin/report_edit.html:121
+#: templates/web/zurich/admin/stats.html:38
+msgid "Publish photo"
+msgstr "Cyhoeddi llun"
+
+#: templates/web/base/questionnaire/completed.html:1
+#: templates/web/base/questionnaire/index.html:0
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
+msgid "Questionnaire"
+msgstr "Holiadur"
+
+#: templates/web/base/admin/timeline.html:30
+msgid "Questionnaire %d answered for problem %d, %s to %s"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:28
+msgid "Questionnaire %d sent for problem %d"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:200
+msgid "Questionnaire filled in by problem reporter"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:22
+#: templates/web/base/around/display_location.html:1
+#: templates/web/base/around/display_location.html:3
+#: templates/web/base/report/display.html:50
+#: templates/web/base/reports/_rss.html:1
+#: templates/web/fixmystreet/alert/updates.html:9
+#: templates/web/fixmystreet/report/display.html:58
+msgid "RSS feed"
+msgstr "Ffrwd RSS"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:250 perllib/FixMyStreet/Cobrand/UK.pm:262
+msgid "RSS feed for %s"
+msgstr "Ffrwd RSS ar gyfer %s"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:256 perllib/FixMyStreet/Cobrand/UK.pm:268
+msgid "RSS feed for %s ward, %s"
+msgstr "Ffrwd RSS ar gyfer ward %s, %s"
+
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:155
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:163
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:173
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:181
+#: perllib/FixMyStreet/Cobrand/UK.pm:276 perllib/FixMyStreet/Cobrand/UK.pm:288
+msgid "RSS feed of %s"
+msgstr "Ffrwd RSS %s"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:281 perllib/FixMyStreet/Cobrand/UK.pm:293
+msgid "RSS feed of %s, within %s ward"
+msgstr "Ffrwd RSS %s, o fewn ward %s"
+
+#: templates/web/base/alert/_list.html:22
+msgid "RSS feed of nearby problems"
+msgstr "Ffrwd RSS o broblemau gerllaw"
+
+#: templates/web/base/reports/_rss.html:1
+msgid "RSS feed of problems in this %s"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
+#: perllib/FixMyStreet/Cobrand/UK.pm:214
+msgid "RSS feed of problems within %s"
+msgstr "Ffrwd RSS o broblemau yn %s"
+
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:127
+#: perllib/FixMyStreet/Cobrand/UK.pm:220
+msgid "RSS feed of problems within %s ward"
+msgstr "Ffrwd RSS o broblemau o fewn ward %s"
+
+#: templates/web/base/around/display_location.html:1
+#: templates/web/base/around/display_location.html:4
+msgid "RSS feed of recent local problems"
+msgstr "Ffrwd RSS o broblemau lleol diweddar"
+
+#: templates/web/base/report/display.html:50
+#: templates/web/fixmystreet/alert/updates.html:9
+#: templates/web/fixmystreet/report/display.html:58
+msgid "RSS feed of updates to this problem"
+msgstr "Ffrwd RSS o ddiweddariadau i'r broblem hon"
+
+#: templates/web/base/alert/updates.html:9
+#: templates/web/base/report/display.html:41
+#: templates/web/fixmystreet/alert/updates.html:14
+#: templates/web/fixmystreet/report/display.html:60
+msgid "Receive email when updates are left on this problem."
+msgstr "Derbyn e-bost pan fydd diweddariadau i'r broblem hon."
+
+#. ("%s is the site name")
+#: templates/web/base/around/display_location.html:0
+#: templates/web/base/around/display_location.html:33
+#, fuzzy
+msgid "Recent local problems, %s"
+msgstr "Problemau lleol diweddar, FixMyStreet"
+
+#: templates/web/base/reports/index.html:24
+msgid "Recently <br>fixed"
+msgstr "Trwsiwyd yn <br>ddiweddar"
+
+#: templates/web/base/front/recent.html:11
+msgid "Recently reported problems"
+msgstr "Problemau a adroddwyd yn ddiweddar"
+
+#: templates/web/zurich/report/new/notes.html:5
+msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:46
+msgid "Remove flag"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/update_edit.html:62
+#: templates/web/zurich/admin/update_edit.html:35
+msgid "Remove photo (can't be undone!)"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
+#: templates/web/fixmystreet/header_logo.html:2
+msgid "Report"
+msgstr ""
+
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
+#: templates/web/fixmystreet/header_logo.html:2
+#: templates/web/zurich/footer.html:18
+#: templates/web/zurich/nav_over_content.html:4
+msgid "Report a problem"
+msgstr "Adrodd problem"
+
+#: templates/web/fixmystreet/report/display.html:32
+msgid "Report abuse"
+msgstr "Adrodd camddefnydd"
+
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
+msgid "Report on %s"
+msgstr "Adroddwyd ar %s"
+
+#: templates/web/base/report/new/fill_in_details_form.html:1
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+msgid "Report your problem"
+msgstr "Adrodd eich problem"
+
+#: templates/web/base/around/intro.html:1
+#: templates/web/zurich/around/intro.html:1
+msgid "Report, view, or discuss local problems"
+msgstr "Adrodd, gweld, neu drafod problemau lleol"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
+#: templates/web/base/contact/index.html:50
+#: templates/web/fixmystreet/contact/index.html:65
+msgid "Reported anonymously at %s"
+msgstr "Adroddwyd yn ddienw am %s"
+
+#: templates/web/base/admin/questionnaire.html:5
+#: templates/web/base/questionnaire/index.html:62
+msgid "Reported before"
+msgstr "Adroddwyd eisoes"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+#: templates/web/base/contact/index.html:52
+#: templates/web/fixmystreet/contact/index.html:67
+msgid "Reported by %s at %s"
+msgstr "Adroddwyd gan %s am %s"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Adroddwyd %s"
+
+#: templates/web/zurich/report/_main.html:2
+msgid "Reported in the %s category"
+msgstr "Adroddwyd yn y categori %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
+msgid "Reported in the %s category anonymously at %s"
+msgstr "Adroddwyd yn y categori %s yn ddienw am %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+msgid "Reported in the %s category by %s at %s"
+msgstr "Adroddwyd yn y categori %s am %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
+msgid "Reported via %s anonymously at %s"
+msgstr "Adroddwyd drwy %s yn ddienw am %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
+msgid "Reported via %s by %s at %s"
+msgstr "Adroddwyd drwy %s gan %s am %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
+msgid "Reported via %s in the %s category anonymously at %s"
+msgstr "Adroddwyd drwy %s yn y categori %s yn ddienw am %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
+msgid "Reported via %s in the %s category by %s at %s"
+msgstr "Adroddwyd drwy %s yn y categori %s am %s"
+
+#: templates/web/base/reports/index.html:21
+msgid "Reported within the last four weeks"
+msgstr "Adroddwyd o fewn y bedair wythnos ddiwethaf"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Adroddwyd %s"
+
+#: templates/web/base/around/index.html:2
+#: templates/web/base/js/translation_strings.html:41
+#: templates/web/base/report/new/fill_in_details.html:0
+#: templates/web/base/report/new/fill_in_details.html:5
+#: templates/web/zurich/report/new/fill_in_details_form.html:2
+msgid "Reporting a problem"
+msgstr "Adrodd problem"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
+#: templates/web/zurich/header.html:60
+msgid "Reports"
+msgstr "Adroddiadau"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:327 perllib/FixMyStreet/Cobrand/UK.pm:331
+msgid "Reports are limited to %s characters in length. Please shorten your report"
+msgstr ""
+
+#: templates/web/zurich/admin/index-sdm.html:7
+msgid "Reports awaiting approval"
+msgstr ""
+
+#: templates/web/zurich/admin/index-sdm.html:10
+msgid "Reports published"
+msgstr "Adroddiadau a gyhoeddwyd"
+
+#: templates/web/base/admin/report_edit.html:67
+msgid "Resend report"
+msgstr "Ailanfon adrodd"
+
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:28
+msgid "Right place?"
+msgstr "Y lle cywir?"
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:167
+#: perllib/FixMyStreet/Geocode/OSM.pm:152
+msgid "Road operator for this named road (derived from road reference number and type): %s"
+msgstr ""
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:164
+#: perllib/FixMyStreet/Geocode/OSM.pm:149
+msgid "Road operator for this named road (from OpenStreetMap): %s"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
+msgid "Rotate Left"
+msgstr "Cylchdroi i'r chwith"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
+msgid "Rotate Right"
+msgstr "Cylchdroi i'r dde"
+
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
+msgid "Satellite"
+msgstr ""
+
+#: templates/web/base/admin/body.html:208
+#: templates/web/base/admin/category_edit.html:84
+#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
+msgid "Save changes"
+msgstr "Cadw'r newidiadau"
+
+#: templates/web/base/admin/reports.html:1
+#: templates/web/zurich/admin/reports.html:1
+msgid "Search Reports"
+msgstr "Chwilio am adroddiadau"
+
+#: templates/web/base/admin/users.html:1
+msgid "Search Users"
+msgstr "Chwilio am ddefnyddwyr"
+
+#: templates/web/zurich/header.html:82
+msgid "Search reports"
+msgstr "Chwilio am adroddiadau"
+
+#: templates/web/base/admin/reports.html:5
+#: templates/web/base/admin/users.html:8
+#: templates/web/zurich/admin/reports.html:5
+msgid "Search:"
+msgstr "Chwilio:"
+
+#: templates/web/base/admin/reports.html:26
+msgid "Searching found no reports."
+msgstr ""
+
+#: templates/web/base/admin/users.html:41
+msgid "Searching found no users."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:33
+#: templates/web/zurich/admin/body-form.html:16
+msgid "Select a body"
+msgstr ""
+
+#: templates/web/base/reports/index.html:9
+msgid "Select a particular council to see the reports sent there."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:71
+#: templates/web/zurich/admin/body-form.html:26
+msgid "Select an area"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Adroddiadau ar agor"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
+msgid "Sent to %s %s later"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:66
+msgid "Sent:"
+msgstr "Anfonwyd:"
+
+#: templates/web/base/admin/report_edit.html:71
+#: templates/web/zurich/admin/stats.html:45
+msgid "Service:"
+msgstr "Gwasanaeth:"
+
+#: templates/web/fixmystreet/report/display.html:38
+msgid "Share"
+msgstr "Rhannu"
+
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
+#: templates/web/fixmystreet/report/update-form.html:146
+msgid "Show my name publicly"
+msgstr "Dangos fy enw yn gyhoeddus"
+
+#: templates/web/base/around/display_location.html:67
+msgid "Show old"
+msgstr "Dangos yr hen rai"
+
+#: templates/web/base/around/display_location.html:58
+msgid "Show pins"
+msgstr "Dangos piniau"
+
+#: templates/web/base/auth/general.html:3
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
+#: templates/web/zurich/auth/general.html:18
+#: templates/web/zurich/auth/general.html:35
+msgid "Sign in"
+msgstr "Mewngofnodi"
+
+#: templates/web/base/auth/general.html:1
+#: templates/web/zurich/auth/general.html:1
+msgid "Sign in or create an account"
+msgstr "Mewngofnodi neu greu cyfrif"
+
+#: templates/web/base/auth/sign_out.html:1
+#: templates/web/zurich/auth/sign_out.html:1
+msgid "Sign out"
+msgstr "Allgofnodi"
+
+#: templates/web/base/report/new/fill_in_details_text.html:1
+msgid "Some categories may require additional information."
+msgstr "Gall rhai categorïau ofyn am wybodaeth bellach."
+
+#: templates/web/base/admin/body-form.html:149
+#: templates/web/base/admin/body-form.html:150
+msgid ""
+"Some endpoints require an <strong>API key</strong> to indicate that the reports are being\n"
+" sent from your FixMyStreet installation."
+msgstr ""
+
+#: templates/web/base/alert/index.html:42
+msgid "Some photos of recent reports"
+msgstr "Lluniau o adroddiadau diweddar"
+
+#. ('Optional comment for translator')
+#: perllib/FixMyStreet/App/View/Email.pm:32
+#: perllib/FixMyStreet/App/View/Web.pm:52
+msgid "Some text to localize"
+msgstr "Testun i'w leoleiddio"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:78
+msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
+msgstr ""
+
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
+#: templates/web/base/tokens/abuse.html:5
+msgid "Sorry, there has been an error confirming your problem."
+msgstr "Mae'n ddrwg gennym, bu gwall tra'n cadarnhau eich problem."
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
+#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
+#: perllib/FixMyStreet/Geocode/OSM.pm:48
+msgid "Sorry, we could not find that location."
+msgstr "Mae'n ddrwg gennym, ni allwn ddod o hyd i'r lleoliad hwnnw."
+
+#: perllib/FixMyStreet/Geocode/Bing.pm:34
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
+msgid "Sorry, we could not parse that location. Please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
+#: templates/web/base/admin/stats.html:64
+msgid "Start Date:"
+msgstr "Dyddiad cychwyn:"
+
+#: templates/web/base/admin/body.html:69
+#: templates/web/base/admin/flagged.html:18
+#: templates/web/base/admin/list_updates.html:11
+#: templates/web/base/admin/reports.html:15
+#: templates/web/fixmystreet/report/update-form.html:26
+msgid "State"
+msgstr "Cyflwr"
+
+#: templates/web/base/admin/report_edit.html:47
+#: templates/web/base/admin/update_edit.html:27
+#: templates/web/base/report/update-form.html:28
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
+#: templates/web/zurich/admin/update_edit.html:17
+msgid "State:"
+msgstr "Cyflwr:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
+#: templates/web/base/admin/stats.html:1
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
+msgid "Stats"
+msgstr "Ystadegau"
+
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+msgid "Status"
+msgstr "Statws"
+
+#: templates/web/base/report/updates.html:10
+msgid "Still open, via questionnaire, %s"
+msgstr "Ar agor o hyd, drwy holiadur, %s"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
+msgid "Subcategory: %s"
+msgstr "Is-gategori: %s"
+
+#: templates/web/zurich/admin/index-dm.html:27
+msgid "Subdivision/Body"
+msgstr ""
+
+#: templates/web/fixmystreet/contact/index.html:98
+msgid "Subject"
+msgstr "Pwnc"
+
+#: templates/web/base/admin/report_edit.html:19
+#: templates/web/base/contact/index.html:88
+#: templates/web/base/report/new/fill_in_details_form.html:53
+#: templates/web/zurich/admin/report_edit.html:39
+msgid "Subject:"
+msgstr "Pwnc:"
+
+#: templates/web/base/questionnaire/creator_fixed.html:19
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
+#: templates/web/base/report/new/fill_in_details_form.html:96
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
+msgid "Submit"
+msgstr "Cyflwyno"
+
+#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/update_edit.html:65
+#: templates/web/base/admin/user-form.html:56
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
+#: templates/web/zurich/admin/update_edit.html:38
+msgid "Submit changes"
+msgstr "Cyflwyno newidiadau"
+
+#: templates/web/base/questionnaire/index.html:97
+msgid "Submit questionnaire"
+msgstr "Cyflwyno'r holiadur"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:6
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-dm.html:6
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+msgid "Submitted"
+msgstr "Cyflwynwyd"
+
+#: templates/web/base/alert/updates.html:17
+#: templates/web/base/report/display.html:46
+#: templates/web/fixmystreet/alert/updates.html:23
+#: templates/web/fixmystreet/report/display.html:65
+msgid "Subscribe"
+msgstr "Tanysgrifio"
+
+#: templates/web/base/alert/_list.html:92
+msgid "Subscribe me to an email alert"
+msgstr "Tanysgrifio i hysbysiad e-bost"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
+#: templates/web/base/admin/bodies.html:25
+#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
+#: templates/web/zurich/admin/index-dm.html:1
+#: templates/web/zurich/admin/index-sdm.html:1
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
+#: templates/web/zurich/header.html:57
+msgid "Summary"
+msgstr "Crynodeb"
+
+#: templates/web/base/reports/index.html:1
+#: templates/web/zurich/reports/index.html:0
+#: templates/web/zurich/reports/index.html:4
+msgid "Summary reports"
+msgstr "Adroddiadau"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
+msgid "Survey"
+msgstr "Arolwg"
+
+#: templates/web/base/admin/questionnaire.html:1
+msgid "Survey Results"
+msgstr "Canlyniadau arolwg"
+
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Diweddariadau"
+
+#: templates/web/base/admin/list_updates.html:12
+#: templates/web/zurich/admin/templates.html:9
+msgid "Text"
+msgstr "Testun"
+
+#: templates/web/base/admin/body.html:28
+msgid "Text only version"
+msgstr "Fersiwn testun yn unig"
+
+#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
+#: templates/web/zurich/admin/update_edit.html:12
+msgid "Text:"
+msgstr "Testun:"
+
+#: templates/web/base/tokens/confirm_problem.html:12
+msgid "Thank you for reporting this issue!"
+msgstr "Diolch am adrodd y broblem hon!"
+
+#: templates/web/base/tokens/error.html:7
+msgid "Thank you for trying to confirm your update or problem. We seem to have an error ourselves though, so <a href=\"%s\">please let us know what went on</a> and we'll look into it."
+msgstr ""
+
+#: templates/web/base/tokens/confirm_update.html:15
+msgid "Thank you for updating this issue!"
+msgstr "Diolch am ddiweddaru'r broblem!"
+
+#: templates/web/base/contact/submit.html:6
+#: templates/web/base/questionnaire/completed.html:5
+msgid "Thank you for your feedback"
+msgstr "Diolch am eich adborth"
+
+#: templates/web/base/around/_error_multiple.html:17
+msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
+msgstr "Diolch am uwchlwytho eich llun. Nawr mae'n rhaid i ni leoli eich problem, felly rhowch enw stryd cyfagos neu god post yn y blwch uchod&nbsp;:"
+
+#: templates/web/base/questionnaire/creator_fixed.html:9
+msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
+msgstr "Diolch, mae'n dda gennym glywed y cafodd ei drwsio! Gawn ni ofyn a ydych wedi adrodd problem i gyngor o'r blaen?"
+
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
+msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
+msgstr "Ni uwchlwythwyd y llun yn gywir (%s), ceisiwch eto."
+
+#: perllib/FixMyStreet/App/Controller/Council.pm:97
+msgid "That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Location.pm:126
+msgid "That location does not appear to be in the UK; please try again."
+msgstr "Mae'n ymddangos nad yw'r lleoliad hwnnw yn y DU; rhowch gynnig arall arni."
+
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:47
+#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:63
+#: perllib/FixMyStreet/Cobrand/UK.pm:71
+msgid "That postcode was not recognised, sorry."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
+msgid "That problem has been marked as sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
+msgid "That problem will now be resent."
+msgstr "Ailanfonir y broblem nawr."
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
+msgid "That report cannot be viewed on %s."
+msgstr "Ni ellir gweld yr adroddiad hwnnw ar %s."
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
+msgid "That report has been removed from FixMyStreet."
+msgstr "Tynnwyd yr adroddiad oddi ar FixMyStreet."
+
+#: templates/web/base/admin/body.html:144
+msgid ""
+"The <strong>email address</strong> is the destination to which reports about this category will be sent. \n"
+" Other categories for this body may have the same email address."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:123
+#: templates/web/base/admin/body-form.html:124
+msgid ""
+"The <strong>endpoint</strong> is the URL of the service that FixMyStreet will connect to \n"
+" when sending reports to this body."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:136
+#: templates/web/base/admin/body-form.html:137
+msgid ""
+"The <strong>jurisdiction</strong> is only needed if the endpoint is serving more\n"
+" than one. If the body is running its own endpoint, you can usually leave this blank."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:94
+#: templates/web/base/admin/body-form.html:95
+msgid ""
+"The <strong>send method</strong> determines how problem reports will be sent to the body.\n"
+" If you leave this blank, <strong>send method defaults to email</strong>."
+msgstr ""
+
+#: templates/web/base/open311/index.html:90
+msgid "The Open311 v2 attribute agency_responsible is used to list the administrations that received the problem report, which is not quite the way the attribute is defined in the Open311 v2 specification."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:11
+#: templates/web/base/admin/body-form.html:12
+msgid ""
+"The body's <strong>name</strong> identifies the body (for example, <em>Borsetshire District Council</em>)\n"
+" and may be displayed publically."
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_text.html:1
+#: templates/web/base/report/new/fill_in_details_text.html:3
+msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
+msgstr ""
+
+#: templates/web/base/admin/edit-league.html:3
+#: templates/web/base/admin/edit-league.html:4
+msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
+msgid "The error was: %s"
+msgstr "Y gwall oedd: %s"
+
+#: templates/web/base/open311/index.html:86
+msgid "The following Open311 v2 attributes are returned for each request: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code and service_name."
+msgstr ""
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:144
+msgid "The following information about the nearest road might be inaccurate or irrelevant, if the problem is close to several roads or close to a road without a name registered in OpenStreetMap."
+msgstr ""
+
+#: db/alert_types.pl:19 db/alert_types.pl:23 db/alert_types.pl:27
+#: db/alert_types.pl:31
+msgid "The latest local problems reported by users"
+msgstr "Y problemau lleol diweddaraf a adroddwyd gan ddefnyddwyr"
+
+#: db/alert_types.pl:35
+msgid "The latest problems for {{COUNCIL}} reported by users"
+msgstr ""
+
+#: db/alert_types.pl:39
+msgid "The latest problems for {{COUNCIL}} within {{WARD}} ward reported by users"
+msgstr ""
+
+#: db/alert_types.pl:11
+msgid "The latest problems reported by users"
+msgstr ""
+
+#: db/alert_types.pl:15
+msgid "The latest problems reported fixed by users"
+msgstr ""
+
+#: db/alert_types.pl:43
+msgid "The latest problems within {{NAME}}'s boundary reported by users"
+msgstr ""
+
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:58
+msgid "The list of available areas is being provided by the MapIt service at %s."
+msgstr ""
+
+#: templates/web/base/auth/change_password.html:12
+#: templates/web/base/auth/change_password.html:16
+msgid "The passwords do not match"
+msgstr "Nid yw'r cyfrineiriau'n cyfateb"
+
+#: templates/web/base/errors/page_error_404_not_found.html:10
+#: templates/web/base/errors/page_error_404_not_found.html:12
+msgid "The requested URL '%s' was not found on this server"
+msgstr "Ni chanfuwyd yr URL '%s' ar y gweinydd hwn"
+
+#: templates/web/base/alert/_list.html:16
+msgid "The simplest alert is our geographic one:"
+msgstr "Yr hysbysiad symlaf yw'r un daearyddol:"
+
+#: templates/web/base/report/new/councils_extra_text.html:1
+#: templates/web/base/report/new/councils_text_some.html:10
+#: templates/web/base/report/new/fill_in_details_form.html:18
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:14
+msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
+msgstr "Bydd y crynodeb a'r disgrifiad yn gyhoeddus (gweler ein <a href=\"/privacy\">polisi preifatrwydd</a>)."
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
+msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
+msgstr ""
+
+#: templates/web/base/admin/user-form.html:12
+#: templates/web/base/admin/user-form.html:13
+msgid ""
+"The user's <strong>name</strong> is displayed publicly on reports that have not been marked <em>anonymous</em>.\n"
+" Names are not necessarily unique."
+msgstr ""
+
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
+#: templates/web/base/reports/_problem-list.html:15
+msgid "There are no reports to show."
+msgstr "Nid oes unrhyw adroddiadau i'w dangos."
+
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
+msgid "There was a problem showing the All Reports page. Please try again later."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
+#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
+msgid "There was a problem showing this page. Please try again later."
+msgstr "Bu gwall dangos y dudalen hon. Rhowch gynnig arall arni nes ymlaen."
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
+#: templates/web/base/auth/general.html:26
+#: templates/web/zurich/auth/general.html:28
+msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
+msgstr "Bu problem gyda'r e-bost neu gyfrinair. Os na allwch gofio eich cyfrinair, neu os nad oes un gennych, llenwch ddarn &lsquo;mewngofnodi drwy e-bost&rsquo; y ffurflen."
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:355
+msgid "There was a problem with your email/password combination. Please try again."
+msgstr "Bu gwall gyda'r e-bost neu'r cyfrinair. Rhowch gynnig arall arni."
+
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:272
+msgid "There was a problem with your update. Please try again."
+msgstr "Bu gwall gyda'r diweddariad. Rhowch gynnig arall arni."
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
+msgid "There were problems with your report. Please see below."
+msgstr "Bu gwallau gyda'r adroddiad. Gwelwch isod."
+
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:300
+msgid "There were problems with your update. Please see below."
+msgstr "Bu gwallau gyda'r diweddariad. Gwelwch isod."
+
+#: templates/web/base/admin/body-form.html:112
+#: templates/web/base/admin/body-form.html:113
+msgid ""
+"These settings are for bodies that use Open311 (or other back-end integration) to receive problem reports.<br>\n"
+" <strong>You don't need to set them if the Send Method is email.</strong>.\n"
+" For more information on Open311, see \n"
+" <a href='https://www.mysociety.org/2013/01/17/open311-explained/' class='admin-offsite-link'>this article</a>.\n"
+" "
+msgstr ""
+
+#: templates/web/base/open311/index.html:77
+msgid "This API implementation is work in progress and not yet stabilized. It will change without warnings in the future."
+msgstr ""
+
+#: templates/web/base/admin/body.html:44
+msgid ""
+"This body covers no area. This means that it has no jurisdiction over problems reported <em>at any location</em>.\n"
+" Consequently, none of its categories will appear in the drop-down category menu when users report problems.\n"
+" Currently, users <strong>cannot report problems to this body</strong>."
+msgstr ""
+
+#: templates/web/base/admin/body.html:54
+msgid "This body has no contacts. This means that currently problems reported to this body <strong>will not be sent</strong>."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:52
+#: templates/web/base/admin/body-form.html:53
+msgid ""
+"This body will only be sent reports for problems that are located in the <strong>area covered</strong>.\n"
+" A body will not receive any reports unless it covers at least one area."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
+msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
+msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
+#: perllib/FixMyStreet/Cobrand/UK.pm:43
+msgid "This information is required"
+msgstr "Mae'r wybodaeth hon yn ofynnol"
+
+#: templates/web/base/debug_header.html:3
+msgid "This is a developer site; things might break at any time, and the database will be periodically deleted."
+msgstr ""
+
+#: templates/web/base/reports/index.html:7
+msgid "This is a summary of all reports on this site."
+msgstr "Dyma grynodeb o'r holl adroddiadau ar y wefan hon."
+
+#: templates/web/zurich/auth/token.html:8
+msgid "This may be because the link is too old or already used, or the address was not copied correctly."
+msgstr ""
+
+#: templates/web/base/report/banner.html:15
+msgid "This problem has been closed"
+msgstr "Caewyd y broblem hon"
+
+#: templates/web/base/report/banner.html:12
+#: templates/web/base/report/update-form.html:48
+#: templates/web/fixmystreet/report/update-form.html:46
+msgid "This problem has been fixed"
+msgstr "Trwsiwyd y broblem hon"
+
+#: templates/web/base/report/update-form.html:43
+#: templates/web/fixmystreet/report/update-form.html:40
+msgid "This problem has not been fixed"
+msgstr "Ni thrwsiwyd y broblem hon"
+
+#: templates/web/base/report/banner.html:19
+msgid "This problem is in progress"
+msgstr "Mae'r broblem hon ar y gweill"
+
+#: templates/web/base/report/banner.html:9
+msgid "This problem is old and of unknown status."
+msgstr "mae'r broblem hon yn hen a'i statws yn anhysbys."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
+#: templates/web/zurich/report/_main.html:14
+msgid "This report is awaiting moderation."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
+msgid "This report is currently marked as closed."
+msgstr "Mae'r adroddiad hwn wedi'i nodi ar gau."
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
+msgid "This report is currently marked as fixed."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
+msgid "This report is currently marked as open."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
+msgid "This report was submitted anonymously"
+msgstr "Cyflwynwyd yr adroddiad yn ddienw"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
+msgid "This web page also contains a photo of the problem, provided by the user."
+msgstr "Mae'r dudalen we hon yn cynnwys llun o'r broblem, a ddarparwyd gan y defnyddiwr."
+
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
+#: templates/web/base/admin/timeline.html:1
+msgid "Timeline"
+msgstr "Llinell amser"
+
+#: templates/web/base/admin/flagged.html:15
+#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
+msgid "Title"
+msgstr "Teitl"
+
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Teitl"
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:27
+msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+msgid "To view a map of the precise location of this issue"
+msgstr ""
+
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/questionnaire.html:24
+#: templates/web/base/admin/stats.html:24
+#: templates/web/base/admin/stats.html:43
+#: templates/web/zurich/admin/stats.html:30
+msgid "Total"
+msgstr "Cyfanswm"
+
+#: templates/web/base/js/translation_strings.html:29
+msgid "Try again"
+msgstr "Ceisio eto"
+
+#: templates/web/base/contact/submit.html:14
+msgid "Try emailing us directly:"
+msgstr "Ceisiwch anfon e-bost atom yn uniongyrchol:"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:33
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:31
+msgid "Unable to fix"
+msgstr "Methu trwsio"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
+#: templates/web/base/admin/update_edit.html:28
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
+#: templates/web/zurich/admin/update_edit.html:18
+msgid "Unconfirmed"
+msgstr "Heb ei gadarnhau"
+
+#: templates/web/fixmystreet/report/banner.html:9
+msgid "Unknown"
+msgstr "Anhysbys"
+
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
+msgid "Unknown alert type"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:39
+msgid "Unknown error"
+msgstr "Gwall anhysbys"
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
+msgid "Unknown problem ID"
+msgstr ""
+
+#: templates/web/fixmystreet/report/update-form.html:19
+msgid "Update"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:33
+msgid "Update %s created for problem %d; by %s"
+msgstr ""
+
+#: templates/web/base/contact/index.html:21
+#: templates/web/fixmystreet/contact/index.html:36
+msgid "Update below added anonymously at %s"
+msgstr ""
+
+#: templates/web/base/contact/index.html:23
+#: templates/web/fixmystreet/contact/index.html:38
+msgid "Update below added by %s at %s"
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:240
+#: templates/web/zurich/admin/body-form.html:52
+msgid "Update body"
+msgstr ""
+
+#: templates/web/base/admin/index.html:55
+msgid "Update breakdown by state"
+msgstr ""
+
+#: db/alert_types.pl:7
+msgid "Update by {{name}}"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:42
+#: templates/web/zurich/admin/update_edit.html:25
+msgid "Update changed problem state to %s"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:44
+msgid "Update marked problem as fixed"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:46
+msgid "Update reopened problem"
+msgstr ""
+
+#: templates/web/base/admin/body.html:101
+msgid "Update statuses"
+msgstr ""
+
+#: templates/web/base/report/update-form.html:22
+msgid "Update:"
+msgstr ""
+
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+msgid "Updated"
+msgstr "Diweddarwyd"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
+msgid "Updated!"
+msgstr "Diweddarwyd!"
+
+#: templates/web/base/admin/list_updates.html:2
+#: templates/web/base/report/update.html:3
+#: templates/web/fixmystreet/report/update.html:5
+#: templates/web/zurich/report/updates.html:2
+msgid "Updates"
+msgstr "Diweddariadau"
+
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
+msgid "Updates are limited to %s characters in length. Please shorten your update"
+msgstr ""
+
+#: db/alert_types.pl:5 db/alert_types.pl:6
+msgid "Updates on {{title}}"
+msgstr "Diweddariadau ar {{title}}"
+
+#. ("%s is the site name")
+#: templates/web/base/report/display.html:0
+#: templates/web/base/report/display.html:5
+#: templates/web/fixmystreet/report/display.html:0
+#: templates/web/fixmystreet/report/display.html:9
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "Diweddariadau i'r broblem hon, FixMyStreet"
+
+#: templates/web/base/admin/body.html:182
+msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
+msgstr "Defnyddiwch y <strong>nodyn</strong> i gofnodi manylion a ddangosir yma yn unig. Ni ddangosir nodiadau'n gyhoeddus, ac ni chânt eu hanfon at y corff."
+
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
+msgid "User flag removed"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
+msgid "User flagged"
+msgstr ""
+
+#: templates/web/base/admin/users.html:5
+msgid "User search finds matches in users' names and email addresses."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
+#: templates/web/base/admin/flagged.html:29
+#: templates/web/zurich/header.html:69
+msgid "Users"
+msgstr "Defnyddwyr"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
+msgid "Values updated"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:18
+#: templates/web/base/admin/update_edit.html:18
+#: templates/web/zurich/admin/report_edit-sdm.html:21
+#: templates/web/zurich/admin/report_edit.html:22
+#: templates/web/zurich/admin/update_edit.html:10
+msgid "View report on site"
+msgstr ""
+
+#: templates/web/base/reports/body.html:14
+msgid "View reports by ward"
+msgstr "Gweld adroddiadau yn ôl ward"
+
+#: templates/web/base/around/display_location.html:0
+#: templates/web/base/around/display_location.html:35
+msgid "Viewing a location"
+msgstr ""
+
+#: templates/web/base/report/display.html:0
+#: templates/web/fixmystreet/report/display.html:0
+msgid "Viewing a problem"
+msgstr ""
+
+#: templates/web/base/reports/body.html:16
+msgid "Wards of this council"
+msgstr "Wardiau'r cyngor hwn"
+
+#: templates/web/base/alert/choose.html:6
+#: templates/web/base/around/_error_multiple.html:6
+msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
+msgstr ""
+
+#: templates/web/zurich/auth/token.html:7
+msgid "We have not been able to confirm your account - sorry."
+msgstr "Doedd hi ddim yn bosib i ni gadarnhau eich cyfrif - mae'n ddrwg gennym."
+
+#: templates/web/zurich/auth/token.html:17
+msgid "We have sent you an email containing a link to confirm your account."
+msgstr "Rydym wedi anfon e-bost atoch sy'n cynnwys dolen i gadarnhau eich cyfrif."
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:2
+#: templates/web/fixmystreet/report/update-form.html:77
+msgid "We never show your email"
+msgstr "Ni ddatgelir eich e-bost"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:31
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:65
+msgid "We never show your email address or phone number."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
+msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
+msgstr ""
+
+#: templates/web/base/index-steps.html:31
+msgid "We send it to the council on your behalf"
+msgstr ""
+
+#: templates/web/base/report/new/notes.html:4
+#: templates/web/zurich/report/new/notes.html:4
+msgid "We will only use your personal information in accordance with our <a href=\"/privacy\">privacy policy.</a>"
+msgstr "Rydym ond yn defnyddio eich gwybodaeth bersonol yn unol â'n <a href=\"/privacy\">polisi preifatrwydd.</a>"
+
+#: templates/web/base/questionnaire/completed-open.html:2
+msgid "We&rsquo;re sorry to hear the problem’s not fixed. Why not try writing to your local representatives?"
+msgstr ""
+
+#: templates/web/base/contact/blurb.html:8
+msgid "We'd love to hear what you think about this site. Just fill in the form, or send an email to <a href='mailto:%s'>%s</a>:"
+msgstr "Carem glywed eich barn am y wefan hon. Llenwch y ffurflen, neu anfonwch e-bost at <a href='mailto:%s'>%s</a>:"
+
+#: templates/web/base/contact/submit.html:7
+msgid "We’ll get back to you as soon as we can."
+msgstr "Ymatebwn cyn gynted â phosib."
+
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
+msgid "What’s the issue, and where is it?"
+msgstr "Beth yw'r broblem, a ble mae hi?"
+
+#: templates/web/base/admin/category_edit.html:90
+#: templates/web/zurich/admin/body.html:18
+msgid "When edited"
+msgstr ""
+
+#: templates/web/base/admin/problem_row.html:35
+msgid "When sent"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
+msgid "Whole block of empty flats"
+msgstr ""
+
+#: templates/web/base/tokens/confirm_alert.html:7
+msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
+#: templates/web/base/open311/index.html:92
+msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
+msgstr ""
+
+#: templates/web/base/front/footer-marketing.html:17
+msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:87
+msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
+msgstr "Hoffech chi dderbyn holiadur arall ymhen 4 wythnos, i'ch atgoffa i wirio'r statws?"
+
+#: templates/web/base/report/new/notes.html:7
+msgid "Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation."
+msgstr "Mae ysgrifennu eich holl neges mewn priflythrennau yn ei gwneud hi'n anodd i'w darllen, ac felly hefyd diffyg atalnodi."
+
+#: templates/web/base/report/new/fill_in_details_form.html:4
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:5
+msgid "Wrong location? Just click again on the map."
+msgstr "Lleoliad anghywir? Cliciwch ar y map eto."
+
+#: templates/web/base/admin/stats.html:10
+msgid "Year"
+msgstr "Blwyddyn"
+
+#: templates/web/base/admin/bodies.html:66
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
+#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
+#: templates/web/base/admin/category_edit.html:5
+#: templates/web/base/admin/flagged.html:47
+#: templates/web/base/admin/list_updates.html:32
+#: templates/web/base/admin/list_updates.html:34
+#: templates/web/base/admin/list_updates.html:35
+#: templates/web/base/admin/problem_row.html:20
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/update_edit.html:24
+#: templates/web/base/admin/users.html:31
+#: templates/web/base/questionnaire/creator_fixed.html:14
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
+msgid "Yes"
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:17
+#: templates/web/fixmystreet/report/update-form.html:91
+msgid "Yes I have a password"
+msgstr "Oes, mae gen i gyfrinair"
+
+#: templates/web/base/contact/index.html:39
+#: templates/web/fixmystreet/contact/index.html:54
+msgid "You are complaining that this problem report was unnecessarily moderated:"
+msgstr ""
+
+#: templates/web/base/contact/index.html:41
+#: templates/web/fixmystreet/contact/index.html:56
+msgid "You are reporting the following problem report for being abusive, containing personal information, or similar:"
+msgstr ""
+
+#: templates/web/base/contact/index.html:15
+#: templates/web/fixmystreet/contact/index.html:30
+msgid "You are reporting the following update for being abusive, containing personal information, or similar:"
+msgstr ""
+
+#: templates/web/zurich/tokens/confirm_problem.html:5
+#: templates/web/zurich/tokens/confirm_problem.html:8
+msgid "You can <a href=\"%s%s\">view the problem on this site</a>."
+msgstr "Gallwch <a href=\"%s%s\">weld y broblem ar y wefan hon</a>."
+
+#: templates/web/base/admin/user-form.html:48
+msgid "You can add an abusive user's email to the abuse list, which automatically hides (and never sends) reports they create."
+msgstr ""
+
+#: templates/web/fixmystreet/contact/index.html:121
+msgid "You can contact technical support on <a href='mailto:%s'>%s</a>"
+msgstr "Gallwch gysylltu â'n tîm cymorth technegol drwy <a href='mailto:%s'>%s</a>"
+
+#: templates/web/base/admin/flagged.html:5
+msgid ""
+"You can flag any report or user by editing them, and they will be listed on this page.\n"
+" For example, this can useful if you want to keep an eye on a user who has posted inappropriate\n"
+" reports in the past."
+msgstr ""
+
+#: templates/web/base/report/new/councils_text_none.html:10
+#: templates/web/base/report/new/councils_text_none.html:2
+#: templates/web/base/report/new/councils_text_some.html:19
+#: templates/web/base/report/new/councils_text_some.html:21
+msgid "You can help us by finding a contact email address for local problems for %s and emailing it to us at <a href='mailto:%s'>%s</a>."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:85
+msgid "You can mark a body as deleted if you do not want it to be active on the site."
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:36
+msgid "You declined; please fill in the box above"
+msgstr "Gwrthodoch chi; llenwch y blwch uchod"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:38
+msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:75
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+msgid "You have already attached a photo to this report, attaching another one will replace it."
+msgstr "Rydych wedi atodi llun i'r adroddiad hwn eisoes, byddai atodi un arall yn ei amnewid."
+
+#: templates/web/base/report/update-form.html:59
+#: templates/web/fixmystreet/report/update-form.html:56
+msgid "You have already attached a photo to this update, attaching another one will replace it."
+msgstr "Rydych wedi atodi llun i'r diweddariad hwn eisoes, byddai atodi un arall yn ei amnewid."
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
+#: templates/web/base/auth/sign_out.html:4
+#: templates/web/zurich/auth/sign_out.html:3
+msgid "You have been signed out"
+msgstr ""
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:13
+msgid "You have located the problem at the point marked with a green pin on the map. If this is not the correct location, simply click on the map again. "
+msgstr ""
+
+#: templates/web/zurich/tokens/confirm_problem.html:5
+#: templates/web/zurich/tokens/confirm_problem.html:6
+msgid "You have successfully confirmed your email address."
+msgstr ""
+
+#: templates/web/base/report/display.html:20
+#: templates/web/base/report/new/fill_in_details.html:37
+#: templates/web/fixmystreet/report/display.html:17
+msgid "You have successfully signed in; please check and confirm your details are accurate:"
+msgstr "Mewngofnodwyd yn llwyddiannus; gwiriwch a chadarnhewch fod eich manylion yn gywir:"
+
+#: templates/web/base/my/my.html:20
+msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
+msgstr ""
+
+#: templates/web/base/admin/index.html:19
+msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
+msgstr ""
+
+#: templates/web/base/admin/bodies.html:7
+msgid ""
+"You need to add bodies (such as councils or departments) so that you can then add\n"
+" the categories of problems they can handle (such as potholes or streetlights) and the\n"
+" contacts (such as an email address) to which reports are sent."
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:67
+msgid "You really want to resend?"
+msgstr "Ydych chi wir am ailanfon?"
+
+#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
+#: templates/web/base/my/my.html:4
+msgid "Your Reports"
+msgstr "Eich adroddiadau"
+
+#: templates/web/base/alert/_list.html:89
+#: templates/web/fixmystreet/alert/updates.html:19
+#: templates/web/fixmystreet/alert/updates.html:22
+#: templates/web/fixmystreet/contact/index.html:91
+#: templates/web/fixmystreet/report/display.html:62
+#: templates/web/fixmystreet/report/display.html:64
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
+#: templates/web/fixmystreet/report/update-form.html:76
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
+msgid "Your email"
+msgstr "Eich e-bost"
+
+#: templates/web/base/auth/general.html:28
+#: templates/web/fixmystreet/report/update-form.html:82
+#: templates/web/zurich/auth/general.html:30
+#: templates/web/zurich/auth/general.html:58
+msgid "Your email address"
+msgstr "Eich cyfeiriad e-bost"
+
+#: templates/web/base/report/new/fill_in_details_form.html:106
+#: templates/web/base/report/update-form.html:81
+msgid "Your email:"
+msgstr "Eich e-bost:"
+
+#: templates/web/fixmystreet/report/updates-sidebar-notes.html:7
+msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
+msgstr ""
+
+#: templates/web/base/auth/general.html:51
+#: templates/web/fixmystreet/contact/index.html:84
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
+#: templates/web/fixmystreet/report/update-form.html:142
+#: templates/web/zurich/auth/general.html:61
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
+msgid "Your name"
+msgstr "Eich enw"
+
+#: templates/web/base/contact/index.html:73
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
+msgid "Your name:"
+msgstr "Eich enw:"
+
+#: templates/web/base/auth/general.html:39
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
+#: templates/web/fixmystreet/report/update-form.html:96
+#: templates/web/zurich/auth/general.html:34
+msgid "Your password"
+msgstr "Eich cyfrinair"
+
+#: templates/web/base/auth/change_password.html:6
+msgid "Your password has been changed"
+msgstr "Newidiwyd eich cyfrinair"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
+msgid "Your phone number"
+msgstr "Eich rhif ffôn"
+
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
+msgid "Your reports"
+msgstr "Eich adroddiadau"
+
+#: templates/web/base/my/my.html:41
+msgid "Your updates"
+msgstr "Eich diweddariadau"
+
+#: templates/web/base/contact/index.html:81
+msgid "Your&nbsp;email:"
+msgstr "Eich&nbsp;e-bost:"
+
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Pob adroddiad"
+
+#: templates/web/base/admin/timeline.html:4
+msgid "by %s"
+msgstr "gan %s"
+
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Adroddiadau ar gau"
+
+#: templates/web/base/reports/body.html:6
+#: templates/web/base/reports/body.html:7
+msgid "council"
+msgstr "cyngor"
+
+#: templates/web/base/admin/report_edit.html:32
+msgid "didn't use map"
+msgstr ""
+
+#: templates/web/base/alert/index.html:33
+#: templates/web/base/around/postcode_form.html:15
+msgid "e.g. ‘%s’ or ‘%s’"
+msgstr "e.e. '%s' neu '%s'"
+
+#: templates/web/base/admin/body-form.html:188
+#: templates/web/base/admin/flagged.html:51
+msgid "edit user"
+msgstr ""
+
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Adroddiadau newydd"
+
+#: templates/web/base/admin/index.html:33
+#: templates/web/zurich/admin/index.html:5
+msgid "from %d different users"
+msgstr ""
+
+#: templates/web/base/report/_item.html:17
+#: templates/web/zurich/report/_item.html:16
+msgid "last updated %s"
+msgstr "diweddarwyd ddiwethaf %s"
+
+#: perllib/Utils.pm:204
+msgid "less than a minute"
+msgstr "llai na munud"
+
+#: templates/web/base/report/updates.html:57
+msgid "marked as a duplicate report"
+msgstr ""
+
+#: templates/web/base/report/updates.html:47
+msgid "marked as action scheduled"
+msgstr ""
+
+#: templates/web/base/report/updates.html:59
+msgid "marked as an internal referral"
+msgstr ""
+
+#: templates/web/base/report/updates.html:49
+msgid "marked as closed"
+msgstr ""
+
+#: templates/web/base/report/updates.html:28
+#: templates/web/base/report/updates.html:51
+msgid "marked as fixed"
+msgstr ""
+
+#: templates/web/base/report/updates.html:45
+msgid "marked as in progress"
+msgstr ""
+
+#: templates/web/base/report/updates.html:41
+msgid "marked as investigating"
+msgstr ""
+
+#: templates/web/base/report/updates.html:55
+msgid "marked as not the council's responsibility"
+msgstr ""
+
+#: templates/web/base/report/updates.html:43
+msgid "marked as planned"
+msgstr ""
+
+#: templates/web/base/report/updates.html:53
+msgid "marked as unable to fix"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
+#: templates/web/base/admin/questionnaire.html:15
+#: templates/web/base/admin/questionnaire.html:16
+msgid "n/a"
+msgstr "ddim yn berthnasol"
+
+#: templates/web/base/alert/_list.html:85
+msgid "or"
+msgstr "neu"
+
+#: templates/web/base/js/translation_strings.html:27
+msgid "or locate me automatically"
+msgstr "neu dewch o hyd i fi'n awtomatig"
+
+#: templates/web/base/admin/report_edit.html:28
+#: templates/web/base/admin/report_edit.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
+#: templates/web/zurich/admin/report_edit.html:50
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
+msgid "originally entered: &ldquo;%s&rdquo;"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:43
+msgid "other areas:"
+msgstr "ardaloedd eraill:"
+
+#: templates/web/base/report/updates.html:29
+#: templates/web/base/report/updates.html:39
+msgid "reopened"
+msgstr "ailagorwyd"
+
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
+msgid "sign out"
+msgstr "allgofnodi"
+
+#: templates/web/base/report/new/fill_in_details_form.html:12
+#: templates/web/base/report/new/fill_in_details_form.html:15
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+msgid "the local council"
+msgstr "y cyngor lleol"
+
+#: templates/web/base/report/_main.html:57
+#: templates/web/zurich/report/_main.html:5
+msgid "there is no pin shown as the user did not use the map"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
+msgid "this type of local problem"
+msgstr ""
+
+#: perllib/Utils.pm:176
+msgid "today"
+msgstr "heddiw"
+
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Adroddiadau newydd"
+
+#: templates/web/base/admin/report_edit.html:32
+msgid "used map"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:35
+msgid "user is from same council as problem - %d"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:38
+msgid "user is problem owner"
+msgstr ""
+
+#: templates/web/base/reports/body.html:0
+#: templates/web/base/reports/body.html:3
+msgid "ward"
+msgstr "ward"
+
+#: templates/web/base/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: perllib/Utils.pm:223
+#, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d awr"
+msgstr[1] "%d awr"
+msgstr[2] "%d o oriau"
+msgstr[3] "%d awr"
+
+#: templates/web/base/report/_support.html:6
+#, perl-format
+msgid "%d supporter"
+msgid_plural "%d supporters"
+msgstr[0] "%d cefnogwr"
+msgstr[1] "%d gefnogwr"
+msgstr[2] "%d o gefnogwyr"
+msgstr[3] "%d cefnogwr"
+
+#: perllib/Utils.pm:225
+#, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d funud"
+msgstr[1] "%d funud"
+msgstr[2] "%d o funudau"
+msgstr[3] "%d munud"
+
+#: templates/web/base/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: templates/web/emptyhomes/report/new/councils_text_none.html:3
+#, perl-format
+msgid "We do not yet have details for the council that covers this location."
+msgid_plural "We do not yet have details for the councils that cover this location."
+msgstr[0] "Nid oes gennym fanylion am y cyngor sy'n rheoli'r lleoliad hwn."
+msgstr[1] "Nid oes gennym fanylion am y cyngor sy'n rheoli'r lleoliad hwn."
+msgstr[2] "Nid oes gennym fanylion am y cyngor sy'n rheoli'r lleoliad hwn."
+msgstr[3] "Nid oes gennym fanylion am y cynghorau sy'n rheoli'r lleoliad hwn."
+
+#: perllib/Utils.pm:219
+#, perl-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d wythnos"
+msgstr[1] "%d wythnos"
+msgstr[2] "%d o wythnosau"
+msgstr[3] "%d wythnos"
+
+#: templates/web/base/front/stats.html:12
+#, perl-format
+msgid "<big>%s</big> report in past week"
+msgid_plural "<big>%s</big> reports in past week"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: templates/web/base/front/stats.html:23
+#, perl-format
+msgid "<big>%s</big> fixed in past month"
+msgid_plural "<big>%s</big> fixed in past month"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: perllib/Utils.pm:221
+#, perl-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d diwrnod"
+msgstr[1] "%d ddiwrnod"
+msgstr[2] "%d o ddiwrnodau"
+msgstr[3] "%d diwrnod"
+
+#: templates/web/base/report/new/councils_text_some.html:13
+#, perl-format
+msgid "We do <strong>not</strong> yet have details for the other council that covers this location."
+msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Peidiwch â phoeni, cadwn eich hysbysiad tra eich bod chi'n gwirio eich e-bost.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Peidiwch â phoeni; cadwn eich adroddiad tra eich bod chi'n gwirio eich e-bost.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Peidiwch â phoeni; cadwn eich diweddariad tra eich bod chi'n gwirio eich e-bost.)"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Nac oes</strong>, gadewch i fi fewngofnodi drwy e-bost:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Ydych chi'n <strong>ddatblygwr</strong>? Hoffech chi gyfrannu at FixMyStreet?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Problemau agosaf gerllaw <small>(o fewn&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Cysylltu â FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Oes gennych chi gyfrinair FixMyBarangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "Gweinyddwr FixMyStreet:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Os na, ni chaiff eich hysbysiad ei fywiogi."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Os na, ni chaiff eich problem ei phostio."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Os na, ni chaiff eich diweddariad ei bostio."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Adroddiadau lleol newydd ar reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Adroddiadau newydd i {{COUNCIL}} o fewn ward {{WARD}} ar reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Adroddiadau newydd ar reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Adroddiadau newydd ar reportemptyhomes.com gerllaw {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Adroddiadau newydd i {{COUNCIL}} ar reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Adroddiadau newydd o fewn ffiniau {{NAME}} ar reportemptyhomes.com"
+
+#~ msgid "No problems found."
+#~ msgstr "Ni chanfuwyd problemau."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Ni adroddwyd unrhyw broblemau eto."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Nawr i gyflwyno eich adroddiad&hellip; oes gennych chi gyfrinair FixMyStreet?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Nawr i gyflwyno eich diweddariad&hellip; oes gennych chi gyfrinair FixMyStreet?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Mae ein cod yn agored ac mae <a href=\"http://github.com/mysociety/fixmystreet\">ar gael ar GitHub</a>."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Cymerwch olwg ar y diweddariadau."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemau yn %s, FixMyStreet"
+
+#~ msgid "Publish the response"
+#~ msgstr "Cyhoeddi'r ymateb"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Adroddwyd %s, i %s"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Mewngofnodi drwy e-bost"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Mewngofnodwyd fel %s"
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Gellir gweld manylion eich problem yn y tab arall uchod."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Mae manylion eich problem ar gael i'w gweld ar ochr dde'r dudalen hon."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Yr adroddiadau lleol diweddaraf a adroddwyd gan ddefnyddwyr"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "I <strong>adrodd problem</strong>, cliciwch ar y lleoliad cywir ar y map."
+
+#~ msgid "User"
+#~ msgstr "Defnyddiwr"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Nawr mae'n rhaid i chi glicio ar y ddolen yn yr e-bost anfonon ni atoch chi."
+
+#~ msgid "Your email address:"
+#~ msgstr "Eich cyfeiriad e-bost:"
+
+#~ msgid "Your report"
+#~ msgstr "Eich adroddiad"
diff --git a/locale/da_DK.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/da_DK.UTF-8/LC_MESSAGES/FixMyStreet.po
index f2942d715..f124e1838 100644
--- a/locale/da_DK.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/da_DK.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -14,18 +14,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-25 21:04+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-08-04 21:51+0000\n"
"Last-Translator: Keld Simonsen <keld@rap.rap.dk>\n"
-"Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/fixmystreet/language/da_DK/)\n"
+"Language-Team: Danish (Denmark) (http://www.transifex.com/mysociety/fixmystreet/language/da_DK/)\n"
"Language: da_DK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " og "
@@ -38,11 +38,13 @@ msgstr " og "
msgid " or "
msgstr " eller "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d bekræftede varsler, %d ubekræftede"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d myndighedskontakter &ndash; %d bekræftet, %d ubekræftet"
@@ -51,11 +53,13 @@ msgstr "%d myndighedskontakter &ndash; %d bekræftet, %d ubekræftet"
msgid "%d edits by %s"
msgstr "%d redigeringer af %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d aktive opdateringer"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d spørgeskemaer sendt &ndash; %d besvaret (%s%%)"
@@ -68,15 +72,54 @@ msgstr "%d til %d af %d"
msgid "%s - Summary reports"
msgstr "%s - opsummeringsrapporter"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMinVej har forskellige RSS-strømme og e-postlister om lokale problemer, dette inkluderer problemer meldt indenfor en bestemt bydel eller myndighed, eller et område med problemer\n"
+"indenfor en angivet distance fra en bestemt position."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMinVej har forskellige RSS-strømme og e-postlister om lokale problemer, dette inkluderer problemer meldt indenfor en bestemt bydel eller myndighed, eller et område med problemer\n"
+"indenfor en angivet distance fra en bestemt position."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr "FixMinVej sender forskellige kategorier af problemer til forskellige myndigheder, problemer som gælder flere myndigheder bliver sendt til alle dem det angår."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s bydel, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, rapporteret %s"
@@ -88,59 +131,57 @@ msgstr "%s, indefor bydel %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> -bidragsydere"
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Tag det roligt; vi ser på dit varsel mens du tjekker din e-mail.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Tag det roligt &mdash; vi ser på din problemrapport mens du tjekker din email.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Tag det roligt &mdash; vi ser på din opdatering mens du tjekker din email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Epost i misbrugstabellen)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Dit navn"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Dit telefonnummer"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(en standardafstand som dækker en befolkning på omtrent 200.000)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(alternativt kan RSS-strømmen tilpasses, indenfor"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(lukket)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(løst)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(som graffite, affald, hul i vejen, eller ødelagt gadelys)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(ikke rapporteret til myndigheden)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(valgfrit)"
@@ -148,25 +189,24 @@ msgstr "(valgfrit)"
msgid "(public)"
msgstr "(offentlig)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(sendt til begge)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(vi viser aldrig din e-postadresse eller dit telefonnummer)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(vi viser aldrig din e-postadresse)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Vælg en kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Vælg en ejendomsstype --"
@@ -179,12 +219,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr "<code>MAPIT_URL</code> er sat, (<code>%s</code>) men ingen <code>MAPIT_TYPES</code>.<br>Dette er nok grunden til at \"dækket område\" er tom (nedenfor).<br>Måske skal du tilføje nogen <code>MAPIT_TYPES</code> i konfigurationsfilen?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Hvis du ikke kan se kortet, <a href='%s' rel='nofollow'>så spring dette trin over</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> aktive problemer"
@@ -197,28 +239,22 @@ msgstr "<strong>Nej</strong> Lad mig bekræfte min rapport med e-post"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Nej</strong> Lad mig bekræfte min opdatering med e-post"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Nej</strong>, lad mig logge ind med e-post:"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Nej</strong>, det gør jeg ikke. La mig logge ind med e-post:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nej</strong>, lad mig bekræfte min rapport med e-post:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nej</strong>, lad mig bekræfte min opdatering med e-post:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -229,8 +265,8 @@ msgstr "<strong>Ja</strong>, jeg har en adgangskode"
msgid "About us"
msgstr "Om os"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -252,7 +288,7 @@ msgstr "Tilføj en kontakt ved at bruge formularen nedenfor."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Tilføj myndighed"
@@ -265,10 +301,15 @@ msgstr "Tilføj ny kategori"
msgid "Add user"
msgstr "Tilføj bruger"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Tilføjede %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Afventer moderation"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Gentag:"
@@ -281,21 +322,25 @@ msgstr "Varsel %d oprettet for %s, type %s, parameter %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Varsel %d koblet fra (oprettet %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Send mig varsel ved fremtidige opdateringer"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Alle rapporter"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Alle rapporter"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alle rapporter"
@@ -318,8 +363,7 @@ msgstr "Al informationen du har lagt ind her vil blive sendt til"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "All informationen du har lagt ind her vil blive sendt til <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "En opdatering markerede dette problem som ordnet."
@@ -328,16 +372,12 @@ msgstr "En opdatering markerede dette problem som ordnet."
msgid "Anonymous"
msgstr "Anonym"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonym:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Er du en <strong>udvikler</strong>? Kunne du tænke dig at bidrage til FixMinVej?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Er du en udvikler?"
@@ -350,24 +390,27 @@ msgstr "Dækket område"
#: templates/web/base/admin/bodies.html:15
#: templates/web/base/admin/body.html:60
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
-msgstr ""
+msgstr "Da reproduktionsstedet og %s ikke stemmer, vil beskeden som er lavet her, blive sendt til problemrapportøren, og ikke til kontakten som er givet for beskedformålet."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Tildel til ekstern myndighed:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Flyt til en anden kategori:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Tildel til ekstern myndighed:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Tildelt underafdeling:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Tildelt %s"
@@ -388,12 +431,12 @@ msgstr "Afventer moderation"
msgid "Back"
msgstr "Tilbage"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Bandlys epostadresse"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Administrationer"
@@ -413,12 +456,16 @@ msgstr "Administration:"
msgid "By Date"
msgstr "PÃ¥ dato"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Hvis du ikke kan se kortet, <em>så overspring dette trin</em>."
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -429,27 +476,28 @@ msgstr "Hvis du ikke kan se kortet, <em>så overspring dette trin</em>."
msgid "Category"
msgstr "Kategori"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Løsningsrate fordelt på kategori for problemer > 4 uger gamle"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategori: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Skift adgangskode"
@@ -491,54 +539,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr "Vælg et <strong>kategorinavn</strong> som giver mening for indbyggerne (f.eks. \"Hul i vejen\", \"Gadebelysning\") men som også er nyttigt for myndigheden. Disse vil dukke op i rullegardinmenuen på rapportér-et-problem-siden."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Klik her eller indtast dato på formatet dd/mm/åååå"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klik i kortet for at rapportere et problem"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Lukket"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
-msgstr "(ikke rapporteret til myndigheden)"
-
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Fiksede rapporter"
+msgstr "Lukket af myndigheden"
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Lukket:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "De nærmeste problemer <small>(inden for&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Koordinater:"
@@ -546,22 +600,22 @@ msgstr "Koordinater:"
msgid "Cobrand"
msgstr "Mærkevaresamarbejde"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Mærkevaresamarbejdsdata:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Mærkevaresamarbejde:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Opsætning"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Opsæt endepunkt"
@@ -569,7 +623,7 @@ msgstr "Opsæt endepunkt"
msgid "Confirm"
msgstr "Bekræft"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Bekræft konto"
@@ -589,7 +643,7 @@ msgstr "Bekræftelse"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Bekræftet"
@@ -600,13 +654,18 @@ msgstr "Bekræftede rapporter mellem %s og %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Bekræftet:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontakt FixMinVej"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontakt os"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -621,8 +680,14 @@ msgstr "Kontakt os"
msgid "Contact the team"
msgstr "Kontakt projektgruppen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinater:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Kunne ikke finde bruger"
@@ -640,7 +705,7 @@ msgstr "Administration"
msgid "Council contacts for %s"
msgstr "Administrationskontakter for %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "myndighedsreference:&nbsp;%s"
@@ -655,7 +720,7 @@ msgstr "Administration:"
msgid "Count"
msgstr "Antal"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Lav en rapport"
@@ -664,17 +729,19 @@ msgstr "Lav en rapport"
msgid "Create category"
msgstr "Lav kategori"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Lav en rapport"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Oprettet"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Oprettet:"
@@ -684,10 +751,15 @@ msgid "Current state"
msgstr "Gældende tilstand"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "I øjeblikket er der ikke lavet nogen instanser."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -697,11 +769,16 @@ msgstr "Oversigt"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Behandlet af underafdeling inden 5 arbejdsdage"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Slettet"
@@ -719,9 +796,9 @@ msgstr "Detaljer"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detaljer:"
@@ -729,23 +806,27 @@ msgstr "Detaljer:"
msgid "Devolved"
msgstr "Delegeret"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "brugte ikke kort"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Arbejdsheste"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Har du en FixMyBarangay-adgangskode?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Har du en FixMinVej-adgangskode?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Véd ikke"
@@ -753,8 +834,8 @@ msgstr "Véd ikke"
msgid "Don't like forms?"
msgstr "Kan du ikke lide skemaer?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -776,7 +857,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Redigér"
@@ -787,7 +869,7 @@ msgstr "Redigér detaljer for myndighed"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -802,15 +884,15 @@ msgstr "Redigerer opdatering %d"
msgid "Editing user %d"
msgstr "Redigerer bruger %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Opdateret af"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -818,7 +900,7 @@ msgstr "Opdateret af"
msgid "Email"
msgstr "E-post"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Epost lagt til misbrugsliste"
@@ -834,7 +916,7 @@ msgstr "Epostvarsel laget"
msgid "Email alert deleted"
msgstr "Epostvarsel slettet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Epost allerede i misbrugslisten"
@@ -847,38 +929,36 @@ msgid "Email me updates"
msgstr "Send mig opdateringer"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-post:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "E-post: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Tom lejlighed"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Tomt hus eller bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Tomt kontor eller forretningsbygning"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Tom pub eller bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Tom offentlig bygning - skole, sygehus, etc."
@@ -913,7 +993,7 @@ msgstr "Slut-dato:"
msgid "Endpoint"
msgstr "Endepunkt"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Indtast et vejnavn i Z&uuml;rich"
@@ -926,10 +1006,8 @@ msgstr "Indtast et britisk postnummer i nærheden, eller vejnavn og sted"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Indtast postnummer i nærheden, eller vejnavn og sted"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Indtast et vejnavn og sted"
@@ -937,13 +1015,12 @@ msgstr "Indtast et vejnavn og sted"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Vælg et nærliggende gadenavn og område, postnummer eller distrikt i Delhi"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Indtast en ny adgangskode:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -954,7 +1031,6 @@ msgstr "Indtast en ny adgangskode"
msgid "Enter details of the problem"
msgstr "Indtast detaljer om problemet"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -964,6 +1040,10 @@ msgstr "Indtast detaljer om problemet"
msgid "Error"
msgstr "Fejl"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -975,14 +1055,22 @@ msgstr "Eksempler:"
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
-msgstr ""
+msgstr "Forklar hvad som er galt, nøjagtigt hvor det er og hvor længe det har været galt..."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "Eksternt link"
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
-msgstr ""
+msgstr "Eksternt link"
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Ekstra data:"
@@ -995,8 +1083,7 @@ msgstr "Kunne ikke sende besked"
msgid "Filter report list"
msgstr "Filtrér rapportliste"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Første gang"
@@ -1004,38 +1091,14 @@ msgstr "Første gang"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Fiks dette ved at vælge en <strong>area covered</strong> i <em> Edit body details</em>-skemaet nedenfor."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMinVej"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMinVej-administrator:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMinVej har forskellige RSS-strømme og e-postlister om lokale problemer, dette inkluderer problemer meldt indenfor en bestemt bydel eller myndighed, eller et område med problemer\n"
-"indenfor en angivet distance fra en bestemt position."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr "FixMinVej sender forskellige kategorier af problemer til forskellige myndigheder, problemer som gælder flere myndigheder bliver sendt til alle dem det angår."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1046,21 +1109,16 @@ msgstr "FixMinVej sender forskellige kategorier af problemer til forskellige myn
msgid "Fixed"
msgstr "Løst"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Løst - Administration"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Løst - Bruger"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Fiksede rapporter"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Løst:"
@@ -1070,11 +1128,11 @@ msgstr "Løst:"
msgid "Flag as deleted"
msgstr "Markér som slettet"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Markér bruger"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Markeret:"
@@ -1091,7 +1149,7 @@ msgstr "Markerede brugere er listet op på <a href='%s'>Markerede</a>-siden."
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Markerede brugere er ikke begrænset på noget måde. Dette er bare en liste med brugere som er blevet markeret for at give dem opmærksomhed."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Markeret:"
@@ -1110,9 +1168,22 @@ msgstr "For mere information, se <a href='http://fixmystreet.org/customising/fms
msgid "Forgotten your password?"
msgstr "Glemt din adgangskode?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Tildel til ekstern myndighed:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Tildel til ekstern myndighed:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Ofte spurgte spørgsmål"
@@ -1135,27 +1206,26 @@ msgstr "FÃ¥ opdateringer for problemer i denne %s"
msgid "Get updates of problems in this %s"
msgstr "FÃ¥ opdateringer for problemer i denne %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Giv mig en RSS-strøm"
#: templates/web/base/questionnaire/completed.html:14
msgid "Glad to hear it’s been fixed!"
-msgstr ""
+msgstr "Glad for at høre at det er i orden!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Søg"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Skal der sendes spørgeskema?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Graf over problemoprettelse fordelt på status over tid"
@@ -1163,41 +1233,37 @@ msgstr "Graf over problemoprettelse fordelt på status over tid"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Linjer med grå baggrund er myndigheder som ikke længere eksidsterer."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Er dette problem blevet løst?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Har du rapporteret et problem til en myndighed før, eller er dette første gang?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Hjælp"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Her er de forskellige typer lokale problemvarsler for &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hej, %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1211,7 +1277,7 @@ msgstr "Skjul gamle"
msgid "Hide pins"
msgstr "Skjul nåle"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historie"
@@ -1227,7 +1293,7 @@ msgstr "Hvordan rapporteres et problem"
msgid "How to send successful reports"
msgstr "Hvordan indsendes rapporter som er løst"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Jeg er bange for at du ikke kan bekræfte ubekræftede rapporter."
@@ -1254,8 +1320,8 @@ msgstr "Jeg er bange for at vi ikke kunne verificere denne reference. Hvis du ko
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1273,18 +1339,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr "Hvis to eller flere instanser er lokaliseret på samme sted, kombinerer FixMinVej identiske kategorier i en enkelt opføring i menuen. Kontrollér at du bruger samme kategorinavn for instanserne, hvis det er det du ønsker."
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Hvis du ikke gør dette, vil dit varsel ikke blive aktiveret"
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Hvis du ikke gør dette, vil din rapport ikke blive publiceret"
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Hvis du ikke gør dette, vil din opdatering ikke blive publiceret"
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr "Hvis du får mere information om status for dit problem, så vær sød at komme tilbage til netstedet og lav en opdatering."
@@ -1294,16 +1348,16 @@ msgstr "Hvis du får mere information om status for dit problem, så vær sød a
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Hvis du indsender et problem her, så vil emne og detaljer for problemet være offentlig, men problemet vil <strong>ikke</strong> blive rapportert til myndigheden."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Hvis du bruger web-baseret e-post eller har filtre for affalds-e-post på din e-postkonto, skal du i nogen tilfælde se efter vores beskeder der."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Hvis du ønsker at tilføje en offentlig kommentar på problemet, så tilføj den her\n"
"(denne bliver ikke sendt til myndigheden). Du kan for eksempel\n"
@@ -1343,7 +1397,7 @@ msgstr ""
"Hvis du har aktiveret Open311 update-sending ovenfor, skal du identificere hvilke FixMinVej <strong>bruger</ strong> som bliver krediteret for opdateringer \n"
"når de bliver vist på netstedet. Vis ID (nummer) for denne bruger."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Ugyldigt ID"
@@ -1368,14 +1422,13 @@ msgstr "I misbrugstabel?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "Yderligere bliver følgende attributter, som ikke er del af Open311 v2-specifikationen, returneret: agency_sent_datetime, title (også returneret som del af description), interface_used, comment_count, requestor_name (kun tilstede hvis indsender tillod at navnet kunne vises på dette netsted)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Under udførelse"
@@ -1383,7 +1436,7 @@ msgstr "Under udførelse"
msgid "Inbox zero, here we come!"
msgstr "Tom indboks, her kommer vi!"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Inkludér rapportørens personlige detaljer"
@@ -1395,12 +1448,12 @@ msgstr "Inkludér ubekræftede problemer"
msgid "Incorrect has_photo value \"%s\""
msgstr "Forkert has_photo-værdi \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Interne notater"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Intern reference"
@@ -1408,7 +1461,7 @@ msgstr "Intern reference"
msgid "Invalid agency_responsible value %s"
msgstr "Ugyldig agency_responsible-værdi %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Ugyldig slut-dato"
@@ -1416,12 +1469,12 @@ msgstr "Ugyldig slut-dato"
msgid "Invalid format %s specified."
msgstr "Ugyldigt format %s angivet."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Ugyldig startdato"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1437,12 +1490,21 @@ msgstr "Det er ofte hurtigst at <a href=\"%s\">tjekke vores FAQ</a> og se om sva
#: templates/web/base/tokens/confirm_problem.html:14
msgid "It’s on its way to the council right now."
+msgstr "Den er på vej til myndigheden lige nu."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
msgstr ""
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1454,7 +1516,7 @@ msgstr "Husk min indlogning på denne datamaskine"
msgid "Last editor"
msgstr "Sidst redigeret af"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Sidste opdatering:"
@@ -1487,9 +1549,9 @@ msgstr "Lokale RSS-strømme og e-postvarsler"
#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:12
#: templates/web/base/alert/list.html:14 templates/web/base/alert/list.html:3
msgid "Local RSS feeds and email alerts for ‘%s’"
-msgstr ""
+msgstr "Lokale RSS-strømme og e-postvarsler"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Lokale varsler"
@@ -1502,14 +1564,12 @@ msgid "MAP"
msgstr "KORT"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Kort"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "markeret som lukket"
+msgstr "Markér som afsendt"
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1517,16 +1577,26 @@ msgstr "Markér brugere hvis adfærd du ønsker at have tjek på som <strong>mar
#: templates/web/base/reports/index.html:24
msgid "Marked fixed/closed in the past eight weeks"
-msgstr ""
+msgstr "Markeret som løst/lukket indenfor de seneste otte uger"
#: templates/web/base/reports/index.html:25
msgid "Marked fixed/closed more than eight weeks ago"
-msgstr ""
+msgstr "Markeret som løst/lukket for mere end otte uger siden"
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Besked"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Tildel til ekstern myndighed:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Tildel til ekstern myndighed:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Besked:"
@@ -1554,27 +1624,25 @@ msgstr "Flere problemer i nærheden"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Navn"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Navn:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Navn: %s"
@@ -1587,12 +1655,12 @@ msgstr "Nærmeste navngivne vej til nålen placeret på kortet (automatisk gener
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Nærmeste postnummer for nålen placeret på kortet (automatisk genereret): %s (%sm væk)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Nærmeste vej for nålen placeret på kortet (automatisk genereret ved hjælp af Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1600,10 +1668,15 @@ msgstr ""
"Nærmeste vej for nålen placeret på kortet (automatisk genereret ved hjælp af Bing Maps) er: %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Nesten færdig! Nu skal du tjekke din e-post..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Nesten færdig! Nu skal du tjekke din e-post..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nye <br>problemer"
@@ -1612,12 +1685,12 @@ msgstr "Nye <br>problemer"
msgid "New body added"
msgstr "Ny myndighed tilføjet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Ny kategorikontakt tilføjet"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Nyt internt notat:"
@@ -1625,9 +1698,10 @@ msgstr "Nyt internt notat:"
msgid "New local problems on FixMyStreet"
msgstr "Nye lokale problemer på FixMinVej"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nye lokale rapporter på reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nyt internt notat:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1653,33 +1727,15 @@ msgstr "Nye rapporter indenfor grænsen for {{NAME}} på FixMinVej"
msgid "New reports"
msgstr "Nye rapporter"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nye rapporter for {{COUNCIL}} indenfor {{WARD}} bydel på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nye rapporter på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nye rapporter på reportemptyhomes.com nær postnummer {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nye rapporter til {{COUNCIL}} på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nye rapporter indenfor grænsen til {{NAME}} på reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Ny tilstand"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Ny opdatering:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Ny tilstand"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1692,14 +1748,12 @@ msgstr "Næste"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nej"
@@ -1727,20 +1781,11 @@ msgstr "Fandt ingen markerede problemer."
msgid "No flagged users found."
msgstr "Fant ingen markerede brugere."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Ikke flere opdateringer"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Ingen problemer blev fundet."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Ingen problemer er rapporteret"
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Ingen resultater returneret"
@@ -1761,8 +1806,6 @@ msgid "No supporters"
msgstr "Ingen supportere"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Ingen"
@@ -1779,8 +1822,8 @@ msgstr ""
"Afhængig af implementeringen kan ansatte brugere have adgang til dashbordet (sammendrag af \n"
"aktivitet for hele instansen), mulighed at skjule beskeder eller sætte status for specialrapporter."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1788,7 +1831,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Ikke ansvarlig"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Ikke ansvarlig"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Ikke for min underafdeling"
@@ -1801,7 +1852,7 @@ msgid "Not reported to council"
msgstr "Ikke rapporteret til myndigheden"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Bemærk"
@@ -1811,7 +1862,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Bemærk at når vi medtager ubekræftede rapporter så bruges datoen som rapporten var oprettet, hvilket ikke behøver være den samme måned som rapporten blev bekræftet, så tallene kan hoppe lidt op og ned."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Bemærk:"
@@ -1820,22 +1871,20 @@ msgstr "Bemærk:"
msgid "Note: <strong>%s</strong>"
msgstr "Note: <strong>%d</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "PÃ¥ tide at sende din rapport&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "PÃ¥ tide at sende din rapport&hellip; har du en FixMinVej-adgangskode?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "PÃ¥ tide at registrere din opdatering&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "PÃ¥ tide at registrere din opdatering&hellip; har du en FixMinVej-adgangskode?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1865,35 +1914,28 @@ msgstr "Ældre <br>problemer"
msgid "One-line summary"
msgstr "Enlinjers opsummering"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Ã…ben"
#: templates/web/base/reports/index.html:22
msgid "Open for more than four weeks, with an update within the past eight weeks"
-msgstr ""
-
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Ã…bne rapporter"
+msgstr "Ã…ben i mere end fire uger, med en opdatering inden for de seneste otte uger"
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
-msgstr ""
+msgstr "Ã…ben, men uden nogen opdatering i otte uger"
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
@@ -1907,32 +1949,26 @@ msgstr "Open311-initiativets netside"
msgid "Open311 specification"
msgstr "Open311-specifikation"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Eller problemer meldt til:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Eller du kan abonnere på varsel baseret på bydel eller myndighed du hører ind under:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Andet"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Vores kildekode er frit programmel og <a href=\"http://github.com/mysociety/fixmystreet\">tilgængelig på GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Ejer"
@@ -1947,12 +1983,12 @@ msgstr "Fandt ikke siden"
msgid "Parent"
msgstr "Forælder"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Delvis"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1961,6 +1997,7 @@ msgid "Password (optional)"
msgstr "Adgangskode (valgfrit)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Adgangskode:"
@@ -1968,7 +2005,7 @@ msgstr "Adgangskode:"
msgid "Permalink"
msgstr "Permalink"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Telefonnummer"
@@ -1977,11 +2014,9 @@ msgstr "Telefonnummer"
msgid "Phone number (optional)"
msgstr "Telefonnummer (valgfrit)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefon:"
@@ -1992,14 +2027,23 @@ msgstr "Telefon:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Billed"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Denne information er påkrævet"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Denne information er påkrævet"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Billed:"
@@ -2011,22 +2055,18 @@ msgstr "Billeder af nye problemer i nærheden"
msgid "Place pin on map"
msgstr "Placér tegnestiften på kortet"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planlagt"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Venligst <a class=\"tab_link\" href=\"#report\">gennemse</a> opdateringene som er blevet lagt ind."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Vær høflig, præcis og kortfattet."
@@ -2036,22 +2076,20 @@ msgstr "Vær høflig, præcis og kortfattet."
msgid "Please check the passwords and try again"
msgstr "Venligst kontrollér adgangskoderne og prøv igen"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Venligst kontrollér e-posten du angav"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Venligst kontrollér at du har skrevet en gyldig e-postadresse"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2061,15 +2099,16 @@ msgstr "Vælg en kategori"
msgid "Please choose a property type"
msgstr "Vælg en type egenskab"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Husk at rette op på fejlene nedenfor."
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"Venligst <strong>ikke</strong> rapportér fejl via denne side; beskederne går til\n"
@@ -2081,7 +2120,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Vær ikke ufin &mdash; at skælde ud på din myndighed skader værdien af tjenesten for alle brugerne."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Venligst indlæg en besked"
@@ -2092,15 +2131,15 @@ msgstr "Venligst indlæg en besked"
msgid "Please enter a password"
msgstr "Indtast en adgangskode"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Venligst angiv et emne"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2108,7 +2147,7 @@ msgid "Please enter a valid email"
msgstr "Tilføj en gyldig e-post"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Angiv din e-post"
@@ -2117,21 +2156,19 @@ msgstr "Angiv din e-post"
msgid "Please enter some details"
msgstr "Angiv oplysninger om problemet"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Angiv din e-post"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Venligst angiv din e-postadresse"
@@ -2142,10 +2179,10 @@ msgstr "Venligst angiv dit fornavn"
#: perllib/FixMyStreet/Cobrand/UK.pm:318
#: templates/web/base/js/translation_strings.html:7
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
-msgstr ""
+msgstr "Venligst angiv dit fulde navn, myndigheder som modtager dit problem har brug for dette - hvis du ikke ønsker at dit navn skal vises, så fjern hakket nedenfor"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2186,7 +2223,7 @@ msgstr ""
"Venligst udfyld skemaet nedenfor med detaljerne om problemet,\n"
"og beskriv placeringen så nøjagtigt som muligt i boksen for detaljer."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Venligst indikér om du ønsker at modtage et nyt spørgeskema"
@@ -2209,19 +2246,24 @@ msgstr "Bemærk at din rapport <strong>endnu ikke er sendt</strong. Vælg en ka
msgid "Please note:"
msgstr "Venligst bemærk:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Venligst bidrag med en forklaring på hvorfor du genåbner denne problemrapport"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Venligst bidrag med lidt tekst i tillæg til et billede"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Venligst oplys om du har rapporteret et problem til din myndighed tidligere"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Vælg en myndighed"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Vælg den kilde du ønsker"
@@ -2230,21 +2272,17 @@ msgstr "Vælg den kilde du ønsker"
msgid "Please select the type of alert you want"
msgstr "Venligst vælg hvilken type varsel du ønsker"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Venligs angiv om dette problem er blevet fikset eller ikke"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Venligst gennemse opdateringerne som er blevet lagt ind."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Venligst læg kun JPEG-bilder op"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Indtast en besked"
@@ -2253,8 +2291,8 @@ msgid "Please write your update here"
msgstr "Indtast venligst din opdatering her"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2275,22 +2313,36 @@ msgstr "Sendt ind af %s (<strong>%s</strong>) %s"
msgid "Posted by %s at %s"
msgstr "Sendt ind af %s %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Forrige"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Personliv"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privat"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problem"
@@ -2306,12 +2358,12 @@ msgstr "Problem %s bekræftet"
msgid "Problem %s sent to council %s"
msgstr "Problem %s sendt til myndighed %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Tilstandsfordeling af problemer"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problem markeret som åbent."
@@ -2327,12 +2379,10 @@ msgstr "Problemer"
msgid "Problems in this area"
msgstr "Problemer i dette område"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemer i nærheden"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemer på kortet"
@@ -2341,12 +2391,11 @@ msgstr "Problemer på kortet"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problemer nyligt rapporteret fikset på FixMinVej"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemer indenfor %.1fkm fra denne positionen"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2358,20 +2407,17 @@ msgstr "Problemer indenfor %s"
msgid "Problems within %s ward"
msgstr "Problemer indenfor %s bydel"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemer indenfor %s, Fiksgatami"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemer indenfor %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemer indenfor grænserne af:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Ejendomme nyligt rapporteret som gået tilbage i brug på reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Ejendomsadresse:"
@@ -2385,39 +2431,31 @@ msgstr "Type egenskab:"
msgid "Provide an update"
msgstr "Bidrag med en opdatering"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Det er valgfrit at angive navn og adgangskode, men hvis du gør det kan du nemmere rapportere problemer, lave opdateringer og håndtere dine rapporter."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Det er valgfrit at angive en adgangskode, men hvis du gør det vil det blive nemmere for dig at rapportere problemer, lave opdateringer og håndtere dine rapporter"
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Offentlig respons:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publicér billede"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publicér svar"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Spørgeskema"
@@ -2433,12 +2471,11 @@ msgstr "Spørgeskema %d sendt for problem %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Spørgeskema udfyldt af fejlrapportøren"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2464,8 +2501,7 @@ msgstr "RSS-strøm fra %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS-strøm af %s, indenfor %s bydel"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS-strøm med problemer i nærheden"
@@ -2473,7 +2509,7 @@ msgstr "RSS-strøm med problemer i nærheden"
msgid "RSS feed of problems in this %s"
msgstr "RSS-strøm for problemer i denne %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2503,17 +2539,18 @@ msgstr "RSS-strøm med opdateringer for dette problem"
msgid "Receive email when updates are left on this problem."
msgstr "Modtag e-post når der er opdateringer på dette problem"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Nylige lokale problemer, FixMinVej."
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Nyligt løste <br>problemer"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Nyligt meldte problemer"
@@ -2521,23 +2558,28 @@ msgstr "Nyligt meldte problemer"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Husk at FixMinVej primært er lavet for at rapportere fysiske problemer som kan blive fikset. Hvis dit problem ikke er egnet til at sende ind via denne tjeneste, så husk at du kan kontakte myndigheden direkte via deres egen netside."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Fjern markering"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Fjern billede (kan ikke fortrydes!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "redigér bruger"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr "Rapport"
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Rapportér et problem"
@@ -2546,7 +2588,7 @@ msgstr "Rapportér et problem"
msgid "Report abuse"
msgstr "Rapportér misbrug"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Rapport på %s"
@@ -2555,83 +2597,82 @@ msgstr "Rapport på %s"
msgid "Report your problem"
msgstr "Rapportér dit problem"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Rapportér, find eller diskutér lokale problemer"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Rapporteret %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Rapporteret %s, til %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Rapporteret anonymt %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Rapporteret tidligere"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Publiceret af %s %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Rapporteret %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Rapporteret i kategorien %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Rapporteret i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Rapporteret i kategorien %s af %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Publiceret af %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Rapporteret af %s af %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Rapporteret af %s i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Rapporteret af %s i kategorien %s af %s %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Rapporteret i kategorien %s"
+msgstr "Rapporteret inden for de seneste fire uger"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Rapporteret %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Rapporterer et problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Rapporter"
@@ -2644,18 +2685,21 @@ msgstr "Rapporterne begrænses til %s tegn. Rapporten skal forkortes."
msgid "Reports awaiting approval"
msgstr "Rapporter som venter på godkendelse"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Problemer på og omkring kortet"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Publicerede rapporter"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Send rapport igen"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Rigtig sted?"
@@ -2670,26 +2714,32 @@ msgstr "Vejoperatør for denne navngivne vej (udledt af vejens referencenummer o
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Vejoperatør for denne navngivne vej (fra OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Rotér til venstre"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Rotér til højre"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "Satelit"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Gem ændringer"
@@ -2702,7 +2752,7 @@ msgstr "Søg i rapporter"
msgid "Search Users"
msgstr "Søg i brugere"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Søg i rapporter"
@@ -2734,20 +2784,25 @@ msgstr "Vælg en bestemt myndighed for at se problemer som er sendt derhen."
msgid "Select an area"
msgstr "Vælg et område"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Vælg hvilken type varsel du ønsker og klik på knappen for en RSS-kilde, eller indtast din e-postadresse for at abonnere på et e-postvarsel."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Ã…bne rapporter"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Sendt til %s %s senere"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Sendt:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Tjeneste:"
@@ -2756,8 +2811,8 @@ msgstr "Tjeneste:"
msgid "Share"
msgstr "Del"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2773,34 +2828,23 @@ msgid "Show pins"
msgstr "Vis nåle"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Log ind"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Log ind via epost"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Log ind eller opret en konto"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Log ud"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Logget ind som %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Nogen kategorier kræver måske mere information"
@@ -2819,8 +2863,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Nogen billeder af nylig meldte problemer"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Noget tekst at oversætte"
@@ -2828,24 +2873,32 @@ msgstr "Noget tekst at oversætte"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Beklager det ser ud til at være et \"Crown dependency\"-postnummer, som vi ikke dækker."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Beklager, men der opstod et problem når vi forsøgte at bekræfte din problemrapport"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Beklager, men vi kunne ikke finde dette sted."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Beklager, men vi kunne ikke tolke den position. Prøv venligst igen."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Beklager, men vi kunne ikke tolke den position. Prøv venligst igen."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Start-dato:"
@@ -2861,16 +2914,17 @@ msgstr "Tilstand"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Tilstand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistik"
@@ -2884,7 +2938,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr "Fortsat åben via spørgeskema, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Underkategori: %s"
@@ -2899,45 +2958,42 @@ msgstr "Emne"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Emne:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Send ind"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Indsend ændringer"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Indsend spørgeskema"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Sendt ind"
@@ -2948,18 +3004,19 @@ msgstr "Sendt ind"
msgid "Subscribe"
msgstr "Abonnér"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Jeg ønsker at abonnere på e-postvarsel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Opsummering"
@@ -2970,7 +3027,7 @@ msgstr "Opsummering"
msgid "Summary reports"
msgstr "Opsummeringsrapporter"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Spørgeundersøgelse"
@@ -2978,9 +3035,18 @@ msgstr "Spørgeundersøgelse"
msgid "Survey Results"
msgstr "Resultater fra spørgeundersøgelsen"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Opdateringer"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Tekst"
@@ -2989,6 +3055,7 @@ msgid "Text only version"
msgstr "Tekst-version"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Tekst:"
@@ -3010,7 +3077,7 @@ msgstr "Tak for at du opdaterede dette problem!"
msgid "Thank you for your feedback"
msgstr "Tak for din tilbagemelding"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Tak for at du har lagt dit billede op. Vi skal nu placere dit problem, så vær sød at indtaste navnet på en vej eller et postnummer i området i boksen ovenfor&nbsp;:"
@@ -3018,7 +3085,7 @@ msgstr "Tak for at du har lagt dit billede op. Vi skal nu placere dit problem,
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Tak, glad for at høre at problemet er fikset! Vi vil gjerne spørge dig om du har rapporteret et problem til en myndighed tidligere?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Billedet ser ikke ud til at være blevet lagt op rigtigt (%s), prøv igen."
@@ -3036,20 +3103,19 @@ msgstr "Det sted virker ikke til at være i Storbritannien. Venligst prøv igen.
msgid "That postcode was not recognised, sorry."
msgstr "Det postnummer blev ikke genkendt, beklager."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Det problem vil nu blive sendt igen."
+msgstr "Det problem er blevet markeret som sendt."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Det problem vil nu blive sendt igen."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Denne rapport kan ikke vises på %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Den rapport er blevet fjernet fra FixMinVej."
@@ -3101,10 +3167,6 @@ msgstr ""
"Administrationens <strong>navn</strong> identificerer instansen (for eksempel, <em>Borsetshire District Council</em>)\n"
"og kan blive vist udadtil."
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Bekræftelses-e-posten <strong>kan</strong> tage nogen få minutter før den kommer frem &mdash; så vær tålmodig."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
@@ -3114,21 +3176,13 @@ msgstr ""
" væg), hvad det er, hvor længe det har været der, en beskrivelse (og et billede af\n"
" problemet hvis du har et), osv."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Detaljerne om dit problem er tilgængelige under den anden fane ovenfor."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Detaljerne om dit problem er tilgængelig på højre kant af denne side."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "The diligency prize league tabellen viser redaktørernes aktivitet, (hvem som har redigeret flest)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Fejlen var: %s"
@@ -3146,10 +3200,6 @@ msgstr "Følgende information om nærmeste vej kan være unøjagtigt eller irrel
msgid "The latest local problems reported by users"
msgstr "De sidste lokale problemer rapporteret af brugere"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "De sidste lokale rapporter rapporteret af brugere"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "De sidste problemer for {{COUNCIL}} rapporteret af brugere"
@@ -3170,21 +3220,9 @@ msgstr "De sidste problemer som er rapporteret fikset af brugere"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "De sidste problemer indenfor grænsen til {{NAME}} rapporteret af brugere"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "De sidste ejendomme rapporteret tilbage i brug af brugere"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "De sidste rapporter for {{COUNCIL}} rapporteret af brugere"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "De sidste rapporter for {{COUNCIL}} indenfor {{WARD}} bydel rapporteret af brugere"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "De sidste rapporter indenfor grænsen til {{NAME}} rapporteret af brugere"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3200,8 +3238,7 @@ msgstr "Adgangskoderne er ikke ens"
msgid "The requested URL '%s' was not found on this server"
msgstr "Den forespurgte URL '%s' blev ikke fundet på denne server"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Den simpleste besked er vores geografiske:"
@@ -3212,7 +3249,7 @@ msgstr "Den simpleste besked er vores geografiske:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "Opsummeringen og beskrivelsen vil også blive offentliggjort (se vores <a href=\"/privacy\">personvernregler</a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Brugeren kunne ikke placere problemet på et kort, men kontrollér området omkring stedet de angav"
@@ -3225,23 +3262,24 @@ msgstr ""
"Brugerens <strong>navn</strong> vises offentligt på rapporter som ikke er markeret med <em>anonymt</em>.\n"
"Navne er ikke nødvendigvis unikke."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr "Der er ingen rapporter at vise."
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Der var problemer med at vise 'Alle rapporter'-siden. Venligst prøv igen senere."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Der var problemer med at vise denne side. Venligst prøv igen senere."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Der var problemer med din e-post/adgangskode-kombination. Hvis du har glemt din adgangskode, eller hvis du ikke har en, så udfyld venligst 'Log ind via e-post'-delen af skemaet"
@@ -3254,7 +3292,7 @@ msgstr "Der var problemer med din epost/adgangskode-kombination. Vær sød at f
msgid "There was a problem with your update. Please try again."
msgstr "Der var problemer med din opdatering. Vær sød at forsøge igen."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Der var problemer med din rapport. Venligst se nedenfor."
@@ -3303,16 +3341,16 @@ msgstr ""
"Denne instans får kun rapporter for problemer som er lokaliseret i <strong>area covered</strong>.\n"
"En instans vil ikke få nogen beskeder hvis det ikke dækker mindst ét område."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Denne e-post er blevet sendt til begge myndigheder som dækker stedet for problemet, da brugeren ikke kategoriserede det. Vær sød at ignorere den hvis I ikke er korrekt myndighed for at håndtere denne sag, eller give os besked om hvilken kategori af problemer dette er, så vi kan tilføje det i vores system."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Denne e-post er blevet sendt til flere myndigheder som dækker stedet for problemet, da den valgte kategori er tilgængelig for disse. Vær sød at ignorere e-posten hvis I ikke er korrekt myndighed for at håndtere denne sag."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3326,7 +3364,7 @@ msgstr "Dette er et udviklernetsted.Ting kan gå i stykker når som helst og dat
msgid "This is a summary of all reports on this site."
msgstr "Dette er en oplistning af alle problemerne i denne tjeneste."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "Dette kan være fordi lænken er for gammel eller allerede brugt, eller at lænken ikke blev kopieret rigtigt."
@@ -3353,55 +3391,69 @@ msgstr "Dette problemet er under udførelse"
msgid "This problem is old and of unknown status."
msgstr "Dette problem er gammelt og med ukendt status."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Denne rapport afventer moderation"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Denne rapport er for tiden markeret som lukket."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Denne rapport er for tiden markeret som fikset."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Denne rapport er for tiden markeret som åben."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Denne rapport blev rapporteret anonymt"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Denne netside indeholder også et billede af problemet, sendt ind af brugeren."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Tidslinje"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titel"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "For at <strong>rapportere et problem</strong>, så klik på rette sted på kortet."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Du finder lokale problemer ved at søge på dit postnummer, vejnavn eller sted"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Du finder lokale problemer ved at søge på dit postnummer, vejnavn eller sted"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "For at se et kort med en mere præsis placering for dette problem."
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3417,8 +3469,8 @@ msgstr "Prøv igen"
msgid "Try emailing us directly:"
msgstr "Forsøg at sende epost direkte til os:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3426,11 +3478,11 @@ msgstr "Forsøg at sende epost direkte til os:"
msgid "Unable to fix"
msgstr "Kan ikke fikses"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Ubekræftet"
@@ -3447,7 +3499,9 @@ msgstr "Ukendt varsel-type"
msgid "Unknown error"
msgstr "Ukendt fejl"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Ukendt problem-Id"
@@ -3470,11 +3524,11 @@ msgid "Update below added by %s at %s"
msgstr "Opdateringen nedenfor tilføjet af %s %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Opdatér myndighed"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Tilstandsfordeling for opdateringer"
@@ -3509,24 +3563,24 @@ msgstr "Opdatering:"
msgid "Updated"
msgstr "Opdateret"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Opdateret!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Opdateringer"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "Opdateringer er begrænset til %s tegn i længde. Venligst skriv en kortere tekst."
@@ -3534,27 +3588,30 @@ msgstr "Opdateringer er begrænset til %s tegn i længde. Venligst skriv en kort
msgid "Updates on {{title}}"
msgstr "Opdateringer af {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Opdateringer for dette problem, FixMinVej"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "Brug <strong>notater</strong> for at notere detaljer som skal vises i admin-grænsefladen. Notater vises ikke offentligt og bliver ikke sendt til myndigheden."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Bruger"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "brugte kort"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Brugermarkering fjernet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Bruger markeret"
@@ -3562,23 +3619,23 @@ msgstr "Bruger markeret"
msgid "User search finds matches in users' names and email addresses."
msgstr "Brugersøgning finder træf på brugernavne og epostadresser. "
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Brugere"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Værdier opdateret"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Se rapport på netstedet"
@@ -3602,16 +3659,15 @@ msgid "Wards of this council"
msgstr "Bydele indenfor denne myndighed"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Vi fandt mere en et træf for dette sted. Vi viser op til ti træf, så forsøg en anden søgning hvis dit sted ikke er her."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Vi har ikke kunnet bekræfte din konto - beklager."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Vi har sendt dig en epost som indeholder link for at bekræfte din konto."
@@ -3625,7 +3681,7 @@ msgstr "Vi viser aldrig din e-postadresse"
msgid "We never show your email address or phone number."
msgstr "Vi viser aldrig din e-postadresse eller dit telefonnummer"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Vi indser at %s kan være ansvarlig for dette problem, men vi mangler for tiden kontaktinformation for dem. Hvis du kender en egnet kontaktadresse, så tag kontakt med os."
@@ -3640,7 +3696,7 @@ msgstr "Vi vil kun bruge personlig information om dig i henhold til vore <a href
#: templates/web/base/questionnaire/completed-open.html:2
msgid "We&rsquo;re sorry to hear the problem’s not fixed. Why not try writing to your local representatives?"
-msgstr ""
+msgstr "Vi er kede af at høre at problemet ikke er løst. Hvad med at forsøge at skrive til dine lokale repræsentanter?"
#: templates/web/base/contact/blurb.html:8
msgid "We'd love to hear what you think about this site. Just fill in the form, or send an email to <a href='mailto:%s'>%s</a>:"
@@ -3648,13 +3704,17 @@ msgstr "Vi ønsker at få din tilbagemelding om hvad du mener om denne tjeneste.
#: templates/web/base/contact/submit.html:7
msgid "We’ll get back to you as soon as we can."
+msgstr "Vi tager kontakt med dig så snart vi kan."
+
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
-msgstr ""
+msgstr "Hvad er problemet og hvor er det?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Hvornår redigeret"
@@ -3663,7 +3723,7 @@ msgstr "Hvornår redigeret"
msgid "When sent"
msgstr "Hvornår sendt"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Hel blok med tomme lejligheder"
@@ -3671,16 +3731,22 @@ msgstr "Hel blok med tomme lejligheder"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr "Hvorfor stoppe der? <a href=\"/alert\">Sæt flere varsler</a> op gratis."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Når du søger efter forespørgsler, så er det også muligt at søge efter agency_responsible for at begrænse det til forespørgsler som er sendt til en enkelt admindstration. Søgtetermen er administrations-IDen som angivet af <a href=\"%s\">MaPit</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "Kunne du tænke dig at bidrage til FixMinVej? Vores kKildekoden er frit programmel og <a href=\"http://fixmystreet.org\">tilgængelig via fixmystreet.org</a>."
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Kunne du tænke dig at modtage en ny forespørgsel om 4 uger, som minder dig om at tjekke status?"
@@ -3706,15 +3772,13 @@ msgstr "Ã…r"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ja"
@@ -3779,11 +3843,9 @@ msgstr "Du afviste; venligst udfyld boksen ovenfor"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Du har allerede besvaret dette spørgeskema. Hvis du har spørgsmål, venligst <a href='%s'>tag kontakt</a>, eller <a href='%s'>se på dit problem</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Du har allerede vedlagt et billede til dette problem. At vedlægge et andet vil erstatte dette."
@@ -3792,6 +3854,10 @@ msgstr "Du har allerede vedlagt et billede til dette problem. At vedlægge et an
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Du har allerede vedlagt et billede til denne opdatering. At vedlægge et andet vil erstatte dette."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3812,15 +3878,11 @@ msgstr "Du har nu lykkes med at bekræfte din e-postadresse."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Du har lykkes med at logge ind. Venligst kontrollér og bekræft at dine detaljer er korrekte:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Du har ikke lavet en rapport endnu. <a href=\"%s\">Rapportér et problem nu.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Du skal nu åbne lænken i e-posten vi netop har sendt dig."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Du skal <a href=\"%s\">add some bodies</a> (som kommuner eller afdelinger) før rapporten kan blive sendt. "
@@ -3833,18 +3895,16 @@ msgstr ""
"Du skal tilføje instanser (for eksempel kommuner eller afdelinger), så du derefter kan tilføje \n"
"grupper af problemer de kan håndtere (som hul i gader og veje, eller gadelys) og kontakter (som en e-postadresse) som beskeder kan sendes til."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Ønsker du virkelig at sende igen?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Dine rapporter"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3853,22 +3913,17 @@ msgstr "Dine rapporter"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Din e-post"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Din e-postadresse"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Din e-postadresse:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3878,24 +3933,23 @@ msgstr "Din e-post"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Vi vil kun bruge personlig information om dig i henhold til vores <a href=\"/faq#privacy\">privatlivsregler.</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Dit navn"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Dit navn:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3908,19 +3962,15 @@ msgstr "Din adgangskode er blevet ændret"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Dit telefonnummer"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Dine rapporter"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Dine opdateringer"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Dine opdateringer"
@@ -3928,42 +3978,55 @@ msgstr "Dine opdateringer"
msgid "Your&nbsp;email:"
msgstr "Din&nbsp;e-post:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Alle rapporter"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "af %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Fiksede rapporter"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "myndighed (fx kommune)"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "brugte ikke kort"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
-msgstr ""
+msgstr "for eksempel '%s' eller '%s'"
#: templates/web/base/admin/body-form.html:188
#: templates/web/base/admin/flagged.html:51
msgid "edit user"
msgstr "redigér bruger"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Fiksede rapporter"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "fra %d forskellige brugere"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "sidst opdateret %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "mindre end et minut"
@@ -4008,14 +4071,13 @@ msgstr "markeret som planlagt"
msgid "marked as unable to fix"
msgstr "markeret som uløseligt"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/a"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "eller"
@@ -4025,16 +4087,16 @@ msgstr "eller find min position automatisk"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "oprinnelig lagt ind: &ldquo;%s&rdquo;"
@@ -4047,8 +4109,8 @@ msgstr "andre områder:"
msgid "reopened"
msgstr "Ã¥bnet igen"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "log ud"
@@ -4064,17 +4126,20 @@ msgstr "den lokale myndighed"
msgid "there is no pin shown as the user did not use the map"
msgstr "Der vises ingen nål på grund af at brugeren ikke brugte kortet"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "denne type lokalt problem"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "idag"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Fiksede rapporter"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "brugte kort"
@@ -4098,7 +4163,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> rapporteret<br>for nyligt"
msgstr[1] "<big>%s</big> rapporteret<br>for nyligt"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4112,7 +4177,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d supporter"
msgstr[1] "%d supportere"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4133,7 +4198,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Vi har endnu ikke detaljer for myndigheden som dækker dette sted."
msgstr[1] "Vi har endnu ikke detaljer for myndighederne som dækker dette sted."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4154,7 +4219,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> fikset sidste måned"
msgstr[1] "<big>%s</big> fikset sidste måned"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4168,5 +4233,143 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Vi har endnu <strong>ikke</strong> detaljerne for den anden myndighed som dækker dette sted."
msgstr[1] "Vi har endnu <strong>ikke</strong> detaljerne for de andre myndigheder som dækker dette sted."
-#~ msgid "For council(s):"
-#~ msgstr "For myndighederne:"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Tag det roligt; vi ser på dit varsel mens du tjekker din e-mail.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Tag det roligt &mdash; vi ser på din problemrapport mens du tjekker din email.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Tag det roligt &mdash; vi ser på din opdatering mens du tjekker din email.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Hvis du ikke kan se kortet, <a href='%s' rel='nofollow'>så spring dette trin over</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Nej</strong>, det gør jeg ikke. La mig logge ind med e-post:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Er du en <strong>udvikler</strong>? Kunne du tænke dig at bidrage til FixMinVej?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "De nærmeste problemer <small>(inden for&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontakt FixMinVej"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Har du en FixMyBarangay-adgangskode?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMinVej-administrator:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Hvis du ikke gør dette, vil dit varsel ikke blive aktiveret"
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Hvis du ikke gør dette, vil din rapport ikke blive publiceret"
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Hvis du ikke gør dette, vil din opdatering ikke blive publiceret"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nye lokale rapporter på reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nye rapporter for {{COUNCIL}} indenfor {{WARD}} bydel på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nye rapporter på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nye rapporter på reportemptyhomes.com nær postnummer {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nye rapporter til {{COUNCIL}} på reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nye rapporter indenfor grænsen til {{NAME}} på reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Ny opdatering:"
+
+#~ msgid "No problems found."
+#~ msgstr "Ingen problemer blev fundet."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Ingen problemer er rapporteret"
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "PÃ¥ tide at sende din rapport&hellip; har du en FixMinVej-adgangskode?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "PÃ¥ tide at registrere din opdatering&hellip; har du en FixMinVej-adgangskode?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Vores kildekode er frit programmel og <a href=\"http://github.com/mysociety/fixmystreet\">tilgængelig på GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Venligst <a class=\"tab_link\" href=\"#report\">gennemse</a> opdateringene som er blevet lagt ind."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Venligst gennemse opdateringerne som er blevet lagt ind."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemer indenfor %s, Fiksgatami"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Ejendomme nyligt rapporteret som gået tilbage i brug på reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publicér svar"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Rapporteret %s, til %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Problemer på og omkring kortet"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Log ind via epost"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Logget ind som %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "Bekræftelses-e-posten <strong>kan</strong> tage nogen få minutter før den kommer frem &mdash; så vær tålmodig."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Detaljerne om dit problem er tilgængelige under den anden fane ovenfor."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Detaljerne om dit problem er tilgængelig på højre kant af denne side."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "De sidste lokale rapporter rapporteret af brugere"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "De sidste ejendomme rapporteret tilbage i brug af brugere"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "De sidste rapporter for {{COUNCIL}} rapporteret af brugere"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "De sidste rapporter for {{COUNCIL}} indenfor {{WARD}} bydel rapporteret af brugere"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "De sidste rapporter indenfor grænsen til {{NAME}} rapporteret af brugere"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "For at <strong>rapportere et problem</strong>, så klik på rette sted på kortet."
+
+#~ msgid "User"
+#~ msgstr "Bruger"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Du skal nu åbne lænken i e-posten vi netop har sendt dig."
+
+#~ msgid "Your email address:"
+#~ msgstr "Din e-postadresse:"
+
+#~ msgid "Your report"
+#~ msgstr "Dine rapporter"
diff --git a/locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po
index c7b47b702..73b73874a 100644
--- a/locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-05-21 15:17+0000\n"
+"PO-Revision-Date: 2015-06-02 13:18+0100\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
"Language-Team: German (Switzerland) (http://www.transifex.com/projects/p/fixmystreet/language/de_CH/)\n"
"Language: de_CH\n"
@@ -17,16 +17,14 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.7.6\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
+#: perllib/FixMyStreet/DB/Result/Problem.pm:649
#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
msgid " and "
msgstr "und"
-#: templates/web/base/report/new/councils_text_all.html:2
#: templates/web/base/report/new/councils_text_none.html:11
-#: templates/web/base/report/new/councils_text_none.html:2
-#: templates/web/base/report/new/councils_text_some.html:19
#: templates/web/base/report/new/councils_text_some.html:22
#: templates/web/base/report/new/councils_text_some.html:5
msgid " or "
@@ -57,12 +55,11 @@ msgstr ""
msgid "%d to %d of %d"
msgstr "%d bis %d von %d"
-#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:23
msgid "%s - Summary reports"
msgstr "Alle Meldungen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#: perllib/FixMyStreet/DB/Result/Problem.pm:740
msgid "%s ref:&nbsp;%s"
msgstr ""
@@ -70,7 +67,7 @@ msgstr ""
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
msgid "%s, reported at %s"
msgstr "Gemeldet von %s um %s"
@@ -82,6 +79,10 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:70
+msgid "(Defect & location of defect)"
+msgstr "(Schaden & Ort des Schadens)"
+
#: templates/web/base/email_sent.html:29
msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
msgstr ""
@@ -95,10 +96,20 @@ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking y
msgstr ""
#: templates/web/base/admin/report_blocks.html:11
-#: templates/web/base/admin/users.html:31
+#: templates/web/base/admin/users.html:29
msgid "(Email in abuse table)"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
+msgstr "Ihr Name"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
+msgstr "Ihre Telefonnummer"
+
#: templates/web/base/alert/_list.html:20
#: templates/web/fixmystreet/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
@@ -123,7 +134,7 @@ msgstr "(beantwortet)"
msgid "(fixed)"
msgstr "(beantwortet)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
+#: templates/web/base/index.html:9
#: templates/web/fixmystreet/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(z.B. illegale Deponien, Strassensch&auml;den, Graffitis usw.)"
@@ -133,8 +144,8 @@ msgstr "(z.B. illegale Deponien, Strassensch&auml;den, Graffitis usw.)"
msgid "(not sent to council)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:218
+#: templates/web/zurich/report/new/fill_in_details_form.html:99
msgid "(optional)"
msgstr "(optional)"
@@ -147,7 +158,7 @@ msgstr ""
msgid "(sent to both)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:212
msgid "(we never show your email address or phone number)"
msgstr "(Ihre E-Mail Adresse und Telefonnummer werden nie angezeigt)"
@@ -155,17 +166,16 @@ msgstr "(Ihre E-Mail Adresse und Telefonnummer werden nie angezeigt)"
msgid "(we never show your email)"
msgstr "(Ihre E-Mail Adresse wird nie angezeigt)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/DB/Result/Problem.pm:410
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:651
+#: perllib/FixMyStreet/DB/Result/Problem.pm:418
msgid "-- Pick a category --"
msgstr "-- Wählen Sie eine Kategorie --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
-#: perllib/FixMyStreet/DB/Result/Problem.pm:416
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:424
msgid "-- Pick a property type --"
msgstr ""
-#: templates/web/base/admin/body-form.html:42
#: templates/web/base/admin/body-form.html:43
msgid ""
"<code>MAPIT_URL</code> is set (<code>%s</code>) but no <code>MAPIT_TYPES</code>.<br>\n"
@@ -173,7 +183,6 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
#: templates/web/base/around/_report_banner.html:5
msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
msgstr "Karte nicht sichtbar? <a href='%s' rel='nofollow'>&Uuml;berspringen</a>.</small>"
@@ -200,7 +209,7 @@ msgstr "Neu Registrieren"
msgid "<strong>No</strong>, I do not, let me sign in by email:"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:163
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
@@ -209,7 +218,7 @@ msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
+#: templates/web/base/report/new/fill_in_details_form.html:141
#: templates/web/base/report/update-form.html:95
#: templates/web/fixmystreet/auth/general.html:37
#: templates/web/fixmystreet/auth/general.html:39
@@ -223,16 +232,12 @@ msgstr "Passwort"
msgid "About us"
msgstr "&Uuml;ber uns"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
-#: templates/web/base/report/update-form.html:30
+#: templates/web/base/admin/report_edit.html:39
#: templates/web/base/report/update-form.html:31
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:29
msgid "Action Scheduled"
msgstr ""
-#: templates/web/base/admin/body-form.html:3
#: templates/web/base/admin/body-form.html:4
msgid ""
"Add a <strong>body</strong> for each administrative body, such as a council or department\n"
@@ -240,32 +245,36 @@ msgid ""
" categories of problem) to each body."
msgstr ""
-#: templates/web/base/admin/body.html:56
+#: templates/web/base/admin/body.html:48
msgid "Add a contact using the form below."
msgstr ""
#: templates/web/base/admin/bodies.html:74
-#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/base/admin/body-form.html:233
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Adresse hinzuf&uuml;gen"
-#: templates/web/base/admin/body.html:116
+#: templates/web/base/admin/body.html:108
#: templates/web/zurich/admin/body.html:31
msgid "Add new category"
msgstr "F&uuml;ge neue Kategorie hinzu"
-#: templates/web/base/admin/users.html:47
+#: templates/web/base/admin/users.html:45
msgid "Add user"
msgstr "User hinzuf&uuml;gen"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:70
msgid "Added %s"
msgstr ""
+#: templates/web/base/report/new/category_extras.html:4
+msgid "Additional Information"
+msgstr "Zusätzliche Angaben"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
-msgstr "Nochmals:"
+msgstr "Nochmals"
#: templates/web/base/admin/timeline.html:35
msgid "Alert %d created for %s, type %s, parameters %s / %s"
@@ -281,15 +290,18 @@ msgid "Alert me to future updates"
msgstr ""
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Alle Meldungen"
+#: templates/web/zurich/admin/stats.html:5
+msgid "All Reports as CSV"
+msgstr "Als CSV exportieren"
+
#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alle Meldungen"
@@ -303,11 +315,8 @@ msgstr "Alle Meldungen von %s bis %s"
msgid "All the information you provide here will be sent to"
msgstr ""
-#: templates/web/base/report/new/councils_text_all.html:2
#: templates/web/base/report/new/councils_text_all.html:4
-#: templates/web/base/report/new/fill_in_details_form.html:12
#: templates/web/base/report/new/fill_in_details_form.html:14
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:11
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
@@ -322,10 +331,10 @@ msgstr ""
msgid "Anonymous"
msgstr "Anonym"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
-msgstr "Anonym:"
+msgstr "Anonym"
#: templates/web/base/footer.html:26
msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
@@ -336,32 +345,33 @@ msgid "Are you a developer?"
msgstr ""
#: templates/web/base/admin/body-form.html:69
-#: templates/web/base/admin/body.html:16
#: templates/web/zurich/admin/body-form.html:24
msgid "Area covered"
msgstr "Gebiet"
#: templates/web/base/admin/bodies.html:15
-#: templates/web/base/admin/body.html:60
+#: templates/web/base/admin/body.html:52
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:268
+msgid "Assign to competent body:"
+msgstr "Nachricht an zuständige Stelle:"
+
+#: templates/web/zurich/admin/report_edit.html:228
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
-msgstr "Einer anderen Kategorie (DA) zuweisen:"
+msgstr "Einer anderen Kategorie (DA) zuweisen"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:266
msgid "Assign to external body:"
-msgstr "Einer externen Stelle zuweisen:"
+msgstr "Nachricht an zuständige Stelle"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:245
msgid "Assign to subdivision:"
-msgstr "An Fachbereich zuweisen:"
+msgstr "An Fachbereich zuweisen"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:210
msgid "Assigned to %s"
msgstr "Besten Dank f&uuml;r Ihre Meldung. Wir haben Ihr Anliegen an %s weitergeleitet, da es nicht in den Zust&auml;ndigkeitsbereich der am Pilot beteiligten Fachbereiche f&auml;llt.<br/>Freundliche Gr&uuml;sse <br/>Ihre Stadt Z&uuml;rich"
@@ -386,8 +396,8 @@ msgstr "Zur&uuml;ck"
msgid "Ban email address"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1285
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:381
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Externe Adressen"
@@ -398,10 +408,9 @@ msgstr "Externe Adressen"
msgid "Body"
msgstr "Organisation"
-#: templates/web/base/admin/report_edit.html:34
#: templates/web/base/admin/user-form.html:32
msgid "Body:"
-msgstr "Organisation:"
+msgstr "Organisation"
#: templates/web/base/admin/stats.html:80
msgid "By Date"
@@ -411,15 +420,16 @@ msgstr ""
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Karte nicht sichtbar? <em>&Uuml;berspringen Sie diesen Schritt</em>"
-#: templates/web/base/admin/body.html:68
+#: templates/web/base/admin/body.html:60
#: templates/web/base/admin/index.html:55
#: templates/web/base/report/new/category.html:10
-#: templates/web/base/report/new/category_wrapper.html:3
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:53
#: templates/web/zurich/admin/body.html:14
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-sdm.html:21
#: templates/web/zurich/admin/reports.html:13
#: templates/web/zurich/admin/stats.html:50
+#: templates/web/zurich/report/new/fill_in_details_form.html:50
msgid "Category"
msgstr "Kategorie"
@@ -427,12 +437,13 @@ msgstr "Kategorie"
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
-#: templates/web/base/admin/body.html:138
+#: templates/web/base/admin/body.html:130
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/report/new/fill_in_details_form.html:68
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategorie:"
@@ -447,19 +458,19 @@ msgstr "Kategorie: %s"
msgid "Change password"
msgstr "Passwort &auml;ndern"
-#: templates/web/base/admin/body.html:160
+#: templates/web/base/admin/body.html:152
msgid ""
"Check <strong>confirmed</strong> to indicate that this contact has been confirmed as correct.\n"
" If you are not sure of the origin or validity of the contact, leave this unchecked."
msgstr ""
-#: templates/web/base/admin/body.html:171
+#: templates/web/base/admin/body.html:163
msgid ""
"Check <strong>deleted</strong> to remove the category from use. \n"
" It will not appear as an available category in the drop-down menu on the report-a-problem page."
msgstr ""
-#: templates/web/base/admin/body.html:191
+#: templates/web/base/admin/body.html:183
msgid ""
"Check <strong>private</strong> if reports in this category should <strong>never be displayed on the website</strong>.\n"
" <br>\n"
@@ -470,12 +481,16 @@ msgid ""
" at a specific address."
msgstr ""
-#: templates/web/base/admin/body.html:130
+#: templates/web/base/admin/body.html:122
msgid ""
"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr "Vorlage wählen"
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
@@ -484,31 +499,25 @@ msgstr ""
#: templates/web/base/js/translation_strings.html:50
#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
-msgstr "Mangel lokalisieren"
+msgstr "Schaden lokalisieren"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
-#: templates/web/base/dashboard/index.html:142
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:185
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_edit.html:45
+#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
-#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Beantwortet"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:839
msgid "Closed by council"
msgstr ""
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
+#: templates/web/base/my/my.html:40 templates/web/fixmystreet/my/my.html:46
msgid "Closed reports"
msgstr ""
@@ -516,41 +525,38 @@ msgstr ""
msgid "Closed:"
msgstr "Beantwortet:"
-#: templates/web/base/around/tabbed_lists.html:10
#: templates/web/base/around/tabbed_lists.html:12
msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
msgstr ""
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
-msgstr "Koordinaten:"
+msgstr "Koordinaten"
#: templates/web/base/admin/list_updates.html:10
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:74
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1292
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:50
msgid "Configure Endpoint"
msgstr ""
-#: templates/web/base/admin/body.html:72
+#: templates/web/base/admin/body.html:64
msgid "Confirm"
msgstr "Best&auml;tigen"
@@ -571,10 +577,10 @@ msgstr ""
msgid "Confirmation"
msgstr "Bestätigung"
-#: templates/web/base/admin/body.html:166
-#: templates/web/base/admin/body.html:79
-#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/body.html:158
+#: templates/web/base/admin/body.html:71
+#: templates/web/base/admin/category_edit.html:32
+#: templates/web/base/admin/category_edit.html:87
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Best&auml;tigt"
@@ -585,7 +591,7 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:70
msgid "Confirmed:"
msgstr "Best&auml;tigt:"
@@ -593,10 +599,8 @@ msgstr "Best&auml;tigt:"
msgid "Contact FixMyStreet"
msgstr ""
-#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
#: templates/web/base/contact/submit.html:1
-#: templates/web/fixmystreet/contact/index.html:1
#: templates/web/fixmystreet/contact/index.html:2
msgid "Contact Us"
msgstr ""
@@ -606,8 +610,13 @@ msgstr ""
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr "Koordinaten"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1429
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1457
msgid "Could not find user"
msgstr ""
@@ -625,10 +634,6 @@ msgstr ""
msgid "Council contacts for %s"
msgstr "Kontaktdetails von %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
-msgid "Council ref:&nbsp;%s"
-msgstr ""
-
#: templates/web/base/admin/stats.html:84
msgid "Council:"
msgstr ""
@@ -638,31 +643,32 @@ msgstr ""
#: templates/web/zurich/admin/stats.html:45
#: templates/web/zurich/admin/stats.html:50
msgid "Count"
-msgstr ""
+msgstr "Anzahl"
#: templates/web/base/email_sent.html:1
msgid "Create a report"
msgstr "Erfasse eine Meldung"
-#: templates/web/base/admin/body.html:208
+#: templates/web/base/admin/body.html:200
#: templates/web/zurich/admin/body.html:59
msgid "Create category"
-msgstr ""
+msgstr "Kategorie erstellen"
+
+#: templates/web/zurich/admin/template_edit.html:29
+msgid "Create template"
+msgstr "Vorlage erstellen"
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Erstellt"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:69
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
-msgstr "Erstellt:"
+msgstr "Erstellt"
#: templates/web/base/admin/stats.html:31
msgid "Current state"
@@ -673,7 +679,11 @@ msgstr "Aktueller Status"
msgid "Currently no bodies have been created."
msgstr "Bisher wurden noch keine Organisationseinheiten erfasst."
-#: templates/web/base/dashboard/index.html:5
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:820
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr "Kunde nicht kontaktierbar"
+
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
msgstr ""
@@ -682,15 +692,20 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr "Innerhalb von f&uuml;nf Arbeitstagen abgeschlossen"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:875
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr "Vorlage löschen"
+
#: templates/web/base/admin/bodies.html:27
-#: templates/web/base/admin/body.html:177
-#: templates/web/base/admin/body.html:81
-#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/body.html:169
+#: templates/web/base/admin/body.html:73
+#: templates/web/base/admin/category_edit.html:37
+#: templates/web/base/admin/category_edit.html:88
msgid "Deleted"
msgstr "Gel&ouml;scht"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:51
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:43
#: templates/web/zurich/admin/index-dm.html:22
#: templates/web/zurich/admin/index-sdm.html:20
#: templates/web/zurich/admin/reports.html:12
@@ -704,16 +719,21 @@ msgstr "Beschreibung"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
-msgstr "Beschreibung:"
+msgstr "Beschreibung"
-#: templates/web/base/admin/body.html:87
+#: templates/web/base/admin/body.html:79
msgid "Devolved"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
+msgstr "hat Karte nicht verwendet"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Weiss ich nicht"
@@ -738,16 +758,13 @@ msgstr ""
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
-#: templates/web/base/report/update-form.html:30
+#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/report/update-form.html:32
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:30
msgid "Duplicate"
msgstr ""
-#: templates/web/base/admin/body.html:106
+#: templates/web/base/admin/body.html:98
msgid ""
"Each contact for the body has a category, which is displayed to the public. \n"
" Different categories <strong>can have the same contact</strong> (email address).\n"
@@ -757,20 +774,19 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
-#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/base/admin/users.html:31
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
-msgstr ""
+msgstr "Anpassen"
-#: templates/web/base/admin/body.html:220
+#: templates/web/base/admin/body.html:212
#: templates/web/zurich/admin/body.html:71
msgid "Edit body details"
msgstr "Details editieren"
#: templates/web/base/admin/report_edit.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
-#: templates/web/zurich/admin/report_edit.html:1
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
msgstr "Meldung %d bearbeiten"
@@ -784,12 +800,12 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:89
msgid "Editor"
msgstr ""
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:86
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
#: templates/web/fixmystreet/auth/general.html:21
@@ -800,23 +816,23 @@ msgstr ""
msgid "Email"
msgstr "E-Mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1405
msgid "Email added to abuse list"
msgstr ""
-#: templates/web/base/admin/body.html:155
+#: templates/web/base/admin/body.html:147
msgid "Email address:"
msgstr ""
#: templates/web/base/tokens/confirm_alert.html:6
msgid "Email alert created"
-msgstr ""
+msgstr "E-Mail Benachrichtigung erstellt"
#: templates/web/base/tokens/confirm_alert.html:10
msgid "Email alert deleted"
-msgstr ""
+msgstr "E-Mail Benachrichtigung gel&ouml;scht"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1402
msgid "Email already in abuse list"
msgstr ""
@@ -828,15 +844,13 @@ msgstr ""
msgid "Email me updates"
msgstr "Schicken Sie mir Aktualisierungen"
-#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/category_edit.html:26
+#: templates/web/base/admin/report_edit.html:67
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-mail:"
@@ -844,28 +858,27 @@ msgstr "E-mail:"
msgid "Email: %s"
msgstr "E-mail:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:620
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:619
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:622
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:623
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:624
msgid "Empty public building - school, hospital, etc."
msgstr ""
-#: templates/web/base/admin/body-form.html:162
-#: templates/web/base/admin/body-form.html:163
+#: templates/web/base/admin/body-form.html:159
msgid ""
"Enable <strong>Open311 update-sending</strong> if the endpoint will send and receive\n"
" updates to existing reports. If you're not sure, it probably does not, so leave this unchecked.\n"
@@ -873,8 +886,7 @@ msgid ""
" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
msgstr ""
-#: templates/web/base/admin/body-form.html:222
-#: templates/web/base/admin/body-form.html:223
+#: templates/web/base/admin/body-form.html:216
msgid ""
"Enable this <strong>can be devolved</strong> setting if one or more contacts have a \n"
" different endpoint (and send method) from the body's. For example, if reports for some categories of\n"
@@ -885,13 +897,13 @@ msgstr ""
msgid "End Date:"
msgstr ""
-#: templates/web/base/admin/body-form.html:130
+#: templates/web/base/admin/body-form.html:126
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
-msgstr "Ungef&auml;hre Adresse des Mangels"
+msgstr "Ungef&auml;hre Adresse des Schadens"
#: perllib/FixMyStreet/Cobrand/UK.pm:13
msgid "Enter a nearby UK postcode, or street name and area"
@@ -900,21 +912,19 @@ msgstr "Geben Sie eine Adresse an"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:20
#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:21
msgid "Enter a nearby postcode, or street name and area"
-msgstr "Ungef&auml;hre Adresse des Mangels"
+msgstr "Ungef&auml;hre Adresse des Schadens"
-#: templates/web/base/around/postcode_form.html:1
#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
#: templates/web/fixmystreet/around/postcode_form.html:11
msgid "Enter a nearby street name and area"
-msgstr "Ungef&auml;hre Adresse des Mangels"
+msgstr "Ungef&auml;hre Adresse des Schadens"
#: perllib/FixMyStreet/Cobrand/ZeroTB.pm:7
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:170
#: templates/web/base/report/update-form.html:124
msgid "Enter a new password:"
msgstr ""
@@ -926,9 +936,9 @@ msgstr ""
msgid "Enter a password"
msgstr "Ihr Passwort"
-#: templates/web/base/index-steps.html:26
+#: templates/web/base/index-steps.html:33
msgid "Enter details of the problem"
-msgstr "Beschreiben Sie den Mangel"
+msgstr "Beschreiben Sie den Schaden"
#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
@@ -949,16 +959,17 @@ msgstr "Beispieladresse"
msgid "Examples:"
msgstr "Beispiele:"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:47
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
-#: templates/web/base/admin/body-form.html:81
-msgid "External URL"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:170
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:908
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
msgstr ""
-#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:76
msgid "Extra data:"
msgstr ""
@@ -976,7 +987,7 @@ msgstr "Alle Meldungen"
msgid "First time"
msgstr ""
-#: templates/web/base/admin/body.html:48
+#: templates/web/base/admin/body.html:40
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
@@ -1007,31 +1018,24 @@ msgid ""
msgstr ""
#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
-#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/admin/report_edit.html:41
+#: templates/web/base/admin/report_edit.html:42
#: templates/web/base/dashboard/index.html:144
-#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:34
#: templates/web/fixmystreet/report/banner.html:12
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:32
msgid "Fixed"
msgstr "Beantwortet"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_edit.html:43
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_edit.html:42
msgid "Fixed - User"
msgstr ""
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
+#: templates/web/base/my/my.html:35 templates/web/fixmystreet/my/my.html:41
msgid "Fixed reports"
msgstr ""
@@ -1039,7 +1043,7 @@ msgstr ""
msgid "Fixed:"
msgstr ""
-#: templates/web/base/admin/body-form.html:89
+#: templates/web/base/admin/body-form.html:84
#: templates/web/zurich/admin/body-form.html:36
msgid "Flag as deleted"
msgstr "Als gel&#246;scht markieren"
@@ -1048,7 +1052,7 @@ msgstr "Als gel&#246;scht markieren"
msgid "Flag user"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1290
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1057,7 +1061,7 @@ msgstr ""
msgid "Flagged reports and users"
msgstr ""
-#: templates/web/base/admin/user-form.html:46
+#: templates/web/base/admin/user-form.html:45
msgid "Flagged users are listed on the <a href='%s'>flagged</a> page."
msgstr ""
@@ -1065,8 +1069,8 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
-#: templates/web/base/admin/user-form.html:52
+#: templates/web/base/admin/report_edit.html:78
+#: templates/web/base/admin/user-form.html:51
msgid "Flagged:"
msgstr ""
@@ -1075,6 +1079,10 @@ msgstr ""
msgid "Follow a ward link to view only reports within that ward."
msgstr ""
+#: templates/web/base/admin/report_edit.html:30
+msgid "For council(s):"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:65
msgid "For more information, see <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>How FixMyStreet uses Mapit</a>."
msgstr ""
@@ -1084,8 +1092,15 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Ihr Passwort"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:738
+msgid "Forwarded to external body"
+msgstr "An externe Stelle weitergeleitet"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:739
+msgid "Forwarded wish to external body"
+msgstr "Wunsch an externe Stelle weitergeleitet"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
#: templates/web/base/static/privacy.html:2
msgid "Frequently Asked Questions"
msgstr "Hilfe"
@@ -1099,13 +1114,11 @@ msgstr ""
msgid "Get updates"
msgstr ""
-#: templates/web/fixmystreet/reports/_rss.html:3
#: templates/web/fixmystreet/reports/_rss.html:9
msgid "Get updates of %s problems"
-msgstr "Beschreiben Sie den Mangel"
+msgstr "Beschreiben Sie den Schaden"
#: templates/web/fixmystreet/reports/_rss.html:11
-#: templates/web/fixmystreet/reports/_rss.html:3
msgid "Get updates of problems in this %s"
msgstr ""
@@ -1125,7 +1138,7 @@ msgstr ""
msgid "Go"
msgstr "Los"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:77
msgid "Going to send questionnaire?"
msgstr ""
@@ -1149,7 +1162,7 @@ msgstr ""
#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Hilfe"
@@ -1159,19 +1172,16 @@ msgstr "Hilfe"
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/fixmystreet/header.html:52
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hallo %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:901
+#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_edit.html:51
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1185,7 +1195,7 @@ msgstr "Alte ausblenden"
msgid "Hide pins"
msgstr "Stecknadeln ausblenden"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:82
msgid "History"
msgstr "History"
@@ -1201,16 +1211,14 @@ msgstr "Erfassen Sie eine neue Meldung:"
msgid "How to send successful reports"
msgstr "Anleitung"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:757
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
-#: templates/web/base/tokens/confirm_problem.html:23
#: templates/web/base/tokens/confirm_problem.html:27
msgid "I just reported a problem on @fixmystreet"
msgstr ""
-#: templates/web/base/tokens/confirm_update.html:19
#: templates/web/base/tokens/confirm_update.html:23
msgid "I just updated a problem on @fixmystreet"
msgstr ""
@@ -1219,7 +1227,11 @@ msgstr ""
msgid "I'm afraid we couldn't locate your problem in the database.\n"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Tokens.pm:327
+#: perllib/FixMyStreet/App/Controller/Tokens.pm:54
+msgid "I'm afraid we couldn't validate that token, as the report was made too long ago."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Tokens.pm:282
msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
msgstr "Leider konnte Ihre URL nicht aufgel&ouml;st werden. Falls Sie die URL aus einer Mail kopiert haben, &uuml;berpr&uuml;fen Sie bitte ob Sie die gesamte URL kopiert haben.\n"
@@ -1228,20 +1240,19 @@ msgstr "Leider konnte Ihre URL nicht aufgel&ouml;st werden. Falls Sie die URL au
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:22
+#: templates/web/zurich/admin/list_updates.html:36
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
-#: templates/web/base/admin/body-form.html:24
#: templates/web/base/admin/body-form.html:25
msgid ""
"Identify a <strong>parent</strong> if this body is itself part of another body.\n"
" For basic installations, you don't need to join bodies in this way."
msgstr ""
-#: templates/web/base/admin/body.html:133
+#: templates/web/base/admin/body.html:125
msgid ""
"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
@@ -1263,7 +1274,6 @@ msgstr ""
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
-#: templates/web/base/report/new/councils_text_none.html:2
#: templates/web/base/report/new/councils_text_none.html:8
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
@@ -1280,27 +1290,24 @@ msgid ""
"your experience of getting the problem fixed?"
msgstr ""
-#: templates/web/base/admin/body.html:149
+#: templates/web/base/admin/body.html:141
msgid "If you're using <strong>a send method that is not email</strong>, enter the service ID (Open311) or equivalent identifier here."
msgstr ""
-#: templates/web/base/admin/body-form.html:207
-#: templates/web/base/admin/body-form.html:208
+#: templates/web/base/admin/body-form.html:201
msgid ""
"If you've enabled Open311 update-sending above, Open311 usually only accepts OPEN or CLOSED status in \n"
" its updates. Enable <strong>extended Open311 stauses</strong> if you want to allow extra states to be passed.\n"
" Check that your cobrand supports this feature before switching it on."
msgstr ""
-#: templates/web/base/admin/body-form.html:194
-#: templates/web/base/admin/body-form.html:195
+#: templates/web/base/admin/body-form.html:188
msgid ""
"If you've enabled Open311 update-sending above, enable <strong>suppression of alerts</strong> \n"
" if you do <strong>not</strong> want that user to be notified whenever these updates are created."
msgstr ""
-#: templates/web/base/admin/body-form.html:177
-#: templates/web/base/admin/body-form.html:178
+#: templates/web/base/admin/body-form.html:174
msgid ""
"If you've enabled Open311 update-sending above, you must identify which \n"
" FixMyStreet <strong>user</strong> will be attributed as the creator of those updates\n"
@@ -1315,11 +1322,8 @@ msgstr "Unbekannt ID"
msgid "Illegal feed selection"
msgstr ""
-#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
-#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
msgstr "In Bearbeitung"
@@ -1332,14 +1336,11 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: templates/web/base/admin/report_edit.html:38
#: templates/web/fixmystreet/report/banner.html:19
-#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "In Bearbeitung"
@@ -1347,7 +1348,7 @@ msgstr "In Bearbeitung"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:282
msgid "Include reporter personal details"
msgstr "Pers&ouml;nliche Angaben des Meldenden mitsenden"
@@ -1359,12 +1360,11 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:33
msgid "Internal notes"
msgstr "Interne Notizen"
#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
msgid "Internal referral"
msgstr ""
@@ -1372,7 +1372,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1205
msgid "Invalid end date"
msgstr "Ung&ultiges Enddatum"
@@ -1380,17 +1380,13 @@ msgstr "Ung&ultiges Enddatum"
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid start date"
msgstr "Ung&ultiges Startdatum"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
-#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/admin/report_edit.html:37
#: templates/web/base/dashboard/index.html:143
-#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:29
msgid "Investigating"
msgstr ""
@@ -1403,8 +1399,17 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:173
+msgid "Jurisdiction Unknown"
+msgstr "Zust&auml;ndigkeit unbekannt"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:913
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr "Zust&auml;ndigkeit unbekannt"
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
+#: templates/web/base/report/new/fill_in_details_form.html:150
#: templates/web/base/report/update-form.html:104
#: templates/web/fixmystreet/auth/general.html:47
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
@@ -1413,12 +1418,12 @@ msgstr ""
msgid "Keep me signed in on this computer"
msgstr "Angemeldet bleiben"
-#: templates/web/base/admin/body.html:70
+#: templates/web/base/admin/body.html:62
#: templates/web/zurich/admin/body.html:16
msgid "Last editor"
msgstr "Letzter Bearbeiter"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:72
msgid "Last update:"
msgstr "Letzte Bearbeitung"
@@ -1426,29 +1431,30 @@ msgstr "Letzte Bearbeitung"
msgid "Last&nbsp;update:"
msgstr "Letzte Bearbeitung"
-#: templates/web/base/admin/body-form.html:229
+#: templates/web/base/admin/body-form.html:222
msgid "Leave this blank if all reports to this body should be sent using the same send method (e.g., \"%s\")."
msgstr ""
-#: templates/web/base/admin/body.html:27
+#: templates/web/base/admin/body.html:17 templates/web/base/admin/body.html:19
msgid "List all reported problems"
msgstr "Liste aller Meldungen"
-#: templates/web/base/report/new/category_wrapper.html:4
+#: templates/web/base/report/new/fill_in_details_form.html:69
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:54
+#: templates/web/zurich/report/new/fill_in_details_form.html:51
msgid "Loading..."
msgstr ""
#: templates/web/base/alert/choose.html:1
#: templates/web/base/alert/choose.html:3
#: templates/web/base/alert/index.html:1 templates/web/base/alert/index.html:3
-#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:5
+#: templates/web/base/alert/list.html:5
#: templates/web/base/alert/updates.html:1
#: templates/web/base/tokens/confirm_alert.html:1
#: templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
msgstr ""
-#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:12
#: templates/web/base/alert/list.html:14 templates/web/base/alert/list.html:3
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
@@ -1457,39 +1463,34 @@ msgstr ""
msgid "Local alerts"
msgstr "RSS"
-#: templates/web/base/index-steps.html:25
+#: templates/web/base/index-steps.html:31
msgid "Locate the problem on a map of the area"
-msgstr "Lokalisieren Sie den Mangel auf der Karte"
+msgstr "Lokalisieren Sie den Schaden auf der Karte"
#: templates/web/base/js/translation_strings.html:43
msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-msgid "Mark as sent"
-msgstr ""
-
-#: templates/web/base/admin/user-form.html:44
+#: templates/web/base/admin/user-form.html:43
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
msgstr ""
-#: templates/web/base/reports/index.html:24
-msgid "Marked fixed/closed in the past eight weeks"
-msgstr ""
-
-#: templates/web/base/reports/index.html:25
-msgid "Marked fixed/closed more than eight weeks ago"
-msgstr ""
-
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Nachricht"
+#: templates/web/zurich/admin/report_edit.html:339
+msgid "Message to competent body:"
+msgstr "Nachricht an zuständige Stelle"
+
+#: templates/web/zurich/admin/report_edit.html:337
+msgid "Message to external body:"
+msgstr "Nachricht an zuständige Stelle"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Nachricht:"
@@ -1524,15 +1525,13 @@ msgstr "Meldungen in der Nähe"
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:99
msgid "Name"
msgstr "Name"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:66
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Name:"
@@ -1550,12 +1549,12 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:424
+#: perllib/FixMyStreet/Cobrand/Default.pm:464
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:278
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1569,16 +1568,16 @@ msgstr "Fast Fertig! Bitte checken Sie Ihre Mailbox..."
msgid "New <br>problems"
msgstr "Neue <br>Meldungen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:261
+#: perllib/FixMyStreet/App/Controller/Admin.pm:265
msgid "New body added"
msgstr "Neue Organisation hinzugef&uuml;gt"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:391
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Neue interne Notiz"
@@ -1590,6 +1589,10 @@ msgstr ""
msgid "New local reports on reportemptyhomes.com"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
+msgstr "Neue Nachricht an die Kommunikation"
+
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
msgstr ""
@@ -1638,23 +1641,24 @@ msgstr ""
msgid "New state"
msgstr "Neuer Status"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Neue Antwort"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+msgid "New template"
+msgstr "Neue Vorlage"
#: templates/web/base/pagination.html:13
msgid "Next"
msgstr "Weiter"
-#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
-#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
+#: templates/web/base/admin/body.html:72 templates/web/base/admin/body.html:74
+#: templates/web/base/admin/body.html:78 templates/web/base/admin/body.html:80
#: templates/web/base/admin/category_edit.html:4
#: templates/web/base/admin/list_updates.html:32
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
#: templates/web/base/questionnaire/index.html:44
@@ -1688,7 +1692,8 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:318
msgid "No further updates"
msgstr "Bearbeitung abschliessen"
@@ -1706,25 +1711,20 @@ msgstr "Bisher wurden noch keine Meldungen erfasst."
msgid "No result returned"
msgstr ""
-#: templates/web/base/admin/body-form.html:60
#: templates/web/base/admin/body-form.html:61
msgid ""
"No specific areas are currently available, because the <code>MAPIT_URL</code> in\n"
" your config file is not pointing to a live MapIt service."
msgstr ""
-#: templates/web/base/report/_support.html:2
#: templates/web/base/report/_support.html:4
msgid "No supporters"
msgstr ""
-#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: templates/web/base/admin/report_edit.html:30
msgid "None"
msgstr "Keine"
-#: templates/web/base/admin/user-form.html:24
#: templates/web/base/admin/user-form.html:25
msgid ""
"Normal (public) users should not be associated with any <strong>body</strong>.<br>\n"
@@ -1733,16 +1733,19 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
-#: templates/web/base/report/update-form.html:30
+#: templates/web/base/admin/report_edit.html:46
#: templates/web/base/report/update-form.html:33
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:31
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:177
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:923
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr "Nicht kontaktierbar"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Anderer Fachbereich zust&auml;ndig"
@@ -1750,12 +1753,12 @@ msgstr "Anderer Fachbereich zust&auml;ndig"
msgid "Not reported before"
msgstr ""
-#: templates/web/base/report/_main.html:62
+#: templates/web/base/report/_main.html:61
msgid "Not reported to council"
msgstr ""
-#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/body.html:63
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr ""
@@ -1764,8 +1767,8 @@ msgstr ""
msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
msgstr ""
-#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/body.html:178
+#: templates/web/base/admin/category_edit.html:47
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr ""
@@ -1774,11 +1777,15 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
+#: templates/web/zurich/admin/list_updates.html:19
+msgid "Notes from SDM to DM"
+msgstr "Nachrichten an die Kommunikationstelle"
+
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:113
+#: templates/web/base/report/new/fill_in_details_form.html:132
msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
msgstr ""
@@ -1815,40 +1822,27 @@ msgstr ""
msgid "Older <br>problems"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:45
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:37
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:895
+#: templates/web/base/admin/report_edit.html:36
+#: templates/web/base/admin/report_edit.html:37
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
-#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Aufgenommen"
-#: templates/web/base/reports/index.html:22
-msgid "Open for more than four weeks, with an update within the past eight weeks"
-msgstr ""
-
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
+#: templates/web/base/my/my.html:30 templates/web/fixmystreet/my/my.html:36
msgid "Open reports"
msgstr "Offene Meldungen"
-#: templates/web/base/reports/index.html:23
-msgid "Open, but not had any update in eight weeks"
-msgstr ""
-
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
msgstr ""
@@ -1871,13 +1865,13 @@ msgstr ""
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1056
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:651
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:652
+#: perllib/FixMyStreet/DB/Result/Problem.pm:591
+#: perllib/FixMyStreet/DB/Result/Problem.pm:601
+#: perllib/FixMyStreet/DB/Result/Problem.pm:611
+#: perllib/FixMyStreet/DB/Result/Problem.pm:623
#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
msgid "Other"
@@ -1901,8 +1895,7 @@ msgstr ""
msgid "Parent"
msgstr "Geh&ouml;rt zu"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_edit.html:51
msgid "Partial"
msgstr ""
@@ -1922,7 +1915,7 @@ msgstr ""
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:105
msgid "Phone number"
msgstr "Telefonnummer"
@@ -1932,26 +1925,32 @@ msgid "Phone number (optional)"
msgstr "Telefonnummer (optional)"
#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: templates/web/base/admin/report_edit.html:68
+#: templates/web/base/report/new/fill_in_details_form.html:216
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefonnummer:"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:72
#: templates/web/fixmystreet/report/update-form.html:59
#: templates/web/zurich/admin/index-dm.html:29
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:69
msgid "Photo"
msgstr "Foto"
+#: perllib/FixMyStreet/App/Controller/Photo.pm:201
+msgid "Photo is required."
+msgstr "Foto wird ben&ouml;tigt"
+
+#: templates/web/base/admin/category_edit.html:43
+msgid "Photo required"
+msgstr "Foto ben&ouml;tigt"
+
#: templates/web/base/questionnaire/index.html:71
-#: templates/web/base/report/new/fill_in_details_form.html:84
+#: templates/web/base/report/new/fill_in_details_form.html:103
#: templates/web/base/report/update-form.html:62
#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
@@ -1965,15 +1964,12 @@ msgstr "Fotos von neuen Meldungen in der N&auml;he"
msgid "Place pin on map"
msgstr "Pin auf der Karte absetzen"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
-#: templates/web/base/dashboard/index.html:142
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:935
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:941
+#: templates/web/base/admin/report_edit.html:38
#: templates/web/base/dashboard/index.html:143
-#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Rückmeldung ausstehend"
@@ -1985,7 +1981,6 @@ msgstr ""
msgid "Please be polite, concise and to the point."
msgstr "Bitte seien Sie freundlich und pr&auml;gnant."
-#: templates/web/base/auth/change_password.html:12
#: templates/web/base/auth/change_password.html:17
msgid "Please check the passwords and try again"
msgstr ""
@@ -1995,27 +1990,24 @@ msgid "Please check your email"
msgstr "Bitte &uuml;berpr&uuml;fen Sie Ihr E-Mail"
#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
#: templates/web/fixmystreet/auth/general.html:16
-#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Bitte &uuml;berpr&uuml;fen Sie ob Ihre E-Mail Adresse korrekt ist"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
-#: perllib/FixMyStreet/DB/Result/Problem.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:347
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:861
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:920
+#: perllib/FixMyStreet/DB/Result/Problem.pm:420
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
msgstr "Bitte w&auml;hlen Sie eine Kategorie"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:418
+#: perllib/FixMyStreet/DB/Result/Problem.pm:426
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
msgid "Please correct the errors below"
msgstr ""
@@ -2031,13 +2023,12 @@ msgstr ""
msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:346
+#: perllib/FixMyStreet/App/Controller/Admin.pm:350
#: perllib/FixMyStreet/DB/Result/Comment.pm:125
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr ""
-#: templates/web/base/auth/change_password.html:12
#: templates/web/base/auth/change_password.html:15
#: templates/web/base/js/translation_strings.html:19
msgid "Please enter a password"
@@ -2049,9 +2040,9 @@ msgstr "Obligatorisches Feld"
msgid "Please enter a subject"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
-#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1088
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1141
+#: perllib/FixMyStreet/App/Controller/Admin.pm:349
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2071,18 +2062,15 @@ msgstr "Bitte geben Sie einige Details an"
#: perllib/FixMyStreet/App/Controller/Contact.pm:112
#: perllib/FixMyStreet/DB/Result/User.pm:124
#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
#: templates/web/fixmystreet/auth/general.html:15
-#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Ihre E-Mail Adresse"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:97
msgid "Please enter your email address"
msgstr "Ihre E-Mail Adresse"
@@ -2090,7 +2078,7 @@ msgstr "Ihre E-Mail Adresse"
msgid "Please enter your first name"
msgstr "Bitte geben Sie Ihren Namen an"
-#: perllib/FixMyStreet/Cobrand/UK.pm:318
+#: perllib/FixMyStreet/DB/Result/Problem.pm:413
#: templates/web/base/js/translation_strings.html:7
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
@@ -2120,20 +2108,19 @@ msgstr "Bitte geben Sie Ihre E-Mail-Adresse an"
msgid "Please feel free to <a href=\"%s\">sign in again</a>, or go back to the <a href=\"/\">front page</a>."
msgstr "<a href=\"%s\">Erneut anmelden</a> oder <a href=\"/\">zur&uuml;ck zur Startseite</a>."
-#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the problem below."
msgstr ""
#: templates/web/zurich/report/new/fill_in_details_form.html:46
msgid "Please fill in details of the problem."
-msgstr "Beschreiben Sie den Mangel."
+msgstr "Beschreiben Sie den Schaden."
#: templates/web/base/report/new/fill_in_details_form.html:28
#: templates/web/fixmystreet/report/new/sidebar.html:7
#: templates/web/zurich/report/new/fill_in_details_form.html:20
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
-msgstr "F&uuml;llen Sie das Formular mit den Details des Mangels aus und beschreiben Sie den Ort des Mangels m&ouml;glichst genau."
+msgstr "F&uuml;llen Sie das Formular mit den Details des Schadens aus und beschreiben Sie den Ort des Schadens m&ouml;glichst genau."
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
msgid "Please indicate whether you'd like to receive another questionnaire"
@@ -2171,6 +2158,10 @@ msgstr ""
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:263
+msgid "Please select a body."
+msgstr "Organisation wählen"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2187,9 +2178,9 @@ msgstr ""
msgid "Please take a look at the updates that have been left."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:127
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:129
msgid "Please upload a JPEG image only"
msgstr "Bitte laden Sie nur JPEG Bilder hoch."
@@ -2232,14 +2223,15 @@ msgstr "Zur&uuml;ck"
msgid "Privacy"
msgstr ""
-#: templates/web/base/admin/body.html:202
-#: templates/web/base/admin/body.html:85
-#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/body.html:194
+#: templates/web/base/admin/body.html:77
+#: templates/web/base/admin/category_edit.html:40
+#: templates/web/base/admin/report_edit.html:79
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Meldung"
@@ -2260,7 +2252,7 @@ msgstr ""
msgid "Problem breakdown by state"
msgstr "Meldungen nach Status sortiert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1059
msgid "Problem marked as open."
msgstr ""
@@ -2295,7 +2287,7 @@ msgstr "Meldungen, welche k&uuml;rzlich beantwortet wurden"
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:632
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2307,7 +2299,6 @@ msgstr "Meldungen innerhalb %s"
msgid "Problems within %s ward"
msgstr ""
-#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
msgid "Problems within %s, FixMyStreet"
msgstr ""
@@ -2321,7 +2312,7 @@ msgstr ""
msgid "Properties recently reported as put back to use on reportemptyhomes.com"
msgstr ""
-#: templates/web/base/admin/report_edit.html:45
+#: templates/web/base/admin/report_edit.html:32
msgid "Property address:"
msgstr ""
@@ -2338,32 +2329,26 @@ msgstr "Meldung aktualisieren"
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
+#: templates/web/base/report/new/fill_in_details_form.html:174
#: templates/web/base/report/update-form.html:128
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:300
+#: templates/web/zurich/admin/report_edit.html:327
msgid "Public response:"
-msgstr "Offizielle Antwort"
+msgstr "R&uuml;ckmeldung an User"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Foto ver&ouml;ffentlichen"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Antwort ver&ouml;ffentlichen"
-
#: templates/web/base/questionnaire/completed.html:1
-#: templates/web/base/questionnaire/index.html:0
#: templates/web/base/questionnaire/index.html:14
#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
#: templates/web/fixmystreet/questionnaire/index.html:15
#: templates/web/fixmystreet/questionnaire/index.html:33
#: templates/web/fixmystreet/questionnaire/index.html:5
@@ -2383,7 +2368,6 @@ msgid "Questionnaire filled in by problem reporter"
msgstr ""
#: templates/web/base/alert/_list.html:21
-#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
@@ -2422,7 +2406,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:633
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2434,7 +2418,6 @@ msgstr ""
msgid "RSS feed of problems within %s ward"
msgstr ""
-#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:4
msgid "RSS feed of recent local problems"
msgstr ""
@@ -2452,7 +2435,6 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr "Erhalten Sie Aktualisierungen dieser Meldung."
-#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
msgid "Recent local problems, FixMyStreet"
msgstr ""
@@ -2468,25 +2450,29 @@ msgstr "K&uuml;rzlich erfasste Meldungen:"
#: templates/web/zurich/report/new/notes.html:5
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
-msgstr "Z&uuml;ri wie neu dient dazu M&auml;ngel an der Infrastruktur zu melden. Meldungen und W&uuml;nsche bez&uuml;glich Verbesserungen an der Infrastruktur sowie Gestaltungsvorschl&auml;ge k&ouml;nnen über Z&uuml;ri wie neu nicht ber&uuml;cksichtigt werden. Notf&auml;lle m&uuml;ssen der Polizei gemeldet werden via Telefon 117."
+msgstr "&#171;Z&uuml;ri wie neu&#187; dient dazu Sch&auml;den an der Infrastruktur zu melden. Meldungen und W&uuml;nsche bez&uuml;glich Verbesserungen an der Infrastruktur sowie Gestaltungsvorschl&auml;ge k&ouml;nnen über &#171;Z&uuml;ri wie neu&#187; nicht ber&uuml;cksichtigt werden. Notf&auml;lle m&uuml;ssen der Polizei gemeldet werden via Telefon 117."
#: templates/web/base/admin/report_blocks.html:16
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:94
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:298
+msgid "Reply to user:"
+msgstr "Antwort an User"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
-msgstr ""
+msgstr "Meldung"
#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Eine Meldung erfassen"
@@ -2508,7 +2494,7 @@ msgstr ""
#: templates/web/fixmystreet/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
-msgstr "Melden Sie M&auml;ngel an der Infrastruktur von Z&uuml;rich"
+msgstr "Melden Sie Sch&auml;den an der Infrastruktur von Z&uuml;rich"
#: templates/web/base/my/my.html:82
msgid "Reported %s"
@@ -2518,7 +2504,7 @@ msgstr ""
msgid "Reported %s, to %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:606
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
@@ -2530,62 +2516,66 @@ msgstr "Anonym gemeldet um"
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:629
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Gemeldet von %s um %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr "Gemeldet von"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "In der Kategorie %s gemeldet"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
msgid "Reported in the %s category anonymously at %s"
msgstr "In der Kategorie %s um %s gemeldet"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:624
msgid "Reported in the %s category by %s at %s"
msgstr "Gemeldet in der Kategorie %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:598
msgid "Reported via %s anonymously at %s"
msgstr "Anonym gemeldet von %s um %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:620
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:594
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:614
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
-#: templates/web/base/reports/index.html:21
-#, fuzzy
-msgid "Reported within the last four weeks"
-msgstr "In der Kategorie %s gemeldet"
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+msgid "Reported:"
+msgstr "Gemeldet"
-#: templates/web/base/around/around_index.html:1
#: templates/web/base/around/around_index.html:3
#: templates/web/base/js/translation_strings.html:41
-#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Ihre Meldung"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1286
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:373
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Meldungen"
-#: perllib/FixMyStreet/Cobrand/UK.pm:327 perllib/FixMyStreet/Cobrand/UK.pm:331
+#: perllib/FixMyStreet/DB/Result/Problem.pm:434
+#: perllib/FixMyStreet/DB/Result/Problem.pm:438
msgid "Reports are limited to %s characters in length. Please shorten your report"
msgstr ""
@@ -2601,10 +2591,17 @@ msgstr ""
msgid "Reports published"
msgstr "Beantwortet"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:71
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr "Vorlagen für %s"
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Richtiger Ort?"
@@ -2619,26 +2616,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1505
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1510
+#: templates/web/base/admin/report_edit.html:90
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Links drehen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1505
+#: templates/web/base/admin/report_edit.html:91
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Rechts drehen"
+#: templates/web/zurich/admin/report_edit.html:439
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr "Durch das Drehen des Fotos gehen nicht gespeicherte Änderungen verloren."
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
-#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/body.html:200
+#: templates/web/base/admin/category_edit.html:79
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Speichern"
@@ -2651,7 +2654,7 @@ msgstr "Meldungen suchen"
msgid "Search Users"
msgstr "User suchen"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Meldungen suchen"
@@ -2665,7 +2668,7 @@ msgstr "Suchen:"
msgid "Searching found no reports."
msgstr ""
-#: templates/web/base/admin/users.html:41
+#: templates/web/base/admin/users.html:39
msgid "Searching found no users."
msgstr ""
@@ -2688,24 +2691,28 @@ msgstr "Gebiet wählen"
msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:821
+msgid "Sent report back"
+msgstr "Meldung zur&uuml;ckgewiesen"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:753
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:71
msgid "Sent:"
msgstr "Gesendet:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
-msgstr ""
+msgstr "Gerät"
#: templates/web/fixmystreet/report/display.html:38
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
+#: templates/web/base/report/new/fill_in_details_form.html:211
#: templates/web/base/report/update-form.html:157
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
@@ -2750,12 +2757,7 @@ msgstr "Ausloggen"
msgid "Signed in as %s"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_text.html:1
-msgid "Some categories may require additional information."
-msgstr ""
-
-#: templates/web/base/admin/body-form.html:149
-#: templates/web/base/admin/body-form.html:150
+#: templates/web/base/admin/body-form.html:146
msgid ""
"Some endpoints require an <strong>API key</strong> to indicate that the reports are being\n"
" sent from your FixMyStreet installation."
@@ -2778,7 +2780,7 @@ msgstr ""
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:215
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
#: perllib/FixMyStreet/Geocode/Google.pm:47
@@ -2788,7 +2790,7 @@ msgstr "Diese Adresse wurde nicht gefunden."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Diese Adresse wurde nicht gefunden."
@@ -2796,7 +2798,7 @@ msgstr "Diese Adresse wurde nicht gefunden."
msgid "Start Date:"
msgstr ""
-#: templates/web/base/admin/body.html:69
+#: templates/web/base/admin/body.html:61
#: templates/web/base/admin/flagged.html:18
#: templates/web/base/admin/list_updates.html:11
#: templates/web/base/admin/reports.html:15
@@ -2804,19 +2806,20 @@ msgstr ""
msgid "State"
msgstr "Status"
-#: templates/web/base/admin/report_edit.html:47
+#: templates/web/base/admin/report_edit.html:34
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:164
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
-msgstr "Status:"
+msgstr "Status"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1291
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:376
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistik"
@@ -2830,6 +2833,11 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
msgid "Subcategory: %s"
msgstr ""
@@ -2845,26 +2853,26 @@ msgstr "Titel"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
-msgstr "Titel:"
+msgstr "Titel"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
-#: templates/web/base/report/new/fill_in_details_form.html:96
+#: templates/web/base/report/new/fill_in_details_form.html:115
+#: templates/web/base/report/new/fill_in_details_form.html:155
+#: templates/web/base/report/new/fill_in_details_form.html:177
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:113
msgid "Submit"
msgstr "Abschicken"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:97
#: templates/web/base/admin/update_edit.html:65
-#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/base/admin/user-form.html:55
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:323
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Speichern"
@@ -2874,16 +2882,13 @@ msgstr "Speichern"
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
-#: templates/web/zurich/admin/header.html:1
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:160
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:888
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Erfasst"
@@ -2899,24 +2904,23 @@ msgstr ""
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1284
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:372
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Zusammenfassung"
#: templates/web/base/reports/index.html:1
-#: templates/web/zurich/reports/index.html:0
#: templates/web/zurich/reports/index.html:4
msgid "Summary reports"
msgstr "Alle Meldungen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1288
msgid "Survey"
msgstr ""
@@ -2924,17 +2928,26 @@ msgstr ""
msgid "Survey Results"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr "Vorlage &laquo;%s&raquo;"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
+#: templates/web/zurich/header.html:77
+msgid "Templates"
+msgstr "Vorlagen"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
-#: templates/web/base/admin/body.html:28
+#: templates/web/base/admin/body.html:21
msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2964,13 +2977,13 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Council.pm:97
msgid "That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again."
-msgstr "Sie k&ouml;nnen M&auml;ngel nur innerhalb der Stadt Z&uuml;rich melden. Verwenden Sie daf&uuml;r die Adressuche."
+msgstr "Sie k&ouml;nnen Sch&auml;den nur innerhalb der Stadt Z&uuml;rich melden. Verwenden Sie daf&uuml;r die Adressuche."
#: perllib/FixMyStreet/App/Controller/Location.pm:126
msgid "That location does not appear to be in the UK; please try again."
@@ -2982,45 +2995,37 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
-msgid "That problem has been marked as sent."
-msgstr "Dieser Mangel wurde behoben"
-
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:728
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:128
msgid "That report cannot be viewed on %s."
-msgstr "Diese Meldung wurde von Z&uuml;ri wie neu entfernt."
+msgstr "Diese Meldung wurde von &#171;Z&uuml;ri wie neu&#187; entfernt."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:121
msgid "That report has been removed from FixMyStreet."
-msgstr "Diese Meldung wurde von Z&uuml;ri wie neu entfernt."
+msgstr "Diese Meldung wurde von &#171;Z&uuml;ri wie neu&#187; entfernt."
-#: templates/web/base/admin/body.html:144
+#: templates/web/base/admin/body.html:136
msgid ""
"The <strong>email address</strong> is the destination to which reports about this category will be sent. \n"
" Other categories for this body may have the same email address."
msgstr ""
-#: templates/web/base/admin/body-form.html:123
-#: templates/web/base/admin/body-form.html:124
+#: templates/web/base/admin/body-form.html:120
msgid ""
"The <strong>endpoint</strong> is the URL of the service that FixMyStreet will connect to \n"
" when sending reports to this body."
msgstr ""
-#: templates/web/base/admin/body-form.html:136
-#: templates/web/base/admin/body-form.html:137
+#: templates/web/base/admin/body-form.html:133
msgid ""
"The <strong>jurisdiction</strong> is only needed if the endpoint is serving more\n"
" than one. If the body is running its own endpoint, you can usually leave this blank."
msgstr ""
-#: templates/web/base/admin/body-form.html:94
-#: templates/web/base/admin/body-form.html:95
+#: templates/web/base/admin/body-form.html:91
msgid ""
"The <strong>send method</strong> determines how problem reports will be sent to the body.\n"
" If you leave this blank, <strong>send method defaults to email</strong>."
@@ -3030,7 +3035,6 @@ msgstr ""
msgid "The Open311 v2 attribute agency_responsible is used to list the administrations that received the problem report, which is not quite the way the attribute is defined in the Open311 v2 specification."
msgstr ""
-#: templates/web/base/admin/body-form.html:11
#: templates/web/base/admin/body-form.html:12
msgid ""
"The body's <strong>name</strong> identifies the body (for example, <em>Borsetshire District Council</em>)\n"
@@ -3041,10 +3045,9 @@ msgstr ""
msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
-msgstr "Bitte machen Sie so genaue Angaben wie m&ouml;glich: Beschreiben Sie die Art des Mangels und wo er sich befindet (z.B. an der Wand). Senden Sie uns ein Foto des Mangels (inkl. Umgebung). <br/>Beschreiben Sie nur einen Mangel pro Meldung."
+msgstr "Bitte machen Sie so genaue Angaben wie m&ouml;glich: Beschreiben Sie die Art des Schadens und wo er sich befindet (z.B. an der Wand). Senden Sie uns mindestens ein Foto des Schadens (inkl. Umgebung). <br/>Beschreiben Sie <b>nur einen Schaden pro Meldung</b>."
#: templates/web/fixmystreet/questionnaire/index.html:44
msgid "The details of your problem are available from the other tab above."
@@ -3054,7 +3057,6 @@ msgstr ""
msgid "The details of your problem are available on the right hand side of this page."
msgstr ""
-#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
@@ -3122,12 +3124,10 @@ msgstr ""
msgid "The list of available areas is being provided by the MapIt service at %s."
msgstr ""
-#: templates/web/base/auth/change_password.html:12
#: templates/web/base/auth/change_password.html:16
msgid "The passwords do not match"
msgstr ""
-#: templates/web/base/errors/page_error_404_not_found.html:10
#: templates/web/base/errors/page_error_404_not_found.html:12
msgid "The requested URL '%s' was not found on this server"
msgstr ""
@@ -3148,17 +3148,12 @@ msgstr ""
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
-#: templates/web/base/admin/user-form.html:12
#: templates/web/base/admin/user-form.html:13
msgid ""
"The user's <strong>name</strong> is displayed publicly on reports that have not been marked <em>anonymous</em>.\n"
" Names are not necessarily unique."
msgstr ""
-#: templates/web/base/reports/_problem-list.html:15
-msgid "There are no reports to show."
-msgstr ""
-
#: perllib/FixMyStreet/App/Controller/Reports.pm:75
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
@@ -3168,7 +3163,7 @@ msgstr ""
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:747
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
#: templates/web/base/auth/general.html:23
#: templates/web/fixmystreet/auth/general.html:25
@@ -3192,8 +3187,7 @@ msgstr ""
msgid "There were problems with your update. Please see below."
msgstr ""
-#: templates/web/base/admin/body-form.html:112
-#: templates/web/base/admin/body-form.html:113
+#: templates/web/base/admin/body-form.html:109
msgid ""
"These settings are for bodies that use Open311 (or other back-end integration) to receive problem reports.<br>\n"
" <strong>You don't need to set them if the Send Method is email.</strong>.\n"
@@ -3206,18 +3200,17 @@ msgstr ""
msgid "This API implementation is work in progress and not yet stabilized. It will change without warnings in the future."
msgstr ""
-#: templates/web/base/admin/body.html:44
+#: templates/web/base/admin/body.html:36
msgid ""
"This body covers no area. This means that it has no jurisdiction over problems reported <em>at any location</em>.\n"
" Consequently, none of its categories will appear in the drop-down category menu when users report problems.\n"
" Currently, users <strong>cannot report problems to this body</strong>."
msgstr ""
-#: templates/web/base/admin/body.html:54
+#: templates/web/base/admin/body.html:46
msgid "This body has no contacts. This means that currently problems reported to this body <strong>will not be sent</strong>."
msgstr ""
-#: templates/web/base/admin/body-form.html:52
#: templates/web/base/admin/body-form.html:53
msgid ""
"This body will only be sent reports for problems that are located in the <strong>area covered</strong>.\n"
@@ -3232,8 +3225,8 @@ msgstr ""
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:897
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:967
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3259,23 +3252,23 @@ msgstr ""
#: templates/web/base/report/update-form.html:48
#: templates/web/fixmystreet/report/update-form.html:46
msgid "This problem has been fixed"
-msgstr "Dieser Mangel wurde behoben"
+msgstr "Dieser Schaden wurde behoben"
#: templates/web/base/report/update-form.html:43
#: templates/web/fixmystreet/report/update-form.html:40
msgid "This problem has not been fixed"
-msgstr "Dieser Mangel wurde nicht behoben"
+msgstr "Dieser Schaden wurde nicht behoben"
#: templates/web/base/report/banner.html:19
msgid "This problem is in progress"
-msgstr "Dieser Mangel ist in Bearbeitung"
+msgstr "Dieser Schaden ist in Bearbeitung"
#: templates/web/base/report/banner.html:9
msgid "This problem is old and of unknown status."
msgstr "Dieses Problem ist alt und hat einen unbekannten Status"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:157
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:158
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "&Uuml;berpr&uuml;fung ausstehend"
@@ -3300,16 +3293,28 @@ msgstr ""
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr "Aufwand (in Minuten)"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1287
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titel"
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr "Titel"
+
#: templates/web/base/around/_report_banner.html:2
msgid "To <strong>report a problem</strong>, click on the map at the correct location."
msgstr ""
@@ -3338,20 +3343,16 @@ msgstr "Erneut versuchen"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
-#: templates/web/base/report/update-form.html:30
+#: templates/web/base/admin/report_edit.html:46
#: templates/web/base/report/update-form.html:33
-#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:31
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_edit.html:51
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Unbest&auml;tigt"
@@ -3368,7 +3369,9 @@ msgstr ""
msgid "Unknown error"
msgstr "Unbekannter Fehler"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:114
msgid "Unknown problem ID"
msgstr ""
@@ -3390,8 +3393,8 @@ msgstr ""
msgid "Update below added by %s at %s"
msgstr ""
-#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/base/admin/body-form.html:233
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Speichern"
@@ -3416,7 +3419,7 @@ msgstr ""
msgid "Update reopened problem"
msgstr ""
-#: templates/web/base/admin/body.html:101
+#: templates/web/base/admin/body.html:93
msgid "Update statuses"
msgstr ""
@@ -3430,19 +3433,19 @@ msgstr ""
msgid "Updated"
msgstr "Aktualisiert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1049
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1107
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1151
+#: perllib/FixMyStreet/App/Controller/Admin.pm:825
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:757
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:782
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:852
msgid "Updated!"
msgstr "Aktualisiert!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Antwort"
@@ -3455,27 +3458,25 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
-#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
-#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
msgid "Updates to this problem, FixMyStreet"
msgstr ""
-#: templates/web/base/admin/body.html:182
+#: templates/web/base/admin/body.html:174
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
+msgstr "Karte verwendet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1461
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1433
msgid "User flagged"
msgstr ""
@@ -3483,23 +3484,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1289
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:388
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:386
+#: perllib/FixMyStreet/App/Controller/Admin.pm:416
+#: perllib/FixMyStreet/App/Controller/Admin.pm:436
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Meldung auf der Webseite betrachten"
@@ -3508,16 +3509,10 @@ msgstr "Meldung auf der Webseite betrachten"
msgid "View reports by ward"
msgstr ""
-#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:35
msgid "Viewing a location"
msgstr "Meldung erfassen"
-#: templates/web/base/report/display.html:0
-#: templates/web/fixmystreet/report/display.html:0
-msgid "Viewing a problem"
-msgstr "Meldung anschauen"
-
#: templates/web/base/reports/body.html:16
msgid "Wards of this council"
msgstr ""
@@ -3550,7 +3545,7 @@ msgstr "Ihre E-Mail Adresse oder Telefonnummer werden nie angezeigt"
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
-#: templates/web/base/index-steps.html:31
+#: templates/web/base/index-steps.html:38
msgid "We send it to the council on your behalf"
msgstr ""
@@ -3571,11 +3566,11 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:41
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:85
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Wann editiert"
@@ -3584,7 +3579,7 @@ msgstr "Wann editiert"
msgid "When sent"
msgstr "Wann gesendet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:621
msgid "Whole block of empty flats"
msgstr ""
@@ -3592,6 +3587,12 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:918
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr "Wunsch"
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
@@ -3619,18 +3620,18 @@ msgid "Year"
msgstr "Jahr"
#: templates/web/base/admin/bodies.html:66
-#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
-#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
+#: templates/web/base/admin/body.html:72 templates/web/base/admin/body.html:74
+#: templates/web/base/admin/body.html:78 templates/web/base/admin/body.html:80
#: templates/web/base/admin/category_edit.html:5
#: templates/web/base/admin/flagged.html:47
#: templates/web/base/admin/list_updates.html:32
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/admin/report_edit.html:77
#: templates/web/base/admin/update_edit.html:24
-#: templates/web/base/admin/users.html:31
+#: templates/web/base/admin/users.html:29
#: templates/web/base/questionnaire/creator_fixed.html:14
#: templates/web/base/questionnaire/index.html:42
#: templates/web/base/questionnaire/index.html:81
@@ -3659,12 +3660,11 @@ msgstr ""
msgid "You are reporting the following update for being abusive, containing personal information, or similar:"
msgstr ""
-#: templates/web/zurich/tokens/confirm_problem.html:5
#: templates/web/zurich/tokens/confirm_problem.html:8
msgid "You can <a href=\"%s%s\">view the problem on this site</a>."
msgstr "Danke! Sie k&ouml;nnen Ihre aktualisierte Meldung <a href=\"%s%s\">auf der Webseite anschauen</a>."
-#: templates/web/base/admin/user-form.html:48
+#: templates/web/base/admin/user-form.html:47
msgid "You can add an abusive user's email to the abuse list, which automatically hides (and never sends) reports they create."
msgstr ""
@@ -3680,13 +3680,11 @@ msgid ""
msgstr ""
#: templates/web/base/report/new/councils_text_none.html:10
-#: templates/web/base/report/new/councils_text_none.html:2
-#: templates/web/base/report/new/councils_text_some.html:19
#: templates/web/base/report/new/councils_text_some.html:21
msgid "You can help us by finding a contact email address for local problems for %s and emailing it to us at <a href='mailto:%s'>%s</a>."
msgstr ""
-#: templates/web/base/admin/body-form.html:85
+#: templates/web/base/admin/body-form.html:81
msgid "You can mark a body as deleted if you do not want it to be active on the site."
msgstr ""
@@ -3699,10 +3697,9 @@ msgid "You have already answered this questionnaire. If you have a question, ple
msgstr ""
#: templates/web/base/questionnaire/index.html:68
-#: templates/web/base/report/new/fill_in_details_form.html:75
+#: templates/web/base/report/new/fill_in_details_form.html:94
#: templates/web/fixmystreet/questionnaire/index.html:88
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:79
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Sie haben bereits ein Photo angeh&auml;ngt. Laden Sie ein neues hoch um es zu ersetzen."
@@ -3711,6 +3708,10 @@ msgstr "Sie haben bereits ein Photo angeh&auml;ngt. Laden Sie ein neues hoch um
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:78
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr "Sie haben dieser Meldung bereits Fotos angehängt. Sie können maximal 3 Fotos anhängen (wenn Sie mehr anhängen, wird das Älteste entfernt)."
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3720,7 +3721,6 @@ msgstr "Sie haben sich abgemeldet"
msgid "You have located the problem at the point marked with a green pin on the map. If this is not the correct location, simply click on the map again. "
msgstr "Der gr&uuml;ne Punkt lokalisiert Ihre Meldung auf der Karte. Falls dieser Ort nicht stimmt, kann der Pin verschoben werden."
-#: templates/web/zurich/tokens/confirm_problem.html:5
#: templates/web/zurich/tokens/confirm_problem.html:6
msgid "You have successfully confirmed your email address."
msgstr "Sie haben Ihre Meldung erfolgreich best&auml;tigt. "
@@ -3750,12 +3750,11 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:71
msgid "You really want to resend?"
msgstr ""
-#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
+#: templates/web/base/my/my.html:15 templates/web/base/my/my.html:4
#: templates/web/fixmystreet/my/my.html:15
#: templates/web/fixmystreet/my/my.html:4
msgid "Your Reports"
@@ -3770,7 +3769,7 @@ msgstr "Ihre Meldungen"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:93
msgid "Your email"
msgstr "E-Mail Adresse"
@@ -3783,13 +3782,13 @@ msgstr "Ihre E-Mail Adresse"
#: templates/web/base/auth/general.html:27
msgid "Your email address:"
-msgstr "Ihre E-Mail Adresse:"
+msgstr "Ihre E-Mail Adresse"
#: templates/web/base/alert/_list.html:92
-#: templates/web/base/report/new/fill_in_details_form.html:106
+#: templates/web/base/report/new/fill_in_details_form.html:125
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
-msgstr "Ihre E-Mail:"
+msgstr "Ihre E-Mail"
#: templates/web/fixmystreet/report/updates-sidebar-notes.html:7
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
@@ -3801,16 +3800,16 @@ msgstr "Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a h
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:103
msgid "Your name"
msgstr "Ihr Name"
#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
+#: templates/web/base/report/new/fill_in_details_form.html:204
#: templates/web/base/report/update-form.html:151
msgid "Your name:"
-msgstr "Ihr Name:"
+msgstr "Ihr Name"
#: templates/web/fixmystreet/auth/general.html:42
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
@@ -3825,7 +3824,7 @@ msgstr "Ihr Passwort wurde ge&auml;ndert"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:109
msgid "Your phone number"
msgstr "Ihre Telefonnummer"
@@ -3837,26 +3836,27 @@ msgstr "Ihre Meldung"
msgid "Your reports"
msgstr "Ihre Meldungen"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:59
msgid "Your updates"
msgstr ""
#: templates/web/base/contact/index.html:81
msgid "Your&nbsp;email:"
-msgstr "Ihre E-Mail Adresse:"
+msgstr "Ihre E-Mail Adresse"
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
-#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
+#: perllib/FixMyStreet/DB/Result/Problem.pm:738
+msgid "council ref:&nbsp;%s"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:28
msgid "didn't use map"
msgstr "hat Karte nicht verwendet"
@@ -3865,7 +3865,6 @@ msgstr "hat Karte nicht verwendet"
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "z.B. ‘%s’ oder ‘%s’"
-#: templates/web/base/admin/body-form.html:188
#: templates/web/base/admin/flagged.html:51
msgid "edit user"
msgstr ""
@@ -3925,7 +3924,7 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:131
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
@@ -3940,22 +3939,16 @@ msgstr "oder"
msgid "or locate me automatically"
msgstr "oder automatisch lokalisieren"
-#: templates/web/base/admin/report_edit.html:28
-#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/base/admin/report_edit.html:26
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:34
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "Originaltext: &ldquo;%s&rdquo;"
-#: templates/web/base/admin/report_edit.html:43
+#: templates/web/base/admin/report_edit.html:30
msgid "other areas:"
msgstr ""
@@ -3964,14 +3957,12 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/fixmystreet/header.html:53
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "ausloggen"
-#: templates/web/base/report/new/fill_in_details_form.html:12
#: templates/web/base/report/new/fill_in_details_form.html:15
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
msgid "the local council"
msgstr ""
@@ -3989,9 +3980,7 @@ msgstr ""
msgid "today"
msgstr "heute"
-#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
+#: templates/web/base/admin/report_edit.html:28
msgid "used map"
msgstr "Karte verwendet"
@@ -3999,11 +3988,6 @@ msgstr "Karte verwendet"
msgid "user is from same council as problem - %d"
msgstr ""
-#: templates/web/base/admin/update_edit.html:38
-msgid "user is problem owner"
-msgstr ""
-
-#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:3
msgid "ward"
msgstr ""
@@ -4084,3 +4068,24 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] ""
msgstr[1] ""
+
+#~ msgid "Edit templates"
+#~ msgstr "Vorlagen editieren"
+
+#~ msgid "Publish the response"
+#~ msgstr "Antwort ver&ouml;ffentlichen"
+
+#~ msgid "Templates:"
+#~ msgstr "Vorlagen:"
+
+#~ msgid "Viewing a problem"
+#~ msgstr "Meldung anschauen"
+
+#~ msgid "New update:"
+#~ msgstr "Neue Antwort"
+
+#~ msgid "Please upload a JPEG image only\n"
+#~ msgstr "Bitte laden Sie nur JPEG Bilder hoch\n"
+
+#~ msgid "Thank you &mdash; you can <a href=\"%s\">view your updated problem</a> on the site."
+#~ msgstr "Danke &mdash; Sie k&ouml;nnen Ihre aktualisierte Meldung <a href=\"%s\">auf der Webseite anschauen</a>."
diff --git a/locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po
index 203311153..b62eb2089 100644
--- a/locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -10,18 +10,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:59+0000\n"
-"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
-"Language-Team: German (Germany) (http://www.transifex.com/projects/p/fixmystreet/language/de_DE/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
+"Last-Translator: mySociety <transifex@mysociety.org>\n"
+"Language-Team: German (Germany) (http://www.transifex.com/mysociety/fixmystreet/language/de_DE/)\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "und"
@@ -34,11 +34,13 @@ msgstr "und"
msgid " or "
msgstr "oder"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d bestätigte Alarme, %d unbestätigt"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
@@ -47,11 +49,13 @@ msgstr ""
msgid "%d edits by %s"
msgstr "%d bearbeitet von %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d Aktualisierungen in Echtzeit"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d Fragebögen versandt &ndash; %d beantwortet (%s%%)"
@@ -64,15 +68,47 @@ msgstr "%d an %d von %d"
msgid "%s - Summary reports"
msgstr "%s - Zusammenfassungen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s Stadtteil, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, gemeldet am %s"
@@ -84,59 +120,56 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr ""
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Ihr Name"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Ihre Telefonnummer"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr ""
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(geschlossen)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(gel&ouml;st)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(z.B. illegale Deponien, Strassensch&auml;den, Graffitis usw.)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(optional)"
@@ -144,25 +177,24 @@ msgstr "(optional)"
msgid "(public)"
msgstr "(öffentlich)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(gesendet an beide)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(ihre eMail-Adresse oder Telefonnummer werden nie angezeigt)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(ihre eMail-Adresse wird nie angezeigt)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- W&auml;hlen Sie eine Kategorie --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr ""
@@ -175,12 +207,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr ""
@@ -193,28 +227,22 @@ msgstr ""
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr ""
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -225,8 +253,8 @@ msgstr "<strong>Ja</strong>, ich habe ein Passwort"
msgid "About us"
msgstr "&Uuml;ber uns"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -248,7 +276,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -261,10 +289,15 @@ msgstr "F&uuml;ge neue Kategorie hinzu"
msgid "Add user"
msgstr "Benutzer hinzufügen"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "%s hinzugefügt"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Wartet auf Moderation"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Nochmals:"
@@ -277,21 +310,25 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr "Alarm %d deaktiviert (erstellt %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr ""
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Alle Meldungen"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Alle Meldungen"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alle Meldungen"
@@ -314,8 +351,7 @@ msgstr ""
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr ""
@@ -324,16 +360,12 @@ msgstr ""
msgid "Anonymous"
msgstr "Anonym"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonym:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Sind Sie ein Entwickler?"
@@ -348,22 +380,24 @@ msgstr "Gebiet abgedeckt"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -384,12 +418,12 @@ msgstr "Wartet auf Moderation"
msgid "Back"
msgstr "Zurück"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -409,12 +443,16 @@ msgstr ""
msgid "By Date"
msgstr "Nach Datum"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -425,27 +463,28 @@ msgstr ""
msgid "Category"
msgstr "Kategorie"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategorie:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategorie: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Passwort &auml;ndern"
@@ -478,54 +517,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klicken Sie in die Karte um eine Meldung zu erfassen"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Geschlossen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr ""
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Geschlossene Berichte"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Geschlossen:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Koordinaten:"
@@ -533,22 +578,22 @@ msgstr "Koordinaten:"
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Konfiguration"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Endpunkt konfigurieren"
@@ -556,7 +601,7 @@ msgstr "Endpunkt konfigurieren"
msgid "Confirm"
msgstr "Best&auml;tigen"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Konto bestätigen"
@@ -576,7 +621,7 @@ msgstr "Best&auml;tigung"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Best&auml;tigt"
@@ -587,13 +632,18 @@ msgstr "Bestätigte Berichte zwischen %s und %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Best&auml;tigt:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "FixMyStreet kontaktieren"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontaktieren Sie uns"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -608,8 +658,14 @@ msgstr "Kontaktieren Sie uns"
msgid "Contact the team"
msgstr "Kontaktieren Sie das Team"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinaten:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Benutzer konnte nicht gefunden werden"
@@ -627,7 +683,7 @@ msgstr ""
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -642,7 +698,7 @@ msgstr ""
msgid "Count"
msgstr "Anzahl"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Erfasse eine Meldung"
@@ -651,17 +707,19 @@ msgstr "Erfasse eine Meldung"
msgid "Create category"
msgstr "Kategorie erstellen"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Erfasse eine Meldung"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Erstellt"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Erstellt:"
@@ -671,10 +729,15 @@ msgid "Current state"
msgstr "Aktueller Status"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -684,11 +747,16 @@ msgstr "Übersichtsseite"
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Gel&ouml;scht"
@@ -706,9 +774,9 @@ msgstr "Beschreibung"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Beschreibung:"
@@ -716,23 +784,27 @@ msgstr "Beschreibung:"
msgid "Devolved"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "hat Karte nicht verwendet"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Weiss ich nicht"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Haben Sie ein FixMyBarangay-Passwort?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Haben Sie ein FixMyStreet-Passwort?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Weiß ich nicht"
@@ -740,8 +812,8 @@ msgstr "Weiß ich nicht"
msgid "Don't like forms?"
msgstr "Sie mögen keine Formulare?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -760,7 +832,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Bearbeiten"
@@ -771,7 +844,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -786,15 +859,15 @@ msgstr "Aktualisierung %d wird bearbeitet"
msgid "Editing user %d"
msgstr "Benutzer %d wird bearbeitet"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Editor"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -802,7 +875,7 @@ msgstr "Editor"
msgid "Email"
msgstr "E-Mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr ""
@@ -818,7 +891,7 @@ msgstr "E-Mail-Benachrichtigung erstellt"
msgid "Email alert deleted"
msgstr "E-Mail-Benachrichtigung gelöscht"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr ""
@@ -831,38 +904,36 @@ msgid "Email me updates"
msgstr "Schicken sie mir Aktualisierungen"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-Mail:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "E-Mail: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Leere Kneipe oder Bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -891,7 +962,7 @@ msgstr "Enddatum:"
msgid "Endpoint"
msgstr "Endpunkt"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -904,10 +975,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr "Geben Sie eine Adresse an"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Geben Sie eine Adresse an"
@@ -915,13 +984,12 @@ msgstr "Geben Sie eine Adresse an"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Geben Sie ein neues Passwort ein:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -932,7 +1000,6 @@ msgstr "Geben Sie ein Passwort ein"
msgid "Enter details of the problem"
msgstr "Beschreiben sie den Mangel"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -942,6 +1009,10 @@ msgstr "Beschreiben sie den Mangel"
msgid "Error"
msgstr "Fehler"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -955,12 +1026,19 @@ msgstr "Beispiele:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Zusätzliche Daten:"
@@ -973,8 +1051,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Berichtliste filtern"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Erstes Mal"
@@ -982,36 +1059,14 @@ msgstr "Erstes Mal"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet-Administrator:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1022,21 +1077,16 @@ msgstr ""
msgid "Fixed"
msgstr "Gel&ouml;st"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr ""
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr ""
@@ -1046,11 +1096,11 @@ msgstr ""
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1067,7 +1117,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr ""
@@ -1086,9 +1136,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Passwort vergessen?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Häufig gestellte Fragen"
@@ -1111,8 +1172,7 @@ msgstr "Aktualisierungen von %s Problemen holen"
msgid "Get updates of problems in this %s"
msgstr "Aktualisierungen von Problemen in diesem %s holen"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
@@ -1121,17 +1181,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Los"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1139,41 +1199,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Hilfe"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hallo %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1187,7 +1243,7 @@ msgstr "Alte ausblenden"
msgid "Hide pins"
msgstr "Stecknadeln ausblenden"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "History"
@@ -1203,7 +1259,7 @@ msgstr "Erfasse eine neue Meldung:"
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -1230,8 +1286,8 @@ msgstr "Leider konnte ihre URL nicht aufgel&ouml;st werden. Falls sie die URL au
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1249,18 +1305,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1270,16 +1314,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1309,7 +1352,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Unbekannt ID"
@@ -1334,14 +1377,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "In Bearbeitung"
@@ -1349,7 +1391,7 @@ msgstr "In Bearbeitung"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1361,12 +1403,12 @@ msgstr "Unbestätigte Berichte miteinbeziehen"
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Interne Hinweise"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1374,7 +1416,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Ung&ultiges Enddatum"
@@ -1382,12 +1424,12 @@ msgstr "Ung&ultiges Enddatum"
msgid "Invalid format %s specified."
msgstr "Ungültiges Format %s angegeben."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Ung&ultiges Startdatum"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1405,10 +1447,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1420,7 +1471,7 @@ msgstr ""
msgid "Last editor"
msgstr "Letzter Bearbeiter"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Letzte Bearbeitung"
@@ -1455,7 +1506,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "RSS"
@@ -1468,14 +1519,12 @@ msgid "MAP"
msgstr "KARTE"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Karte"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "als geschlossen markiert"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1493,6 +1542,14 @@ msgstr ""
msgid "Message"
msgstr "Nachricht"
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Nachricht:"
@@ -1520,27 +1577,25 @@ msgstr "Meldungen in der Nähe"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Name"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Name:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Name: %s"
@@ -1553,21 +1608,26 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Fast Fertig! Bitte checken Sie ihre Mailbox..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Fast Fertig! Bitte checken Sie ihre Mailbox..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Neue <br>Probleme"
@@ -1576,12 +1636,12 @@ msgstr "Neue <br>Probleme"
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Neue interne Anmerkung:"
@@ -1589,9 +1649,10 @@ msgstr "Neue interne Anmerkung:"
msgid "New local problems on FixMyStreet"
msgstr ""
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Neue lokale Berichte auf reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Neue interne Anmerkung:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1617,33 +1678,15 @@ msgstr ""
msgid "New reports"
msgstr "Neue Berichte"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Neue Berichte auf reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Neue Berichte an {{COUNCIL}} auf reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Neue Berichte innerhalb {{NAME}}s Grenze auf reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Neuer Status"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Neue Aktualisierung:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Neuer Status"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1656,14 +1699,12 @@ msgstr "Weiter"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nein"
@@ -1691,20 +1732,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Keine weiteren Aktualisierungen"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Keine Meldungen gefunden."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Bisher wurden noch keine Meldungen erfasst."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Kein Ergebnis zurückgegeben"
@@ -1722,8 +1754,6 @@ msgid "No supporters"
msgstr "Keine Unterstützer"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Keine"
@@ -1736,8 +1766,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1745,7 +1775,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Nicht verantwortlich"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Nicht verantwortlich"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1758,7 +1796,7 @@ msgid "Not reported to council"
msgstr ""
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Anmerkung"
@@ -1768,7 +1806,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Anmerkung:"
@@ -1777,22 +1815,20 @@ msgstr "Anmerkung:"
msgid "Note: <strong>%s</strong>"
msgstr "Anmerkung: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1822,20 +1858,18 @@ msgstr "Ältere <br>Probleme"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "&Ouml;ffnen"
@@ -1843,11 +1877,6 @@ msgstr "&Ouml;ffnen"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Offene Berichte"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1864,32 +1893,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Andere"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Besitzer"
@@ -1904,12 +1927,12 @@ msgstr "Seite nicht gefunden"
msgid "Parent"
msgstr "Übergeordnet"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Teilweise"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1918,6 +1941,7 @@ msgid "Password (optional)"
msgstr "Passwort (optional)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Passwort:"
@@ -1925,7 +1949,7 @@ msgstr "Passwort:"
msgid "Permalink"
msgstr "Permalink"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Telefonnummer"
@@ -1934,11 +1958,9 @@ msgstr "Telefonnummer"
msgid "Phone number (optional)"
msgstr "Telefonnummer (optional)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefonnummer:"
@@ -1949,14 +1971,23 @@ msgstr "Telefonnummer:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Diese Information wird ben&ouml;tigt"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Diese Information wird ben&ouml;tigt"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto:"
@@ -1968,22 +1999,18 @@ msgstr "Fotos von neuen Meldungen in der N&auml;he"
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Geplant"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Bitte seien Sie freundlich und pr&auml;gnant."
@@ -1993,22 +2020,20 @@ msgstr "Bitte seien Sie freundlich und pr&auml;gnant."
msgid "Please check the passwords and try again"
msgstr ""
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Bitte &uuml;berpr&uuml;fen sie ihre eMail"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Bitte &uuml;berpr&uuml;fen Sie ob Ihre eMail-Adresse korrekt ist"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2018,7 +2043,7 @@ msgstr "Bitte w&auml;hlen Sie eine Kategorie"
msgid "Please choose a property type"
msgstr "Bitte wählen Sie eine Eigentumsart"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2026,7 +2051,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2035,7 +2060,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Bitte geben Sie eine Nachricht ein"
@@ -2046,15 +2071,15 @@ msgstr "Bitte geben Sie eine Nachricht ein"
msgid "Please enter a password"
msgstr "Bitte geben Sie ein Passwort ein"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Bitte geben Sie einen Betreff ein"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2062,7 +2087,7 @@ msgid "Please enter a valid email"
msgstr "Bitte geben Sie eine g&uuml;ltige eMail-Adresse an"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Bitte geben Sie eine g&uuml;ltige eMail-Adresse an"
@@ -2071,21 +2096,19 @@ msgstr "Bitte geben Sie eine g&uuml;ltige eMail-Adresse an"
msgid "Please enter some details"
msgstr "Bitte geben Sie einiges Details an"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Bitte geben Sie Ihre eMail-Adresse an"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Bitte geben Sie eine Ihre eMail-Adresse an"
@@ -2098,8 +2121,8 @@ msgstr "Bitte geben Sie Ihren Vornamen ein"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2138,7 +2161,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2161,19 +2184,24 @@ msgstr ""
msgid "Please note:"
msgstr "Hinweise:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Bitte geben Sie ein Passwort ein"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2182,21 +2210,17 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Bitte nur ein JPEG-BIld hochladen"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Bitte schreiben Sie eine Nachricht"
@@ -2205,8 +2229,8 @@ msgid "Please write your update here"
msgstr "Bitte schreiben Sie hier Ihre Aktualisierung"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2227,22 +2251,36 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Vorherige"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Datenschutz"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privat"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Meldung"
@@ -2258,12 +2296,12 @@ msgstr "Problem %s bestätigt"
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problem als offen markiert."
@@ -2279,12 +2317,10 @@ msgstr "Meldungen"
msgid "Problems in this area"
msgstr "Meldungen in dieser Gegend"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Meldungen in der N&auml;he"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Meldungen auf der Karte"
@@ -2293,12 +2329,11 @@ msgstr "Meldungen auf der Karte"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Meldungen, welche k&uuml;rzlich gel&ouml;st wurden"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2310,20 +2345,17 @@ msgstr "Meldungen innerhalb %s"
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Probleme innerhalb %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Meldungen innerhalb %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Probleme innerhalb der Grenze von:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Immobilien-Adresse:"
@@ -2337,39 +2369,31 @@ msgstr "Eigentumstyp"
msgid "Provide an update"
msgstr "Meldung aktualisieren"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Foto veröffentlichen"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Fragebogen"
@@ -2385,12 +2409,11 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2416,8 +2439,7 @@ msgstr ""
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -2425,7 +2447,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2455,17 +2477,18 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr "Erhalten Sie Aktualisierungen dieser Meldung."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Recent local problems, %s"
+msgstr "K&uuml;rzlich erfasste Meldungen"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Kürzlich <br>repariert"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "K&uuml;rzlich erfasste Meldungen"
@@ -2473,23 +2496,28 @@ msgstr "K&uuml;rzlich erfasste Meldungen"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Fix My Z&uuml;rich wird prim&auml;r daf&uuml;r verwendet, physische M&auml;ngel zu melden, welche behoben werden k&ouml;nnen. Wenn Ihr Problem daf&uuml;r nicht passend erscheint, k&ouml;nnen sie die entsprechende Dienststelle weiterhin telefonisch oder per eMail erreichen."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Foto entfernen (kann nicht rückgängig gemacht werden!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "Benutzer bearbeiten"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Eine Meldung erfassen"
@@ -2498,7 +2526,7 @@ msgstr "Eine Meldung erfassen"
msgid "Report abuse"
msgstr "Missbrauch melden"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Bericht auf %s"
@@ -2507,63 +2535,59 @@ msgstr "Bericht auf %s"
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Melden sie M&auml;ngel an der Infrastruktur von Z&uuml;rich"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Anonym gemeldet um"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Vorher berichtet"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Gemeldet von %s um %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Vorher berichtet"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Anonym gemeldet von %s um %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Gemeldet von %s um %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Anonym gemeldet von %s um %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Gemeldet von %s um %s"
@@ -2571,18 +2595,22 @@ msgstr "Gemeldet von %s um %s"
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Berichte"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Verfassen Sie eine Meldung"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Berichte"
@@ -2595,18 +2623,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr "Berichte warten auf Moderation"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Berichte veröffentlicht"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Bericht erneut senden"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Richtiger Ort?"
@@ -2621,26 +2652,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Nach links drehen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Nach rechts drehen"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "Satellit"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "&Auml;nderungen speichern"
@@ -2653,7 +2690,7 @@ msgstr "Berichte suchen"
msgid "Search Users"
msgstr "Benutzer suchen"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Berichte suchen"
@@ -2685,20 +2722,24 @@ msgstr ""
msgid "Select an area"
msgstr "Wählen Sie ein Gebiet"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Offene Berichte"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Gesendet:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Dienst:"
@@ -2707,8 +2748,8 @@ msgstr "Dienst:"
msgid "Share"
msgstr "Teilen"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2724,34 +2765,23 @@ msgid "Show pins"
msgstr "Zeige Stecknadeln"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Anmelden"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Per E-Mail anmelden"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Melden Sie sich an oder erstellen Sie ein Konto"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Abmelden"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Angemeldet als %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2767,8 +2797,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2776,24 +2807,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Startdatum:"
@@ -2809,16 +2847,17 @@ msgstr "Status"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Status:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistiken"
@@ -2832,7 +2871,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Unterkategorie: %s"
@@ -2847,45 +2891,42 @@ msgstr "Titel"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Titel:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Abschicken"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Änderungen senden"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Fragebogen absenden"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Gesendet"
@@ -2896,18 +2937,19 @@ msgstr "Gesendet"
msgid "Subscribe"
msgstr "Abonnieren"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Zusammenfassung"
@@ -2918,7 +2960,7 @@ msgstr "Zusammenfassung"
msgid "Summary reports"
msgstr "Zusammenfassungsberichte"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Umfrage"
@@ -2926,9 +2968,18 @@ msgstr "Umfrage"
msgid "Survey Results"
msgstr "Umfrageergebnisse"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Aktualisierungen"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Text"
@@ -2937,6 +2988,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Text:"
@@ -2958,7 +3010,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr "Vielen Dank für Ihre Rückmeldung"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2966,7 +3018,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2984,20 +3036,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Das Problem wird jetzt erneut gesendet."
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Das Problem wird jetzt erneut gesendet."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Dieser Bericht kann nicht auf %s angeschaut werden."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Diese Meldung wurde von Fix My Z&uuml;rich entfernt."
@@ -3039,30 +3090,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Der Fehler war: %s"
@@ -3080,10 +3119,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3104,20 +3139,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3134,8 +3157,7 @@ msgstr "Die Passwörter stimmen nicht überein"
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3146,7 +3168,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3157,23 +3179,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3186,7 +3209,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr "Es gab ein Problem mit Ihrer Aktualisierung. Bitte versuchen Sie es erneut."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Es gab ein Problem mit Ihrem Bericht. Bitte versuchen Sie es erneut."
@@ -3226,16 +3249,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3249,7 +3272,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3276,55 +3299,68 @@ msgstr "Dieser Mangel ist in Bearbeitung"
msgid "This problem is old and of unknown status."
msgstr "Dieses Problem ist alt und hat einen unbekannten Status"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Dieser Bericht wartet auf Moderation."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Dieser Bericht ist aktuell als geschlossen markiert."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Dieser Bericht ist aktuell als behoben markiert."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Dieser Bericht ist aktuell als offen markiert."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Zeitleiste"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titel"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3340,8 +3376,8 @@ msgstr "Erneut versuchen"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3349,11 +3385,11 @@ msgstr ""
msgid "Unable to fix"
msgstr "Kann nicht behoben werden"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Unbest&auml;tigt"
@@ -3370,7 +3406,9 @@ msgstr "Unbekannter Benachrichtigungstyp"
msgid "Unknown error"
msgstr "Unbekannter Fehler"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Unbekannte Problemkennung"
@@ -3393,11 +3431,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3432,24 +3470,24 @@ msgstr "Aktualisierung:"
msgid "Updated"
msgstr "Aktualisiert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Aktualisiert!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Aktualisierungen"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3457,27 +3495,29 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr "Aktualisierungen auf {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "Aktualisierungen von %s Problemen holen"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Benutzer"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3485,23 +3525,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Benutzer"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Werte aktualisiert"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Bericht auf Seite ansehen"
@@ -3525,16 +3565,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3548,7 +3587,7 @@ msgstr "Ihre eMail wird nie angezeigt"
msgid "We never show your email address or phone number."
msgstr "Ihre eMail-Adresse oder Telefonnummer werden nie angezeigt"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3573,11 +3612,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Wann editiert"
@@ -3586,7 +3629,7 @@ msgstr "Wann editiert"
msgid "When sent"
msgstr "Wann gesendet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3594,16 +3637,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3629,15 +3678,13 @@ msgstr "Jahr"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ja"
@@ -3700,11 +3747,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3713,6 +3758,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3733,15 +3782,11 @@ msgstr "Sie haben Ihre E-Mail-Adresse erfolgreich bestätigt."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3752,18 +3797,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Möchten Sie wirklich erneut senden?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Ihre Berichte"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3772,22 +3815,17 @@ msgstr "Ihre Berichte"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Ihre eMail"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Ihre eMail-Adresse"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Ihre eMail-Adresse:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3797,24 +3835,23 @@ msgstr "Ihre eMail:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Ihr Name"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Ihr Name:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3827,19 +3864,15 @@ msgstr "Ihr Passwort wurde ge&auml;ndert"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Ihre Telefonnummer"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Ihre Meldung"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Ihre Meldungen"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Ihre Aktualisierungen"
@@ -3847,23 +3880,31 @@ msgstr "Ihre Aktualisierungen"
msgid "Your&nbsp;email:"
msgstr "Ihre&nbsp;E-Mail-Adresse:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Alle Meldungen"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "von %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Geschlossene Berichte"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "hat Karte nicht verwendet"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "z.B. ‘%s’ oder ‘%s’"
@@ -3872,17 +3913,22 @@ msgstr "z.B. ‘%s’ oder ‘%s’"
msgid "edit user"
msgstr "Benutzer bearbeiten"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Neue Berichte"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "von %d verschiedenen Benutzern"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "zuletzt aktualisiert %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "weniger als einer Minute"
@@ -3927,14 +3973,13 @@ msgstr "als geplant markiert"
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/v"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "oder"
@@ -3944,16 +3989,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3966,8 +4011,8 @@ msgstr "andere Gebiete:"
msgid "reopened"
msgstr "erneut geöffnet"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "ausloggen"
@@ -3983,17 +4028,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "heute"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Neue Berichte"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4017,7 +4065,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4031,7 +4079,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d Unterstützer"
msgstr[1] "%d Unterstützer"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4052,7 +4100,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4073,7 +4121,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> im letzten Monat behoben"
msgstr[1] "<big>%s</big> im letzten Monat gehoben"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4086,3 +4134,51 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] ""
msgstr[1] ""
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "FixMyStreet kontaktieren"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Haben Sie ein FixMyBarangay-Passwort?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet-Administrator:"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Neue lokale Berichte auf reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Neue Berichte auf reportemptyhomes.com"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Neue Berichte an {{COUNCIL}} auf reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Neue Berichte innerhalb {{NAME}}s Grenze auf reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Neue Aktualisierung:"
+
+#~ msgid "No problems found."
+#~ msgstr "Keine Meldungen gefunden."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Bisher wurden noch keine Meldungen erfasst."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Probleme innerhalb %s, FixMyStreet"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Per E-Mail anmelden"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Angemeldet als %s"
+
+#~ msgid "User"
+#~ msgstr "Benutzer"
+
+#~ msgid "Your email address:"
+#~ msgstr "Ihre eMail-Adresse:"
+
+#~ msgid "Your report"
+#~ msgstr "Ihre Meldung"
diff --git a/locale/el_GR.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/el_GR.UTF-8/LC_MESSAGES/FixMyStreet.po
index e649315ca..2270e2a01 100644
--- a/locale/el_GR.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/el_GR.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -4,6 +4,7 @@
# Matthew Somerville <matthew@mysociety.org>, 2011-06-03.
#
# Translators:
+# Adrian Pappas <pappasadrian@gmail.com>, 2015
# basanas1606, 2015
# basanas1606, 2015
# Theodore D <diamaltho@gmail.com>, 2015
@@ -13,18 +14,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
-"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/fixmystreet/language/el_GR/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-10-12 11:18+0000\n"
+"Last-Translator: Adrian Pappas <pappasadrian@gmail.com>\n"
+"Language-Team: Greek (Greece) (http://www.transifex.com/mysociety/fixmystreet/language/el_GR/)\n"
"Language: el_GR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "και"
@@ -37,11 +38,13 @@ msgstr "και"
msgid " or "
msgstr "ή"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d επιβεβαιωμένες ειδοποιήσεις, %d μη επιβεβαιωμένες"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d επαφές υπηÏεσίας &ndash; %d επιβεβαιωμένες, %d ανεπιβεβαίωτες"
@@ -50,11 +53,13 @@ msgstr "%d επαφές υπηÏεσίας &ndash; %d επιβεβαιωμένε
msgid "%d edits by %s"
msgstr "%d επεξεÏγασίες από &quot;%s&quot;"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d ζωντανές ενημεÏώσεις"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "στάλθηκαν %d εÏωτηματολόγια &ndash; %d απαντήθηκαν (%s%%)"
@@ -67,15 +72,52 @@ msgstr "%d μέχÏι %d από %d"
msgid "%s - Summary reports"
msgstr "%s - Συνοπτικές αναφοÏές"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr "Το FixMyStreet έχει μία ποικιλία από πηγές RSS και ειδοποιήσεις μέσω email για τα τοπικά Ï€Ïοβλήματα, καθώς και ειδοποιήσεις για έναν συγκεκÏιμένο τομέα ή υπηÏεσία, ή για όλα τα Ï€Ïοβλήματα σε μια οÏισμένη ακτίνα απόστασης από κάποια τοποθεσία."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr "Το FixMyStreet έχει μία ποικιλία από πηγές RSS και ειδοποιήσεις μέσω email για τα τοπικά Ï€Ïοβλήματα, καθώς και ειδοποιήσεις για έναν συγκεκÏιμένο τομέα ή υπηÏεσία, ή για όλα τα Ï€Ïοβλήματα σε μια οÏισμένη ακτίνα απόστασης από κάποια τοποθεσία."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s αναφ.:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"Το FixMyStreet στέλνει διαφοÏετικές κατηγοÏίες Ï€Ïοβλημάτων\n"
+"στις κατάλληλες υπηÏεσίες, οπότε κάποια Ï€Ïοβλήματα που στέλνονται σε μία υπηÏεσία μποÏεί να μην ταιÏιάζουν με τα Ï€ÏοκαθοÏισμένα ÏŒÏια της αÏμοδιότητάς της. Για παÏάδειγμα, μια αναφοÏά για ένα graffiti θα σταλεί στην υπηÏεσία που είναι αÏμόδια για την πεÏιοχή, άÏα θα εμφανίζεται και στις δÏο κατηγοÏίες ειδοποιήσεων της υπηÏεσίας, ενώ όσον αφοÏά την επικεφαλής υπηÏεσία θα εμφανίζεται μόνο στην κατηγοÏία ειδοποιήσεων \"Εντός του τομέα ευθÏνης\"."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s πεÏιοχή, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, έγινε αναφοÏά στο &quot;%s&quot;"
@@ -87,59 +129,57 @@ msgstr "%s, στην πεÏιοχή %quot;%s&quot;"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> και συνεÏγάτες"
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Μην ανησυχείς &mdash; θα παÏαμείνουμε στην ειδοποίησή σου μέχÏι να ελέγξεις το email σου.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Μην ανησυχείς &mdash; θα παÏαμείνουμε στην αναφοÏά του Ï€Ïοβλήματός σου μέχÏι να ελέγξεις το email σου.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Μην ανησυχείς &mdash; θα παÏαμείνουμε στην ενημέÏωσή σου μέχÏι να ελέγξεις το email σου.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(το email βÏίσκεται στη μαÏÏη λίστα)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Το όνομά σου"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Ο αÏιθμός τηλεφώνου σου"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(αντιστοιχεί σε πεÏιοχή όπου κατοικοÏν πεÏίπου 200.000 άτομα)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(εναλλακτικά, μποÏείς να λαμβάνεις ειδοποιήσεις για ζητήματα σε ακτίνα "
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(έκλεισε)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(διοÏθώθηκε)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(όπως graffiti, παÏατημένα σκουπίδια, σπασμένες πλάκες πεζοδÏομίου ή καμένα φώτα δÏόμων)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(δεν αποστάλθηκε σε υπηÏεσία)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(Ï€ÏοαιÏετικό)"
@@ -147,25 +187,24 @@ msgstr "(Ï€ÏοαιÏετικό)"
msgid "(public)"
msgstr "(φαίνεται δημόσια)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(στάλθηκε και στις δÏο)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(δεν φαίνεται ποτέ το email ή ο τηλεφωνικός αÏιθμός σου)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(δεν φαίνεται ποτέ το email σου)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Διάλεξε κατηγοÏία --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Διάλεξε είδος ακινήτου --"
@@ -181,12 +220,14 @@ msgstr ""
"Μάλλον γι'αυτό η κατηγοÏία \"πεÏιοχή αÏμοδιότητας\" είναι κενή (παÏακάτω).<br>\n"
"Μήπως να Ï€Ïοσθέσετε μεÏικά <code>MAPIT_TYPES</code> στο αÏχείο Ïυθμίσεων;"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Αν δεν μποÏείς να δεις τον χάÏτη, <a href='%s' rel='nofollow'>παÏάλειψε αυτό το βήμα</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> Ï€Ïοβλήματα τώÏα"
@@ -199,28 +240,22 @@ msgstr "<strong>Όχι</strong> Îα γίνει επιβεβαίωση της α
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Όχι</strong> Îα γίνει επιβεβαίωση της ενημέÏωσης μέσω email"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Όχι</strong> να συνδεθώ μέσω email"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Όχι<strong>, να συνδεθώ μέσω email:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Όχι<strong>, να γίνει επιβεβαίωση της αναφοÏάς μέσω email:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Όχι</strong>, να γίνει επιβεβαίωση της ενημέÏωσης μέσω email:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -231,8 +266,8 @@ msgstr "<strong>Îαι</strong> έχω κωδικό Ï€Ïόσβασης"
msgid "About us"
msgstr "Σχετικά με εμάς"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -256,7 +291,7 @@ msgstr "ΠÏόσθεσε μία επαφή χÏησιμοποιώντας την
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "ΠÏοσθήκη τομέα"
@@ -269,10 +304,15 @@ msgstr "ΠÏοσθήκη νέας κατηγοÏίας"
msgid "Add user"
msgstr "ΠÏοσθήκη χÏήστη"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "ΠÏοστέθηκε %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Σε αναμονή ελέγχου"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Ξανά:"
@@ -285,21 +325,25 @@ msgstr "Η ειδοποίηση %d δημιουÏγήθηκε για το &quot;
msgid "Alert %d disabled (created %s)"
msgstr "Η ειδοποίηση %d απενεÏγοποιήθηκε (δημιουÏγήθηκε %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Ειδοποίησέ με για μελλοντικές ενημεÏώσεις"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Όλες οι ΑναφοÏές"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Όλες οι ΑναφοÏές"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Όλες οι αναφοÏές"
@@ -322,8 +366,7 @@ msgstr "Όλες οι πληÏοφοÏίες που καταχωÏήθηκαν Î
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Όλες οι πληÏοφοÏίες που καταχωÏήθηκαν εδώ θα αποσταλοÏν στο <strong>&quot;%s&quot;</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Το Ï€Ïόβλημα ενημεÏώθηκε ως διοÏθωμένο."
@@ -332,16 +375,12 @@ msgstr "Το Ï€Ïόβλημα ενημεÏώθηκε ως διοÏθωμένο."
msgid "Anonymous"
msgstr "Ανώνυμος"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Ανώνυμος:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Είσαι <strong>Ï€ÏογÏαμματιστής</strong>; Θα ήθελες να συνεισφέÏεις στο FixMyStreet;"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Είσαι Ï€ÏογÏαμματιστής;"
@@ -356,22 +395,25 @@ msgstr "ΠεÏιοχή αÏμοδιότητας"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr "Δεδομένου ότι αυτό είναι ένα δοκιμαστικό site και το %s είναι ψευδές, οι αναφοÏές που γίνονται σε αυτό το site θα σταλοÏν στις δοκιμαστικές αναφοÏές Ï€Ïοβλημάτων και όχι στην κανονική επαφή που υπάÏχει για την κατηγοÏία αναφοÏάς των Ï€Ïοβλημάτων."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Ανάθεση σε εξωτεÏικό τομέα:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Ανάθεση σε διαφοÏετική κατηγοÏία:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Ανάθεση σε εξωτεÏικό τομέα:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Ανάθεση στο τμήμα:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Ανατέθηκε στο &quot;%s&quot;"
@@ -392,12 +434,12 @@ msgstr "Σε αναμονή ελέγχου"
msgid "Back"
msgstr "Πίσω"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Αποκλεισμός της διεÏθυνσης email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Τομείς"
@@ -417,12 +459,16 @@ msgstr "Τομέας:"
msgid "By Date"
msgstr "Ανά ημεÏομηνία"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Δεν μποÏείς να δεις τον χάÏτη; <em>ΠαÏάλειψη βήματος</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -433,27 +479,28 @@ msgstr "Δεν μποÏείς να δεις τον χάÏτη; <em>ΠαÏάλεÎ
msgid "Category"
msgstr "ΚατηγοÏία"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Μέσος ÏŒÏος διόÏθωσης Ï€Ïοβλημάτων για την κατηγοÏία > 4 εβδομάδες"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "ΚατηγοÏία:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "ΚατηγοÏία: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης"
@@ -495,54 +542,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr "Επίλεξε ένα όνομα <strong>κατηγοÏίας</strong> που να έχει νόημα για τους πολίτες (Ï€.χ., \"ΛακκοÏβες\", \"Φωτισμός δÏόμων\") αλλά είναι χÏήσιμο και για τον τομέα. Αυτά θα φαίνονται στο Î¼ÎµÎ½Î¿Ï Ï„Î·Ï‚ σελίδας \"ΑνάφεÏε ένα Ï€Ïόβλημα\"."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Κάνε κλικ εδώ ή κάνε εισαγωγή με τη μοÏφή ηη/μμ/εεεε"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Κάνε κλικ στον χάÏτη για να αναφέÏεις ένα Ï€Ïόβλημα"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Κλειστό"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Κλειστό από την υπηÏεσία"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Κλειστές αναφοÏές"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Κλειστό:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "ΚοντινότεÏα Ï€Ïοβλήματα <small>(σε ακτίνα %s χλμ)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Συντεταγμένες:"
@@ -550,22 +603,22 @@ msgstr "Συντεταγμένες:"
msgid "Cobrand"
msgstr "ΠÏοστεθέν σήμα"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Δεδομένα Ï€Ïοστεθέντος σήματος:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "ΠÏοστεθέν σήμα:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Ρυθμίσεις"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "ΡÏθμιση σημείου τεÏματισμοÏ"
@@ -573,7 +626,7 @@ msgstr "ΡÏθμιση σημείου τεÏματισμοÏ"
msgid "Confirm"
msgstr "Επιβεβαίωση"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Επιβεβαίωση λογαÏιασμοÏ"
@@ -593,7 +646,7 @@ msgstr "Επιβεβαίωση"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Επιβεβαιώθηκε"
@@ -604,13 +657,18 @@ msgstr "Επιβεβαιωμένες αναφοÏές Î¼ÎµÏ„Î±Î¾Ï %s και %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Επιβεβαιώθηκε:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Επικοινωνία με το FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Επικοινώνησε με εμάς"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -625,8 +683,14 @@ msgstr "Επικοινώνησε με εμάς"
msgid "Contact the team"
msgstr "Επικοινώνησε με την ομάδα διαχείÏισης"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Συντεταγμένες:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Δεν είναι δυνατή η εÏÏεση χÏήστη"
@@ -644,7 +708,7 @@ msgstr "ΥπηÏεσία"
msgid "Council contacts for %s"
msgstr "Επαφές υπηÏεσίας για &quot;%s&quot;"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "υπηÏεσία αναφ.:&nbsp;%s"
@@ -659,7 +723,7 @@ msgstr "ΥπηÏεσία:"
msgid "Count"
msgstr "ΚαταμέτÏηση"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "ΔημιουÏγία αναφοÏάς"
@@ -668,17 +732,19 @@ msgstr "ΔημιουÏγία αναφοÏάς"
msgid "Create category"
msgstr "ΔημιουÏγία κατηγοÏίας"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "ΔημιουÏγία αναφοÏάς"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "ΔημιουÏγήθηκε"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "ΔημιουÏγήθηκε:"
@@ -688,10 +754,15 @@ msgid "Current state"
msgstr "Κατάσταση"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Δεν έχουν δημιουÏγηθεί τομείς μέχÏι στιγμής."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -701,11 +772,16 @@ msgstr "Πίνακας Ελέγχου"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Εξετάστηκε από το τμήμα μέσα σε 5 εÏγάσιμες ημέÏες"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "ΔιαγÏαμμένα"
@@ -723,9 +799,9 @@ msgstr "ΠληÏοφοÏίες"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "ΠληÏοφοÏίες:"
@@ -733,23 +809,27 @@ msgstr "ΠληÏοφοÏίες:"
msgid "Devolved"
msgstr "Μεταβιβάστηκε"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "δεν χÏησιμοποιήθηκε χάÏτης"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Πίνακας βÏαβείων επιμέλειας"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Έχεις κωδικό Ï€Ïόσβασης για το FixMyBarangay;"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Έχεις κωδικό Ï€Ïόσβασης για το FixMyStreet;"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Δεν γνωÏίζω"
@@ -757,8 +837,8 @@ msgstr "Δεν γνωÏίζω"
msgid "Don't like forms?"
msgstr "Δεν σου αÏέσουν οι φόÏμες;"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -780,7 +860,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "ΕπεξεÏγασία"
@@ -791,7 +872,7 @@ msgstr "ΕπεξεÏγασία λεπτομεÏειών του τομέα"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -806,15 +887,15 @@ msgstr "Γίνεται επεξεÏγασία της ενημέÏωσης %d"
msgid "Editing user %d"
msgstr "Γίνεται επεξεÏγασία του χÏήστη %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "ΕπεξεÏγαστής"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -822,7 +903,7 @@ msgstr "ΕπεξεÏγαστής"
msgid "Email"
msgstr "Email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Το Email Ï€Ïοστέθηκε στην μαÏÏη λίστα"
@@ -838,7 +919,7 @@ msgstr "Η ειδοποίηση μέσω email δημιουÏγήθηκε"
msgid "Email alert deleted"
msgstr "Η ειδοποίηση μέσω email διεγÏάφη"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Το Email είναι ήδη στην μαÏÏη λίστα"
@@ -851,38 +932,36 @@ msgid "Email me updates"
msgstr "Στείλτε Email για ενημεÏώσεις"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Email: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Άδειο διαμέÏισμα ή μεζονέτα"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Άδειο σπίτι ή μονοκατοικία"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Άδειο γÏαφείο ή άλλος χώÏος εμποÏικής χÏήσης"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Άδειο μπαÏ"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Άδειο δημόσιο κτήÏιο - σχολείο, νοσοκομείο, κτλ."
@@ -918,7 +997,7 @@ msgstr "ΗμεÏομηνία Λήξης:"
msgid "Endpoint"
msgstr "Σημείο τεÏματισμοÏ"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Δώσε μια ονομασία για την οδό"
@@ -931,10 +1010,8 @@ msgstr "ΓÏάψε έναν κοντινό ταχυδÏομικό κώδικα,
msgid "Enter a nearby postcode, or street name and area"
msgstr "ΓÏάψε έναν κοντινό ταχυδÏομικό κώδικα, οδό ή πεÏιοχή"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "ΓÏάψε μία κοντινή οδό ή πεÏιοχή"
@@ -942,13 +1019,12 @@ msgstr "ΓÏάψε μία κοντινή οδό ή πεÏιοχή"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "ΓÏάψε μία κοντινή οδό, πεÏιοχή, ταχυδÏομικό κώδικα ή πεÏιφέÏεια"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "ΓÏάψε ένα νέο κωδικό Ï€Ïόσβασης:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -959,7 +1035,6 @@ msgstr "ΓÏάψε ένα κωδικό Ï€Ïόσβασης"
msgid "Enter details of the problem"
msgstr "ΓÏάψε λεπτομέÏειες σχετικά με το Ï€Ïόβλημα"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -969,6 +1044,10 @@ msgstr "ΓÏάψε λεπτομέÏειες σχετικά με το Ï€ÏόβλÎ
msgid "Error"
msgstr "Σφάλμα"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -982,12 +1061,20 @@ msgstr "ΠαÏαδείγματα:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "Εξήγησε ποιο είναι το Ï€Ïόβλημα, που βÏίσκεται ακÏιβώς και για πόσο καιÏÏŒ υπάÏχει..."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "ΕξωτεÏικός ΣÏνδεσμος"
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
-msgstr ""
+msgstr "ΕξωτεÏικός ΣÏνδεσμος"
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Επιπλέον δεδομένα:"
@@ -1000,8 +1087,7 @@ msgstr "Αποτυχία αποστολής μηνÏματος"
msgid "Filter report list"
msgstr "ΦίλτÏο λίστας αναφοÏάς"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "ΠÏώτη φοÏά"
@@ -1009,38 +1095,14 @@ msgstr "ΠÏώτη φοÏά"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "ΔιόÏθωσέ το επιλέγοντας μία <strong>πεÏιοχή αÏμοδιότητας</strong> στη φόÏμα <em>ΕπεξεÏγασία λεπτομεÏειών του σώματος</em> παÏακάτω."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "ΔιαχειÏιστής FixMyStreet:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr "Το FixMyStreet έχει μία ποικιλία από πηγές RSS και ειδοποιήσεις μέσω email για τα τοπικά Ï€Ïοβλήματα, καθώς και ειδοποιήσεις για έναν συγκεκÏιμένο τομέα ή υπηÏεσία, ή για όλα τα Ï€Ïοβλήματα σε μια οÏισμένη ακτίνα απόστασης από κάποια τοποθεσία."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"Το FixMyStreet στέλνει διαφοÏετικές κατηγοÏίες Ï€Ïοβλημάτων\n"
-"στις κατάλληλες υπηÏεσίες, οπότε κάποια Ï€Ïοβλήματα που στέλνονται σε μία υπηÏεσία μποÏεί να μην ταιÏιάζουν με τα Ï€ÏοκαθοÏισμένα ÏŒÏια της αÏμοδιότητάς της. Για παÏάδειγμα, μια αναφοÏά για ένα graffiti θα σταλεί στην υπηÏεσία που είναι αÏμόδια για την πεÏιοχή, άÏα θα εμφανίζεται και στις δÏο κατηγοÏίες ειδοποιήσεων της υπηÏεσίας, ενώ όσον αφοÏά την επικεφαλής υπηÏεσία θα εμφανίζεται μόνο στην κατηγοÏία ειδοποιήσεων \"Εντός του τομέα ευθÏνης\"."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1051,21 +1113,16 @@ msgstr ""
msgid "Fixed"
msgstr "ΔιοÏθώθηκε"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "ΔιοÏθώθηκε - ΥπηÏεσία"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "ΔιοÏθώθηκε - ΧÏήστης"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "ΑναφοÏές για ΔιοÏθωμένα"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "ΔιοÏθώθηκε:"
@@ -1075,11 +1132,11 @@ msgstr "ΔιοÏθώθηκε:"
msgid "Flag as deleted"
msgstr "Σήμανση ως διαγÏαμμένο"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Επισήμανση χÏήστη"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Επισημασμένα"
@@ -1096,7 +1153,7 @@ msgstr "Οι επισημασμένοι χÏήστες καταγÏάφονταÎ
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Οι επισημασμένοι χÏήστες δεν υφίστανται κάποιο είδος πεÏιοÏισμοÏ. Είναι απλά μία λίστα από χÏήστες που έχουν επισημανθεί ώστε να ξεχωÏίζουν."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Επισημασμένοι:"
@@ -1115,9 +1172,22 @@ msgstr "Για πεÏισσότεÏες πληÏοφοÏίες, δες <a href='
msgid "Forgotten your password?"
msgstr "Ξέχασες τον κωδικό Ï€Ïόσβασής σου;"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Ανάθεση σε εξωτεÏικό τομέα:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Ανάθεση σε εξωτεÏικό τομέα:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Συχνές ΕÏωτήσεις"
@@ -1140,8 +1210,7 @@ msgstr "Λήψη ενημεÏώσεων για Ï€Ïοβλήματα %s"
msgid "Get updates of problems in this %s"
msgstr "Λήψη ενημεÏώσεων για Ï€Ïοβλήματα σε αυτό το &quot;%s&quot;"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Λήψη μίας Ïοής RSS "
@@ -1150,17 +1219,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr "ΧαιÏόμαστε που φτιάχτηκε!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "ΕμπÏός"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "ΣκοπεÏεις να στείλεις εÏωτηματολόγιο;"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "ΓÏάφημα της δημιουÏγίας Ï€Ïοβλημάτων (κατάσταση Ï€Ïος χÏόνος)"
@@ -1168,41 +1237,37 @@ msgstr "ΓÏάφημα της δημιουÏγίας Ï€Ïοβλημάτων (κÎ
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Οι γκÏίζες ονομασίες είναι υπηÏεσίες που δεν υπάÏχουν πλέον."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "ΔιοÏθώθηκε το Ï€Ïόβλημα;"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Έχεις αναφέÏει ποτέ ξανά ένα Ï€Ïόβλημα στην υπηÏεσία ή αυτή είναι η Ï€Ïώτη φοÏά;"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Βοήθεια"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Αυτές είναι οι κατηγοÏίες ειδοποιήσεων για τοπικά Ï€Ïοβλήματα για &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Γεια %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1216,7 +1281,7 @@ msgstr "ΑπόκÏυψη παλιών"
msgid "Hide pins"
msgstr "ΑπόκÏυψη καÏφιτσών"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "ΙστοÏικό"
@@ -1232,7 +1297,7 @@ msgstr "Πώς να αναφέÏεις ένα Ï€Ïόβλημα"
msgid "How to send successful reports"
msgstr "Πώς να στείλεις επιτυχημένες αναφοÏές"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "ΦοβοÏμαστε ότι δε γίνεται να επιβεβαιώσεις ανεπιβεβαίωτες αναφοÏές."
@@ -1259,8 +1324,8 @@ msgstr "ΦοβοÏμαστε ότι δεν μποÏέσαμε να επαληθÎ
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "Ταυτότητα"
@@ -1280,18 +1345,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr "Αν δÏο ή πεÏισσότεÏοι τομείς υπηÏετοÏν την ίδια πεÏιοχή, το FixMyStreet συνδυάζει τις ίδιες κατηγοÏίες σε μία ενιαία καταχώÏιση στο μενοÏ. Αν θες να χÏησιμοποιήσεις αυτή τη δυνατότητα, βεβαιώσου ότι σε κάθε τομέα το όνομα της συγκεκÏιμένης κατηγοÏίας είναι ίδιο."
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Αλλιώς, η ειδοποίησή σας δεν θα υποβληθεί."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Αλλιώς, το Ï€Ïόβλημα δεν θα υποβληθεί."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Αλλιώς, η ενημέÏωση δεν θα υποβληθεί."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr "Αν μάθεις πεÏισσότεÏες πληÏοφοÏίες για την κατάσταση του Ï€Ïοβλήματός σου, σε παÏακαλοÏμε να επιστÏέψεις στην ιστοσελίδα και να γÏάψεις μια σχετική ενημέÏωση."
@@ -1301,16 +1354,16 @@ msgstr "Αν μάθεις πεÏισσότεÏες πληÏοφοÏίες για
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Αν υποβάλεις ένα Ï€Ïόβλημα εδώ, το θέμα και οι λεπτομέÏειες του Ï€Ïοβλήματος θα είναι δημόσιες, αλλά το Ï€Ïόβλημα <strong>δεν</strong> θα υποβληθεί στην υπηÏεσία."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Αν χÏησιμοποιείς διαδικτυακό email ή έχεις φίλτÏα \"ανεπιθÏμητης αλληλογÏαφίας\", έλεγξε τους φακέλους ανεπιθÏμητων/spam email: μεÏικές φοÏές, τα μηνÏματά μας επισημαίνονται έτσι."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr "Αν επιθυμείς να αφήσεις μία δημόσια ενημέÏωση για το Ï€Ïόβλημα, παÏακαλοÏμε γÏάψ' την εδώ (σημείωση: δεν θα αποσταλεί στην υπηÏεσία). Για παÏάδειγμα, ποια ήταν η εμπειÏία που είχες για την διόÏθωση του Ï€Ïοβλήματος;"
#: templates/web/base/admin/body.html:149
@@ -1342,7 +1395,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr "Αν έχεις ενεÏγοποιήσει την αποστολή ενημεÏώσεων μέσω Open311 παÏαπάνω, Ï€Ïέπει να Ï€ÏοσδιοÏίσεις ποιος <strong>χÏήστης</strong> του FixMyStreet θα χαÏακτηÏίζεται ως ο δημιουÏγός αυτών των ενημεÏώσεων όποτε εμφανίζονται στην ιστοσελίδα. ΠαÏακαλοÏμε γÏάψε τον αÏιθμό ID Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… χÏήστη."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Λανθασμένη ID"
@@ -1367,14 +1420,13 @@ msgstr "Î’Ïίσκεται στον πίνακα καταχÏήσεων;"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "Επιπλέον, θα επιστÏαφοÏν οι παÏακάτω ιδιότητες που δεν πεÏιλαμβάνονται στις Ï€ÏοδιαγÏαφές του Open311 v2: agency_sent_datetime, title (επιστÏέφεται επίσης ως μέÏος της πεÏιγÏαφής), interface_used, comment_count, requestor_name (υπάÏχει μόνο εφόσον ο αιτών επιτÏέψει την εμφάνιση του ονόματός του στην ιστοσελίδα)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Σε εξέλιξη"
@@ -1382,7 +1434,7 @@ msgstr "Σε εξέλιξη"
msgid "Inbox zero, here we come!"
msgstr "Δεν έχετε νέα μηνÏματα!"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Îα πεÏιλαμβάνονται οι Ï€Ïοσωπικές πληÏοφοÏίες του υποβολέα"
@@ -1394,12 +1446,12 @@ msgstr "Îα πεÏιλαμβάνονται μη επιβεβαιωμένες α
msgid "Incorrect has_photo value \"%s\""
msgstr "Εσφαλμένη τιμή has_photo \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "ΕσωτεÏικές οδηγίες"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "ΕσωτεÏική αναφοÏά"
@@ -1407,7 +1459,7 @@ msgstr "ΕσωτεÏική αναφοÏά"
msgid "Invalid agency_responsible value %s"
msgstr "Εσφαλμένη τιμή agency_responsible %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Λανθασμένη ημεÏομηνία λήξης"
@@ -1415,12 +1467,12 @@ msgstr "Λανθασμένη ημεÏομηνία λήξης"
msgid "Invalid format %s specified."
msgstr "Λανθασμένη μοÏφοποίηση %s."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Λανθασμένη ημεÏομηνία έναÏξης"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1438,10 +1490,19 @@ msgstr "Συχνά είναι γÏηγοÏότεÏο να <a href=\"%s\">ελέÎ
msgid "It’s on its way to the council right now."
msgstr "Το δημοτικό συμβοÏλιο ενημεÏώνεται για το Ï€Ïόβλημα."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1453,7 +1514,7 @@ msgstr "Îα παÏαμείνω συνδεδεμένος από αυτήν τη
msgid "Last editor"
msgstr "Τελευταίος επεξεÏγαστής"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Τελευταία ενημέÏωση"
@@ -1488,7 +1549,7 @@ msgstr "Τοπικές Ïοές RSS και ειδοποιήσεις email"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Τοπικές Ïοές RSS και ειδοποιήσεις email για ‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Τοπικές ειδοποιήσεις"
@@ -1501,14 +1562,12 @@ msgid "MAP"
msgstr "ΧΑΡΤΗΣ"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "ΧάÏτης"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "σημειωμένο ως κλειστό"
+msgstr "Σημείωση ως απεσταλμένο"
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1516,16 +1575,26 @@ msgstr "Îα επισημάνεις ως <strong>επισημασμένους</s
#: templates/web/base/reports/index.html:24
msgid "Marked fixed/closed in the past eight weeks"
-msgstr ""
+msgstr "Σημείωση ως επιδιοÏθωμένο/κλειστό μέσα στις τελευταίες οκτώ εβδομάδες"
#: templates/web/base/reports/index.html:25
msgid "Marked fixed/closed more than eight weeks ago"
-msgstr ""
+msgstr "Σημείωση ως επιδιοÏθωμένο/κλειστό πιο Ï€Ïιν από οκτώ εβδομάδες"
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Μήνυμα"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Ανάθεση σε εξωτεÏικό τομέα:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Ανάθεση σε εξωτεÏικό τομέα:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Μήνυμα:"
@@ -1553,27 +1622,25 @@ msgstr "ΠεÏισσότεÏα Ï€Ïοβλήματα στην πεÏιοχή"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Όνομα"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Όνομα:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Όνομα: %s"
@@ -1586,12 +1653,12 @@ msgstr "Η οδός που βÏίσκεται πλησιέστεÏα στην κ
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Ο ταχυδÏομικός κώδικας που βÏίσκεται πλησιέστεÏα στην καÏφίτσα που τοποθετήθηκε στον χάÏτη (παÏέχεται αυτόματα): %s (%sm μακÏιά)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Η οδός που βÏίσκεται πλησιέστεÏα στην καÏφίτσα που τοποθετήθηκε στον χάÏτη (παÏέχεται αυτόματα από το Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1599,10 +1666,15 @@ msgstr ""
"Η οδός που βÏίσκεται πλησιέστεÏα στην καÏφίτσα που τοποθετήθηκε στον χάÏτη (παÏέχεται αυτόματα από το Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Σχεδόν τελειώσαμε! ΤώÏα έλεγξε το email σου..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Σχεδόν τελειώσαμε! ΤώÏα έλεγξε το email σου..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Îέα <br>Ï€Ïοβλήματα"
@@ -1611,12 +1683,12 @@ msgstr "Îέα <br>Ï€Ïοβλήματα"
msgid "New body added"
msgstr "ΠÏοστέθηκε νέος τομέας"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "ΠÏοστέθηκε νέα επαφή κατηγοÏίας"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Îέα εσωτεÏική σημείωση:"
@@ -1624,9 +1696,10 @@ msgstr "Îέα εσωτεÏική σημείωση:"
msgid "New local problems on FixMyStreet"
msgstr "Îέα τοπικά Ï€Ïοβλήματα στο FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Îέες τοπικές αναφοÏές στο reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Îέα εσωτεÏική σημείωση:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1652,33 +1725,15 @@ msgstr "Îέα Ï€Ïοβλήματα στα ÏŒÏια του {{NAME}} στο FixMy
msgid "New reports"
msgstr "Îέες αναφοÏές"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Îέες αναφοÏές για το {{COUNCIL}} στην πεÏιοχή {{WARD}} στο reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Îέες αναφοÏές στο reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Îέες αναφοÏές στο reportemptyhomes.com κοντά στο {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Îέες αναφοÏές για το {{COUNCIL}} στο reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Îέες αναφοÏές στα ÏŒÏια του {{NAME}} στο reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Îέα κατάσταση"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Îέα ενημέÏωση:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Îέα κατάσταση"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1691,14 +1746,12 @@ msgstr "Επόμενο"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Όχι"
@@ -1726,20 +1779,11 @@ msgstr "Δε βÏέθηκαν επισημασμένα Ï€Ïοβλήματα."
msgid "No flagged users found."
msgstr "Δε βÏέθηκαν επισημασμένοι χÏήστες."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Καμία πεÏαιτέÏω ενημέÏωση"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Δε βÏέθηκαν Ï€Ïοβλήματα"
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Δεν έχει αναφεÏθεί κανένα Ï€Ïόβλημα μέχÏι στιγμής."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Δεν επιστÏάφηκαν αποτελέσματα."
@@ -1757,8 +1801,6 @@ msgid "No supporters"
msgstr "Δεν υπάÏχουν υποστηÏικτές"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Κανένα"
@@ -1774,8 +1816,8 @@ msgstr ""
"ΧÏήστες εξουσιοδοτημένου Ï€ÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï Î¼Ï€Î¿ÏοÏν να συσχετιστοÏν με τον τομέα που αντιπÏοσωπεÏουν.<br>\n"
"Ανάλογα με την υλοποίηση, οι χÏήστες Ï€ÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï Î¯ÏƒÏ‰Ï‚ έχουν Ï€Ïόσβαση στον πίνακα εÏγαλείων (πεÏίληψη της δÏαστηÏιότητάς τους μέσα στον τομέα), τη δυνατότητα να κÏÏβουν αναφοÏές ή να οÏίζουν ειδικές αναφοÏές κατάστασης."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1783,7 +1825,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Δεν είναι ΥπεÏθυνος"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Δεν είναι ΥπεÏθυνος"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Δεν αφοÏά το τμήμα μου"
@@ -1796,7 +1846,7 @@ msgid "Not reported to council"
msgstr "Δεν αναφέÏθηκε σε υπηÏεσία"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Σημείωση"
@@ -1806,7 +1856,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Όταν συμπεÏιλαμβάνουμε ανεπιβεβαίωτες αναφοÏές, χÏησιμοποιοÏμε την ημεÏομηνία που δημιουÏγήθηκε η αναφοÏά, η οποία ενδέχεται να μην έγινε στον ίδιο μήνα που επιβεβαιώθηκε η αναφοÏά. Επομένως, οι αÏιθμοί ίσως είναι λίγο εκτός."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Σημείωση:"
@@ -1815,22 +1865,20 @@ msgstr "Σημείωση:"
msgid "Note: <strong>%s</strong>"
msgstr "Σημείωση: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "ΤώÏα, για να υποβάλεις την αναφοÏά σου&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "ΤώÏα, για να υποβάλεις την αναφοÏά σου&hellip; έχεις κωδικό στο FixMyStreet;"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "ΤώÏα, για να υποβάλεις την ενημέÏωσή σου&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "ΤώÏα, για να υποβάλεις την ενημέÏωσή σου&hellip; έχεις κωδικό στο FixMyStreet;"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "ΟΚ"
@@ -1860,35 +1908,28 @@ msgstr "Παλιά <br>Ï€Ïοβλήματα"
msgid "One-line summary"
msgstr "ΠεÏίληψη μιας γÏαμμής"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Ανοιχτό"
#: templates/web/base/reports/index.html:22
msgid "Open for more than four weeks, with an update within the past eight weeks"
-msgstr ""
-
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Ανοιχτές αναφοÏές"
+msgstr "Ανοιχτό για πάνω από τέσσεÏις εβδομάδες, με κάποια ενημέÏωση μέσα στις τελευταίες οκτώ εβδομάδες"
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
-msgstr ""
+msgstr "Ανοιχτό, αλλά δεν έγινε κάποια ενημέÏωση εδώ και οκτώ εβδομάδες"
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
@@ -1902,32 +1943,26 @@ msgstr "ΑÏχική σελίδα του Open311"
msgid "Open311 specification"
msgstr "ΠÏοδιαγÏαφές Open311"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Ή Ï€Ïοβλήματα που αναφέÏθηκαν σε:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Ή μποÏείς να λαμβάνεις ειδοποιήσεις που αφοÏοÏν μία συγκεκÏιμένη υπηÏεσία της πεÏιοχής:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Άλλα"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Ο κώδικάς μας είναι open source και είναι <a href=\"http://github.com/mysociety/fixmystreet\">διαθέσιμος στο GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Ιδιοκτήτης"
@@ -1942,12 +1977,12 @@ msgstr "Η σελίδα δεν βÏέθηκε"
msgid "Parent"
msgstr "Πηγή"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Εν μέÏει"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1956,6 +1991,7 @@ msgid "Password (optional)"
msgstr "Κωδικός Ï€Ïόσβασης (Ï€ÏοαιÏετικό)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Îέος κωδικός Ï€Ïόσβασης:"
@@ -1963,7 +1999,7 @@ msgstr "Îέος κωδικός Ï€Ïόσβασης:"
msgid "Permalink"
msgstr "ΣÏνδεσμος"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "ΑÏιθμός τηλεφώνου"
@@ -1972,11 +2008,9 @@ msgstr "ΑÏιθμός τηλεφώνου"
msgid "Phone number (optional)"
msgstr "ΑÏιθμός τηλεφώνου (Ï€ÏοαιÏετικό)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Τηλέφωνο:"
@@ -1987,14 +2021,23 @@ msgstr "Τηλέφωνο:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "ΦωτογÏαφία"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Αυτή η πληÏοφοÏία απαιτείται"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Αυτή η πληÏοφοÏία απαιτείται"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "ΦωτογÏαφία:"
@@ -2006,22 +2049,18 @@ msgstr "ΦωτογÏαφίες από κοντινές και Ï€Ïόσφατες
msgid "Place pin on map"
msgstr "Θέση της πεÏιοχής στο χάÏτη"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "ΠÏογÏαμματίστηκε"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "ΠαÏακαλοÏμε <a class=\"tab_link\" href=\"#report\">Ïίξε μια ματιά</a> στις ενημεÏώσεις που έχουν μείνει."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "ΠαÏακαλοÏμε να είσαι ευγενικός, συνοπτικός και στο θέμα."
@@ -2031,22 +2070,20 @@ msgstr "ΠαÏακαλοÏμε να είσαι ευγενικός, συνοπτÎ
msgid "Please check the passwords and try again"
msgstr "ΠαÏακαλοÏμε έλεγξε τους κωδικοÏÏ‚ Ï€Ïόσβασης και Ï€Ïοσπάθησε πάλι."
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "ΠαÏακαλοÏμε έλεγξε το email σου"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "ΠαÏακαλοÏμε έλεγξε αν η διεÏθυνση email είναι σωστή"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2056,15 +2093,16 @@ msgstr "ΠαÏακαλοÏμε επίλεξε μια κατηγοÏία"
msgid "Please choose a property type"
msgstr "ΠαÏακαλοÏμε επίλεξε ένα είδος ακινήτου"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "ΠαÏακαλοÏμε διόÏθωσε τα παÏακάτω λάθη"
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr "ΠαÏακαλοÏμε <strong>μην</strong> αναφέÏεις Ï€Ïοβλήματα μέσω αυτής της φόÏμας. Τα μηνÏματα πηγαίνουν απευθείας στην ομάδα που βÏίσκεται πίσω από το FixMyStreet, όχι σε κάποια υπηÏεσία. Για να αναφέÏεις ένα Ï€Ïόβλημα, παÏακαλοÏμε <a href=\"/\">πήγαινε στην αÏχική σελίδα</a> και ακολοÏθησε τις οδηγίες."
@@ -2073,7 +2111,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "ΠαÏακαλοÏμε να μην κάνεις κατάχÏηση&nbsp;&mdash; η κατάχÏηση της υπηÏεσίας υποβαθμίζει την αξία της για όλους τους χÏήστες."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "ΠαÏακαλοÏμε γÏάψε ένα μήνυμα"
@@ -2084,15 +2122,15 @@ msgstr "ΠαÏακαλοÏμε γÏάψε ένα μήνυμα"
msgid "Please enter a password"
msgstr "ΠαÏακαλοÏμε γÏάψε έναν κωδικό Ï€Ïόσβασης"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "ΠαÏακαλοÏμε γÏάψε ένα θέμα"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2100,7 +2138,7 @@ msgid "Please enter a valid email"
msgstr "ΠαÏακαλοÏμε γÏάψε ένα έγκυÏο email"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "ΠαÏακαλοÏμε γÏάψε μία έγκυÏη διεÏθυνση email"
@@ -2109,21 +2147,19 @@ msgstr "ΠαÏακαλοÏμε γÏάψε μία έγκυÏη διεÏθυνση
msgid "Please enter some details"
msgstr "ΠαÏακαλοÏμε γÏάψε μεÏικές λεπτομέÏειες"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "ΠαÏακαλοÏμε γÏάψε το email σου"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "ΠαÏακαλοÏμε γÏάψε τη διεÏθυνση email σου"
@@ -2136,8 +2172,8 @@ msgstr "ΠαÏακαλοÏμε γÏάψε το όνομά σου"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "ΠαÏακαλοÏμε γÏάψε το ονοματεπώνυμό σου, οι υπηÏεσίες χÏειάζονται αυτή την πληÏοφοÏία – αν δεν επιθυμείς να εμφανίζεται το όνομά σου στην ιστοσελίδα, ξετσέκαÏε το πεδίο παÏακάτω"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2176,7 +2212,7 @@ msgstr "ΠαÏακαλοÏμε συμπλήÏωσε τις λεπτομέÏειÎ
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "ΠαÏακαλοÏμε συμπλήÏωσε την παÏακάτω φόÏμα με τις λεπτομέÏειες του Ï€Ïοβλήματος, και πεÏίγÏαψε την τοποθεσία όσο ακÏιβέστεÏα γίνεται στο πεδίο με τις λεπτομέÏειες."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "ΠαÏακαλοÏμε σήμανε αν θα ήθελες να λάβεις άλλο εÏωτηματολόγιο"
@@ -2199,19 +2235,24 @@ msgstr "ΠαÏακαλοÏμε σημείωσε ότι η αναφοÏά σου
msgid "Please note:"
msgstr "ΠαÏακαλοÏμε σημείωσε ότι:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "ΠαÏακαλοÏμε δώσε μεÏικές εξηγήσεις για τους λόγους που ξανανοίγεις αυτή την αναφοÏά"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "ΠαÏακαλοÏμε γÏάψε κείμενο καθώς και δώσε μία φωτογÏαφία"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "ΠαÏακαλοÏμε πες αν έχεις ξαναναφέÏει ένα Ï€Ïόβλημα στην υπηÏεσία στο παÏελθόν"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Επίλεξε ένα σώμα"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "ΠαÏακαλοÏμε επίλεξε τη Ïοή που επιθυμείς"
@@ -2220,21 +2261,17 @@ msgstr "ΠαÏακαλοÏμε επίλεξε τη Ïοή που επιθυμεÎ
msgid "Please select the type of alert you want"
msgstr "ΠαÏακαλοÏμε επίλεξε το είδος της ειδοποίησης που επιθυμείς"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "ΠαÏακαλοÏμε δήλωσε αν το Ï€Ïόβλημα έχει διοÏθωθεί ή όχι"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "ΠαÏακαλοÏμε Ïίξε μια ματιά στις ενημεÏώσεις που έχουν μείνει"
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "ΠαÏακαλοÏμε ανέβασε μία εικόνα JPEG μόνο"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "ΠαÏακαλοÏμε γÏάψε ένα μήνυμα"
@@ -2243,8 +2280,8 @@ msgid "Please write your update here"
msgstr "ΠαÏακαλοÏμε γÏάψε την ενημέÏωσή σου εδώ"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2265,22 +2302,36 @@ msgstr "ΔημοσιεÏθηκε από %s (<strong>%s</strong>) στις %s"
msgid "Posted by %s at %s"
msgstr "ΔημοσιεÏθηκε από %s στις %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "ΠÏοηγοÏμενα"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Ιδιωτικότητα"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Ιδιωτικό"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "ΠÏόβλημα"
@@ -2296,12 +2347,12 @@ msgstr "Το Ï€Ïόβλημα %s επιβεβαιώθηκε"
msgid "Problem %s sent to council %s"
msgstr "Το Ï€Ïόβλημα %s στάλθηκε στην υπηÏεσία %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Ανάλυση Ï€Ïοβλήματος ανά κατάσταση"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Το Ï€Ïόβλημα επισημάνθηκε ως ανοιχτό."
@@ -2317,12 +2368,10 @@ msgstr "ΠÏοβλήματα"
msgid "Problems in this area"
msgstr "ΠÏοβλήματα στην πεÏιοχή"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Κοντινά Ï€Ïοβλήματα"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "ΠÏοβλήματα στον χάÏτη"
@@ -2331,12 +2380,11 @@ msgstr "ΠÏοβλήματα στον χάÏτη"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "ΠÏοσφάτως αναφεÏθέντα Ï€Ïοβλήματα διοÏθωμένα στο FixMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Λήψη ειδοποιήσεων για Ï€Ïοβλήματα σε ακτίνα %.1f χλμ από εδώ"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2348,20 +2396,17 @@ msgstr "ΠÏοβλήματα στο &quot;%s&quot;"
msgid "Problems within %s ward"
msgstr "ΠÏοβλήματα στην πεÏιοχή &quot;%s&quot;"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "ΠÏοβλήματα σε ακτίνα %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "ΠÏοβλήματα στο &quot;%s&quot;"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "ΠÏοβλήματα μέσα στα ÏŒÏια του:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Ιδιοκτησίες που Ï€Ïόσφατα αναφέÏθηκε ότι επαναλειτουÏγοÏν στο reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "ΔιεÏθυνση ακινήτου:"
@@ -2375,39 +2420,31 @@ msgstr "Είδος ακινήτου:"
msgid "Provide an update"
msgstr "Δώσε μια ενημέÏωση"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Η εισαγωγή ονόματος και ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης είναι Ï€ÏοαιÏετική, αλλά έτσι θα σου είναι ευκολότεÏο να αναφέÏεις Ï€Ïοβλήματα, να αφήνεις ενημεÏώσεις και να διαχειÏίζεσαι τις αναφοÏές σου."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Η εισαγωγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης είναι Ï€ÏοαιÏετική, αλλά έτσι θα σου είναι ευκολότεÏο να αναφέÏεις Ï€Ïοβλήματα, να αφήνεις ενημεÏώσεις και να διαχειÏίζεσαι τις αναφοÏές σου."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Δημόσια απάντηση:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Δημοσίευσε τη φωτογÏαφία"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Δημοσίευσε την απάντηση"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "ΕÏωτηματολόγιο"
@@ -2423,12 +2460,11 @@ msgstr "Το εÏωτηματολόγιο %d στάλθηκε για το Ï€ÏÏŒ
msgid "Questionnaire filled in by problem reporter"
msgstr "Το εÏωτηματολόγιο συμπληÏώθηκε από τον υποβολέα του Ï€Ïοβλήματος"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2454,8 +2490,7 @@ msgstr "Ροή RSS από %s"
msgid "RSS feed of %s, within %s ward"
msgstr "Ροή RSS από %s, στην πεÏιοχή &quot;%s&quot;"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "Ροή RSS για κοντινά Ï€Ïοβλήματα"
@@ -2463,7 +2498,7 @@ msgstr "Ροή RSS για κοντινά Ï€Ïοβλήματα"
msgid "RSS feed of problems in this %s"
msgstr "Ροή RSS για Ï€Ïοβλήματα σε αυτό το &quot;%s&quot;"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2493,17 +2528,18 @@ msgstr "Ροή RSS για ενημεÏώσεις σε αυτό το Ï€Ïόβλη
msgid "Receive email when updates are left on this problem."
msgstr "Λήψη email όταν γίνονται ενημεÏώσεις για αυτό το Ï€Ïόβλημα"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "ΠÏόσφατα τοπικά Ï€Ïοβλήματα, FixMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "ΠÏόσφατα <br>διοÏθωμένα"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "ΠÏόσφατες αναφοÏές Ï€Ïοβλημάτων"
@@ -2511,23 +2547,28 @@ msgstr "ΠÏόσφατες αναφοÏές Ï€Ïοβλημάτων"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Θυμήσου ότι το FixMyStreet έχει ως Ï€ÏωταÏχικό σκοπό την αναφοÏά φυσικών Ï€Ïοβλημάτων που μποÏοÏν να διοÏθωθοÏν. Αν το Ï€Ïόβλημα δεν είναι κατάλληλο για υποβολή μέσω αυτής της ιστοσελίδας μποÏείς να επικοινωνήσεις με την υπηÏεσία απευθείας μέσω της ιστοσελίδας της."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "ΑφαίÏεση σήμανσης"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "ΑφαίÏεση φωτογÏαφίας (δεν αναιÏείται!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "επεξεÏγασία χÏήστη"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
-msgstr ""
+msgstr "ΑναφοÏά"
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "ΑναφοÏά Ï€Ïοβλήματος"
@@ -2536,7 +2577,7 @@ msgstr "ΑναφοÏά Ï€Ïοβλήματος"
msgid "Report abuse"
msgstr "ΑναφοÏά κατάχÏησης"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "ΑναφοÏά στο &quot;%s&quot;"
@@ -2545,83 +2586,82 @@ msgstr "ΑναφοÏά στο &quot;%s&quot;"
msgid "Report your problem"
msgstr "ΑνάφεÏε το Ï€Ïόβλημά σου"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "ΑνάφεÏε, δες ή συζήτησε τα τοπικά Ï€Ïοβλήματα"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "ΑναφέÏθηκε %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "ΑναφέÏθηκε %s, στο %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "ΑναφέÏθηκε ανώνυμα στις %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "ΑναφέÏθηκε Ï€Ïοηγουμένως"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "ΑναφέÏθηκε από %s στις %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "ΑναφέÏθηκε %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "ΑναφέÏθηκε στην κατηγοÏία %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "ΑναφέÏθηκε στην κατηγοÏία %s, ανώνυμα στις %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "ΑναφέÏθηκε στην κατηγοÏία %s από τον %s στις %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "ΑναφέÏθηκε μέσω %s ανώνυμα στις %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "ΑναφέÏθηκε μέσω %s από τον %s στις %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "ΑναφέÏθηκε μέσω %s στην κατηγοÏία %s ανώνυμα στις %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "ΑναφέÏθηκε μέσω %s στην κατηγοÏία %s από τον %s στις %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "ΑναφέÏθηκε στην κατηγοÏία %s"
+msgstr "ΑναφέÏθηκε μέσα στις τελευταίες τέσσεÏις εβδομάδες"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "ΑναφέÏθηκε %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "ΑναφοÏά Ï€Ïοβλήματος"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "ΑναφοÏές"
@@ -2634,18 +2674,21 @@ msgstr "Οι αναφοÏές έχουν ÏŒÏιο %s χαÏακτήÏων. ΠαÏ
msgid "Reports awaiting approval"
msgstr "ΑναφοÏές που αναμένουν έγκÏιση"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "ΑναφοÏές κοντά στον χάÏτη"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "ΑναφοÏές που δημοσιεÏθηκαν"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Επαναποστολή αναφοÏάς"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Σωστή τοποθεσία;"
@@ -2660,26 +2703,32 @@ msgstr "ΧειÏιστής δÏόμου για την ονομασμένη οδÏ
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "ΧειÏιστής δÏόμου για την ονομασμένη οδο (από το OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "ΠεÏιστÏοφή αÏιστεÏά"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "ΠεÏιστÏοφή δεξιά"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "ΔοÏυφόÏος"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Αποθήκευση αλλαγών"
@@ -2692,7 +2741,7 @@ msgstr "Αναζήτηση ΑναφοÏών"
msgid "Search Users"
msgstr "Αναζήτηση ΧÏηστών"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Αναζήτηση αναφοÏών"
@@ -2724,20 +2773,25 @@ msgstr "Επίλεξε μια συγκεκÏιμένη υπηÏεσία για Î
msgid "Select an area"
msgstr "Διάλεξε μια πεÏιοχή"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Διάλεξε ποιο είδος ειδοποίησης θα Ï€ÏοτιμοÏσες και μετά κάνε κλικ στο κουμπί για να οδηγηθείς σε μία Ïοή RSS, ή γÏάψε τη διεÏθυνση email σου για να ειδοποιείσαι μέσω email."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Ανοιχτές αναφοÏές"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Στάλθηκε στο %s %s αÏγότεÏα"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Στάλθηκε:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "ΥπηÏεσία:"
@@ -2746,8 +2800,8 @@ msgstr "ΥπηÏεσία:"
msgid "Share"
msgstr "Κοινοποίηση"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2763,34 +2817,23 @@ msgid "Show pins"
msgstr "ΠÏοβολή καÏφιτσών"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "ΣÏνδεση"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "ΣÏνδεση μέσω email"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "ΣÏνδεση ή δημιουÏγία λογαÏιασμοÏ"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "ΑποσÏνδεση"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Συνδεδεμένος ως %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "ΜεÏικές κατηγοÏίες ίσως απαιτοÏν Ï€Ïόσθετες πληÏοφοÏίες."
@@ -2806,8 +2849,9 @@ msgstr "ΜεÏικά σημεία τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î¯ÏƒÏ‰Ï‚ απαιτοÏ
msgid "Some photos of recent reports"
msgstr "ΜεÏικές φωτογÏαφίες από Ï€Ïόσφατες αναφοÏές"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Κείμενο για εντοπισμό"
@@ -2815,24 +2859,32 @@ msgstr "Κείμενο για εντοπισμό"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Συγνώμη, φαίνεται πως αυτός ο ταχυδÏομικός κώδικας είναι Crown dependency postcode, δεν καλÏπτουμε τέτοιους ΤΚ,"
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Συγνώμη, υπήÏξε βλάβη στην επιβεβαίωση του Ï€Ïοβλήματός σου."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Συγνώμη, δεν μποÏέσαμε να βÏοÏμε αυτήν την τοποθεσία."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Συγνώμη, δεν μποÏέσαμε να αναλÏσουμε αυτήν την τοποθεσία. ΠαÏακαλοÏμε Ï€Ïοσπάθησε ξανά."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Συγνώμη, δεν μποÏέσαμε να αναλÏσουμε αυτήν την τοποθεσία. ΠαÏακαλοÏμε Ï€Ïοσπάθησε ξανά."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "ΗμεÏομηνία ΈναÏξης:"
@@ -2848,16 +2900,17 @@ msgstr "Κατάσταση"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Κατάσταση:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Στατιστικά"
@@ -2871,7 +2924,12 @@ msgstr "Κατάσταση"
msgid "Still open, via questionnaire, %s"
msgstr "Ακόμη ανοιχτό, μέσω εÏωτηματολογίου, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "ΥποκατηγοÏία: %s"
@@ -2886,45 +2944,42 @@ msgstr "Θέμα"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Θέμα:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Υποβολή"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Υποβολή αλλαγών"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Υποβολή εÏωτηματολογίου"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Υποβλήθηκε"
@@ -2935,18 +2990,19 @@ msgstr "Υποβλήθηκε"
msgid "Subscribe"
msgstr "Γίνε συνδÏομητής"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Γίνε συνδÏομητής σε ειδοποιήσεις μέσω email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "ΠεÏίληψη"
@@ -2957,7 +3013,7 @@ msgstr "ΠεÏίληψη"
msgid "Summary reports"
msgstr "ΠεÏιληπτικές αναφοÏές"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "ΈÏευνα"
@@ -2965,9 +3021,18 @@ msgstr "ΈÏευνα"
msgid "Survey Results"
msgstr "Αποτελέσματα έÏευνας"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "ΕνημεÏώσεις"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Κείμενο"
@@ -2976,6 +3041,7 @@ msgid "Text only version"
msgstr "Έκδοση Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Κείμενο:"
@@ -2997,7 +3063,7 @@ msgstr "ΕυχαÏιστοÏμε που ενημέÏωσες αυτό το ζήÏ
msgid "Thank you for your feedback"
msgstr "ΕυχαÏιστοÏμε για την πληÏοφόÏηση"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "ΕυχαÏιστοÏμε που ανέβασες την φωτογÏαφία σου. ΤώÏα χÏειάζεται να εντοπίσουμε το Ï€Ïόβλημά σου, άÏα παÏακαλοÏμε γÏάψε μία κοντινή οδό ή ταχυδÏομικό κώδικα στο πεδίο από πάνω&nbsp;:"
@@ -3005,7 +3071,7 @@ msgstr "ΕυχαÏιστοÏμε που ανέβασες την φωτογÏαφ
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "ΕυχαÏιστοÏμε, χαιÏόμαστε που διοÏθώθηκε! ΜποÏοÏμε απλά να σε Ïωτήσουμε αν έχεις αναφέÏει ξανά κάποιο Ï€Ïόβλημα στην υπηÏεσία στο παÏελθόν;"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Η εικόνα δεν φαίνεται να έχει μεταφοÏτωθεί σωστά (%s), παÏακαλοÏμε Ï€Ïοσπάθησε ξανά."
@@ -3023,20 +3089,19 @@ msgstr "Η τοποθεσία δεν φαίνεται να βÏίσκεται σ
msgid "That postcode was not recognised, sorry."
msgstr "Ο ταχυδÏομικός κώδικας δεν αναγνωÏίστηκε, λυποÏμαστε."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Το Ï€Ïόβλημα τώÏα θα αποσταλθεί ξανά."
+msgstr "Αυτό το Ï€Ïόβλημα έχει σημειωθεί ως απεσταλμένο."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Το Ï€Ïόβλημα τώÏα θα αποσταλθεί ξανά."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Η αναφοÏά δεν μποÏεί να Ï€Ïοβληθεί σε %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Η αναφοÏά αφαιÏέθηκε από το FixMyStreet."
@@ -3084,30 +3149,18 @@ msgstr ""
"Το <strong>όνομα</strong> της υπηÏεσίας ταυτοποιεί την υπηÏεσία (για παÏάδειγμα, <em>ΥπηÏεσία ΚαθαÏιότητας</em>)\n"
"και ίσως Ï€Ïοβληθεί δημόσια."
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "<strong>Ίσως</strong> χÏειαστοÏν μεÏικά λεπτά για να φτάσει το email επιβεβαίωσης &mdash; <em>παÏακαλοÏμε</em> να είσαι υπομονετικός."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "Η υπηÏεσία δεν θα μποÏέσει να βοηθήσει εκτός αν συμπληÏώσεις όσες πεÏισσότεÏες λεπτομέÏειες μποÏείς. ΠαÏακαλοÏμε πεÏίγÏαψε την ακÏιβή τοποθεσία του Ï€Ïοβλήματος (για παÏάδειγμα: πάνω στον κόκκινο τοίχο), ποιο είναι αυτό, για πόσο καιÏÏŒ υπάÏχει, μία πεÏιγÏαφή (και μία φωτογÏαφία του Ï€Ïοβλήματος αν έχεις), κλπ."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Οι λεπτομέÏειες του Ï€Ïοβλήματός σου είναι διαθέσιμες από την άλλη καÏτέλα παÏαπάνω."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Οι λεπτομέÏειες του Ï€Ïοβλήματός σου είναι διαθέσιμες στην δεξιά πλευÏά αυτής της σελίδας."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "Ο πίνακας βÏαβείων επιμέλειας δείχνει τη δÏαστηÏιότητα των συντακτών (ποιος έχει συντάξει τις πεÏισσότεÏες καταγÏαφές)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Το σφάλμα ήταν: %s"
@@ -3125,10 +3178,6 @@ msgstr "Οι ακόλουθες πληÏοφοÏίες σχετικά με τηÎ
msgid "The latest local problems reported by users"
msgstr "Τα πιο Ï€Ïόσφατα τοπικά Ï€Ïοβλήματα που αναφέÏθηκαν από χÏήστες"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Οι πιο Ï€Ïόσφατες τοπικές αναφοÏές που αναφέÏθηκαν από χÏήστες"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Τα πιο Ï€Ïόσφατα Ï€Ïοβλήματα για το {{COUNCIL}} που αναφέÏθηκαν από χÏήστες"
@@ -3149,21 +3198,9 @@ msgstr "Τα πιο Ï€Ïόσφατα Ï€Ïοβλήματα που αναφέÏθÎ
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Τα πιο Ï€Ïόσφατα Ï€Ïοβλήματα στα ÏŒÏια του {{NAME}} που αναφέÏθηκαν από χÏήστες"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Οι πιο Ï€Ïόσφατες ιδιοκτησίες που αναφέÏθηκε από χÏήστες ότι επαναλειτουÏγοÏν"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Οι πιο Ï€Ïόσφατες αναφοÏές για το {{COUNCIL}} που αναφέÏθηκαν από χÏήστες"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Οι πιο Ï€Ïόσφατες αναφοÏές για το {{COUNCIL}} στην πεÏιοχή {{WARD}} που αναφέÏθηκαν από χÏήστες"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Οι πιο Ï€Ïόσφατες αναφοÏές στα ÏŒÏια του {{NAME}} που αναφέÏθηκαν από χÏήστες"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3179,8 +3216,7 @@ msgstr "Οι κωδικοί Ï€Ïόσβασης δεν ταιÏιάζουν"
msgid "The requested URL '%s' was not found on this server"
msgstr "Η ζητοÏμενη διεÏθυνση URL '%s' δε βÏέθηκε στον server"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Για να λαμβάνεις ειδοποιήσεις που αφοÏοÏν ζητήματα της πεÏιοχής:"
@@ -3191,7 +3227,7 @@ msgstr "Για να λαμβάνεις ειδοποιήσεις που αφοÏÎ
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "Η πεÏίληψη και η πεÏιγÏαφή θα είναι επίσης δημόσιες (δες την <a href=\"/privacy\">πολιτική αποÏÏήτου</a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Ο χÏήστης δεν μποÏέσε να εντοπίσει το Ï€Ïόβλημα στον χάÏτη, αλλά για να δει την πεÏιοχή κοντά στην τοποθεσία έγÏαψε"
@@ -3204,23 +3240,24 @@ msgstr ""
"Το <strong>όνομα</strong> του χÏήστη Ï€Ïοβάλλεται δημόσια σε αναφοÏές που δεν έχουν επισημανθεί ως <em>ανώνυμες</em>.\n"
"Τα ονόματα δεν είναι απαÏαιτήτως μοναδικά."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
-msgstr ""
+msgstr "Δεν υπάÏχουν αναφοÏές Ï€Ïος εμφάνιση."
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "ΥπήÏξε Ï€Ïόβλημα στην Ï€Ïοβολή της σελίδας Όλες οι ΑναφοÏές. ΠαÏακαλοÏμε Ï€Ïοσπάθησε ξανά αÏγότεÏα."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "ΥπήÏξε Ï€Ïόβλημα στην Ï€Ïοβολή αυτής της σελίδας. ΠαÏακαλοÏμε Ï€Ïοσπάθησε αÏγότεÏα."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "ΥπήÏξε Ï€Ïόβλημα με το συνδυασμό του email/ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασής σου. Αν δεν μποÏείς να θυμηθείς τον κωδικό σου, ή δεν έχεις, παÏακαλοÏμε συμπλήÏωσε τον τομέα &lsquo;σÏνδεση μέσω email&rsquo; αυτής της φόÏμας."
@@ -3233,7 +3270,7 @@ msgstr "ΥπήÏξε Ï€Ïόβλημα με τον συνδυασμό email/κωÎ
msgid "There was a problem with your update. Please try again."
msgstr "ΥπήÏξε Ï€Ïόβλημα με την ενημέÏωσή σου. ΠαÏακαλοÏμε Ï€Ïοσπάθησε ξανά."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "ΥπήÏξαν Ï€Ïοβλήματα με την αναφοÏά σου. ΠαÏακαλοÏμε δες παÏακάτω."
@@ -3281,16 +3318,16 @@ msgstr ""
"Αυτή η υπηÏεσία θα δέχεται μόνο αναφοÏές για Ï€Ïοβλήματα που βÏίσκονται στην <strong>πεÏιοχή αÏμοδιότητας της</strong>.\n"
"Μια υπηÏεσία δεν θα δέχεται καμία αναφοÏά, εκτός αν είναι αÏμόδια για τουλάχιστον μία πεÏιοχή."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Αυτό το email στάλθηκε και στις δÏο υπηÏεσίες που είναι αÏμόδιες για την τοποθεσία του Ï€Ïοβλήματος, μιας και ο χÏήστης δεν το κατηγοÏιοποίησε. ΠαÏακαλοÏμε αγνόησέ το αν η υπηÏεσία σου δεν είναι αÏμόδια για την αντιμετώπιση του ζητήματος, ή ενημέÏωσέ μας για τη σωστή κατηγοÏία του Ï€Ïοβλήματος ώστε να την Ï€Ïοσθέσουμε στο σÏστημα."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Αυτό το email στάλθηκε σε πολλές υπηÏεσίες που είναι αÏμόδιες για την τοποθεσία του Ï€Ïοβλήματος, Î±Ï†Î¿Ï Î· επιλεγμένη κατηγοÏία συμπεÏιλαμβάνεται σε κάθε μια από αυτές. ΠαÏακαλοÏμε αγνόησέ το αν η υπηÏεσία σου δεν είναι αÏμόδια για την αντιμετώπιση του ζητήματος."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3304,7 +3341,7 @@ msgstr "Αυτή είναι μια ιστοσελίδα για Ï€ÏογÏαμμÎ
msgid "This is a summary of all reports on this site."
msgstr "Αυτή είναι μια πεÏίληψη όλων των αναφοÏών σε αυτή την ιστοσελίδα"
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "Αυτό ίσως συμβαίνει επειδή ο σÏνδεσμος είναι παλιός ή ήδη χÏησιμοποιημένος, ή επειδή η διεÏθυνση δεν αντιγÏάφηκε σωστά."
@@ -3331,55 +3368,69 @@ msgstr "Αυτό το Ï€Ïόβλημα βÏίσκεται σε εξέλιξη"
msgid "This problem is old and of unknown status."
msgstr "Αυτό το Ï€Ïόβλημα είναι παλιό και σε άγνωστη κατάσταση."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Αυτή η αναφοÏά αναμένει έγκÏιση."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Αυτή η αναφοÏά είναι Ï€Ïος το παÏόν καταχωÏημένη ως κλειστή."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Αυτή η αναφοÏά είναι Ï€Ïος το παÏόν καταχωÏημένη ως διοÏθωμένη."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Αυτή η αναφοÏά είναι Ï€Ïος το παÏόν καταχωÏημένη ως ανοιχτή."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Αυτή η αναφοÏά υποβλήθηκε ανώνυμα"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Αυτή η ιστοσελίδα πεÏιέχει επίσης μία φωτογÏαφία του Ï€Ïοβλήματος, που παÏέχεται από το χÏήστη."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "ΧÏονοδιάγÏαμμα"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Τίτλος"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Για να <strong>αναφέÏεις ένα Ï€Ïόβλημα</strong>, κάνε κλικ στον χάÏτη στη σωστή τοποθεσία."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Τίτλος"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Για να βÏεις τις τοπικές ειδοποιήσεις που υπάÏχουν για σένα, παÏακαλοÏμε γÏάψε τον ταχυδÏομικό σου κώδικα, την οδό ή την πεÏιοχή σου."
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Για να βÏεις τις τοπικές ειδοποιήσεις που υπάÏχουν για σένα, παÏακαλοÏμε γÏάψε τον ταχυδÏομικό σου κώδικα, την οδό ή την πεÏιοχή σου."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Για την Ï€Ïοβολή ενός χάÏτη με την ακÏιβή τοποθεσία του ζητήματος"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3395,8 +3446,8 @@ msgstr "Δοκίμασε ξανά"
msgid "Try emailing us directly:"
msgstr "Στείλε μας ένα email:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3404,11 +3455,11 @@ msgstr "Στείλε μας ένα email:"
msgid "Unable to fix"
msgstr "Δεν είναι εφικτή η διόÏθωση"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Ανεπιβεβαίωτο"
@@ -3425,7 +3476,9 @@ msgstr "Άγνωστο είδος ειδοποίησης"
msgid "Unknown error"
msgstr "Άγνωστο σφάλμα"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Άγνωστη ταυτότητα Ï€Ïοβλήματος"
@@ -3448,11 +3501,11 @@ msgid "Update below added by %s at %s"
msgstr "Η παÏακάτω ενημέÏωση Ï€Ïοστέθηκε από %s στις %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "ΕνημέÏωση σώματος"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Ανάλυση ενημέÏωσης ανά κατάσταση"
@@ -3487,24 +3540,24 @@ msgstr "ΕνημέÏωση:"
msgid "Updated"
msgstr "ΕνημεÏώθηκε"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "ΕνημεÏώθηκε!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "ΕνημεÏώσεις"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "Οι ενημεÏώσεις έχουν ÏŒÏιο χαÏακτήÏων %s. ΠαÏακαλοÏμε συντόμευσε την ενημέÏωσή σου"
@@ -3512,27 +3565,30 @@ msgstr "Οι ενημεÏώσεις έχουν ÏŒÏιο χαÏακτήÏων %s.
msgid "Updates on {{title}}"
msgstr "ΕνημεÏώσεις για {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "ΕνημεÏώσεις για το Ï€Ïόβλημα, FixMyStreet"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "ΧÏησιμοποίησε την <strong>σημείωση</strong> για να καταγÏάψεις τις λεπτομέÏειες που θα φαίνονται στον διαχειÏιστή. Οι σημειώσεις δεν εμφανίζονται δημόσια και δεν αποστέλλονται στον τομέα."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "ΧÏήστης"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "χάÏτης σε χÏήση"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Η επισήμανση του χÏήστη αφαιÏέθηκε"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Ο χÏήστης επισημάνθηκε"
@@ -3540,23 +3596,23 @@ msgstr "Ο χÏήστης επισημάνθηκε"
msgid "User search finds matches in users' names and email addresses."
msgstr "Η αναζήτηση χÏηστών βÏίσκει αποτελέσματα για ονόματα χÏηστών και διευθÏνσεις email."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "ΧÏήστες"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Οι τιμές ενημεÏώθηκαν"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "ΠÏοβολή αναφοÏάς στην ιστοσελίδα"
@@ -3580,16 +3636,15 @@ msgid "Wards of this council"
msgstr "ΠτέÏυγες του συμβουλίου"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Î’Ïήκαμε παÏαπάνω από ένα αποτέλεσμα για αυτήν την τοποθεσία. Εδώ παÏουσιάζουμε 10 αποτελέσματα, παÏακαλοÏμε δοκίμασε άλλη αναζήτηση αν δε βÏήκες αυτό που έψαχνες."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Δεν μποÏέσαμε να επιβεβαιώσουμε το λογαÏιασμό σου - συγγνώμη."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Σου στείλαμε ένα email με ένα σÏνδεσμο για την επιβεβαίωση του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ¿Ï…."
@@ -3603,7 +3658,7 @@ msgstr "Δε δείχνουμε ποτέ το email σου"
msgid "We never show your email address or phone number."
msgstr "Δε δείχνουμε ποτέ το email ή το τηλέφωνό σου"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Καταλαβαίνουμε ότι το Ï€Ïόβλημα ίσως είναι στην ευθÏνη του %s. Ωστόσο, μέχÏι στιγμής δεν έχουμε πληÏοφοÏίες επικοινωνίας μαζί τους. Αν γνωÏίζεις μία κατάλληλη διεÏθυνση επικοινωνίας, παÏακαλοÏμε επικοινώνησε μαζί τους."
@@ -3628,11 +3683,15 @@ msgstr "Θα θέλαμε να ακοÏσουμε τι σκέφτεσαι για
msgid "We’ll get back to you as soon as we can."
msgstr "Θα σου απαντήσουμε όσο το δυνατόν συντομότεÏα."
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr "Ποιο είναι το θέμα και που βÏίσκεται;"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Όταν διοÏθώθηκε"
@@ -3641,7 +3700,7 @@ msgstr "Όταν διοÏθώθηκε"
msgid "When sent"
msgstr "Όταν αποστάλθηκε "
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "ΟλόκληÏο τετÏάγωνο από άδεια διαμεÏίσματα"
@@ -3649,16 +3708,22 @@ msgstr "ΟλόκληÏο τετÏάγωνο από άδεια διαμεÏίσμ
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr "Μόνο αυτό? <a href=\"/alert\">ΠÏόσθεσε πεÏισσότεÏες ειδοποιήσεις</a> δωÏεάν."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Με τις αναζητήσεις αιτημάτων, είναι επίσης δυνατό να αναζητήσεις με το πεδίο agency_responsible πεÏιοÏίζοντας τα αποτελέσματα στις αιτήσεις που στέλνονται σε έναν συγκεκÏιμένο τομέα. Ο ÏŒÏος αναζήτησης είναι ο Κωδικός (ID) ενός τομέα που παÏέχεται από το <a href=\"%s\">MapIt</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "Θα ήθελες να συνεισφέÏεις στο FixMyStreet; Ο κώδικας μας είναι ανοιχτής πηγής και <a href=\"http://fixmystreet.org\">διαθέσιμος στο fixmystreet.org</a>."
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Θα ήθελες να λάβεις και άλλο εÏωτηματολόγιο σε 4 εβδομάδες, για να σου υπενθυμίσει να ελέγξεις την Ï„Ïέχουσα κατάσταση;"
@@ -3684,15 +3749,13 @@ msgstr "Έτος"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Îαι"
@@ -3758,11 +3821,9 @@ msgstr "Έχεις υποχωÏήσει - παÏακαλοÏμε συμπλήÏÏ
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Έχεις ήδη απαντήσεις σε αυτό το εÏωτηματολόγιο. Αν έχεις κάποιος αποÏία, παÏακαλοÏμε <a href='%s'>επικοινώνησε</a>, ή <a href='%s'>δες το Ï€Ïόβλημά σου</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Έχεις ήδη Ï€Ïοσθέσει μια φωτογÏαφία σε αυτή την αναφοÏά, αν Ï€Ïοσθέσεις μια καινοÏÏια θα την αντικαταστήσει. "
@@ -3771,6 +3832,10 @@ msgstr "Έχεις ήδη Ï€Ïοσθέσει μια φωτογÏαφία σε α
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Έχεις ήδη Ï€Ïοσθέσει μια φωτογÏαφία σε αυτή την αναφοÏά, αν Ï€Ïοσθέσεις μια καινοÏÏια θα την αντικαταστήσει. "
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3791,15 +3856,11 @@ msgstr "Επιβεβαίωσες την διεÏθυνση email σου επιτ
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Έχεις με επιτυχία εγγÏαφεί, παÏακαλοÏμε έλεγξε και επιβεβαίωσε αν οι λεπτομέÏειες είναι σωστές:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Δεν έχεις υποβάλλει ακόμα κάποιες αναφοÏές. <a href=\"%s\">ΑνάφεÏε κάποιο Ï€Ïόβλημα τώÏα.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Θα Ï€Ïέπει να κάνεις κλικ πάνω στον σÏνδεσμο που σου αποστείλαμε μόλις τώÏα στο e-mail σου. "
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Θα Ï€Ïέπει να <a href=\"%s\">Ï€Ïοσθέσεις κάποιες υπηÏεσίες</a> (όπως υπηÏεσίες ή τομείς) Ï€Ïιν να είναι διαθέσιμη η αποστολή αναφοÏών."
@@ -3813,18 +3874,16 @@ msgstr ""
"τις κατηγοÏίες Ï€Ïοβλημάτων που αυτές μποÏοÏν να αντιμετωπίσουν (όπως πχ. λακκοÏβες ή φωτισμός δÏόμων)\n"
"και τις επαφές (όπως πχ. e-mail διευθÏνσεις) στις οποίες μποÏοÏν να αποσταλοÏν οι αναφοÏές."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Είσαι σίγουÏος ότι θέλεις να το ξαναστείλεις;"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Οι ΑναφοÏές σου"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3833,22 +3892,17 @@ msgstr "Οι ΑναφοÏές σου"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Το e-mail σου"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Η διεÏθυνση του e-mail σου"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Η διεÏθυνση του e-mail σου:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3858,24 +3912,23 @@ msgstr "Το e-mail σου:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Οι πληÏοφοÏίες σου θα χÏησιμοποιηθοÏν μόνο σÏμφωνα με την <a href=\"/privacy\">πολιτική αποÏÏήτου</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Το όνομά σου"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Το όνομά σου:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3888,19 +3941,15 @@ msgstr "Ο κωδικός σου έχει αλλάξει"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Ο αÏιθμός τηλεφώνου σου"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Η αναφοÏά σου"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Οι αναφοÏές σου"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Οι ενημεÏώσεις σου"
@@ -3908,23 +3957,31 @@ msgstr "Οι ενημεÏώσεις σου"
msgid "Your&nbsp;email:"
msgstr "Το&nbsp;e-mail σου:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Όλες οι αναφοÏές"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "από %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Κλειστές αναφοÏές"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "υπηÏεσία"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "δεν χÏησιμοποιήθηκε χάÏτης"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "π.χ. ‘%s’ ή ‘%s’"
@@ -3933,17 +3990,22 @@ msgstr "π.χ. ‘%s’ ή ‘%s’"
msgid "edit user"
msgstr "επεξεÏγασία χÏήστη"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "ΑναφοÏές για ΔιοÏθωμένα"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "από %d διαφοÏετικοÏÏ‚ χÏήστες"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "τελευταία ενημέÏωση %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "λιγότεÏο από ένα λεπτό"
@@ -3988,14 +4050,13 @@ msgstr "σημειωμένο ως Ï€ÏογÏαμματισμένο"
msgid "marked as unable to fix"
msgstr "σημειωμένο ως αδÏνατο να διοÏθωθεί"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "μη διαθέσιμο"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "ή"
@@ -4005,16 +4066,16 @@ msgstr "ή να βÏεθεί η τοποθεσία μου αυτόματα"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "αναφέÏθηκε αÏχικά από: &ldquo;%s&rdquo;"
@@ -4027,8 +4088,8 @@ msgstr "άλλες πεÏιοχές:"
msgid "reopened"
msgstr "άνοιξε ξανά"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "έξοδος"
@@ -4044,17 +4105,20 @@ msgstr "η τοπική υπηÏεσία"
msgid "there is no pin shown as the user did not use the map"
msgstr "δεν υπάÏχει καÏφίτσα στον χάÏτη επειδή ο χÏήστης δεν χÏησιμοποίησε τον χάÏτη"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "αυτή η κατηγοÏία Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï€Ïοβλήματος"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "σήμεÏα"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "ΑναφοÏές για ΔιοÏθωμένα"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "χάÏτης σε χÏήση"
@@ -4078,7 +4142,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> Ï€Ïόσφατη αναφοÏά"
msgstr[1] "<big>%s</big> Ï€Ïόσφατες αναφοÏές"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4092,7 +4156,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d υποστηÏικτής"
msgstr[1] "%d υποστηÏικτές"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4113,7 +4177,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Δεν έχουμε ακόμη λεπτομέÏειες για το συμβοÏλιο που είναι αÏμόδιο σε αυτήν την τοποθεσία."
msgstr[1] "Δεν έχουμε ακόμη λεπτομέÏειες για τις υπηÏεσίες που είναι αÏμόδιες σε αυτήν την τοποθεσία."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4134,7 +4198,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> διοÏθώθηκε μέσα στον Ï€ÏοηγοÏμενο μήνα"
msgstr[1] "<big>%s</big> διοÏθώθηκαν μέσα στον Ï€ÏοηγοÏμενο μήνα"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4148,5 +4212,143 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "<strong>Δεν</strong> έχουμε ακόμη λεπτομέÏειες για το άλλο συμβοÏλιο που είναι αÏμόδια σε αυτήν την τοποθεσία."
msgstr[1] "<strong>Δεν</strong> έχουμε ακόμη λεπτομέÏειες για τις υπόλοιπες υπηÏεσίες που είναι αÏμόδιες για αυτήν την τοποθεσία."
-#~ msgid "For council(s):"
-#~ msgstr "Για την υπηÏεσία (-ες):"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Μην ανησυχείς &mdash; θα παÏαμείνουμε στην ειδοποίησή σου μέχÏι να ελέγξεις το email σου.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Μην ανησυχείς &mdash; θα παÏαμείνουμε στην αναφοÏά του Ï€Ïοβλήματός σου μέχÏι να ελέγξεις το email σου.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Μην ανησυχείς &mdash; θα παÏαμείνουμε στην ενημέÏωσή σου μέχÏι να ελέγξεις το email σου.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Αν δεν μποÏείς να δεις τον χάÏτη, <a href='%s' rel='nofollow'>παÏάλειψε αυτό το βήμα</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Όχι<strong>, να συνδεθώ μέσω email:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Είσαι <strong>Ï€ÏογÏαμματιστής</strong>; Θα ήθελες να συνεισφέÏεις στο FixMyStreet;"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "ΚοντινότεÏα Ï€Ïοβλήματα <small>(σε ακτίνα %s χλμ)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Επικοινωνία με το FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Έχεις κωδικό Ï€Ïόσβασης για το FixMyBarangay;"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "ΔιαχειÏιστής FixMyStreet:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Αλλιώς, η ειδοποίησή σας δεν θα υποβληθεί."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Αλλιώς, το Ï€Ïόβλημα δεν θα υποβληθεί."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Αλλιώς, η ενημέÏωση δεν θα υποβληθεί."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Îέες τοπικές αναφοÏές στο reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Îέες αναφοÏές για το {{COUNCIL}} στην πεÏιοχή {{WARD}} στο reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Îέες αναφοÏές στο reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Îέες αναφοÏές στο reportemptyhomes.com κοντά στο {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Îέες αναφοÏές για το {{COUNCIL}} στο reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Îέες αναφοÏές στα ÏŒÏια του {{NAME}} στο reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Îέα ενημέÏωση:"
+
+#~ msgid "No problems found."
+#~ msgstr "Δε βÏέθηκαν Ï€Ïοβλήματα"
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Δεν έχει αναφεÏθεί κανένα Ï€Ïόβλημα μέχÏι στιγμής."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "ΤώÏα, για να υποβάλεις την αναφοÏά σου&hellip; έχεις κωδικό στο FixMyStreet;"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "ΤώÏα, για να υποβάλεις την ενημέÏωσή σου&hellip; έχεις κωδικό στο FixMyStreet;"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Ο κώδικάς μας είναι open source και είναι <a href=\"http://github.com/mysociety/fixmystreet\">διαθέσιμος στο GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "ΠαÏακαλοÏμε <a class=\"tab_link\" href=\"#report\">Ïίξε μια ματιά</a> στις ενημεÏώσεις που έχουν μείνει."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "ΠαÏακαλοÏμε Ïίξε μια ματιά στις ενημεÏώσεις που έχουν μείνει"
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "ΠÏοβλήματα σε ακτίνα %s, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Ιδιοκτησίες που Ï€Ïόσφατα αναφέÏθηκε ότι επαναλειτουÏγοÏν στο reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Δημοσίευσε την απάντηση"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "ΑναφέÏθηκε %s, στο %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "ΑναφοÏές κοντά στον χάÏτη"
+
+#~ msgid "Sign in by email"
+#~ msgstr "ΣÏνδεση μέσω email"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Συνδεδεμένος ως %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "<strong>Ίσως</strong> χÏειαστοÏν μεÏικά λεπτά για να φτάσει το email επιβεβαίωσης &mdash; <em>παÏακαλοÏμε</em> να είσαι υπομονετικός."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Οι λεπτομέÏειες του Ï€Ïοβλήματός σου είναι διαθέσιμες από την άλλη καÏτέλα παÏαπάνω."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Οι λεπτομέÏειες του Ï€Ïοβλήματός σου είναι διαθέσιμες στην δεξιά πλευÏά αυτής της σελίδας."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Οι πιο Ï€Ïόσφατες τοπικές αναφοÏές που αναφέÏθηκαν από χÏήστες"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Οι πιο Ï€Ïόσφατες ιδιοκτησίες που αναφέÏθηκε από χÏήστες ότι επαναλειτουÏγοÏν"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Οι πιο Ï€Ïόσφατες αναφοÏές για το {{COUNCIL}} που αναφέÏθηκαν από χÏήστες"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Οι πιο Ï€Ïόσφατες αναφοÏές για το {{COUNCIL}} στην πεÏιοχή {{WARD}} που αναφέÏθηκαν από χÏήστες"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Οι πιο Ï€Ïόσφατες αναφοÏές στα ÏŒÏια του {{NAME}} που αναφέÏθηκαν από χÏήστες"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Για να <strong>αναφέÏεις ένα Ï€Ïόβλημα</strong>, κάνε κλικ στον χάÏτη στη σωστή τοποθεσία."
+
+#~ msgid "User"
+#~ msgstr "ΧÏήστης"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Θα Ï€Ïέπει να κάνεις κλικ πάνω στον σÏνδεσμο που σου αποστείλαμε μόλις τώÏα στο e-mail σου. "
+
+#~ msgid "Your email address:"
+#~ msgstr "Η διεÏθυνση του e-mail σου:"
+
+#~ msgid "Your report"
+#~ msgstr "Η αναφοÏά σου"
diff --git a/locale/es.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/es.UTF-8/LC_MESSAGES/FixMyStreet.po
index d0b8e4873..de7197725 100644
--- a/locale/es.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/es.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -8,22 +8,23 @@
# jvlopez <jesusvlopez@gmail.com>, 2014
# lfalvarez <luisfelipealvarez@gmail.com>, 2014
# mySociety <transifex@mysociety.org>, 2015
+# Pedro Prieto martín <pedro.prieto-martin@ckyosei.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:32+0000\n"
-"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Spanish (http://www.transifex.com/projects/p/fixmystreet/language/es/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-09-11 09:05+0000\n"
+"Last-Translator: Pedro Prieto martín <pedro.prieto-martin@ckyosei.org>\n"
+"Language-Team: Spanish (http://www.transifex.com/mysociety/fixmystreet/language/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " y "
@@ -36,11 +37,13 @@ msgstr " y "
msgid " or "
msgstr " o "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
-msgstr "%d confirmado alertas, %d sin confirmar"
+msgstr "%d alertas confirmadas, %d sin confirmar"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d contactos en Ayuntamiento &ndash; %d confirmados, %d sin confirmar"
@@ -49,11 +52,13 @@ msgstr "%d contactos en Ayuntamiento &ndash; %d confirmados, %d sin confirmar"
msgid "%d edits by %s"
msgstr "%d ediciones por %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d actualizaciones en vivo"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d cuestionarios enviados &ndash; %d respondidos (%s%%)"
@@ -66,79 +71,122 @@ msgstr "%d a %d de %d"
msgid "%s - Summary reports"
msgstr "%s - Informes de notificación"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet dispone de varias listados RSS y de alertas por email de los problemas locales, incluyendo\n"
+"alertas de todos los problemas dentro de un distrito o ayuntamiento concreto, o de todos los problemas \n"
+"a una cierta distancia de un punto determinado."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet dispone de varias listados RSS y de alertas por email de los problemas locales, incluyendo\n"
+"alertas de todos los problemas dentro de un distrito o ayuntamiento concreto, o de todos los problemas \n"
+"a una cierta distancia de un punto determinado."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"FixMyStreet envía problemas de diferentes categorías\n"
+"al organismo administrativo apropiado, por lo que problemas notificados dentro de los límites de un ayuntamiento\n"
+"podrían no aparecer en la lista de problemas enviados a dicho ayuntamiento. Por ejemplo, una notificación de pintadas\n"
+"podría ser enviada directamente a la Diputación Provincial, por lo que aparecería en las áreas tanto del ayuntamiento como de la provincia, pero no aparecerá en la lista de problemas enviados al ayuntamiento."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s barrio, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, reportado el %s"
#: perllib/FixMyStreet/Cobrand/UK.pm:282 perllib/FixMyStreet/Cobrand/UK.pm:294
msgid "%s, within %s ward"
-msgstr "%s , en %s barrio"
+msgstr "%s, en %s barrio"
#: perllib/FixMyStreet/Map/OSM.pm:42
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
-msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> colaboradores"
-
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(No se preocupe &mdash; nosotors mantendremos su alerta mientras usted revisa su email.)"
+msgstr "&copy; colaboradores <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>"
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(No se preocupe &mdash; nosotros mantendremos su reporte mientras usted revisa su email.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(No se preocupe &mdash; nosotros mantendremos su actualización mientras usted revisa su email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
-msgstr "(Correo electrónico en el cuadro abuso)"
+msgstr "(email registrado en la tabla de abusos)"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Su nombre"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Su número de teléfono"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
-msgstr "(Una distancia predeterminada que cubre aproximadamente 200.000 personas)"
+msgstr "(distancia que cubre aproximadamente 200.000 personas)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
-msgstr "(O bien la fuente RSS se pueden personalizar, dentro de"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
+msgstr "(puedes ajustar la distancia a"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(cerrado)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(arreglado)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
-msgstr "(como graffitis, basura ilegal, pavimentación o alumbrado roto)"
+msgstr "(como pintadas, basuras, pavimento o alumbrado rotos)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
-msgstr "(sin enviar al Ayuntamiento)"
+msgstr "(no enviadas al ayuntamiento)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(opcional)"
@@ -146,25 +194,24 @@ msgstr "(opcional)"
msgid "(public)"
msgstr "(público)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(enviado a ambos)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
-msgstr "(nunca se muestra su dirección de correo electrónico o número de teléfono)"
+msgstr "(nunca mostramos su email ni su número de teléfono públicamente)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
-msgstr "(nunca se muestra su dirección de correo electrónico)"
+msgstr "(nunca mostramos su email públicamente)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
-msgstr "-- Elige una categoría --"
+msgstr "-- Escoja una categoría --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Escoja un tipo de propiedad --"
@@ -176,62 +223,58 @@ msgid ""
" This is probably why \"area covered\" is empty (below).<br>\n"
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-"<code>MAPIT_URL</code> está fijado (<code>%s</code>) pero no hay <code>MAPIT_TYPES</code>.<br>\n"
+"Se ha configurado <code>MAPIT_URL</code> (<code>%s</code>) pero no se han configurado <code>MAPIT_TYPES</code>.<br>\n"
"Probablemente por eso el \"area cubierta\" está vacía (abajo).<br>\n"
-"Habrá que añadir <code>MAPIT_TYPES</code> en su archivo de configuración?"
+"Por favor añada <code>MAPIT_TYPES</code> en su archivo de configuración."
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Si no puede ver el mapa, <a href='%s' rel='nofollow'> omita este paso</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> notificaciones en curso"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:39
msgid "<strong>No</strong> Let me confirm my report by email"
-msgstr "<strong>No</strong> permítanme confirmar mi notificación por email"
+msgstr "<strong>No</strong>- confirmar mi notificación por email"
#: templates/web/fixmystreet/report/update-form.html:112
msgid "<strong>No</strong> Let me confirm my update by email"
-msgstr "<strong>No</strong> permítanme confirmar mi actualización por email"
+msgstr "<strong>No</strong>- confirmar mi actualización por email"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
-msgstr "<strong>No</strong> permítanme registrarme por email"
-
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>No</strong>, no lo haré, permítanme registrarme por email:"
+msgstr "<strong>No</strong>- permítanme registrarme por email"
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
-msgstr "<strong>No</strong>, permítanme confirmar mi notificación por email:"
+msgstr "<strong>No</strong>- confirmar mi notificación por email:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
-msgstr "<strong>No</strong>, permítanme confirmar mi actualización por correo electrónico:"
+msgstr "<strong>No</strong>- confirmar mi actualización por email:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
-msgstr "<strong>Sí</strong> tengo una contraseña"
+msgstr "<strong>Sí</strong>- tengo una contraseña"
#: templates/web/base/static/about-en-gb.html:1
#: templates/web/base/static/about-en-gb.html:3
msgid "About us"
msgstr "¿Quiénes somos?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -247,16 +290,16 @@ msgid ""
" categories of problem) to each body."
msgstr ""
"Agregue un <strong>órgano</strong> para cada órgano administrativo, por ejemplo una municipalidad o departamento\n"
-"al cual se le puedan enviar los reportes. Se pueden agregar uno o más contactos (para diferentes\n"
-"categorias de problemas) a cada órgano."
+"al que se puede enviar las notificaciones. Puedes asignar uno o más contactos a cada\n"
+"órgano para las diferentes categorías de problemas."
#: templates/web/base/admin/body.html:56
msgid "Add a contact using the form below."
-msgstr "Añada un contacto usando el siguiente formulario"
+msgstr "Añada un contacto usando el siguiente formulario."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Agregue un órgano"
@@ -267,39 +310,48 @@ msgstr "Agregar nueva categoría"
#: templates/web/base/admin/users.html:47
msgid "Add user"
-msgstr "Añade un usuario"
+msgstr "Añadir un usuario"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Añadido %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "En espera de revisión"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Otra vez:"
#: templates/web/base/admin/timeline.html:35
msgid "Alert %d created for %s, type %s, parameters %s / %s"
-msgstr "Alerta %d creada por %s , tipo %s , los parámetros %s / %s"
+msgstr "Alerta %d creada por %s, tipo %s, parámetros %s / %s"
#: templates/web/base/admin/timeline.html:37
msgid "Alert %d disabled (created %s)"
msgstr "Alerta %d desactivada (creada %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
-msgstr "Avisarme de las actualizaciones futuras"
+msgstr "Notificadme actualizaciones futuras"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Todas las notificaciones"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Todas las notificaciones"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Todas las notificaciones"
@@ -307,11 +359,11 @@ msgstr "Todas las notificaciones"
#: templates/web/base/admin/stats.html:5
#: templates/web/zurich/admin/stats.html:8
msgid "All reports between %s and %s"
-msgstr "Todos los reportes entre %s y %s"
+msgstr "Todas las notificaciones entre %s y %s"
#: templates/web/base/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
-msgstr "Toda la información proporcionada será enviada a"
+msgstr "Toda la información que proporcione será enviada a"
#: templates/web/base/report/new/councils_text_all.html:2
#: templates/web/base/report/new/councils_text_all.html:4
@@ -320,28 +372,23 @@ msgstr "Toda la información proporcionada será enviada a"
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:11
msgid "All the information you provide here will be sent to <strong>%s</strong>."
-msgstr "Toda la información proporcionada será enviada a <strong>%s</strong>."
+msgstr "Toda la información que proporcione será enviada al <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
-msgstr "Una actualización marcó esta notificación como arreglada."
+msgstr "Una actualización marcó este problema como arreglado."
#: templates/web/base/admin/list_updates.html:32
#: templates/web/base/admin/problem_row.html:20
msgid "Anonymous"
msgstr "Anónimo"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anónimo:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "¿Eres <strong>programador</strong>? ¿Te gustaría contribuir a FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "¿Eres programador?"
@@ -349,80 +396,87 @@ msgstr "¿Eres programador?"
#: templates/web/base/admin/body.html:16
#: templates/web/zurich/admin/body-form.html:24
msgid "Area covered"
-msgstr "Area cubierta"
+msgstr "Ãrea cubierta"
#: templates/web/base/admin/bodies.html:15
#: templates/web/base/admin/body.html:60
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
-msgstr "Como se trata de un lugar y %s es falsa, los informes realizados en este sitio serán enviados al administrador del sitio para su resolución, no al contacto dado para la categoría del informe."
+msgstr "Puesto que éste es un servidor de integración y %s es falsa, las notificaciones serán enviados al email del propio informante, no al contacto establecido para la categoría de problema."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Asignar a un órgano externo:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
-msgstr "Asigne a otra categoria"
+msgstr "Asigne a otra categoria:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Asignar a un órgano externo:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
-msgstr "Asigne a la subdivisión"
+msgstr "Asigne a la subdivisión:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Asignado a %s"
#: templates/web/base/open311/index.html:84
msgid "At most %d requests are returned in each query. The returned requests are ordered by requested_datetime, so to get all requests, do several searches with rolling start_date and end_date."
-msgstr "Se devuelven como máximo %d solicitudes por cada consulta. Las solicitudes devueltas se ordenan por requested_datetime, así que para obtener todas las solicitudes, es necesario hacer varias secuencias de búsqueda con start_date y end_date."
+msgstr "Se devuelven hasta %d solicitudes en cada consulta. Dichas solicitudes se ordenan de acuerdo a la fecha de comienzo, así que para obtener todas las solicitudes es necesario hacer varias solicitudes ajustando la fecha de comienzo y final."
#: templates/web/base/open311/index.html:76
msgid "At the moment only searching for and looking at reports work."
-msgstr "Por el momento sólo funcionan las búsquedas y las vistas de notificaciones."
+msgstr "Por el momento sólo funcionan la búsqueda y consulta de notificaciones."
#: perllib/FixMyStreet/DB/Result/Problem.pm:373
#: templates/web/zurich/report/_item.html:11
msgid "Awaiting moderation"
-msgstr "En espera de moderación"
+msgstr "En espera de revisión"
#: templates/web/base/js/translation_strings.html:32
msgid "Back"
msgstr "Atras"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
-msgstr "Prohibir dirección de email"
+msgstr "Suspender este email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
-msgstr "Cuerpos"
+msgstr "Órganos administrativos"
#: templates/web/base/admin/flagged.html:17
#: templates/web/base/admin/reports.html:14
#: templates/web/base/admin/users.html:17
msgid "Body"
-msgstr "Órgano"
+msgstr "Órgano administrativo"
#: templates/web/base/admin/report_edit.html:34
#: templates/web/base/admin/user-form.html:32
msgid "Body:"
-msgstr "Órgano:"
+msgstr "Órgano administrativo:"
#: templates/web/base/admin/stats.html:80
msgid "By Date"
msgstr "Por Fecha"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "¿No puedes ver el mapa? <em>Salte este paso</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -433,27 +487,28 @@ msgstr "¿No puedes ver el mapa? <em>Salte este paso</em>"
msgid "Category"
msgstr "Categoría"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
-msgstr "Categoría ratio de arreglo de problemas > 4 semanas"
+msgstr "Ratio de arreglo de problemas > 4 semanas"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Categoría:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Categoría: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Cambiar contraseña"
@@ -470,8 +525,8 @@ msgid ""
"Check <strong>deleted</strong> to remove the category from use. \n"
" It will not appear as an available category in the drop-down menu on the report-a-problem page."
msgstr ""
-"Marcar <strong>borrado</ strong> para eliminar la categoría de uso. \n"
-"No va a aparecer como una categoría disponible en el menú desplegable que aparece cuando informa de un problema."
+"Marcar <strong>borrado</ strong> para dejar de usar la categoría. \n"
+"Dejará de aparecer en el menú desplegable que se muestra al notificar los problemas."
#: templates/web/base/admin/body.html:191
msgid ""
@@ -483,7 +538,7 @@ msgid ""
" interest in displaying the report. In the UK, we've used this for services like requesting an extra rubbish bin\n"
" at a specific address."
msgstr ""
-"Check <strong>privado</strong> si los reportes en esta categoría <strong>no deben ser desplegados en el sitio</strong>.\n"
+"Marcar <strong>privado</strong> si los reportes en esta categoría <strong>no deben ser desplegados en el sitio</strong>.\n"
"\n"
"Normalmente, las categorías no son privadas.\n"
"\n"
@@ -496,57 +551,63 @@ msgid ""
"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
-"Elegir un nombre de la <strong>categoria</strong> que tenga sentido para el público (por ejemplo, \"baches\", \"El alumbrado público\"), pero es útil\n"
-"para el organismo también. Estos aparecerán en el menú desplegable cuando informe de un problema."
+"Elegir un nombre de <strong>categoria</strong> que tenga sentido para el público (por ejemplo, \"baches\", \"alumbrado público\") y que sea también útil\n"
+"para el organismo administrativo. Las categorías aparecerán en un menú desplegable al notificar un problema."
+
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Haga click aqui o introduzca dd/mm/yyyy"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Haga clic en el mapa para notificar un problema"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Cerrada"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
-msgstr "Cerrado por el Ayuntamiento"
-
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Informes cerrados"
+msgstr "Cerrada por el Ayuntamiento"
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
-msgstr "Cerrado:"
-
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Problemas cercanos <small>(dentro de %%s km)</small>"
+msgstr "Cerrada:"
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Coordenadas:"
@@ -554,22 +615,22 @@ msgstr "Coordenadas:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Datos cobrand:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Configuración"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Configurar punto"
@@ -577,14 +638,14 @@ msgstr "Configurar punto"
msgid "Confirm"
msgstr "Confirmar"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Confirmar cuenta"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:33
#: templates/web/fixmystreet/report/update-form.html:107
msgid "Confirm by email below, providing a new password at that point. When you confirm, your password will be updated."
-msgstr "Confirme por correo electrónico a continuación, proporcionando una nueva contraseña en ese punto. Al confirmar, su contraseña se actualizará."
+msgstr "Confirme por email, proporcionando una nueva contraseña. Al confirmar, su contraseña se actualizará."
#: templates/web/base/questionnaire/creator_fixed.html:1
#: templates/web/base/tokens/confirm_problem.html:1
@@ -597,24 +658,29 @@ msgstr "Confirmación"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Confirmado"
#: templates/web/base/admin/stats.html:5
msgid "Confirmed reports between %s and %s"
-msgstr "Informes confirmados entre %s y %s"
+msgstr "Notificaciones confirmadas entre %s y %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
-msgstr "Confirmado:"
+msgstr "Confirmada:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Contactar FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Contáctenos"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -629,10 +695,16 @@ msgstr "Contáctenos"
msgid "Contact the team"
msgstr "Contactar con el equipo"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Coordenadas:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
-msgstr "No se pudo encontrar usuario"
+msgstr "No se pudo encontrar el usuario"
#: templates/web/base/js/translation_strings.html:37
msgid "Could not look up location"
@@ -646,11 +718,11 @@ msgstr "Ayuntamiento"
#: templates/web/base/admin/category_edit.html:1
#: templates/web/zurich/admin/body.html:1
msgid "Council contacts for %s"
-msgstr "Contactos del Ayuntamiento para %s"
+msgstr "Contactos del ayuntamiento para %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
-msgstr "referencia Ayuntamiento:&nbsp;%s"
+msgstr "Referencia del ayuntamiento:&nbsp;%s"
#: templates/web/base/admin/stats.html:84
msgid "Council:"
@@ -663,7 +735,7 @@ msgstr "Ayuntamiento:"
msgid "Count"
msgstr "Total"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Crear una notificación"
@@ -672,17 +744,19 @@ msgstr "Crear una notificación"
msgid "Create category"
msgstr "Crear una categoría"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Crear una notificación"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Creado"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Creado:"
@@ -692,9 +766,14 @@ msgid "Current state"
msgstr "Estado actual"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
-msgstr "Actualmente no se han creado organismos."
+msgstr "No se han creado organismos aún."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
@@ -705,11 +784,16 @@ msgstr "Cuadro de mando"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Tratado por el departamento dentro de los 5 días hábiles"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Eliminado"
@@ -727,9 +811,9 @@ msgstr "Detalles"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detalles:"
@@ -737,32 +821,36 @@ msgstr "Detalles:"
msgid "Devolved"
msgstr "Transferido"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "no utilizó mapa"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Ranking de premios a la constancia"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "¿Tiene una contraseña FixMyBarangay?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "¿Tiene una contraseña FixMyStreet?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
-msgstr "No lo se"
+msgstr "No lo sé"
#: templates/web/fixmystreet/contact/index.html:118
msgid "Don't like forms?"
msgstr "¿No te gustan los formularios?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -777,48 +865,49 @@ msgid ""
" This means you can add many categories even if you only have one contact for the body.\n"
" "
msgstr ""
-"Cada contacto para el órgano tiene una categoría, el cual es desplegado al público.\n"
-"Diferentes categorías <strong>pueden tener el mismo contacto</strong> (email).\n"
+"Cada categoría de problema tiene asignado un contacto (email) en el órgano administrativo.\n"
+"Diferentes categorías <strong>pueden tener el mismo contacto</strong>.\n"
"Esto significa que puede agregar muchas categorías incluso si tiene un solo contacto para el órgano."
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Editar"
#: templates/web/base/admin/body.html:220
#: templates/web/zurich/admin/body.html:71
msgid "Edit body details"
-msgstr "Editar los detalles del órgano"
+msgstr "Editar los detalles del órgano administrativo"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
-msgstr "Editando problema %d"
+msgstr "Editando el problema %d"
#: templates/web/base/admin/update_edit.html:1
#: templates/web/zurich/admin/update_edit.html:1
msgid "Editing update %d"
-msgstr "Editando actualización %d"
+msgstr "Editando la actualización %d"
#: templates/web/base/admin/user_edit.html:1
msgid "Editing user %d"
-msgstr "Editando usuario %d"
+msgstr "Editando el usuario %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Editor"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -826,9 +915,9 @@ msgstr "Editor"
msgid "Email"
msgstr "Email:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
-msgstr "Email añadido a lista de abusos"
+msgstr "Email añadido a lista de abusones"
#: templates/web/base/admin/body.html:155
msgid "Email address:"
@@ -842,51 +931,49 @@ msgstr "Creada alerta de email"
msgid "Email alert deleted"
msgstr "Borrada alerta de email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
-msgstr "Email ya incluido en lista de abusos"
+msgstr "Email ya incluido en la lista de abusones"
#: templates/web/base/around/_updates.html:5
msgid "Email me new local problems"
-msgstr "Reciba por email nuevos problemas locales"
+msgstr "Reciba por email notificaciones sobre los nuevos problemas"
#: templates/web/base/report/display.html:38
msgid "Email me updates"
msgstr "Recibir por email actualizaciones"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Email: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Piso o duplex vacío"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Casa o bungalow vacío"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Oficina u otros establecimientos comerciales vacíos"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Pub o bar vacío"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Edificio público vacío - escuela, hospital, etc"
@@ -898,9 +985,9 @@ msgid ""
" For more information, see \n"
" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
msgstr ""
-"Activar <strong>Open311 para notificación de incidencias</strong> si el Ayuntamiento lo usa para enviar y recibir\n"
-"notificaciones y actualizaciones. Si no está seguro, mejor no lo active.\n"
-"Para más información vea\n"
+"Activar <strong>Open311 envío de actualizaciones</strong> si el organismo enviará y recibirá\n"
+"actualizaciones de las notificaciones existentes. Si no está seguro, mejor no lo active.\n"
+"Para obtener más información, consulte\n"
"<a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>este documento</a>."
#: templates/web/base/admin/body-form.html:222
@@ -910,8 +997,8 @@ msgid ""
" different endpoint (and send method) from the body's. For example, if reports for some categories of\n"
" problem must be emailed, while others can be sent over Open311."
msgstr ""
-"Habilitar esto <strong>para ser transferido</ strong> establecer si uno o más contactos tienen unos\n"
-"límites diferentes (y enviar método) desde el organismo. Por ejemplo, si los informes para algunas categorías de \n"
+"Activar <strong>puede ser transferido</ strong> para establecer si uno o más contactos del órgano administrativo\n"
+"tienen diferentes vías para recibir (y enviar) actualizaciones. Por ejemplo, si los informes para algunas categorías de \n"
"incidencia deben ser enviadas por correo electrónico, mientras que otros pueden ser enviados a través Open311."
#: templates/web/base/admin/stats.html:70
@@ -922,37 +1009,34 @@ msgstr "Fecha final:"
msgid "Endpoint"
msgstr "Punto final"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
-msgstr "Introduzca un Z&uuml;rich nombre de calle"
+msgstr "Introduzca un nombre de calle de Z&uuml;rich"
#: perllib/FixMyStreet/Cobrand/UK.pm:13
msgid "Enter a nearby UK postcode, or street name and area"
-msgstr "Introduzca un código postal cercano de su región, o nombre de la calle y el área"
+msgstr "Introduzca un código postal cercano, o el nombre de la calle y el área"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:20
#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:21
msgid "Enter a nearby postcode, or street name and area"
-msgstr "Introduzca un código postal cercano, o nombre de la calle y el área"
+msgstr "Introduzca un código postal cercano, o el nombre de la calle y el área"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
-msgstr "Introduzca un nombre de la calle y la zona cercana"
+msgstr "Introduzca el nombre de una calle cercana"
#: perllib/FixMyStreet/Cobrand/ZeroTB.pm:7
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Introduzca un nombre de calle cercana y área, código postal o distrito en Nueva Delhi"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Introduzca una nueva contraseña:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -963,7 +1047,6 @@ msgstr "Introduzca una contraseña"
msgid "Enter details of the problem"
msgstr "Introduzca detalles del problema"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -973,6 +1056,10 @@ msgstr "Introduzca detalles del problema"
msgid "Error"
msgstr "Error"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -984,14 +1071,22 @@ msgstr "Ejemplos:"
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
-msgstr "Explique lo que está mal, exactamente donde está, y el tiempo que ha estado ahí ..."
+msgstr "Explique el problema o incidencia, su localización exacta, cuánto tiempo lleva ahí..."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "URL Externo"
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
-msgstr ""
+msgstr "URL Externo"
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Datos adicionales:"
@@ -1004,54 +1099,22 @@ msgstr "Fallo en el envío del mensaje"
msgid "Filter report list"
msgstr "Filtrar lista de informes"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Primera vez"
#: templates/web/base/admin/body.html:48
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
-msgstr "Arreglar esto eligiendo un <strong>área cubierta</ strong> en <em>Editar detalles del organismo</ em> del siguiente formulario."
+msgstr "Arreglar esto eligiendo un <strong>área cubierta</ strong> en el formulario <em>Editar detalles del organismo</ em> a continuación."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "Admin FixMyStreet:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreet dispone de varias fuentes RSS y alertas por email de los problemas locales, incluyendo\n"
-"alertas para todos los problemas dentro de un barrio o ayuntamiento concreto, o para todos los problemas \n"
-"alrededor de una distancia determinada o zona en particular."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"FixMyStreet envía problemas de diferentes categorías\n"
-" a la Concejalía adecuada en el Ayuntamiento, por lo cual los problemas dentro de los límites de una determinada Concejalía\n"
-" pueden no responden a los problemas enviados. Por ejemplo, una notificación de graffiti\n"
-" se enviará a la Concejalía de Distritos, por lo que aparecerá tanto en el distrito de alertas\n"
-" council, pero sólo aparecerán en la carpeta \"Dentro del límite\" alerta \n"
-" para la Diputación Provincial."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1062,21 +1125,16 @@ msgstr ""
msgid "Fixed"
msgstr "Arreglado"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Arreglado - Ayuntamiento"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Arreglado - Usuario"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Notificaciones arregladas"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Arreglado:"
@@ -1086,11 +1144,11 @@ msgstr "Arreglado:"
msgid "Flag as deleted"
msgstr "Marcar como borrado"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Marca usuario"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Marcado"
@@ -1105,9 +1163,9 @@ msgstr "Los usuarios marcados se listan en página de<a href='%s'>marcados</a>"
#: templates/web/base/admin/flagged.html:31
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
-msgstr "Los usuarios marcados no se limitan de ninguna manera. Esto es sólo una lista de usuarios que se han marcado para la atención."
+msgstr "Las capacidades de los \"usuarios marcados\" no se limitan de ninguna manera. Es solo una lista de usuarios que han sido marcado para observación."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Marcado:"
@@ -1115,7 +1173,7 @@ msgstr "Marcado:"
#: templates/web/base/reports/_ward-list.html:3
#: templates/web/fixmystreet/reports/_ward-list.html:4
msgid "Follow a ward link to view only reports within that ward."
-msgstr "Clic en el enlace de un barrio para ver solo las notificaciones en ese barrio"
+msgstr "Haga clic en el enlace de un barrio para ver solo sus notificaciones."
#: templates/web/base/admin/body-form.html:65
msgid "For more information, see <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>How FixMyStreet uses Mapit</a>."
@@ -1126,11 +1184,24 @@ msgstr "Para más información, vea <a href='http://fixmystreet.org/customising/
msgid "Forgotten your password?"
msgstr "¿Olvidó su contraseña?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Asignar a un órgano externo:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Asignar a un órgano externo:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
-msgstr "Preguntas frecuentes"
+msgstr "Listado de Preguntas Frecuentes"
#: templates/web/base/open311/index.html:136
msgid "GeoRSS on Google Maps"
@@ -1144,76 +1215,71 @@ msgstr "Recibe actualizaciones"
#: templates/web/fixmystreet/reports/_rss.html:3
#: templates/web/fixmystreet/reports/_rss.html:9
msgid "Get updates of %s problems"
-msgstr "Recibe actualizaciones de %s problemas"
+msgstr "Recibe actualizaciones de los problemas %s"
#: templates/web/fixmystreet/reports/_rss.html:11
#: templates/web/fixmystreet/reports/_rss.html:3
msgid "Get updates of problems in this %s"
msgstr "Recibe actualizaciones de los problemas en este %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
-msgstr "Dame un feed RSS"
+msgstr "Proporcióname un listado RSS"
#: templates/web/base/questionnaire/completed.html:14
msgid "Glad to hear it’s been fixed!"
-msgstr "Me alegra saber que ha sido arreglado!"
+msgstr "¡Nos alegra saber que ha sido arreglado!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Ir"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "¿Va a enviar cuestionario?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Gráfico temporal de creación problemas por estado"
#: templates/web/base/reports/index.html:12
msgid "Greyed-out lines are councils that no longer exist."
-msgstr "Líneas de color gris son las Concejalías que ya no existen."
+msgstr "Las líneas de color gris corresponden a áreas de organismos que ya no existen."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "¿Ha sido corregido este problema?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
-msgstr "¿Alguna vez informó de un problema a un Ayuntamiento antes, o es tu primera vez?"
+msgstr "¿Alguna vez informó de un problema a un Ayuntamiento antes, o es su primera vez?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Ayuda"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
-msgstr "Estos son los tipos de alertas de problemas locales para '%s'."
+msgstr "Estos son los tipos de notificaciones de incidencias locales para '%s'."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
-msgstr "Hola %s"
+msgstr "%s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1225,9 +1291,9 @@ msgstr "Ocultar antiguos"
#: templates/web/base/around/display_location.html:60
msgid "Hide pins"
-msgstr "Ocultar pines"
+msgstr "Ocultar marcadores"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historial"
@@ -1241,16 +1307,16 @@ msgstr "Cómo notificar un problema"
#: templates/web/base/js/translation_strings.html:33
msgid "How to send successful reports"
-msgstr "¿Como enviar informes exitosos?"
+msgstr "¿Cómo enviar informes exitosos?"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
-msgstr "Me temo que no puede confirmar informes no confirmados."
+msgstr "No puede confirmar alertas no confirmadas."
#: templates/web/base/tokens/confirm_problem.html:23
#: templates/web/base/tokens/confirm_problem.html:27
msgid "I just reported a problem on @fixmystreet"
-msgstr "Me acaba de informar un problema en @fixmystreet"
+msgstr "Acabo de informar de un problema en @fixmystreet"
#: templates/web/base/tokens/confirm_update.html:19
#: templates/web/base/tokens/confirm_update.html:23
@@ -1259,19 +1325,19 @@ msgstr "Acabo de actualizar un problema en @fixmystreet"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:96
msgid "I'm afraid we couldn't locate your problem in the database.\n"
-msgstr "Me temo que no se ha podido localizar su problema en la base de datos.\n"
+msgstr "No se ha podido localizar su problema en la base de datos.\n"
#: perllib/FixMyStreet/App/Controller/Tokens.pm:327
msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
-msgstr "Me temo que no ha podido verificar token. Si ha copiado la URL de un correo electrónico, por favor compruebe que lo copió correctamente.\n"
+msgstr "No se ha podido verificar token. Si ha copiado la URL de un email, compruebe por favor que lo copió correctamente.\n"
#: templates/web/base/admin/flagged.html:14
#: templates/web/base/admin/list_updates.html:6
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1282,7 +1348,7 @@ msgid ""
"Identify a <strong>parent</strong> if this body is itself part of another body.\n"
" For basic installations, you don't need to join bodies in this way."
msgstr ""
-"Identificar una <strong>matriz</ strong> si este organismo es en sí misma parte de otro organismo.\n"
+"Identificar una <strong>sub-organismos</ strong> si este organismo forma parte de otro organismo.\n"
"Para las instalaciones básicas, no necesita asociar los organismos de esta manera."
#: templates/web/base/admin/body.html:133
@@ -1290,48 +1356,35 @@ msgid ""
"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-"Si dos o más organismos tienen la misma ubicación, FixMyStreet combina categorías idénticas en una sola entrada en\n"
-"el menú. Asegúrese de que utiliza el mismo nombre de la categoría en los órganos si usted desea que esto suceda."
-
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Si no lo hace, la alerta no se activará."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Si no lo hace, el problema no será publicado."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Si no lo hace, no se publicará su actualización."
+"Si dos o más organismos tienen la misma ubicación, FixMyStreet combina categorías de notificaciones idénticas en una sola entrada en\n"
+"el menú. Asegúrese de que utiliza el mismo nombre categoría en ambos órganos si desea que sean combinadas."
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
-msgstr "Si usted consigue algo más de información sobre el estado de su problema, por favor regrese al sitio y deje una actualización."
+msgstr "Si usted consigue algo más de información sobre el estado del problema, por favor regrese a esta web y añádale una actualización."
#: templates/web/base/report/new/councils_text_none.html:2
#: templates/web/base/report/new/councils_text_none.html:8
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
-msgstr "Si envía un problema, el título y detalles serán públicos pero el problema <strong>no</strong> se informará al Ayuntamiento."
+msgstr "Si notifica un problema aquí, estará visible en la web, pero <strong>no se enviará</strong> una notificación automática a ningún organismo administrativo."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
-msgstr "Si utiliza correo electrónico web o tiene filtros anti-spam es recomendable que compruebe carpetas de spam: a veces, los mensajes se marcan así."
+msgstr "Es recomendable que compruebe su carpeta de \"spam\", ya que a veces nuestros mensajes son identificados erróneamente como \"correo no deseado\"."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
-"Si desea dejar una actualización pública en el problema, por favor ingrese aquí\n"
-"(tenga en cuenta que no se enviará al Ayuntamiento). Por ejemplo, ¿cómo fue su experiencia\n"
-"su de que su problema fuera solucionado?"
+"Si desea actualizar el problema, por favor hágalo aquí, pero tenga en cuenta que no se enviará al Ayuntamiento. Podría compartir, por ejemplo \n"
+"cómo fue su experiencia con la resolución del problema."
#: templates/web/base/admin/body.html:149
msgid "If you're using <strong>a send method that is not email</strong>, enter the service ID (Open311) or equivalent identifier here."
-msgstr "Si estás utilizando <strong> un método de envío que no es email </ strong>, introduzca el ID de servicio (Open311) o identificador equivalente aquí."
+msgstr "Si utiliza <strong> un método de envío distinto del email</ strong>, introduzca el ID de servicio (Open311) o identificador equivalente aquí."
#: templates/web/base/admin/body-form.html:207
#: templates/web/base/admin/body-form.html:208
@@ -1340,9 +1393,9 @@ msgid ""
" its updates. Enable <strong>extended Open311 stauses</strong> if you want to allow extra states to be passed.\n"
" Check that your cobrand supports this feature before switching it on."
msgstr ""
-"Si ha habilitado en Open311 actualización de envío anterior, Open311 normalmente sólo acepta el estado abierto o cerrado en\n"
-"sus actualizaciones. Activar <strong>extensión de stauses Open311</ strong> si desea permitir que los estados adicionales sean pasados.\n"
-"Compruebe que su cobrand admite esta función antes de encenderlo."
+"Si ha habilitado \"Open311 envío de actualizaciones\", tenga en cuenta que Open311 normalmente sólo acepta el estado ABIERTO o CERRADO en\n"
+"sus actualizaciones. Active <strong>Open311 extensión de status</ strong> si desea permitir que los estados adicionales sean también transferidos.\n"
+"Compruebe que su cobrand admite esta función antes de activarlo."
#: templates/web/base/admin/body-form.html:194
#: templates/web/base/admin/body-form.html:195
@@ -1350,8 +1403,8 @@ msgid ""
"If you've enabled Open311 update-sending above, enable <strong>suppression of alerts</strong> \n"
" if you do <strong>not</strong> want that user to be notified whenever these updates are created."
msgstr ""
-"Si ha habilitado el envío por Open311, podrá <strong>suprimir las alertas</strong>\n"
-"si <strong>no</ strong> lo hace el usuario será notificado cada vez que se crean estas actualizaciones."
+"Si ha habilitado \"Open311 envío de actualizaciones\", active <strong>suprimir alertas</strong>\n"
+"si <strong>NO</ strong> deseas que el usuario sea notificado cada vez que se cree uno de estos updates."
#: templates/web/base/admin/body-form.html:177
#: templates/web/base/admin/body-form.html:178
@@ -1360,17 +1413,17 @@ msgid ""
" FixMyStreet <strong>user</strong> will be attributed as the creator of those updates\n"
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-"Si ha habilitado Open311 para el envío o actualización anterior, debe identificar qué \n"
-"<strong>usuario</ strong> de FixMyStreet es el creador de esos cambios\n"
-"cuando se muestran en el sitio. Introduzca el ID (número) del usuario."
+"Si ha habilitado \"Open311 envío de actualizaciones\", debe identificar qué \n"
+"<strong>usuario</ strong> de FixMyStreet aparece como creador de dichas actualizaciones\n"
+"en esta web. Introduzca el ID (número) del usuario."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
-msgstr "ID ilegal"
+msgstr "ID incorrecto"
#: perllib/FixMyStreet/App/Controller/Alert.pm:100
msgid "Illegal feed selection"
-msgstr "Selección de feed ilegal"
+msgstr "Selección de listado incorrecta"
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
@@ -1379,34 +1432,33 @@ msgstr "Selección de feed ilegal"
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
-msgstr "En Progreso"
+msgstr "Procesando"
#: templates/web/base/admin/flagged.html:39
msgid "In abuse table?"
-msgstr "abuso de la tabla?"
+msgstr "¿En tabla de abusones?"
#: templates/web/base/open311/index.html:88
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
-msgstr "Además, los siguientes atributos que no forman parte de la especificación Open311 v2 son devueltos: agency_sent_datetime, título (también se devuelve como parte de la descripción), interface_used, comment_count, requestor_name (sólo presente si solicitante permitió que el nombre que se mostrará en el sitio)."
+msgstr "Los siguientes atributos, que no forman parte de la especificación Open311 v2, son adicionalmente devueltos: agency_sent_datetime, title (también se devuelve como parte de la descripción), interface_used, comment_count, requestor_name (solo si el solicitante permitió que el nombre que se mostrará en el sitio)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
-msgstr "En Progreso"
+msgstr "Procesando"
#: templates/web/base/tokens/confirm_alert.html:11
msgid "Inbox zero, here we come!"
-msgstr "Bandeja de entrada cero, allá vamos!"
+msgstr "Bandeja de entrada vacía"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
-msgstr "Incluya datos personales en el informe"
+msgstr "Incluir datos del notificador"
#: templates/web/base/admin/stats.html:76
msgid "Include unconfirmed reports"
@@ -1416,12 +1468,12 @@ msgstr "Incluir notificaciones no confirmadas"
msgid "Incorrect has_photo value \"%s\""
msgstr "Valor incorrecto para has_photo \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Notas internas"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Remisión interna"
@@ -1429,20 +1481,20 @@ msgstr "Remisión interna"
msgid "Invalid agency_responsible value %s"
msgstr "Valor inválido para agency_responsible %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Fecha de fin inválida"
#: perllib/FixMyStreet/App/Controller/Open311.pm:437
msgid "Invalid format %s specified."
-msgstr "Formato no válido %s especificado."
+msgstr "Especificado un formato no válido %s."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Fecha de inicio no válida"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1454,38 +1506,47 @@ msgstr "Investigando"
#: templates/web/fixmystreet/contact/blurb.html:8
msgid "It's often quickest to <a href=\"%s\">check our FAQs</a> and see if the answer is there."
-msgstr "A menudo es más rápido <a href=\"%s\">consultar nuestras preguntas frecuentes</a> y ver si la respuesta está allí."
+msgstr "A menudo es más rápido <a href=\"%s\">consultar nuestro Listado de Preguntas Frecuentes</a> y ver si la respuesta está allí."
#: templates/web/base/tokens/confirm_problem.html:14
msgid "It’s on its way to the council right now."
-msgstr "De camino al ayuntamiento en este momento"
+msgstr "De camino al ayuntamiento en este momento."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
msgid "Keep me signed in on this computer"
-msgstr "Recordar mi contraseña en este ordenador"
+msgstr "Mantener mi sesión abierta en este ordenador"
#: templates/web/base/admin/body.html:70
#: templates/web/zurich/admin/body.html:16
msgid "Last editor"
msgstr "Último editor"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Última actualización:"
#: templates/web/base/admin/problem_row.html:39
msgid "Last&nbsp;update:"
-msgstr "Última actualización:"
+msgstr "Última&nbsp;actualización:"
#: templates/web/base/admin/body-form.html:229
msgid "Leave this blank if all reports to this body should be sent using the same send method (e.g., \"%s\")."
-msgstr "Deje en blanco si todos los informes a este órgano deben ser enviados utilizando el mismo método de envío (e.g., \"%s\")."
+msgstr "Deje en blanco si todos las notificaciones a este órgano administrativo utilizan el mismo método de envío (e.g., \"%s\")."
#: templates/web/base/admin/body.html:27
msgid "List all reported problems"
@@ -1503,51 +1564,59 @@ msgstr "Cargando..."
#: templates/web/base/tokens/confirm_alert.html:1
#: templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
-msgstr "Feeds RSS locales y alertas por email"
+msgstr "Listados RSS locales y alertas por email"
#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:12
#: templates/web/base/alert/list.html:14 templates/web/base/alert/list.html:3
msgid "Local RSS feeds and email alerts for ‘%s’"
-msgstr "Feeds RSS locales y alertas por email para '%s'"
+msgstr "Listados RSS locales y alertas por email para '%s'"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Alertas locales"
#: templates/web/base/index-steps.html:25
msgid "Locate the problem on a map of the area"
-msgstr "Busque el problema en un mapa de la zona"
+msgstr "Señale en el mapa de la zona la localización del problema"
#: templates/web/base/js/translation_strings.html:43
msgid "MAP"
msgstr "MAPA"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr " Mapa"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "marcado como cerrado"
+msgstr "Marcado como enviado"
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
-msgstr "Señalar usuarios cuyo comportamiento desea mantener como <strong>marcado</strong>."
+msgstr "Señalar como <strong>marcados</strong> aquellos usuarios cuyo comportamiento desea observar."
#: templates/web/base/reports/index.html:24
msgid "Marked fixed/closed in the past eight weeks"
-msgstr ""
+msgstr "Marcado como resuelto/cerrado en las últimas ocho semanas"
#: templates/web/base/reports/index.html:25
msgid "Marked fixed/closed more than eight weeks ago"
-msgstr ""
+msgstr "Marcado como resuelto/cerrado hace más de ocho semanas"
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Mensaje:"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Asignar a un órgano externo:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Asignar a un órgano externo:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Mensaje:"
@@ -1558,7 +1627,7 @@ msgstr "Falta jurisdiction_id"
#: templates/web/zurich/admin/stats.html:34
msgid "Moderated by division within one working day"
-msgstr "Moderado en el plazo de un día laborable"
+msgstr "Moderado por el organismo durante el siguiente día laborable"
#: templates/web/base/admin/stats.html:11
msgid "Month"
@@ -1575,45 +1644,43 @@ msgstr "Más problemas cercanos"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Nombre"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Nombre:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Nombre: %s"
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:160
#: perllib/FixMyStreet/Geocode/OSM.pm:145
msgid "Nearest named road to the pin placed on the map (automatically generated using OpenStreetMap): %s%s"
-msgstr "Camino más cercano al pin colocado en el mapa (se genera automáticamente utilizando OpenStreetMap): %s%s"
+msgstr "Nombre de la calle más cercana al marcador colocado en el mapa (se genera automáticamente utilizando OpenStreetMap): %s%s"
#: perllib/FixMyStreet/Cobrand/UK.pm:127
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
-msgstr "Código postal más cercano al pin colocado en el mapa (generado automáticamente): %s (%sm de distancia)"
+msgstr "Código Postal más cercano al marcador colocado en el mapa (generado automáticamente): %s (%sm de distancia)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
-msgstr "Camino más cercano al pin colocado en el mapa (generado automáticamente por Bing Maps): %s"
+msgstr "Camino más cercano al marcador colocado en el mapa (generado automáticamente por Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1621,9 +1688,14 @@ msgstr ""
"Camino más cercano al pin colocado en el mapa (generada automáticamente por Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
-msgstr "¡Casi terminado! Ahora compruebe su correo electrónico ..."
+msgstr "¡Ya casi ha terminado! Busque ahora en su email el mensaje de confirmación..."
+
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "¡Ya casi ha terminado! Busque ahora en su email el mensaje de confirmación..."
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
@@ -1633,12 +1705,12 @@ msgstr "Nuevos <br>problemas"
msgid "New body added"
msgstr "Nuevo organismo añadido"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Añadida nueva categoría de contactos"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Nueva nota interna:"
@@ -1646,9 +1718,10 @@ msgstr "Nueva nota interna:"
msgid "New local problems on FixMyStreet"
msgstr "Nuevos problemas locales en FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nuevas notificaciones locales en reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nueva nota interna:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1674,33 +1747,15 @@ msgstr "Nuevos problemas en los límites de {{NAME}} en FixMyStreet"
msgid "New reports"
msgstr "Nuevos informes"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nuevas notificaciones en {{COUNCIL}} para el barrio {{WARD}} en reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nuevas notificaciones en reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nuevas notificaciones en reportemptyhome.com cerca de {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nuevas notificaciones en {{COUNCIL}} en reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nuevas notificaciones dentro de los límites de {{NAME}} en reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Nuevo estado"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Nueva actualización"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Nuevo estado"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1713,55 +1768,44 @@ msgstr "Siguiente"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "No"
#: templates/web/base/admin/user-form.html:33
msgid "No body"
-msgstr "Sin órgano"
+msgstr "Sin órgano administrativo"
#: templates/web/base/admin/stats.html:85
msgid "No council"
-msgstr "Sin Ayuntamiento"
+msgstr "Sin ayuntamiento"
#: perllib/FixMyStreet/DB/Result/Problem.pm:401
msgid "No council selected"
-msgstr "Ningún Ayuntamiento seleccionado"
+msgstr "Ningún ayuntamiento seleccionado"
#: templates/web/base/admin/edit-league.html:17
msgid "No edits have yet been made."
-msgstr "No se han hecho ediciones aún-"
+msgstr "No se han hecho ediciones aún."
#: templates/web/base/admin/flagged.html:25
msgid "No flagged problems found."
-msgstr "No se encuentran problemas marcados"
+msgstr "No se encuentran problemas marcados."
#: templates/web/base/admin/flagged.html:58
msgid "No flagged users found."
msgstr "No se encuentran usuarios marcados"
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "No hay más actualizaciones"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "No se han encontrado problemas."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "No se han notificado problemas todavía."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Ningún resultado devuelto"
@@ -1781,8 +1825,6 @@ msgid "No supporters"
msgstr "No hay seguidores"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Nada"
@@ -1794,44 +1836,52 @@ msgid ""
" Depending on the implementation, staff users may have access to the dashboard (summary of\n"
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-"Normalmente los usuarios (públicos) no deben estar asociados con cualquier <strong>organismo</ strong>. <br>\n"
-"El personal autorizado pueden asociarse con el departamento que representan. <br>\n"
+"Normalmente los usuarios (públicos) no deben estar asociados con ningún <strong>organismo</ strong>. <br>\n"
+"El personal autorizado puede ser asociado al organismo administrativo que representan. <br>\n"
"Dependiendo de la implementación, el personal pueden tener acceso al tablero (resumen de\n"
-"la actividad a través de su departamento), la capacidad de ocultar los informes o estados especiales del informe."
+"la actividad a través de su departamento), la capacidad de ocultar notificaciones, o establecer estados especiales para las notificaciones."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/fixmystreet/report/update-form.html:31
msgid "Not Responsible"
-msgstr "No reponsable"
+msgstr "No responsable"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "No responsable"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "No para mi subdivisión"
#: templates/web/base/admin/questionnaire.html:6
msgid "Not reported before"
-msgstr "No se notificó antes"
+msgstr "No notificado anteriormente"
#: templates/web/base/report/_main.html:62
msgid "Not reported to council"
-msgstr "Sin comunicar al Ayuntamiento"
+msgstr "No comunicado al ayuntamiento"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Nota"
#: templates/web/base/admin/stats.html:51
msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
-msgstr "Tenga en cuenta que al incluir notificaciones no confirmadas usamos la fecha de creación de la notificación y puede no coincidir con el mes en el que fue confirmado, así que los números pueden variar un poco."
+msgstr "Tenga en cuenta que al incluir notificaciones no confirmadas usamos la fecha de creación de la notificación, que puede no coincidir con el mes en se confirmó, así que los números pueden variar un poco."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Nota:"
@@ -1840,34 +1890,32 @@ msgstr "Nota:"
msgid "Note: <strong>%s</strong>"
msgstr "Nota: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
-msgstr "Y ahora a enviar tu notificación ..."
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Y ahora a enviar tu notificación ... no tienes contraseña en FixMyStreet?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
+msgstr "Ahora a enviar tu notificación&hellip;"
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
-msgstr "Y ahora a enviar tu actualización ..."
-
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Y ahora a enviar tu actualización ... no tienes contraseña en FixMyStreet?"
+msgstr "Ahora a enviar tu notificación&hellip;"
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
-msgstr "Ok"
+msgstr "OK"
#: templates/web/base/report/display.html:28
#: templates/web/base/report/update.html:17
msgid "Offensive? Unsuitable? Tell us"
-msgstr "Ofensiva? Inadecuado? Cuéntanos"
+msgstr "¿Ofensiva? ¿Inadecuada? Avísanos"
#: templates/web/base/reports/index.html:23
msgid "Old / unknown <br>problems"
-msgstr "Problemas<br> Antiguos / desconocidos"
+msgstr "Problemas<br>Antiguos / desconocidos"
#: templates/web/base/admin/questionnaire.html:24
msgid "Old state"
@@ -1883,37 +1931,30 @@ msgstr "Problemas <br>antiguos"
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:45
msgid "One-line summary"
-msgstr "Resumen on-line"
+msgstr "Resumen"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Abierto"
#: templates/web/base/reports/index.html:22
msgid "Open for more than four weeks, with an update within the past eight weeks"
-msgstr ""
-
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Notificaciones abiertas"
+msgstr "Abierto por más de cuatro semanas, con una actualización en las últimas ocho semanas"
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
-msgstr ""
+msgstr "Abierto, pero no ha sido actualizado en ocho semanas"
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
@@ -1927,32 +1968,26 @@ msgstr "Página web de la iniciativa Open311"
msgid "Open311 specification"
msgstr "Especificación Open311"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "O problemas notificados a:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
-msgstr "O puede suscribirse a una alerta basada en el barrio o Ayuntamiento en el que estás:"
+msgstr "O puede suscribirse a una alerta basada en el barrio o ayuntamiento en que te encuentras:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Otros"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Nuestro código es open source y <a href=\"http://github.com/mysociety/fixmystreet\"> está disponible en GitHub </a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Propietario"
@@ -1967,12 +2002,12 @@ msgstr "Página no encontrada"
msgid "Parent"
msgstr "Padre"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Parcial"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1981,6 +2016,7 @@ msgid "Password (optional)"
msgstr "Contraseña (opcional)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Contraseña:"
@@ -1988,7 +2024,7 @@ msgstr "Contraseña:"
msgid "Permalink"
msgstr "Enlace permanente"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Número de teléfono"
@@ -1997,11 +2033,9 @@ msgstr "Número de teléfono"
msgid "Phone number (optional)"
msgstr "Número de teléfono (opcional)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Teléfono:"
@@ -2012,41 +2046,46 @@ msgstr "Teléfono:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Esta información es necesaria"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Esta información es necesaria"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto:"
#: templates/web/base/alert/list.html:26
msgid "Photos of recent nearby reports"
-msgstr "Fotos notificaciones cercanas recientes"
+msgstr "Fotos de notificaciones cercanas recientes"
#: templates/web/base/js/translation_strings.html:30
msgid "Place pin on map"
-msgstr "Coloque el pin en el maña"
+msgstr "Coloque el marcador en el mapa"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planificado"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Por favor, <a class=\"tab_link\" href=\"#report\"> eche un vistazo</a> a las actualizaciones que han sido dejadas."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Por favor, sea cortés, conciso y vaya al grano."
@@ -2054,24 +2093,22 @@ msgstr "Por favor, sea cortés, conciso y vaya al grano."
#: templates/web/base/auth/change_password.html:12
#: templates/web/base/auth/change_password.html:17
msgid "Please check the passwords and try again"
-msgstr "Por favor, comprueba la contraseña e inténtalo de nuevo."
+msgstr "Por favor, comprueba la contraseña e inténtalo de nuevo"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Por favor, consulte su email"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Por favor, compruebe que su dirección de email es correcta"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2081,30 +2118,33 @@ msgstr "Por favor, elija una categoría"
msgid "Please choose a property type"
msgstr "Por favor, elija un tipo de propiedad"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Por favor, corrija los errores a continuación"
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
-"Por favor <strong>no</strong> notifique de problemas a través de este formulario, los mensajes van a\n"
-"el equipo de FixMyStreet, no a un Ayuntamiento. Para notificar un problema,\n"
-"por favor <a href=\"/\">vaya a la página principal </a> y siga las instrucciones."
+"Por favor <strong>no</strong> notifique problemas con este formulario. \n"
+"Los mensajes van\n"
+"al equipo técnico que opera esta web, no a un ayuntamiento.\n"
+"Para notificar un problema,\n"
+"por favor <a href=\"/\">vaya a la página principal</a> y siga las instrucciones."
#: templates/web/base/report/new/notes.html:6
msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users."
-msgstr "Por favor no sea abusivo&nbsp;&mdash; abusando de su Ayuntamiento devaluará el servicio para el resto de usuarios."
+msgstr "Por favor notifique incidencias relevantes y no abuse; abusando de su ayuntamiento degrada su capacidad de servicio a toda la ciudadanía."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
-msgstr "Por favor, rellene un mensaje."
+msgstr "Por favor escriba su mensaje."
#: templates/web/base/auth/change_password.html:12
#: templates/web/base/auth/change_password.html:15
@@ -2112,15 +2152,15 @@ msgstr "Por favor, rellene un mensaje."
msgid "Please enter a password"
msgstr "Por favor, introduzca una contraseña"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Por favor, introduzca un título"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2128,44 +2168,42 @@ msgid "Please enter a valid email"
msgstr "Por favor, introduce una dirección de email válida"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
-msgstr "Por favor, introduzca una dirección válida de email"
+msgstr "Por favor, introduce una dirección de email válida"
#: perllib/FixMyStreet/DB/Result/Problem.pm:398
#: templates/web/base/js/translation_strings.html:4
msgid "Please enter some details"
-msgstr "Por favor, introduzca algunos detalles"
+msgstr "Por favor, describa los detalles más relevantes"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Por favor, introduzca su dirección de email"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
-msgstr "Email"
+msgstr "Por favor introduzca su email"
#: templates/web/base/js/translation_strings.html:25
msgid "Please enter your first name"
-msgstr "Por favor, indica tu nombre."
+msgstr "Por favor, indique su nombre"
#: perllib/FixMyStreet/Cobrand/UK.pm:318
#: templates/web/base/js/translation_strings.html:7
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
-msgstr "Por favor escriba su nombre completo, los Ayuntamientos necesitan esta información - si usted no desea que su nombre aparecerá en la página, desactive la casilla de abajo"
+msgstr "Por favor escriba su nombre completo, ya que los ayuntamientos necesitan esta información. Si usted NO desea que su nombre aparecerá en la página, desactive la casilla de abajo"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2174,7 +2212,7 @@ msgstr "Por favor, introduzca su nombre"
#: templates/web/base/js/translation_strings.html:22
msgid "Please enter your phone number"
-msgstr "Por favor introduce tu telefono"
+msgstr "Por favor, introduzca su número de telefono"
#: templates/web/base/js/translation_strings.html:26
msgid "Please enter your second name"
@@ -2187,16 +2225,16 @@ msgstr "Por favor, introduzca su título"
#: templates/web/base/auth/sign_out.html:5
#: templates/web/zurich/auth/sign_out.html:5
msgid "Please feel free to <a href=\"%s\">sign in again</a>, or go back to the <a href=\"/\">front page</a>."
-msgstr "Por favor, siéntase libre para <a href=\"%s\">acceder de nuevo</a>, o volver a la <a href=\"/\">página inicial</a>."
+msgstr "Por favor, siéntase libre para <a href=\"%s\">acceder nuevamente</a> o volver a la <a href=\"/\">página inicial</a>."
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the problem below."
-msgstr "Por favor, rellene los datos del siguiente problema."
+msgstr "Por favor proporcione a continuación las informaciones sobre el problema."
#: templates/web/zurich/report/new/fill_in_details_form.html:46
msgid "Please fill in details of the problem."
-msgstr "Por favor, rellene los datos del problema."
+msgstr "Por favor proporcione las informaciones sobre el problema."
#: templates/web/base/report/new/fill_in_details_form.html:28
#: templates/web/fixmystreet/report/new/sidebar.html:7
@@ -2204,65 +2242,66 @@ msgstr "Por favor, rellene los datos del problema."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Por favor, complete el siguiente formulario con los detalles del problema y describa la ubicación con la mayor precisión posible en el cuadro de detalles."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
-msgstr "Por favor, indique si desea otro cuestionario"
+msgstr "Por favor, indique si le gustaría recibir algún otro cuestionario"
#: templates/web/fixmystreet/report/updates-sidebar-notes.html:4
msgid "Please note that updates are not sent to the council."
-msgstr "Tenga en cuenta que las actualizaciones no se envían al Ayuntamiento."
+msgstr "Tenga en cuenta que las actualizaciones no son enviadas al ayuntamiento."
#: templates/web/base/report/update-form.html:7
msgid "Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
-msgstr "Tenga en cuenta que las actualizaciones no se envían al Ayuntamiento. Si usted deja su nombre será público. Su información sólo será usada de acuerdo con nuestra <a href=\"/faq#privacy\">política de privacidad</a>"
+msgstr "Tenga en cuenta que las actualizaciones no se envían al ayuntamiento. Si usted deja su nombre será público. Su información sólo será usada de acuerdo con nuestra <a href=\"/faq#privacy\">política de privacidad</a>"
#: templates/web/base/report/new/fill_in_details_form.html:8
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:21
#: templates/web/zurich/report/new/fill_in_details_form.html:11
msgid "Please note your report has <strong>not yet been sent</strong>. Choose a category and add further information below, then submit."
-msgstr "Por favor, tenga en cuenta la notificación <strong>no ha sido enviada aún</strong>. Elija una categoría y añada más información a continuación antes que enviar."
+msgstr "Por favor, tenga en cuenta la notificación <strong>no ha sido enviada aún</strong>. Elija una categoría y añada más información a continuación antes de enviar."
#: templates/web/base/report/new/notes.html:1
#: templates/web/zurich/report/new/notes.html:1
msgid "Please note:"
msgstr "Por favor, tenga en cuenta:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Por favor, explique por qué está reabriendo esta notificación."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
-msgstr "Proporcione un texto así como una foto"
+msgstr "Proporcione un texto y una foto"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
-msgstr "Por favor, diga si alguna vez ha notificado de un problema al Ayuntamiento con anterioridad"
+msgstr "Por favor, indique si ha notificado un problema al ayuntamiento alguna vez."
+
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Selecciona un órgano administrativo"
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
-msgstr "Por favor, seleccione el feed que desea"
+msgstr "Por favor, seleccione el tipo de listado que desea"
#: perllib/FixMyStreet/App/Controller/Alert.pm:118
msgid "Please select the type of alert you want"
msgstr "Por favor, seleccione el tipo de alerta que desea"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Por favor, indique si el problema se ha solucionado"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Por favor eche un vistazo a las actualizaciones que se han dejado."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Por favor, suba una imagen JPEG"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Por favor, escriba un mensaje"
@@ -2271,8 +2310,8 @@ msgid "Please write your update here"
msgstr "Por favor, escriba su actualización aquí"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2283,32 +2322,46 @@ msgstr "Publicar"
#: templates/web/base/report/updates.html:15
msgid "Posted anonymously at %s"
-msgstr "Publicado de forma anónima en %s"
+msgstr "Publicado de forma anónima - %s"
#: templates/web/base/report/updates.html:22
msgid "Posted by %s (<strong>%s</strong>) at %s"
-msgstr "Publicado por %s (<strong>%s</strong>) en %s"
+msgstr "Publicado por %s (<strong>%s</strong>) - %s"
#: templates/web/base/report/updates.html:24
msgid "Posted by %s at %s"
-msgstr "Publicado por %s en %s"
+msgstr "Publicado por %s - %s"
+
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Previo"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Privacidad"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privado"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problema"
@@ -2324,18 +2377,18 @@ msgstr "Problema %s confirmado"
msgid "Problem %s sent to council %s"
msgstr "Problema %s enviado al Ayuntamiento %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Desglose de problemas según estado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problema marcado como abierto."
#: templates/web/base/admin/questionnaire.html:21
msgid "Problem state change based on survey results"
-msgstr "El estado del problema cambió debido a los resultados de encuesta"
+msgstr "El estado del problema cambió debido a los resultados de la encuesta"
#: templates/web/base/admin/flagged.html:10
msgid "Problems"
@@ -2345,12 +2398,10 @@ msgstr "Problemas"
msgid "Problems in this area"
msgstr "Problemas en este área"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemas cercanos"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemas en el mapa"
@@ -2359,12 +2410,11 @@ msgstr "Problemas en el mapa"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problemas recientemente notificados como arreglados en FixMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemas en %.1fkm alrededor"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2376,19 +2426,16 @@ msgstr "Problemas en %s"
msgid "Problems within %s ward"
msgstr "Problemas en el barrio %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemas en %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemas en %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
-msgstr "Problemas en los alrededores de:"
-
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Propiedades recientemente notificadas como vueltas a usar en reportemptyhomes.com"
+msgstr "Problemas en:"
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
@@ -2403,45 +2450,37 @@ msgstr "Tipo de propiedad:"
msgid "Provide an update"
msgstr "Proporcionar una actualización"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
-msgstr "Proporcionar un nombre y una contraseña es opcional, pero al hacerlo le permitirá informar más fácilmente problemas, actualizar y administrar sus informes."
+msgstr "Proporcionar un nombre y una contraseña es opcional, pero hacerlo le permitirá notificar y actualizar los problemas más fácilmente, así como administrar sus informes."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
-msgstr "Proporcionar una contraseña es opcional, pero al hacerlo le permitirá informar problemas con mayor facilidad, deje actualizaciones y administrar sus notificaciones."
+msgstr "Proporcionar una contraseña es opcional, pero hacerlo le permitirá notificar y actualizar los problemas más fácilmente, así como administrar sus informes."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Respuesta del público:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publicar foto"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publicar respuesta"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Cuestionario"
#: templates/web/base/admin/timeline.html:30
msgid "Questionnaire %d answered for problem %d, %s to %s"
-msgstr "Cuestionario %d respuesto para el problema de %d, %s para %s"
+msgstr "Cuestionario %d para el problema %d respondido, %s para %s"
#: templates/web/base/admin/timeline.html:28
msgid "Questionnaire %d sent for problem %d"
@@ -2451,24 +2490,23 @@ msgstr "Cuestionario %d enviado para el problema %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Cuestionario cumplimentado por el notificador problema"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
-msgstr "Feed RSS"
+msgstr "Listado RSS"
#: perllib/FixMyStreet/Cobrand/UK.pm:250 perllib/FixMyStreet/Cobrand/UK.pm:262
msgid "RSS feed for %s"
-msgstr "Feed RSS para %s"
+msgstr "Listado RSS para %s"
#: perllib/FixMyStreet/Cobrand/UK.pm:256 perllib/FixMyStreet/Cobrand/UK.pm:268
msgid "RSS feed for %s ward, %s"
-msgstr "Feed RSS para %s del barrio, %s"
+msgstr "Listado RSS para %s del barrio, %s"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:155
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:163
@@ -2476,43 +2514,42 @@ msgstr "Feed RSS para %s del barrio, %s"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:181
#: perllib/FixMyStreet/Cobrand/UK.pm:276 perllib/FixMyStreet/Cobrand/UK.pm:288
msgid "RSS feed of %s"
-msgstr "Feed RSS para %s"
+msgstr "Listado RSS para %s"
#: perllib/FixMyStreet/Cobrand/UK.pm:281 perllib/FixMyStreet/Cobrand/UK.pm:293
msgid "RSS feed of %s, within %s ward"
-msgstr "Feed RSS para %s, en el barrio %s"
+msgstr "Listado RSS para %s, en el barrio %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
-msgstr "Feed RSS de los problemas más cercanos"
+msgstr "Listado RSS de los problemas cercanos"
#: templates/web/base/reports/_rss.html:1
msgid "RSS feed of problems in this %s"
-msgstr "Feed RSS de los problemas en este %s"
+msgstr "Listado RSS de los problemas en este %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
msgid "RSS feed of problems within %s"
-msgstr "Feed RSS de los problemas dentro de %s"
+msgstr "Listado RSS de los problemas dentro de %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:127
#: perllib/FixMyStreet/Cobrand/UK.pm:220
msgid "RSS feed of problems within %s ward"
-msgstr "Feed RSS feed de los problemas dentro del barrio %s"
+msgstr "Listado RSS de los problemas dentro del barrio %s"
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:4
msgid "RSS feed of recent local problems"
-msgstr "Feed RSS de los problemas locales más recientes"
+msgstr "Listado RSS de los problemas locales más recientes"
#: templates/web/base/report/display.html:50
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed of updates to this problem"
-msgstr "Feed RSS de actualizaciones sobre este problema"
+msgstr "Listado RSS de actualizaciones sobre este problema"
#: templates/web/base/alert/updates.html:9
#: templates/web/base/report/display.html:41
@@ -2521,41 +2558,47 @@ msgstr "Feed RSS de actualizaciones sobre este problema"
msgid "Receive email when updates are left on this problem."
msgstr "Reciba un correo cuando se dejen actualizaciones sobre este problema."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Problemas locales recientes, FixMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Recientemente <br>arreglado"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Problemas recientemente notificados"
#: templates/web/zurich/report/new/notes.html:5
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
-msgstr "Recuerde que FixMyStreet es principalmente para informar sobre problemas físicos que pueden ser arreglados. Si su problema no es apropiado para ser presentado a través de este sitio recuerde que puede ponerse en contacto directamente Ayuntamiento mediante su página web."
+msgstr "Recuerde que FixMyStreet es principalmente para informar sobre problemas físicos que pueden ser arreglados. Si su problema no es apropiado para ser presentado a través de este sitio recuerde que puede ponerse en contacto con su Ayuntamiento directamente mediante su página web."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
-msgstr "Eliminar Marca"
+msgstr "Eliminar marca"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Quitar foto (¡no se puede deshacer!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "editar usuario"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
-msgstr ""
+msgstr "Notificar"
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Notificar un problema"
@@ -2564,150 +2607,158 @@ msgstr "Notificar un problema"
msgid "Report abuse"
msgstr "Denunciar abuso"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Notificar sobre %s"
#: templates/web/base/report/new/fill_in_details_form.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
msgid "Report your problem"
-msgstr "Informe de su incidencia"
+msgstr "Notifique su incidencia"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
-msgstr "Notifique, vea o discuta problemas locales"
-
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Notificado %s"
+msgstr "Notifique, consulte o discuta problemas locales"
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Notificados %s, a %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Notificado anónimamente en %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Notificado con anterioridad"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Notificado por %s en %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Notificado %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
-msgstr "informado en la categoría %s"
+msgstr "Notificado en la categoría %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
-msgstr "Notificado anonimamente en la categoría %s en %s"
+msgstr "Notificado anónimamente en la categoría %s en %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Notificado en la categoría %s por %s en %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
-msgstr "Notificado por %s de forma anónima en %s"
+msgstr "Notificado anónimamente vía %s en %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
-msgstr "Notificado por %s por %s en %s"
+msgstr "Notificado vía %s por %s en %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
-msgstr "Notificado anonimamente por %s en la categoría %s en %s"
+msgstr "Notificado anónimamente vía %s en la categoría %s en %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
-msgstr "Notificado por %s en la categoría %s por %s en %s"
+msgstr "Notificado vía %s en la categoría %s por %s en %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "informado en la categoría %s"
+msgstr "Notificado en las últimas cuatro semanas"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Notificado %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
-msgstr "Notificar un problema"
+msgstr "Notificando un problema"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
-msgstr "Informes"
+msgstr "Notificaciones"
#: perllib/FixMyStreet/Cobrand/UK.pm:327 perllib/FixMyStreet/Cobrand/UK.pm:331
msgid "Reports are limited to %s characters in length. Please shorten your report"
-msgstr "Los informes se limitan a %s caracteres de longitud. Por favor, acorte su informe"
+msgstr "Las notificaciones tienen una longitud máxima de %s. Por favor, acorte su notificación."
#: templates/web/zurich/admin/index-sdm.html:7
msgid "Reports awaiting approval"
msgstr "Informes en espera de aprobación"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Notificaciones en y alrededor del mapa"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
-msgstr "Informes publicados"
+msgstr "Notificaciones publicadas"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Vuelva a enviar la notificación"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
-msgstr "El lugar correcto?"
+msgstr "¿Es correcto el lugar?"
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:167
#: perllib/FixMyStreet/Geocode/OSM.pm:152
msgid "Road operator for this named road (derived from road reference number and type): %s"
-msgstr "Operador de camino operador para este camino (derivado del número de referencia y tipo del camino): %s"
+msgstr "Operador responsable de este camino (derivado del número de referencia y tipo del camino): %s"
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:164
#: perllib/FixMyStreet/Geocode/OSM.pm:149
msgid "Road operator for this named road (from OpenStreetMap): %s"
-msgstr "Operador de ruta para esta ruta con nombre (de OpenStreetMap): %s"
+msgstr "Operador responsable de este camino (de OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Rotar a la izquierda"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Rotar a la derecha"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "Satélite"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Guardar cambios"
@@ -2720,7 +2771,7 @@ msgstr "Buscar Notificaciones"
msgid "Search Users"
msgstr "Buscar Usuarios"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Buscar informes"
@@ -2732,7 +2783,7 @@ msgstr "Buscar:"
#: templates/web/base/admin/reports.html:26
msgid "Searching found no reports."
-msgstr "La búsqueda no encontró informes."
+msgstr "La búsqueda no encontró notificaciones."
#: templates/web/base/admin/users.html:41
msgid "Searching found no users."
@@ -2741,31 +2792,36 @@ msgstr "La búsqueda no encontró usuarios."
#: templates/web/base/admin/body-form.html:33
#: templates/web/zurich/admin/body-form.html:16
msgid "Select a body"
-msgstr "Selecciona un órgano"
+msgstr "Selecciona un órgano administrativo"
#: templates/web/base/reports/index.html:9
msgid "Select a particular council to see the reports sent there."
-msgstr "Seleccione un Ayuntamiento para ver los informes que se le han enviado."
+msgstr "Seleccione un ayuntamiento para ver los informes que se le han enviado."
#: templates/web/base/admin/body-form.html:71
#: templates/web/zurich/admin/body-form.html:26
msgid "Select an area"
msgstr "Seleccione un área"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Seleccione el tipo de alerta que desea y haga clic en el botón correspondiente a un feed RSS o introduzca su dirección de e-mail para suscribirse a alerta por correo electrónico."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Notificaciones abiertas"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Enviado a %s %s después"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Enviado:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Servicio:"
@@ -2774,13 +2830,13 @@ msgstr "Servicio:"
msgid "Share"
msgstr "Compartir"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
msgid "Show my name publicly"
-msgstr "Mostrar mi nombre en público"
+msgstr "Mostrar mi nombre públicamente"
#: templates/web/base/around/display_location.html:67
msgid "Show old"
@@ -2788,37 +2844,26 @@ msgstr "Mostrar antiguos"
#: templates/web/base/around/display_location.html:58
msgid "Show pins"
-msgstr "Mostrar pines"
+msgstr "Mostrar marcadores"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
-msgstr "Registrarse"
-
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Registrarse con email"
+msgstr "Iniciar sesión"
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
-msgstr "Entrar o crear una cuenta"
+msgstr "Iniciar sesión o crear una cuenta"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Salir"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Conectado como %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Algunas categorías pueden requerir información adicional."
@@ -2829,40 +2874,49 @@ msgid ""
"Some endpoints require an <strong>API key</strong> to indicate that the reports are being\n"
" sent from your FixMyStreet installation."
msgstr ""
-"Algunos puntos finales requieren una clave de <strong>API</ strong> para indicar que los informes están siendo\n"
-"enviados desde su instalación FixMyStreet."
+"Algunos puntos finales requieren una clave de <strong>API</ strong> para indicar que las notificaciones provienen\n"
+"de tu sistema FixMyStreet."
#: templates/web/base/alert/index.html:42
msgid "Some photos of recent reports"
msgstr "Algunas fotos de notificaciones recientes"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Algún texto para localizar"
#: perllib/FixMyStreet/Cobrand/UK.pm:78
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
-msgstr "Lo sentimos, eso parece ser un código postal dependiente de La Corona, los cuales no son soportados."
+msgstr "Lo sentimos, ése parece ser un código postal dependiente de La Corona, que no soportamos."
+
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
-msgstr "Lo sentimos, hubo un error confirmando su problema."
+msgstr "Lo sentimos, hubo un error confirmando su notificación."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Lo sentimos, no hemos podido encontrar ese lugar."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Lo sentimos, pero no pudo analizar esa ubicación. Por favor, inténtelo de nuevo."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Lo sentimos, pero no pudo analizar esa ubicación. Por favor, inténtelo de nuevo."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Fecha de inicio:"
@@ -2878,16 +2932,17 @@ msgstr "Estado"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Estado/Prov.:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Estadísticas"
@@ -2901,7 +2956,12 @@ msgstr "Estado"
msgid "Still open, via questionnaire, %s"
msgstr "Sigue abierta, a través de cuestionario, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Subcategoria: %s"
@@ -2911,50 +2971,47 @@ msgstr "Subdivisión/Órgano"
#: templates/web/fixmystreet/contact/index.html:98
msgid "Subject"
-msgstr "Título:"
+msgstr "Título"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Título:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Enviar"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
-msgstr "Enviar Cambios"
+msgstr "Enviar cambios"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Enviar cuestionario"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Enviado"
@@ -2965,18 +3022,19 @@ msgstr "Enviado"
msgid "Subscribe"
msgstr "Suscribirse"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Suscríbeme a alertas por email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Resumen"
@@ -2987,7 +3045,7 @@ msgstr "Resumen"
msgid "Summary reports"
msgstr "Resumen de notificaciones"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Encuesta"
@@ -2995,9 +3053,18 @@ msgstr "Encuesta"
msgid "Survey Results"
msgstr "Resultados de la Encuesta"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Actualizaciones"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Texto"
@@ -3006,13 +3073,14 @@ msgid "Text only version"
msgstr "Versión solo texto"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Texto:"
#: templates/web/base/tokens/confirm_problem.html:12
msgid "Thank you for reporting this issue!"
-msgstr "Gracias por informar de esta incidencia!"
+msgstr "¡Gracias por notificar esta incidencia!"
#: templates/web/base/tokens/error.html:7
msgid "Thank you for trying to confirm your update or problem. We seem to have an error ourselves though, so <a href=\"%s\">please let us know what went on</a> and we'll look into it."
@@ -3027,21 +3095,21 @@ msgstr "Gracias por actualizar esta incidencia!"
msgid "Thank you for your feedback"
msgstr "Gracias por su feedback"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
-msgstr "Gracias por subir tu foto. Ahora necesitamos situar el problema, así que por favor escriba el nombre o código postal de una calle cercana en el cuadro de arriba:"
+msgstr "Gracias por subir una foto. Ahora necesitamos situar la incidencia, así que por favor escriba el nombre o código postal de una calle cercana en el cuadro de arriba:"
#: templates/web/base/questionnaire/creator_fixed.html:9
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
-msgstr "Gracias, me alegro de oír que fue arreglado! ¿Podríamos preguntar si alguna vez ha notificado de un problema a un Ayuntamiento con anterioridad?"
+msgstr "¡Gracias, nos alegra saber que fue arreglado! ¿Podría decirnos si había notificado un problema a un ayuntamiento con anterioridad?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
-msgstr "Esa imagen no parece que haya cargado correctamente (%s), por favor inténtelo de nuevo."
+msgstr "La imagen no ha cargado correctamente (%s), por favor inténtelo de nuevo."
#: perllib/FixMyStreet/App/Controller/Council.pm:97
msgid "That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again."
-msgstr "Esa localización no parece estar cubierta por un Ayuntamiento, tal vez esté en alta mar o fuera del país. Por favor, inténtelo de nuevo."
+msgstr "Esa localización no parece estar cubierta por un ayuntamiento, tal vez esté en alta mar o fuera del país. Por favor, inténtelo de nuevo."
#: perllib/FixMyStreet/App/Controller/Location.pm:126
msgid "That location does not appear to be in the UK; please try again."
@@ -3053,20 +3121,19 @@ msgstr "Esa localización no parece ser de UK, por favor inténtelo de nuevo."
msgid "That postcode was not recognised, sorry."
msgstr "Ese código postal no fue reconocido, lo siento."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "El problema ahora será reenviado."
+msgstr "El problema se ha marcado como enviado."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "El problema ahora será reenviado."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
-msgstr "Este informe no se puede ver en %s."
+msgstr "Esa notificación no se puede ver en %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Esa notificación ha sido eliminada de FixMyStreet."
@@ -3075,8 +3142,8 @@ msgid ""
"The <strong>email address</strong> is the destination to which reports about this category will be sent. \n"
" Other categories for this body may have the same email address."
msgstr ""
-"El <strong>email</strong> es el destino al cual serán enviados los reportes en esta categoría.\n"
-"Otras categorías en este mismo órgano pueden tener el mismo email."
+"El <strong>email</strong> indica dónde serán enviadas las notificaciones de esta categoría.\n"
+"Otras categorías de este mismo órgano administrativo podrían usar el mismo email."
#: templates/web/base/admin/body-form.html:123
#: templates/web/base/admin/body-form.html:124
@@ -3084,15 +3151,15 @@ msgid ""
"The <strong>endpoint</strong> is the URL of the service that FixMyStreet will connect to \n"
" when sending reports to this body."
msgstr ""
-"El <strong>límite</strong> es la URL del servicio al que FixMyStreet se conectará \n"
-"cuando envíe informes al organismo."
+"El <strong>destino</strong> es la URL del servicio al que FixMyStreet se conectará \n"
+"cuando envíe notificaciones al organismo administrativo."
#: templates/web/base/admin/body-form.html:136
#: templates/web/base/admin/body-form.html:137
msgid ""
"The <strong>jurisdiction</strong> is only needed if the endpoint is serving more\n"
" than one. If the body is running its own endpoint, you can usually leave this blank."
-msgstr "La <strong>jurisdicción</strong> sólo es necesaria si los límites incluyen a más de un municipio. Si el organismo funciona sólo con sus propios límites puede dejar en blanco esto."
+msgstr "La <strong>jurisdicción</strong> solo es necesaria si los límites incluyen a más de un municipio. Si el organismo administrativo funciona solo con sus propios límites puede dejar en blanco esto."
#: templates/web/base/admin/body-form.html:94
#: templates/web/base/admin/body-form.html:95
@@ -3100,8 +3167,8 @@ msgid ""
"The <strong>send method</strong> determines how problem reports will be sent to the body.\n"
" If you leave this blank, <strong>send method defaults to email</strong>."
msgstr ""
-"El <strong>método de envío</strong> determina como serán enviados los informes al organismo.\n"
-"Si está en blanco, el método de envío por defecto <strong>será el correo electrónico</strong>."
+"El <strong>método de envío</strong> determina como serán enviados las notificaciones al organismo.\n"
+"Si está en blanco, el método de envío por defecto será por <strong>email</strong>."
#: templates/web/base/open311/index.html:90
msgid "The Open311 v2 attribute agency_responsible is used to list the administrations that received the problem report, which is not quite the way the attribute is defined in the Open311 v2 specification."
@@ -3113,39 +3180,27 @@ msgid ""
"The body's <strong>name</strong> identifies the body (for example, <em>Borsetshire District Council</em>)\n"
" and may be displayed publically."
msgstr ""
-"El <strong>nombre</strong> del organismo identifica al propio organismo (por ejemplo, <em>concejalía de obras</em>)\n"
+"El <strong>nombre</strong> del organismo identifica al propio organismo administrativo (por ejemplo, <em>Ayuntamiento de Elche</em>)\n"
"y puede ser mostrado públicamente. "
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "El email de confirmación <strong>puede</strong> tardar unos minutos en llegar - <em>por favor</em>, se paciente."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
-msgstr "El ayuntamiento dice no ser capaz de ayudar a menos que deje la mayor cantidad de detalles posibles. Por favor, describa la ubicación exacta del problema (por ejemplo, en una pared), lo que es, el tiempo que ha estado allí, una descripción (y una foto del problema si es posible), etc."
-
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Los detalles de su problema están disponibles en la otra pestaña de arriba"
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Los detalles de su problema están disponibles en el lado derecho de esta página."
+msgstr "El ayuntamiento necesita la mayor cantidad de detalles posibles para atender su notificación. Por favor, describa la ubicación exacta del problema (e.g. \"sobre tal o cual pared\"), en qué consiste éste, el tiempo que lleva ahí, una descripción y si es posible también una foto que permita localizarlo, etc."
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
-msgstr "Los premios a la responsabilidad mostrará la actividad de los editores (quien ha editado más registros)."
+msgstr "Los premios a la responsabilidad muestran la actividad de los editores (quién ha editado más registros)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "El error fue: %s"
#: templates/web/base/open311/index.html:86
msgid "The following Open311 v2 attributes are returned for each request: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code and service_name."
-msgstr "Los siguientes atributos Open311 v2 son devueltos para cada petición: service_request_id, descripción, lat, long, media_url, status, requested_datetime, updated_datetime, service_code y service_name."
+msgstr "Los siguientes atributos Open311 v2 son devueltos para cada petición: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code y service_name."
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:159
#: perllib/FixMyStreet/Geocode/OSM.pm:144
@@ -3155,11 +3210,7 @@ msgstr "La información siguiente sobre la carretera más cercana podría ser in
#: db/alert_types.pl:19 db/alert_types.pl:23 db/alert_types.pl:27
#: db/alert_types.pl:31
msgid "The latest local problems reported by users"
-msgstr "Últimos problemas notificados por los usuarios locales"
-
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Últimas notificaciones locales notificadas por los usuarios"
+msgstr "Últimos problemas notificados por usuarios"
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
@@ -3167,7 +3218,7 @@ msgstr "Últimos problemas para {{COUNCIL}} notificados por los usuarios"
#: db/alert_types.pl:39
msgid "The latest problems for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Últimos problemas para {{CONSEJO}} en el barrio de {{WARD}} notificados por los usuarios"
+msgstr "Últimos problemas para {{COUNCIL}} en el barrio de {{WARD}} notificados por los usuarios"
#: db/alert_types.pl:11
msgid "The latest problems reported by users"
@@ -3181,21 +3232,9 @@ msgstr "Últimos problemas notificados por los usuarios como arreglados"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Últimos problemas dentro de los límites de {{NAME}} notificados por los usuarios"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Últimas propiedades notificadas por los usuarios como de en uso de nuevo"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Últimas notificaciones para {{Ayuntamiento}} notificadas por los usuarios"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Últimas notificaciones de {{COUNCIL}} en el barrio de {{WARD}} notificadas por los usuarios"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Últimas notificaciones en los límites de {{NAME}} 's notificadas por los usuarios"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3209,10 +3248,9 @@ msgstr "Las contraseñas no coinciden."
#: templates/web/base/errors/page_error_404_not_found.html:10
#: templates/web/base/errors/page_error_404_not_found.html:12
msgid "The requested URL '%s' was not found on this server"
-msgstr "La URL '%s' solicitada no fue encontrada en el servidor"
+msgstr "La URL solicitada, '%s', no fue encontrada en el servidor"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "La alerta más sencilla es nuestra alerta geográfica:"
@@ -3221,9 +3259,9 @@ msgstr "La alerta más sencilla es nuestra alerta geográfica:"
#: templates/web/base/report/new/fill_in_details_form.html:18
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:14
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
-msgstr "El resumen y la descripción también se harán públicos (véase nuestra <a href=\"/privacy\">politica de privacidad</a>)."
+msgstr "El resumen y la descripción también se harán públicos (consulte nuestra <a href=\"/privacy\">política de privacidad</a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "El usuario no pudo situar el problema en el mapa, salvo para ver el área alrededor de la localización que introdujo."
@@ -3233,29 +3271,30 @@ msgid ""
"The user's <strong>name</strong> is displayed publicly on reports that have not been marked <em>anonymous</em>.\n"
" Names are not necessarily unique."
msgstr ""
-"El usuario <strong>name</ strong> aparece públicamente en los informes que no han sido marcados como <em>anonymous</em>.\n"
-"Los nombres no son necesariamente unicos."
+"El usuario <strong>name</ strong> aparece públicamente en los informes que no han sido marcados como <em>anónimos</em>.\n"
+"Los nombres no son necesariamente únicos."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
-msgstr ""
+msgstr "No hay ninguna notificación que mostrar."
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Hubo un problema mostrando la página de Todas las Notificaciones. Por favor, inténtelo de nuevo más tarde."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Hubo un problema mostrando esta página. Por favor, inténtelo de nuevo más tarde."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
-msgstr "Hubo un problema con su email/contraseña. Si no recuerda, o no tiene, contraseña por favor rellene la sección 'registrarse con email' del formulario."
+msgstr "Hubo un problema con su email/contraseña. Si no recuerda o no tiene contraseña, por favor rellene la sección 'registrarme con email' del formulario."
#: perllib/FixMyStreet/App/Controller/Alert.pm:355
msgid "There was a problem with your email/password combination. Please try again."
@@ -3265,13 +3304,13 @@ msgstr "Hubo un problema con su email/contraseña. Por favor, inténtelo de nuev
msgid "There was a problem with your update. Please try again."
msgstr "Hubo un problema con su actualización. Por favor, inténtelo de nuevo."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Hubo problemas con su notificación. Por favor, vea más abajo."
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:300
msgid "There were problems with your update. Please see below."
-msgstr "Hubo problemas con la actualización. Por favor, vea más abajo."
+msgstr "Hubo problemas con su actualización. Por favor, vea más abajo."
#: templates/web/base/admin/body-form.html:112
#: templates/web/base/admin/body-form.html:113
@@ -3283,13 +3322,13 @@ msgid ""
" "
msgstr ""
"Estos ajustes son para los organismos que utilizan Open311 (u otra integración back-end) para recibir las incidencias.<br>\n"
-"<Strong>Usted no tiene necesidad de hacerlo si el Método de envío es el correo electrónico.</ Strong>.\n"
+"<Strong>Usted no tiene necesidad de hacerlo si el Método de Envío es por correo electrónico.</ Strong>.\n"
"Para obtener más información sobre Open311, consulte\n"
"<a href='https://www.mysociety.org/2013/01/17/open311-explained/' class='admin-offsite-link'>este documento</a>."
#: templates/web/base/open311/index.html:77
msgid "This API implementation is work in progress and not yet stabilized. It will change without warnings in the future."
-msgstr "Esta implementación de la API es un trabajo aún progreso y no es estable todavía. Se cambiará sin advertencias en el futuro."
+msgstr "Esta implementación de la API es un trabajo aún en progreso y no es estable todavía. Se cambiará sin advertencias en el futuro."
#: templates/web/base/admin/body.html:44
msgid ""
@@ -3297,13 +3336,13 @@ msgid ""
" Consequently, none of its categories will appear in the drop-down category menu when users report problems.\n"
" Currently, users <strong>cannot report problems to this body</strong>."
msgstr ""
-"Este organismo no cubre ninguna zona. Esto significa que no tiene jurisdicción sobre los problemas reportados <em>en cualquier ubicación</ em>. \n"
+"Este organismo no cubre ninguna zona. Esto significa que no tiene jurisdicción sobre los problemas reportados <em>en ninguna ubicación</ em>. \n"
"En consecuencia, ninguna de sus categorías aparecerá en el menú desplegable de categorías cuando los usuarios envíen incidencias.\n"
"Actualmente, los usuarios <strong>no pueden informar de problemas a este organismo</ strong>."
#: templates/web/base/admin/body.html:54
msgid "This body has no contacts. This means that currently problems reported to this body <strong>will not be sent</strong>."
-msgstr "Este órgano no tiene contactos. Esto significa que en la actualidad las incidencias reportadas a este organismo <strong>no son enviadas</strong>."
+msgstr "Este órgano no tiene contactos. Esto significa que en la actualidad las incidencias notificadas a este organismo <strong>no son enviadas</strong>."
#: templates/web/base/admin/body-form.html:52
#: templates/web/base/admin/body-form.html:53
@@ -3314,16 +3353,16 @@ msgstr ""
"A este organismo sólo se enviarán informes de problemas que se encuentran en el <strong>área cubierta</strong>.\n"
"Un organismo no recibirá ningún informe salvo que represente al menos un área."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
-msgstr "Este correo electrónico ha sido enviado a los dos Ayuntamientos que cubren la ubicación del problema, ya que el usuario no lo categorizar, por favor, hacer caso omiso de él si usted no es el consejo correcto para hacer frente al problema, o háganos saber qué clase de problema es por lo que podemos añadir a nuestro sistema."
+msgstr "Este correo electrónico ha sido enviado a los dos ayuntamientos que cubren la ubicación del problema, ya que el usuario no lo categorizó. Por favor, haga caso omiso del mismo si usted no es el organismo administrativo responsable de este problema, o háganos saber qué clase de problema es para que lo podamos añadir a nuestro sistema."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
-msgstr "Este correo electrónico ha sido enviado a varios consejos que cubren la ubicación del problema, como la categoría seleccionada se proporciona para todos ellos, por favor, hacer caso omiso de él si usted no es el consejo correcto para hacer frente a la cuestión."
+msgstr "Este correo electrónico ha sido enviado a varios consejos que cubren la ubicación del problema, pues la categoría de problema seleccionada por el usuario se proporciona para todos ellos. Por favor, si usted no pertenece al órgano administrativo responsable de resolver esta incidencia haga caso omiso de este mensaje."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3335,11 +3374,11 @@ msgstr "Este es un sitio para desarrolladores, las cosas podrían romperse en cu
#: templates/web/base/reports/index.html:7
msgid "This is a summary of all reports on this site."
-msgstr "Este es un resumen de todos los informes en este sitio."
+msgstr "Este es un resumen de todos los informes en esta web."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
-msgstr "Esto puede deberse a que el enlace es demasiado antiguo o ya utilizado, o la dirección no se ha copiado correctamente."
+msgstr "Esto puede deberse a que el enlace es demasiado antiguo o ya utilizado, o a que la dirección no se haya copiado correctamente."
#: templates/web/base/report/banner.html:15
msgid "This problem has been closed"
@@ -3364,55 +3403,69 @@ msgstr "Este problema se encuentra en progreso"
msgid "This problem is old and of unknown status."
msgstr "Este problema es antiguo y de estatus desconocido."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
-msgstr "Este informe está pendiente de moderación."
+msgstr "Esta notificación está pendiente de moderación."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Esta notificación está marcada como cerrada."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
-msgstr "Esta notificación está actualmente marcada como arreglada."
+msgstr "Esta notificación está marcada como arreglada."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Esta notificación está marcada como abierta."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
-msgstr "Este informe se ha presentado de forma anónima."
+msgstr "Esta notificación se ha presentado de forma anónima."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Esta página web también contiene una foto del problema, proporcionada por el usuario."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Cronología"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Título"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Para <strong>notificar de un problema</strong>, haz clic en el mapa en la ubicación correcta."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Título"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Para saber cuáles son las alertas locales que tenemos para usted, por favor introduzca su código postal o el nombre de la calle y el área"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Para saber cuáles son las alertas locales que tenemos para usted, por favor introduzca su código postal o el nombre de la calle y el área"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Para ver un mapa de la ubicación precisa de este problema"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3422,14 +3475,14 @@ msgstr "Total"
#: templates/web/base/js/translation_strings.html:29
msgid "Try again"
-msgstr "Inténtalo de nuevo"
+msgstr "Inténtelo de nuevo"
#: templates/web/base/contact/submit.html:14
msgid "Try emailing us directly:"
msgstr "Pruebe enviándonos un correo directamente:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3437,11 +3490,11 @@ msgstr "Pruebe enviándonos un correo directamente:"
msgid "Unable to fix"
msgstr "Incapaz de arreglarlo"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Sin confirmar"
@@ -3458,7 +3511,9 @@ msgstr "Tipo de alerta desconocida"
msgid "Unknown error"
msgstr "Error desconocido"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "ID de problema desconocido"
@@ -3481,17 +3536,17 @@ msgid "Update below added by %s at %s"
msgstr "La actualización de abajo fue añadida por %s en %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Actualizar órgano"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Actualizar desglose por estado"
#: db/alert_types.pl:7
msgid "Update by {{name}}"
-msgstr "Actualización por {{name}}"
+msgstr "Actualizar por {{name}}"
#: templates/web/base/admin/update_edit.html:42
#: templates/web/zurich/admin/update_edit.html:25
@@ -3520,52 +3575,55 @@ msgstr "Actualizar:"
msgid "Updated"
msgstr "Actualizado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "¡Actualizado!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Actualizaciones"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
-msgstr "Las actualizaciones están limitadas a %s caracteres de longitud. Por favor acorte su actualización."
+msgstr "Las actualizaciones están limitadas a %s caracteres. Por favor acorte su actualización."
#: db/alert_types.pl:5 db/alert_types.pl:6
msgid "Updates on {{title}}"
msgstr "Actualizaciones en {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Actualizaciones para este problema, FixMyStreet"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
-msgstr "Usa la <strong>nota</strong> para guardar detalles que sólo serán desplegados en la sección de administración. Las notas no son mostradas publicamente, y no son enviadas al órgano."
+msgstr "Usa la <strong>nota</strong> para guardar detalles que sólo serán desplegados en la sección de administración. Las notas no son mostradas públicamente ni son enviadas al órgano administrativo."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Usuario"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "mapa utilizado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Eliminada marca de usuario"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Usuario marcado"
@@ -3573,23 +3631,23 @@ msgstr "Usuario marcado"
msgid "User search finds matches in users' names and email addresses."
msgstr "La búsqueda ha encontrado coincidencias en nombres de usuarios y direcciones de email."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Usuarios"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Valores actualizados"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Ver notificaciones en el site"
@@ -3610,21 +3668,20 @@ msgstr "Visualizando un problema"
#: templates/web/base/reports/body.html:16
msgid "Wards of this council"
-msgstr "Barrios de este Ayuntamiento"
+msgstr "Barrios de este ayuntamiento"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
-msgstr "Hemos encontrado más de una coincidencia para esa ubicación. Se muestra un máximo de diez, intenta una búsqueda diferente si no lo encuentra aquí."
+msgstr "Hemos encontrado más de una coincidencia para esa ubicación. Se muestran un máximo de diez. Prueba una búsqueda diferente si no encuentra aquí su ubicación."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "No hemos podido confirmar su cuenta - lo sentimos."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
-msgstr "Te hemos enviado un correo electrónico con un enlace para confirmar tu cuenta."
+msgstr "Le hemos enviado un email con un enlace para confirmar su cuenta."
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:2
#: templates/web/fixmystreet/report/update-form.html:77
@@ -3636,9 +3693,9 @@ msgstr "Nunca mostramos su dirección de email"
msgid "We never show your email address or phone number."
msgstr "Nunca mostramos su dirección de email o número de teléfono."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
-msgstr "Somos conscientes de este problema podría ser responsabilidad de %s , sin embargo, actualmente no tenemos ningún datos de contacto de ellos. Si sabe de alguna dirección de contacto adecuada, por favor póngase contáctenos."
+msgstr "Somos conscientes de este problema podría ser responsabilidad de %s; sin embargo, actualmente no disponemos de sus datos de contacto. Si conoce la dirección de contacto adecuada, por favor contáctenos."
#: templates/web/base/index-steps.html:31
msgid "We send it to the council on your behalf"
@@ -3651,21 +3708,25 @@ msgstr "Sólo utilizaremos su información personal de acuerdo a nuestra <a href
#: templates/web/base/questionnaire/completed-open.html:2
msgid "We&rsquo;re sorry to hear the problem’s not fixed. Why not try writing to your local representatives?"
-msgstr "Nosotros&rsquo;re lamentamos que el problema no está arreglado. ¿Por qué no prueba a escribir a sus representantes locales?"
+msgstr "Lamentamos que el problema no esté arreglado. ¿Por qué no prueba a escribir directamente a sus representantes locales?"
#: templates/web/base/contact/blurb.html:8
msgid "We'd love to hear what you think about this site. Just fill in the form, or send an email to <a href='mailto:%s'>%s</a>:"
-msgstr "Nos encantaría saber lo que piensas acerca de este sitio. Sólo tienes que rellenar el formulario o enviar un correo electrónico a <a href='mailto:%s'>%s</a>:"
+msgstr "Nos encantaría saber lo que piensa acerca de esta web. Sólo tienes que rellenar el formulario o enviar un correo electrónico a <a href='mailto:%s'>%s</a>:"
#: templates/web/base/contact/submit.html:7
msgid "We’ll get back to you as soon as we can."
-msgstr "Gracias por tus comentarios. ¡Nos pondremos en contacto con usted tan pronto como nos sea posible!"
+msgstr "Gracias por sus comentarios. ¡Nos pondremos en contacto con usted tan pronto como nos sea posible!"
+
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
-msgstr "¿Cual es el problema y donde está?"
+msgstr "¿Cuál es el problema y dónde está?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Una vez editada"
@@ -3674,35 +3735,41 @@ msgstr "Una vez editada"
msgid "When sent"
msgstr "Una vez enviada"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
-msgstr "Todo el bloque de pisos vacíos"
+msgstr "Bloque de pisos vacíos"
#: templates/web/base/tokens/confirm_alert.html:7
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
-msgstr "¿Porqué detenerse ahí? <a href=\"/alert\">Configure más alertas</a> gratis."
+msgstr "¿Por qué detenerse ahí? <a href=\"/alert\">Configure más alertas</a> gratis."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "En las búsquedas de solicitudes, es también posible buscar por agency_responsible para limitar las solicitudes a las enviados a una sola administración. El término de búsqueda es el ID de administración proporcionada por <a href=\"%s\">MapIT</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
-msgstr "¿Quieres contribuir a FixMyStreet? Nuestro código es abierto y <a href=\"http://fixmystreet.org\">disponible en fixmystreet.org</a>."
+msgstr "¿Quieres contribuir a mejorar FixMyStreet? Nuestro código es abierto y está <a href=\"http://fixmystreet.org\">disponible en fixmystreet.org</a>."
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "¿Quieres recibir otro cuestionario en 4 semanas, recordándote que debes comprobar el estado?"
#: templates/web/base/report/new/notes.html:7
msgid "Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation."
-msgstr "Escribir su mensaje completamente en mayúsculas hace que sea difícil de leer, al igual que la falta de puntuacion."
+msgstr "Escribir su mensaje completamente en mayúsculas o sin signos de puntuación hace que sea difícil de leer."
#: templates/web/base/report/new/fill_in_details_form.html:4
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:5
msgid "Wrong location? Just click again on the map."
-msgstr "Ubicación incorrecta? Simplemente haga clic de nuevo en el mapa."
+msgstr "¿Ubicación incorrecta? Haga clic de nuevo en el mapa, en el lugar correcto."
#: templates/web/base/admin/stats.html:10
msgid "Year"
@@ -3717,15 +3784,13 @@ msgstr "Año"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "SÃ"
@@ -3737,26 +3802,26 @@ msgstr "Sí, tengo una contraseña"
#: templates/web/base/contact/index.html:39
#: templates/web/fixmystreet/contact/index.html:54
msgid "You are complaining that this problem report was unnecessarily moderated:"
-msgstr "Vd. se está quejando de que el la incidencia fue innecesariamente moderada:"
+msgstr "Usted se está quejando de que la notificación fue innecesariamente moderada:"
#: templates/web/base/contact/index.html:41
#: templates/web/fixmystreet/contact/index.html:56
msgid "You are reporting the following problem report for being abusive, containing personal information, or similar:"
-msgstr "Estás reportando por abusiva la siguiente notificación, que contiene información personal, o similar:"
+msgstr "Estás denunciando la siguiente notificación por ser abusiva, contener información personal, o similar:"
#: templates/web/base/contact/index.html:15
#: templates/web/fixmystreet/contact/index.html:30
msgid "You are reporting the following update for being abusive, containing personal information, or similar:"
-msgstr "Estás reportando por abusiva la siguiente actualización, que contiene información personal, o similar:"
+msgstr "Estás denunciando la siguiente actualización por ser abusiva, contener información personal, o similar:"
#: templates/web/zurich/tokens/confirm_problem.html:5
#: templates/web/zurich/tokens/confirm_problem.html:8
msgid "You can <a href=\"%s%s\">view the problem on this site</a>."
-msgstr "Vd. puede <a href=\"%s%s\">ver el problema en este sitio</a>."
+msgstr "Usted puede <a href=\"%s%s\">ver el problema en este sitio</a>."
#: templates/web/base/admin/user-form.html:48
msgid "You can add an abusive user's email to the abuse list, which automatically hides (and never sends) reports they create."
-msgstr "Puede agregar email del usuario abusivo a la lista de abusos, que oculta de forma automática (y nunca envía) los informes que crean."
+msgstr "Puede agregar email del usuario abusivo a la lista de abusones, que oculta de forma automática (y nunca envía) los informes que crean."
#: templates/web/fixmystreet/contact/index.html:121
msgid "You can contact technical support on <a href='mailto:%s'>%s</a>"
@@ -3768,7 +3833,7 @@ msgid ""
" For example, this can useful if you want to keep an eye on a user who has posted inappropriate\n"
" reports in the past."
msgstr ""
-"Puede marcar cualquier informe o usuario mediante su edición, y serán listado en esta página\n"
+"Puede marcar cualquier informe o usuario y serán listado en esta página.\n"
"Por ejemplo, si quiere tener vigilado a un usuario que envió algún informe\n"
"inapropiado anteriormente."
@@ -3777,7 +3842,7 @@ msgstr ""
#: templates/web/base/report/new/councils_text_some.html:19
#: templates/web/base/report/new/councils_text_some.html:21
msgid "You can help us by finding a contact email address for local problems for %s and emailing it to us at <a href='mailto:%s'>%s</a>."
-msgstr "Usted puede ayudarnos a encontrar una dirección de correo electrónico de contacto para los problemas locales para %s y enviarlanosla por correo electrónico a <a href='mailto:%s'>%s</a>."
+msgstr "Puede ayudarnos a encontrar una dirección de email de contacto para los problemas locales para %s y enviárnosla a <a href='mailto:%s'>%s</a>."
#: templates/web/base/admin/body-form.html:85
msgid "You can mark a body as deleted if you do not want it to be active on the site."
@@ -3785,29 +3850,31 @@ msgstr "Puede marcar un organismo como eliminado si no quiere que aparezca activ
#: templates/web/base/js/translation_strings.html:36
msgid "You declined; please fill in the box above"
-msgstr "Vd. ha sido rechazado; por favor, rellene el formulario de arriba"
+msgstr "Usted rechazó finalmente; por favor, rellene el formulario de arriba"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:38
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
-msgstr "Usted ya respondió a esta encuesta. Si tiene alguna pregunta, por favor, <a href='%s'>póngase en contacto </a>, o <a href ='%s'>vea su problema</a>.\n"
+msgstr "Ya respondió a esta encuesta. Si tiene alguna pregunta, por favor, <a href='%s'>póngase en contacto con nosotros</a>, o <a href ='%s'>vea su problema</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
-msgstr "Usted ya adjuntó una foto para esta notificación, adjuntando otra la reemplazará."
+msgstr "Ya ha adjuntado una foto para esta notificación, adjuntando otra reemplazará la anterior."
#: templates/web/base/report/update-form.html:59
#: templates/web/fixmystreet/report/update-form.html:56
msgid "You have already attached a photo to this update, attaching another one will replace it."
-msgstr "Usted ya ha adjuntado una foto para esta actualización, adjuntando otra la reemplazará."
+msgstr "Ya ha adjuntado una foto para esta actualización, adjuntando otra reemplazará la anterior."
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
-msgstr "Ha cerrado la sesión correctamente."
+msgstr "Ha cerrado la sesión correctamente"
#: templates/web/zurich/report/new/fill_in_details_form.html:13
msgid "You have located the problem at the point marked with a green pin on the map. If this is not the correct location, simply click on the map again. "
@@ -3816,25 +3883,21 @@ msgstr "Has ubicado el problema en el punto marcado con el pin verde en el mapa.
#: templates/web/zurich/tokens/confirm_problem.html:5
#: templates/web/zurich/tokens/confirm_problem.html:6
msgid "You have successfully confirmed your email address."
-msgstr "Vd. ha confirmado correctamente su dirección de correo electrónico."
+msgstr "Ha confirmado correctamente su dirección de correo electrónico."
#: templates/web/base/report/display.html:20
#: templates/web/base/report/new/fill_in_details.html:37
#: templates/web/fixmystreet/report/display.html:17
msgid "You have successfully signed in; please check and confirm your details are accurate:"
-msgstr "Ha iniciado sesión correctamente, por favor revise y confirme si sus detalles son precisos:"
+msgstr "Ha iniciado sesión correctamente, por favor revise y confirme si sus detalles son correctos:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
-msgstr "Tiene&rsquo;t informes creados todavía. <a href=\"%s\">Informe de un problema ahora.</a>"
-
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Ahora debe hacer clic en el enlace del correo electrónico que se le acaba de enviar"
+msgstr "No ha notificado nada aún. <a href=\"%s\">Notifique un problema ahora</a>."
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
-msgstr "Vd. necesita <a href=\"%s\">añadir organismos</a> (como ayuntamiento o departamentos) para que el informe pueda ser enviado."
+msgstr "Necesita <a href=\"%s\">añadir organismos</a> (como ayuntamiento o departamentos) para que el informe pueda ser enviado."
#: templates/web/base/admin/bodies.html:7
msgid ""
@@ -3843,21 +3906,19 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
"Es necesario crear organismos (como ayuntamientos o departamentos) para poder añadir\n"
-"categorías de problemas que puedan solucionar (farolas o baches) y su\n"
-"contacto (como una dirección de correo) para que los informes sean enviados."
+"categorías de problemas que éstos puedan solucionar (como farolas o baches) y su\n"
+"vía de contacto (como una dirección de correo), para que las notificaciones puedan ser enviadas."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "¿De verdad quiere volver a enviar?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Sus notificaciones"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3866,22 +3927,17 @@ msgstr "Sus notificaciones"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Su email:"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Su dirección de email"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Su dirección de email:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3891,24 +3947,23 @@ msgstr "Su email:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Su información sólo será usada de acuerdo con nuestra <a href=\"/privacy\">política de privacidad</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
-msgstr "Su Nombre"
+msgstr "Su nombre"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
-msgstr "Su Nombre:"
+msgstr "Su nombre:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3917,23 +3972,19 @@ msgstr "Su contraseña"
#: templates/web/base/auth/change_password.html:6
msgid "Your password has been changed"
-msgstr "Su contraseña ha cambiado."
+msgstr "Su contraseña ha cambiado"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Su número de teléfono"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Su notificación"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Sus notificaciones"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Sus actualizaciones"
@@ -3941,42 +3992,55 @@ msgstr "Sus actualizaciones"
msgid "Your&nbsp;email:"
msgstr "Su email:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Todas las notificaciones"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "por %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Notificaciones cerrados"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
-msgstr "Ayuntamiento"
+msgstr "ayuntamiento"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "no utilizó mapa"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "por ejemplo, '%s' o '%s'"
#: templates/web/base/admin/body-form.html:188
#: templates/web/base/admin/flagged.html:51
msgid "edit user"
-msgstr "Editar usuario"
+msgstr "editar usuario"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Notificaciones arregladas"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "de %d usuarios diferentes"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "ultima actualización %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "menos de un minuto"
@@ -4011,43 +4075,42 @@ msgstr "marcado como en investigación"
#: templates/web/base/report/updates.html:55
msgid "marked as not the council's responsibility"
-msgstr "marcado como que el Ayuntamiento no es responsable"
+msgstr "marcado como que el ayuntamiento no es responsable"
#: templates/web/base/report/updates.html:43
msgid "marked as planned"
-msgstr "marcado según lo previsto"
+msgstr "marcado como planificado"
#: templates/web/base/report/updates.html:53
msgid "marked as unable to fix"
msgstr "marcado como que no se puede arreglar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/a"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "o"
#: templates/web/base/js/translation_strings.html:27
msgid "or locate me automatically"
-msgstr "o localizarme automaticamente"
+msgstr "o localízame automáticamente"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "consignados inicialmente:"
@@ -4060,40 +4123,43 @@ msgstr "otras áreas:"
msgid "reopened"
msgstr "reabierto"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
-msgstr "Salir"
+msgstr "salir"
#: templates/web/base/report/new/fill_in_details_form.html:12
#: templates/web/base/report/new/fill_in_details_form.html:15
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
msgid "the local council"
-msgstr "el Ayuntamiento local"
+msgstr "ayuntamiento"
#: templates/web/base/report/_main.html:57
#: templates/web/zurich/report/_main.html:5
msgid "there is no pin shown as the user did not use the map"
-msgstr "no hay pines porque el usuario no usó el mapa"
+msgstr "no hay marcador porque el usuario no usó el mapa"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "este tipo de problema local"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "hoy"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Notificaciones arregladas"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "mapa utilizado"
#: templates/web/base/admin/update_edit.html:35
msgid "user is from same council as problem - %d"
-msgstr "El usuario es del mismo Ayuntamiento que el problema - %d"
+msgstr "El usuario es del mismo ayuntamiento que el problema - %d"
#: templates/web/base/admin/update_edit.html:38
msgid "user is problem owner"
@@ -4111,7 +4177,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> notificadas recientemente"
msgstr[1] "<big>%s</big> notificadas recientemente"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4125,7 +4191,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d simpatizante"
msgstr[1] "%d simpatizantes"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4144,9 +4210,9 @@ msgstr[1] "<big>%s</big> notificaciones actualizadas"
msgid "We do not yet have details for the council that covers this location."
msgid_plural "We do not yet have details for the councils that cover this location."
msgstr[0] "Todavía no tenemos detalles para el Ayuntamiento que cubre esta zona."
-msgstr[1] "Todavía no tenemos detalles para el Ayuntamiento que cubre esta zona."
+msgstr[1] "Todavía no tenemos información de qué ayuntamientos cubren este área."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4158,16 +4224,16 @@ msgstr[1] "%d semanas"
msgid "<big>%s</big> report in past week"
msgid_plural "<big>%s</big> reports in past week"
msgstr[0] "<big>%s</big> notificadas la semana pasada"
-msgstr[1] "<big>%s</big> notificadas la semana pasada"
+msgstr[1] "<big>%s</big> notificaciones la semana pasada"
#: templates/web/base/front/stats.html:23
#, perl-format
msgid "<big>%s</big> fixed in past month"
msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> arregladas la semana pasada"
-msgstr[1] "<big>%s</big> arregladas la semana pasada"
+msgstr[1] "<big>%s</big> arregladas el mes pasado"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4179,7 +4245,145 @@ msgstr[1] "%d dias"
msgid "We do <strong>not</strong> yet have details for the other council that covers this location."
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] "Todavía <strong>no</strong> tenemos detalles para el Ayuntamiento que cubre esta zona."
-msgstr[1] "Todavía <strong>no</strong> tenemos detalles para el Ayuntamiento que cubre esta zona."
+msgstr[1] "Todavía <strong>no</strong> tenemos información sobre el ayuntamiento que cubre este área."
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(No se preocupe &mdash; guardaremos su alerta mientras usted revisa su email)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(No se preocupe &mdash; guardaremos su notificación mientras revisa su email)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(No se preocupe &mdash; guardaremos su actualización mientras revisa su email)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Si no puede ver el mapa, <a href='%s' rel='nofollow'> omita este paso</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>No</strong>, no tengo, permítanme registrarme por email:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "¿Eres <strong>programador</strong>? ¿Te gustaría contribuir a FixMyStreet?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Problemas cercanos <small>(dentro de %%s km)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Contactar con FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "¿Tiene una contraseña FixMyBarangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "Admin FixMyStreet:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "En caso contrario, no se activará su alerta."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "En caso contrario, no se publicará su notificación."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "En caso contrario, no se publicará su actualización."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nuevas notificaciones locales en reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nuevas notificaciones en {{COUNCIL}} para el barrio {{WARD}} en reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nuevas notificaciones en reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nuevas notificaciones en reportemptyhome.com cerca de {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nuevas notificaciones en {{COUNCIL}} en reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nuevas notificaciones dentro de los límites de {{NAME}} en reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Nueva actualización"
+
+#~ msgid "No problems found."
+#~ msgstr "No se han encontrado problemas."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "No se han notificado problemas todavía."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Ahora a enviar tu notificación&hellip; ¿tienes una contraseña en FixMyStreet?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Ahora a enviar tu notificación&hellip; ¿tienes una contraseña en FixMyStreet?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Nuestro código es open source y <a href=\"http://github.com/mysociety/fixmystreet\">está disponible en GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Por favor, <a class=\"tab_link\" href=\"#report\">eche un vistazo</a> a las actualizaciones que se han recibido."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Por favor eche un vistazo a las actualizaciones que se han recibido."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemas en %s, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Propiedades recientemente notificadas como vueltas a usar en reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publicar respuesta"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Notificado %s, a %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Notificaciones en y alrededor del mapa"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Iniciar sesión con email"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Conectado como %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "El email de confirmación podría tardar unos minutos en llegar - por favor, sea paciente."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Los detalles de su problema están disponibles en la otra pestaña de arriba."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Los detalles de su problema están disponibles en el lado derecho de esta página."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Últimas notificaciones recibidas de los usuarios"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Últimas propiedades notificadas por los usuarios como nuevamente en uso"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Últimas notificaciones para {{COUNCIL}} recibidas de los usuarios"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Últimas notificaciones de {{COUNCIL}} en el barrio de {{WARD}} recibidas de los usuarios"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Últimas notificaciones en los límites de {{NAME}} recibidas de los usuarios"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Para <strong>notificar un problema</strong>, haz clic en el mapa en la ubicación correcta."
+
+#~ msgid "User"
+#~ msgstr "Usuario"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Debe hacer clic en el enlace incluido en el mensaje."
+
+#~ msgid "Your email address:"
+#~ msgstr "Su dirección de email:"
-#~ msgid "For council(s):"
-#~ msgstr "Por Concejalía(s):"
+#~ msgid "Your report"
+#~ msgstr "Su notificación"
diff --git a/locale/fr_FR.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/fr_FR.UTF-8/LC_MESSAGES/FixMyStreet.po
index 917253d33..32b5901df 100644
--- a/locale/fr_FR.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/fr_FR.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -5,25 +5,25 @@
#
# Translators:
# Christophe Ocivélo Saint-Etienne <ocivelo@gmail.com>, 2014
-# fixmystreetfr <fixmystreet@fixmystreet.fr>, 2014
+# fixmystreetfr <fixmystreet@fixmystreet.fr>, 2014-2015
# mySociety <transifex@mysociety.org>, 2015
# Tim Morley <>, 2012
msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
-"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: French (France) (http://www.transifex.com/projects/p/fixmystreet/language/fr_FR/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-10-10 19:23+0000\n"
+"Last-Translator: fixmystreetfr <fixmystreet@fixmystreet.fr>\n"
+"Language-Team: French (France) (http://www.transifex.com/mysociety/fixmystreet/language/fr_FR/)\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " et "
@@ -36,11 +36,13 @@ msgstr " et "
msgid " or "
msgstr " ou "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d alertes confirmées, %d non confirmées "
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d contacts administratifs &ndash; %d confirmés, %d non confirmés"
@@ -49,11 +51,13 @@ msgstr "%d contacts administratifs &ndash; %d confirmés, %d non confirmés"
msgid "%d edits by %s"
msgstr "%d changements par %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d mises à jour en temps réel"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d questionnaires envoyés &ndash; %d complétés (%s%%)"
@@ -66,15 +70,61 @@ msgstr "de %d à %d de %d"
msgid "%s - Summary reports"
msgstr "%s - Rapports sommaires"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet.fr a une variété de flux RSS et d'alertes par email pour les problèmes locaux qui comprennent\n"
+"des alertes pour tous les problèmes dans une commune, ou tous les problèmes inclus\n"
+"dans une certaine distance d'un endroit précis'."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet.fr a une variété de flux RSS et d'alertes par email pour les problèmes locaux qui comprennent\n"
+"des alertes pour tous les problèmes dans une commune, ou tous les problèmes inclus\n"
+"dans une certaine distance d'un endroit précis'."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s réf&nbsp;:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"FixMyStreet.fr envoie les différentes catégories de problèmes\n"
+"à l'administration appropriée, ce qui veut dire que tous les problèmes à l'intérieur\n"
+"d'une commune ne seront pas toujours ceux envoyés à la commune. Par exemple, un\n"
+"nid de poule sur une route nationale sera envoyée aux Ponts et Chausséees et apparaitra\n"
+"dans les deux les alertes des Ponts et Chaussées, mais uniquement dans l'alerte « À l'intérieur de » pour la commune."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "Localité %s, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, rapporté %s"
@@ -84,61 +134,59 @@ msgstr "%s, dans la localité %s"
#: perllib/FixMyStreet/Map/OSM.pm:42
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
-msgstr ""
-
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Pas d'inquiétude&mdash; nous conservons votre alerte pendant que vous vérifiez votre adresse courriel.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Pas d'inquiétude&mdash; nous conservons votre rapport pendant que vous vérifiez votre adresse courriel.)"
+msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributeurs"
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Pas d'inquiétude&mdash; nous conservons votre mise à jour pendant que vous vérifiez votre adresse courriel.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(email dans la liste des abus)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Votre nom"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Votre numéro de téléphone"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(une distance par défaut qui couvre environs 200 000 personnes)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(sinon, le flux RSS peut être personnalisé, dans l&rsquo;intervalle de'"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(fermé)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(résolu)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(comme des graffitis, immondices, trottoirs abimés ou éclairage public)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(non signalé à l&rsquo;administration)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(facultatif)"
@@ -146,25 +194,24 @@ msgstr "(facultatif)"
msgid "(public)"
msgstr "(public)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(envoyé aux deux)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(nous n&rsquo;affichons jamais votre email ou numéro de téléphone)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(nous n&rsquo;affichons jamais votre email)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Choisissez une catégorie --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Choisissez un type de propriété --"
@@ -180,12 +227,14 @@ msgstr ""
" Cela est probablement la raison pour laquelle \"zone couverte\" est vide (dessous).<br>\n"
" Peut etre ajouter un <code>MAPIT_TYPES</code> a votre fichier de config?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Si vous ne pouvez pas voir le plan, <a href='%s' rel='nofollow'>sautez cette étape</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> problèmes actifs"
@@ -198,28 +247,22 @@ msgstr "<strong>Non</strong>, laissez-moi confirmer mon rapport par email :"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Non</strong>, laissez-moi confirmer ma mise à jour par email :"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Non</strong>, laissez-moi m'authentifier par email :"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Non</strong>, je n'en ai pas, laissez-moi m'authentifier par email :"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Non</strong>, laissez-moi confirmer mon rapport par email :"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Non</strong>, laissez-moi confirmer ma mise à jour par email :"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -230,8 +273,8 @@ msgstr "<strong>Oui</strong>, j'ai un mot de passe :"
msgid "About us"
msgstr "À propos"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -256,7 +299,7 @@ msgstr "Ajouter un contact en utilisant le formulaire ci-dessous."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Ajouter un interlocuteur"
@@ -269,10 +312,15 @@ msgstr "Ajouter une nouvelle catégorie"
msgid "Add user"
msgstr "Ajouter un utilisateur"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Ajouté %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Attendant une modération"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Encore une fois :"
@@ -285,21 +333,25 @@ msgstr "Alerte %d créée pour %s, type %s, paramètres %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Alerte %d désactivée (création %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "M'alerter de futures mises à jour"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Tous les rapports"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Tous les rapports"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Tous les rapports"
@@ -322,8 +374,7 @@ msgstr "Toutes les informations que vous fournissez ici seront envoyées à"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Toutes les informations que vous fournissez ici seront envoyées à <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Une mise à jour a marqué ce problème comme résolu"
@@ -332,16 +383,12 @@ msgstr "Une mise à jour a marqué ce problème comme résolu"
msgid "Anonymous"
msgstr "Anonyme"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonyme :"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Vous êtes un <strong>développeur</strong> ? Vous aimeriez contribuer à FixMyStreet ?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Vous êtes un développeur ?"
@@ -354,24 +401,27 @@ msgstr "Zone couverte"
#: templates/web/base/admin/bodies.html:15
#: templates/web/base/admin/body.html:60
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
-msgstr ""
+msgstr "Comme ceci est un site de développement et %s est un test, les rapports produits sur ce site seront envoyés au gestionnaire du problème FixMyStreet et non le contact de l'administration indiqué pour la catégorie choisie."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Affecté à un \"interlocuteur\" externe:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Affecté à une catégorie différente:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Affecté à un \"interlocuteur\" externe:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Affecté à la subdivision:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Affecté à %s"
@@ -392,12 +442,12 @@ msgstr "Attendant une modération"
msgid "Back"
msgstr "Retour"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Bannir l'adresse mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Interlocuteurs"
@@ -417,12 +467,16 @@ msgstr "Interlocuteur:"
msgid "By Date"
msgstr "Par Date"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Vous ne pouvez pas voir le plan ? <em>Sautez cette étape</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -433,27 +487,28 @@ msgstr "Vous ne pouvez pas voir le plan ? <em>Sautez cette étape</em>"
msgid "Category"
msgstr "Catégorie"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Taux de résolution pour les problèmes > 4 semaines"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Catégorie :"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Catégorie : %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Changer le mot de passe"
@@ -500,54 +555,60 @@ msgstr ""
"public (ex., \"nid de poule\", \"éclairage public\") mais est aussi utile pour l'interlocuteur.\n"
" Elle apparaitra dans le menu déroulant sur la page \"Rapporter-un-problème\"."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Cliquer ici ou saisir au format jj/mm/aaaa"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Cliquez sur le plan pour signaler un problème"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Clos"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Clos par l'administration"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Rapports clos"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Clos :"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Problèmes clos à proximité <small>(dans l'intervalle de&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Coordonnées"
@@ -555,22 +616,22 @@ msgstr "Coordonnées"
msgid "Cobrand"
msgstr "Collaboration"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Données de collaboration :"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Collaboration :"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Configuration"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Configurez Endpoint"
@@ -578,7 +639,7 @@ msgstr "Configurez Endpoint"
msgid "Confirm"
msgstr "Confirmer"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Confirmer le compte"
@@ -598,7 +659,7 @@ msgstr "Confirmation"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Confirmé"
@@ -609,13 +670,18 @@ msgstr "Rapports confirmés entre %s et %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Confirmé :"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Contacter FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Nous contacter"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -630,8 +696,14 @@ msgstr "Nous contacter"
msgid "Contact the team"
msgstr "Contacter l'équipe"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Coordonnées"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Impossible de trouver l'utilisateur"
@@ -649,7 +721,7 @@ msgstr "Administration"
msgid "Council contacts for %s"
msgstr "Contacts de l'administration pour %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "Ref. de la mairie :&nbsp;%s"
@@ -664,7 +736,7 @@ msgstr "Administration :"
msgid "Count"
msgstr "Nombre"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Créer un rapport"
@@ -673,17 +745,19 @@ msgstr "Créer un rapport"
msgid "Create category"
msgstr "Créer une catégorie"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Créer un rapport"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Créé"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Créé :"
@@ -693,10 +767,15 @@ msgid "Current state"
msgstr "État actuel"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Pour l'instant, aucun intelocuteur n'a été créé."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -706,11 +785,16 @@ msgstr "Tableau de bord"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Traité par la subdivision dans les 5 jours ouvrables"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Effacé"
@@ -728,9 +812,9 @@ msgstr "Détails :"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Détails :"
@@ -738,23 +822,27 @@ msgstr "Détails :"
msgid "Devolved"
msgstr "Transféré(e)"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "n'a pas utilisé le plan"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Tableau d'honneur de la réactivité"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Avez-vous un mot de passe FixMyBarangay?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Avez-vous un mot de passe FixMyStreet ?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Je ne sais pas"
@@ -762,8 +850,8 @@ msgstr "Je ne sais pas"
msgid "Don't like forms?"
msgstr "Vous n'aimez pas les formulaires ?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -785,7 +873,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Éditer"
@@ -796,7 +885,7 @@ msgstr "Editer les détails de l'intelocuteur"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -811,15 +900,15 @@ msgstr "Édition de la mise à jour %d"
msgid "Editing user %d"
msgstr "Édition de l'utilisateur %d'"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Éditeur"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -827,7 +916,7 @@ msgstr "Éditeur"
msgid "Email"
msgstr "Email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Email rajouté à la liste des abus"
@@ -837,13 +926,13 @@ msgstr "Adresse courriel:"
#: templates/web/base/tokens/confirm_alert.html:6
msgid "Email alert created"
-msgstr ""
+msgstr "Alerte E-mail créé"
#: templates/web/base/tokens/confirm_alert.html:10
msgid "Email alert deleted"
-msgstr ""
+msgstr "Alerte E-mail supprimé"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Email déjà présent dans la liste des abus"
@@ -856,38 +945,36 @@ msgid "Email me updates"
msgstr "Envoyez-moi les mises à jour"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email :"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Courriel: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "appartement ou maisonnette vide"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "maison ou bungalow vide"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "bureau ou commerce vide"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "pub ou bar vide"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "bâtiment public - école - hôpital, etc non renseigné."
@@ -922,7 +1009,7 @@ msgstr "Date de fin:"
msgid "Endpoint"
msgstr "destinataire"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Saisir un nom de rue Z&uuml;complet"
@@ -935,10 +1022,8 @@ msgstr "Saisir un code postal proche, ou un nom de rue ou de localité"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Saisir un code postal proche, ou une rue et une localité"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Saisissez un nom de rue proche, la localité ou le code postal"
@@ -946,13 +1031,12 @@ msgstr "Saisissez un nom de rue proche, la localité ou le code postal"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Saisissez un nom de rue proche et une localité, le code postal et le district de Delhi"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Saisissez un nouveau mot de passe :"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -963,7 +1047,6 @@ msgstr "Saisissez un mot de passe :"
msgid "Enter details of the problem"
msgstr "Saisissez les détails du problème"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -973,6 +1056,10 @@ msgstr "Saisissez les détails du problème"
msgid "Error"
msgstr "Erreur"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -986,26 +1073,33 @@ msgstr "Exemples :"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "Expliquez ce qui ne va pas, sa position exact, et depuis combien de temps..."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "URL externe"
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
-msgstr ""
+msgstr "URL externe"
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Donnée supplémentaire:"
#: templates/web/base/contact/submit.html:13
msgid "Failed to send message"
-msgstr ""
+msgstr "Échec de l'envoi du message"
#: templates/web/zurich/admin/index-dm.html:33
#: templates/web/zurich/admin/index-sdm.html:30
msgid "Filter report list"
msgstr "Liste de filtres de rapport"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Première fois"
@@ -1013,44 +1107,14 @@ msgstr "Première fois"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Résoudre ceci en chosissant une <strong>zone couverte</strong> dans le formulaire <em>Saisie des détails interlocuteur</em> ci-dessous."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "Administrateur FixMyStreet.fr"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreet.fr a une variété de flux RSS et d'alertes par email pour les problèmes locaux qui comprennent\n"
-"des alertes pour tous les problèmes dans une commune, ou tous les problèmes inclus\n"
-"dans une certaine distance d'un endroit précis'."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"FixMyStreet.fr envoie les différentes catégories de problèmes\n"
-"à l'administration appropriée, ce qui veut dire que tous les problèmes à l'intérieur\n"
-"d'une commune ne seront pas toujours ceux envoyés à la commune. Par exemple, un\n"
-"nid de poule sur une route nationale sera envoyée aux Ponts et Chausséees et apparaitra\n"
-"dans les deux les alertes des Ponts et Chaussées, mais uniquement dans l'alerte « À l'intérieur de » pour la commune."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1061,21 +1125,16 @@ msgstr ""
msgid "Fixed"
msgstr "Résolu"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Résolu - Administration"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Résolu - Usager"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Rapports résolus"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Résolu :"
@@ -1085,11 +1144,11 @@ msgstr "Résolu :"
msgid "Flag as deleted"
msgstr "Signaler comme supprimé"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Signaler l'usager"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Signalé"
@@ -1106,7 +1165,7 @@ msgstr "Les utilisateurs signalés sont listés dans la page <a href='%s'>signal
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Les utilisateurs signalés ne sont pas restreints en aucune façon. il s'agit juste d'une liste d'utilisateurs qui ont été marqués pour attention."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Signalé :"
@@ -1125,9 +1184,22 @@ msgstr "Pour plus d'information, Lire <a href='http://fixmystreet.org/customisin
msgid "Forgotten your password?"
msgstr "Vous avez oublié votre mot de passe? "
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Affecté à un \"interlocuteur\" externe:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Affecté à un \"interlocuteur\" externe:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Foire Aux Questions"
@@ -1150,27 +1222,26 @@ msgstr "Recevoir les mises à jours de %s problèmes"
msgid "Get updates of problems in this %s"
msgstr "Recevez les mises à jour pour les problèmes dans cette %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Donnez-moi un flux RSS"
#: templates/web/base/questionnaire/completed.html:14
msgid "Glad to hear it’s been fixed!"
-msgstr ""
+msgstr "Heureux d'entendre qu'il a été résolu!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Ok"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Envoi du questionnaire ?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Graphique historique des problèmes créés, par statut"
@@ -1178,41 +1249,37 @@ msgstr "Graphique historique des problèmes créés, par statut"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Les lignes grisées sont des communes qui n'existent plus"
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Est-ce que le problème a été réglé ?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Est-ce que vous aviez déjà signalé un problème à une administration, ou est-ce que c'est votre première fois ?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Aide"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Voici les types de problèmes locaux pour « %s »."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Bienvenue %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1226,7 +1293,7 @@ msgstr "Cachés anciens"
msgid "Hide pins"
msgstr "Cacher les épingles"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historique"
@@ -1242,19 +1309,19 @@ msgstr "Comment signaler un problème"
msgid "How to send successful reports"
msgstr "Comment envoyer des rapports réussis"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Je suis désolé, vous ne pouvez pas confirmer des rapports non validés"
#: templates/web/base/tokens/confirm_problem.html:23
#: templates/web/base/tokens/confirm_problem.html:27
msgid "I just reported a problem on @fixmystreet"
-msgstr ""
+msgstr "Je viens de signaler un problème sur @fixmystreet"
#: templates/web/base/tokens/confirm_update.html:19
#: templates/web/base/tokens/confirm_update.html:23
msgid "I just updated a problem on @fixmystreet"
-msgstr ""
+msgstr "Je viens de mettre à jour un problème sur @fixmystreet"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:96
msgid "I'm afraid we couldn't locate your problem in the database.\n"
@@ -1269,8 +1336,8 @@ msgstr "Je suis désolé, nous n'avons pas pu valider cet accusé de réception.
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1288,37 +1355,25 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr "Si deux interlocuteurs ou plus servent le même lieu, FixMyStreet combine les catégories identiques dans une saisie unique du menu. Vérifiez que vous utilisez le même nom de catégorie pour les interlocuteurs si vous voulez que ce mode de fonctionnement. "
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Si vous ne le faites pas, votre alerte ne sera pas activée"
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Si vous ne le faites pas, votre problème ne sera pas envoyé."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Si vous ne le faites pas, votre mise à jour ne sera pas envoyée."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
-msgstr ""
+msgstr "Si vous obtenez un peu plus d'informations sur l'état de votre problème, s'il vous plaît revenez sur le site et effectuez une mise à jour."
#: templates/web/base/report/new/councils_text_none.html:2
#: templates/web/base/report/new/councils_text_none.html:8
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Si vous signalez un problème ici, le sujet et les détails seront publics, mais le problème ne sera <strong>pas</strong> signalé à l'administration."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Si vous consultez vos emails sur un site web ou que vous utilisez un filtre antispam, vérifiez peut-être votre boîte Spam/Courrier indésirable : nos messages sont parfois filtrés par erreur."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Si vous souhaitez laisser une actualisation publique sur le problème, merci de l'entrer ici\n"
"(merci de noter que la mise à jour ne sera pas envoyée à l'administration). Par exemple, quelle\n"
@@ -1358,7 +1413,7 @@ msgstr ""
"Si vous avez activer Open311 update-sending plus haut, vous devez identifier quel <strong>utlisateur</strong> FixMyStreet sera défini comme le créateur de ces mises à jour.\n"
"Lorsqu'elles sont montrées sur le site. saisir l' ID (nombre) de cet utilisateur."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "ID invalide"
@@ -1383,22 +1438,21 @@ msgstr "En table d'abus ?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "En plus, les attributs suivants qui ne font pas partie de la spécification Open311 v2 sont renvoyés : agency_sent_datetime, title (qui est aussi renvoyé dans la description), interface_used, comment_count, requestor_name (seulement s'il est présent et que le requérant nous a autorisé à l'afficher sur le site)"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "En cours"
#: templates/web/base/tokens/confirm_alert.html:11
msgid "Inbox zero, here we come!"
-msgstr ""
+msgstr "Boîte de réception zéro, nous voilà!"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Inclure les détails personnels du reporter"
@@ -1410,12 +1464,12 @@ msgstr "Inclure les rapports non confirmés"
msgid "Incorrect has_photo value \"%s\""
msgstr "Valeur has_photo invalide \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Notes internes"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Référence interne"
@@ -1423,7 +1477,7 @@ msgstr "Référence interne"
msgid "Invalid agency_responsible value %s"
msgstr "Valeur agency_responsible invalide \"%s\""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Date de fin invalide"
@@ -1431,12 +1485,12 @@ msgstr "Date de fin invalide"
msgid "Invalid format %s specified."
msgstr "Format spécifié %s invalide"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Date de début invalide"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1452,12 +1506,21 @@ msgstr "Il est souvent plus rapide <a href=\"%s\">de parcourir notre FAQs</a> et
#: templates/web/base/tokens/confirm_problem.html:14
msgid "It’s on its way to the council right now."
+msgstr "Il est sur le chemin de l&rsquo;administration en ce moment."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
msgstr ""
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1469,7 +1532,7 @@ msgstr "Se souvenir de moi sur cet ordinateur"
msgid "Last editor"
msgstr "Dernier auteur"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Dernière actualisation :"
@@ -1504,7 +1567,7 @@ msgstr "Flux RSS et alertes email locaux"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Flux RSS et alertes email locales pour « %s »"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Alertes locales"
@@ -1517,14 +1580,12 @@ msgid "MAP"
msgstr "CARTE"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
-msgstr ""
+msgstr "Carte"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "marqué comme terminé"
+msgstr "Marqué comme envoyé"
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1532,16 +1593,26 @@ msgstr "Marquer les utilisateurs dont vous voulez surveiller le comportement com
#: templates/web/base/reports/index.html:24
msgid "Marked fixed/closed in the past eight weeks"
-msgstr ""
+msgstr "Marqué fixé / fermé depuis les huit dernières semaines"
#: templates/web/base/reports/index.html:25
msgid "Marked fixed/closed more than eight weeks ago"
-msgstr ""
+msgstr "Marqué fixé / fermé depuis plus de huit semaines"
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Message"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Affecté à un \"interlocuteur\" externe:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Affecté à un \"interlocuteur\" externe:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Message :"
@@ -1569,27 +1640,25 @@ msgstr "Encore plus de problèmes aux alentours"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Nom"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Nom :"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Nom: %s"
@@ -1602,12 +1671,12 @@ msgstr "Route la plus proche de l'épingle placée sur le plan (génerée automa
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Code postal le plus proche de l'épingle placée sur le plan (géneré automatiquement): %s (à %sm d'ici)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Route la plus proche de l'épingle placée sur le plan (génerée automatiquement à partir de Bing Maps): %s%s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1615,10 +1684,15 @@ msgstr ""
"Route la plus proche de l'épingle placée sur le plan (génerée automatiquement à partir de Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Presque fini! Maintenant allez voir vos emails…"
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Presque fini! Maintenant allez voir vos emails…"
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nouveaux <br />problèmes"
@@ -1627,12 +1701,12 @@ msgstr "Nouveaux <br />problèmes"
msgid "New body added"
msgstr "Nouveau body ajouté"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Nouveau contact de catégorie rajouté"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Nouvelle note interne:"
@@ -1640,9 +1714,10 @@ msgstr "Nouvelle note interne:"
msgid "New local problems on FixMyStreet"
msgstr "Nouveaux problèmes locaux sur FixMyStreet.fr"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nouveaux rapports local sur reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nouvelle note interne:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1668,33 +1743,15 @@ msgstr "Nouveaux problèmes dans les limites de {{NAME}} sur FixMyStreet.fr"
msgid "New reports"
msgstr "Nouveaux rapports"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nouveaux rapports pour {{COUNCIL}} au sein de {{WARD}} sur reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nouveaux rapports sur reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nouveaux rapports sur reportemptyhomes.com près de {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nouveaux rapports à {{COUNCIL}} sur reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "De nouveaux rapports au sein de {{name}} 's sur reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Nouvel état"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Nouvelle mise à jour:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Nouvel état"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1707,14 +1764,12 @@ msgstr "Suivant"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Non"
@@ -1742,20 +1797,11 @@ msgstr "Aucun problème coché trouvé."
msgid "No flagged users found."
msgstr "Aucun utilisateur coché trouvé."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Pas d'autres mises à jour"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Aucun problème trouvé."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Aucun problème n'a encore été signalé."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Aucun résultat retourné"
@@ -1775,8 +1821,6 @@ msgid "No supporters"
msgstr "Aucun supporter"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Aucun"
@@ -1793,8 +1837,8 @@ msgstr ""
"Suivant l'implémentation, les utilisateurs autorisés peuvent avoir accès au tableau de bord (résumé de \n"
"l'activité concernant leur interloculteur), et la faculté de cacher des rapports ou de définir des statuts spéciaux pour les rapports."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1802,7 +1846,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Pas responsable"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Pas responsable"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Pas pour ma subdivision"
@@ -1815,7 +1867,7 @@ msgid "Not reported to council"
msgstr "Pas signalé à l'administration"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Note"
@@ -1825,7 +1877,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Notez que quand les rapports non confirmés sont inclus nous utilisons la date de création du rapport, qui peut être dans un autre mois que la date de confirmation, ce qui peut légèrement faire varier les chiffres."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Note :"
@@ -1834,22 +1886,20 @@ msgstr "Note :"
msgid "Note: <strong>%s</strong>"
msgstr "Note : <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Maintenant pour envoyer votre rapport&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Maintenant pour envoyer votre rapport&hellip; avez-vous un mot de passe FixMyStreet.fr ?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Now to submit your mise à jour&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Maintenant pour envoyer votre mise à jour&hellip; avez-vous un mot de passe FixMyStreet.fr ?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1879,35 +1929,28 @@ msgstr "Anciens <br />problèmes"
msgid "One-line summary"
msgstr "Résumé"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Ouvert"
#: templates/web/base/reports/index.html:22
msgid "Open for more than four weeks, with an update within the past eight weeks"
-msgstr ""
-
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Rapports ouverts"
+msgstr "Ouvrez pendant plus de quatre semaines, avec une mise à jour au cours des huit dernières semaines"
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
-msgstr ""
+msgstr "Ouvert, mais sans mise à jour depuis huit semaines"
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
@@ -1921,32 +1964,26 @@ msgstr "Page web de l'initiative Open311"
msgid "Open311 specification"
msgstr "Spécification Open311"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Ou problèmes signalés à :"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Ou vous pouvez vous abonner à une alerte en fonction de la commune dans laquelle vous êtes :"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Autres"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Notre code est open source et <a href=\"http://github.com/grischard/fixmystreet\">disponible sur GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Propriétaire"
@@ -1961,12 +1998,12 @@ msgstr "Page Introuvable"
msgid "Parent"
msgstr "Parent"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Partiel"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1975,6 +2012,7 @@ msgid "Password (optional)"
msgstr "Mot de passe (facultatif)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Mot de passe :"
@@ -1982,7 +2020,7 @@ msgstr "Mot de passe :"
msgid "Permalink"
msgstr "Permalien"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Numéro de téléphone"
@@ -1991,11 +2029,9 @@ msgstr "Numéro de téléphone"
msgid "Phone number (optional)"
msgstr "Téléphone (facultatif)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Téléphone"
@@ -2006,14 +2042,23 @@ msgstr "Téléphone"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Photo"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Ces renseignements sont nécessaires"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Ces renseignements sont nécessaires"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Photo :"
@@ -2025,22 +2070,18 @@ msgstr "Photos de rapports récents à proximité"
msgid "Place pin on map"
msgstr "Placer l'épingle sur la carte"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planifié"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Merci de <a class=\"tab_link\" href=\"#report\">consulter</a> aux mises à jour qui ont été faites."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Merci d'être poli, concis et précis."
@@ -2050,22 +2091,20 @@ msgstr "Merci d'être poli, concis et précis."
msgid "Please check the passwords and try again"
msgstr "Merci de vérifier les mots de passe et de réessayer"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Merci de consulter vos emails"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Merci de vérifier que votre adresse email est correcte"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2075,15 +2114,16 @@ msgstr "Merci de sélectionner une catégorie"
msgid "Please choose a property type"
msgstr "Merci de choisir un type de propriété"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Merci de corriger les erreurs ci-dessous"
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"Merci de ne <strong>pas</strong> rapporter des problèmes via ce formulaires; ces\n"
@@ -2095,7 +2135,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Merci de ne pas injurieux&nbsp;&mdash; Calomnier l'administration dévalue le service pour tous les utilisateurs."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Merci d'entrer un message"
@@ -2106,15 +2146,15 @@ msgstr "Merci d'entrer un message"
msgid "Please enter a password"
msgstr "Merci d'entrer un mot de passe :"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Merci d'enter un sujet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2122,7 +2162,7 @@ msgid "Please enter a valid email"
msgstr "Merci d'entrer un email valide"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Merci d'entrer une adresse email valide"
@@ -2131,21 +2171,19 @@ msgstr "Merci d'entrer une adresse email valide"
msgid "Please enter some details"
msgstr "Merci d'entrer quelques détails"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Merci d'entrer votre email"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Merci d'entrer votre adresse email"
@@ -2158,8 +2196,8 @@ msgstr "Saisissez votre prénom"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Merci de saisir votre nom complet, les administrations ont besoin de cette information. Si vous ne souhaitez pas que votre nom soit affiché sur ce site, décochez la case ci-dessous"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2198,7 +2236,7 @@ msgstr "Merci d'entrer les détails du problème."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Merci de remplir le formulaire ci-dessous avec les détails du problème, et de décrir l'emplacement aussi précisément que possible dans les détails."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Merci d'indiquer si vous souhaitez recevoir un autre questionnaire"
@@ -2221,19 +2259,24 @@ msgstr "Merci de noter que votre rapport n'a <strong>pas</strong> été envoyé.
msgid "Please note:"
msgstr "Quelques remarques :"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Merci d'expliquer pourquoi vous ré-ouvrez ce rapport"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Merci de fournir du texte ainsi qu'une photo."
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Merci de nous dire si vous avez signalé un problème à une administration auparavant."
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Sélectionnez un interlocuteur"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Merci de sélectionner le type de flux que vous voulez"
@@ -2242,21 +2285,17 @@ msgstr "Merci de sélectionner le type de flux que vous voulez"
msgid "Please select the type of alert you want"
msgstr "Merci de sélectionner le type d'alerte que vous voulez"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Merci de préciser si le problème a été réglé ou non."
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Merci de consulter les mises à jour qui ont été laissées."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Merci de charger uniquement des images JPEG"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Merci de saisir un message"
@@ -2265,8 +2304,8 @@ msgid "Please write your update here"
msgstr "Merci d'écrire votre mise à jour ici"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2287,22 +2326,36 @@ msgstr "Envoyé par %s (<strong>%s</strong>) à %s"
msgid "Posted by %s at %s"
msgstr "Signalé par %s à %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Précédent"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Confidentialité"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privé"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problème"
@@ -2318,12 +2371,12 @@ msgstr "Problème %d confirmé"
msgid "Problem %s sent to council %s"
msgstr "Problème %d signalé à l&rsquo;administration %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Répartition des problèmes par état"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problème signalé comme ouvert."
@@ -2339,12 +2392,10 @@ msgstr "Problèmes"
msgid "Problems in this area"
msgstr "Problèmes dans cette zone"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problèmes aux alentours"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problèmes sur la carte"
@@ -2353,12 +2404,11 @@ msgstr "Problèmes sur la carte"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problèmes récemment signalés sur FixMyStreet.fr"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problèmes à moins de %.1fkm de ce lieu"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2370,20 +2420,17 @@ msgstr "Problèmes à l'intérieur de %s"
msgid "Problems within %s ward"
msgstr "Problèmes dans la localité %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problèmes à l'intérieur de %s, FixMyStreet.fr"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problèmes à l'intérieur de %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problèmes à l'intérieur des limites de :"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Propriétés récemments rapportés à remettrent en visibilité sur reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Adresse de propriété:"
@@ -2397,39 +2444,31 @@ msgstr "Type de propriété:"
msgid "Provide an update"
msgstr "Apporter une mise à jour"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Fournir un nom et un mot de passe est optionnel, mais cela vous permettra de soumettre des problèmes, faire des mises à jour et gérer les rapports plus facilement."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Un mot de passe n'est pas obligatoire, mais vous permettra de créer, mettre à jour et administrer vos rapports plus facilement."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Réponse publique:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publier une photo"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publier la réponse"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Questionnaire"
@@ -2445,12 +2484,11 @@ msgstr "Questionnaire %d envoyé pour le problème %s"
msgid "Questionnaire filled in by problem reporter"
msgstr "Questionnaire rempli par le requérant"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2476,8 +2514,7 @@ msgstr "Flux RSS de %s"
msgid "RSS feed of %s, within %s ward"
msgstr "Flux RSS de %s, dans la localité %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "Flux RSS de problèmes à proximité"
@@ -2485,7 +2522,7 @@ msgstr "Flux RSS de problèmes à proximité"
msgid "RSS feed of problems in this %s"
msgstr "Flux RSS des problèmes à l'intérieur de cette %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2515,17 +2552,18 @@ msgstr "Flux RSS des mises à jour pour ce problème"
msgid "Receive email when updates are left on this problem."
msgstr "Etre informé par courriel lorsque ce problème est mis à jour."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Problèmes locaux récents, FixMyStreet.fr"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Récemment<br />résolus"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Problèmes signalés récemment"
@@ -2533,23 +2571,28 @@ msgstr "Problèmes signalés récemment"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Rappelez-vous que FixMyStreet est principalement destiné au signalement de problèmes physiques qui peuvent être résolus. Si votre problème ne convient pas pour être soumis via ce site, n'oubliez pas que vous pouvez contacter votre administration directement à l'aide de leur propre site web."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Effacer le signalement"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Effacer la photo (ne peut pas être annulé !)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "saisissez l'utilisateur"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
-msgstr ""
+msgstr "Rapport"
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Signaler un problème"
@@ -2558,7 +2601,7 @@ msgstr "Signaler un problème"
msgid "Report abuse"
msgstr "Signaler un abus"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Signaler sur %s"
@@ -2567,83 +2610,82 @@ msgstr "Signaler sur %s"
msgid "Report your problem"
msgstr "Signaler votre problème"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Signalez et suivez les problèmes locaux"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Signalé %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Signalé %s, à %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Signalé anonymement à %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Signalé avant"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Signalé par %s à %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Signalé %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Rapporté dans la catégorie %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Signalé dans la catégorie %s anonymement à %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Signalé dans la catégorie %s par %s à %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Signalé par %s anonymement à %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Signalé par %s par %s à %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Signalé par %s dans la catégorie %s anonymement à %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Signalé par %s dans la catégorie %s par %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Rapporté dans la catégorie %s"
+msgstr "Publié depuis quatre semaines"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Signalé %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Signalisation d'un problème"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Rapports"
@@ -2656,18 +2698,21 @@ msgstr "Les rapports sont limités à %s caractères de long. Merci de raccourci
msgid "Reports awaiting approval"
msgstr "Rapports attendant une validation"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Rapports sur et autour de la carte"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Rapports publiés"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Renvoyer le rapport"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Lieu correct?"
@@ -2682,26 +2727,32 @@ msgstr "L'opérateur pour cette route (déterminé à partir de la référence e
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "L'opérateur pour cette route (selon OpenStreetMAp): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Pivoter à gauche"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Pivoter à droite"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
-msgstr ""
+msgstr "Satellite"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Enregistrer les modifications"
@@ -2714,7 +2765,7 @@ msgstr "Rechercher rapports"
msgid "Search Users"
msgstr "Rechercher les utilisateurs"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Rechercher les rapports"
@@ -2746,20 +2797,25 @@ msgstr "Sélectionnez une administration pour voir les rapports qui lui ont étÃ
msgid "Select an area"
msgstr "Sélectionnez une zone"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Sélectionnez le type d'alerte que vous souhaitez et cliquez sur le bouton d'un flux RSS, ou entrez votre adresse e-mail pour vous abonner à une alerte e-mail."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Rapports ouverts"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Envoyé à %s %s plus tard)"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Envoyé :"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Service:"
@@ -2768,8 +2824,8 @@ msgstr "Service:"
msgid "Share"
msgstr "Partagez"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2785,34 +2841,23 @@ msgid "Show pins"
msgstr "Montrer les épingles"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "S'authentifier"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "S'authentifier par email"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Connectez-vous ou créez un compte"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Déconnexion"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Connecté en tant que %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Certaines catégories peuvent exiger des renseignements supplémentaires."
@@ -2830,8 +2875,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Photos de rapports récents"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Du texte pour localiser"
@@ -2839,24 +2885,32 @@ msgstr "Du texte pour localiser"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Désolé, ceci semble être un code postal d'une dépendance de la Couronne, que nous ne couvrons pas."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Désolé, il n'y a eu une erreur lors de la confirmation de votre problème."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Désolé, nous n'avons pas pu trouver cet emplacement."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Désolé, nous n'avons pas pu trouver cet emplacement. Merci de réessayer."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Désolé, nous n'avons pas pu trouver cet emplacement. Merci de réessayer."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Date de début:"
@@ -2872,16 +2926,17 @@ msgstr "État actuel"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "État actuel :"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistiques"
@@ -2895,7 +2950,12 @@ msgstr "Statut"
msgid "Still open, via questionnaire, %s"
msgstr "Encore ouvert, via le questionnaire, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Sous-catégorie: %s"
@@ -2910,45 +2970,42 @@ msgstr "Sujet"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Sujet :"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Envoyer"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Envoyer les modifications"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Envoi du questionnaire"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Soumis"
@@ -2959,18 +3016,19 @@ msgstr "Soumis"
msgid "Subscribe"
msgstr "S'abonner"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Abonnez moi à une alerte par email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Résumé"
@@ -2981,7 +3039,7 @@ msgstr "Résumé"
msgid "Summary reports"
msgstr "Rapports résumés"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Enquête"
@@ -2989,9 +3047,18 @@ msgstr "Enquête"
msgid "Survey Results"
msgstr "Résultats de l'enquête"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Mises à jour"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Texte"
@@ -3000,13 +3067,14 @@ msgid "Text only version"
msgstr "Version texte seulement"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Texte :"
#: templates/web/base/tokens/confirm_problem.html:12
msgid "Thank you for reporting this issue!"
-msgstr ""
+msgstr "Merci d&rsquo;avoir signalé ce problème!"
#: templates/web/base/tokens/error.html:7
msgid "Thank you for trying to confirm your update or problem. We seem to have an error ourselves though, so <a href=\"%s\">please let us know what went on</a> and we'll look into it."
@@ -3014,14 +3082,14 @@ msgstr "Merci d'essayer de confirmer votre mise à jour ou un problème. Nous se
#: templates/web/base/tokens/confirm_update.html:15
msgid "Thank you for updating this issue!"
-msgstr ""
+msgstr "Merci d'&rsquo;avoir mis à jour ce problème!"
#: templates/web/base/contact/submit.html:6
#: templates/web/base/questionnaire/completed.html:5
msgid "Thank you for your feedback"
-msgstr ""
+msgstr "Merci pour vos commentaires"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Merci d'avoir chargé votre photo. Nous avons besoin maintenant de localiser le problème, saisissez l'adresse et le code postal dans le champ ci-dessus&nbsp;:"
@@ -3029,7 +3097,7 @@ msgstr "Merci d'avoir chargé votre photo. Nous avons besoin maintenant de local
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Merci, heureux d'apprendre que cela a été résolu ! Pourrions-nous juste vous demander si vous aviez déjà signalé un problème à une administration auparavant ?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Cette image ne ​​semble pas avoir été chargée correctement (% s), réessayez s'il vous plaît."
@@ -3047,20 +3115,19 @@ msgstr "Ce lieu ne semble pas ce trouver au Royaume-Uni; Merci de le saisir à n
msgid "That postcode was not recognised, sorry."
msgstr "Ce code postal n'a pas été reconnu, désolé."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Ce problème va maintenant être renvoyé."
+msgstr "Ce problème a été marqué comme envoyé."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Ce problème va maintenant être renvoyé."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Ce rapport ne peut pas être vu sur %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Ce rapport a été retiré de FixMyStreet.fr."
@@ -3112,30 +3179,18 @@ msgstr ""
"Le <strong>nom</strong> identifie l'interlocuteur (par exemple, <em>La communauté de communes du Borsetshire</em>)\n"
"et peut être affichée au public."
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "L'email de confirmation <strong>peut</strong> prendre quelques minutes pour arriver — <em>merci</em> de patienter."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "L'administration ne pourra intervenir que si vous laissez autant de détails que possible. Décrivez la localisation exacte du problème, ce que c'est, depuis combien de temps il est présent, une description (et une photo du problème si vous en possédez une), etc. "
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Les détails de votre problème sont disponibles à partir de l'onglet autre au-dessus."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Les détails de votre problème sont disponibles sur le côté droit de cette page."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "Le classement du prix d'assiduité montre l'activité des utilisateurs (qui écrit le plus de rapports)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "L'erreur était : %s"
@@ -3153,10 +3208,6 @@ msgstr "Les informations suivantes au sujet de la route la plus proche pourrait
msgid "The latest local problems reported by users"
msgstr "Les derniers problèmes locaux rapportés par les utilisateurs"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Les derniers rapports locaux rapportés par les utilisateurs"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Les derniers problèmes pour {{COUNCIL}} rapportés par les utilisateurs"
@@ -3177,21 +3228,9 @@ msgstr "Les derniers problèmes locaux signalés comme résolus par les utilisat
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Les derniers problèmes à l'intérieur de {{NAME}} rapportés par les utilisateurs"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Les dernières propriétés libres rapportées par les utilisateurs"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Les derniers rapports pour {{COUNCIL}} rapportés par les utilisateurs"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Les derniers rapports pour {{COUNCIL}} dans {{WARD}} rapportés par les utilisateurs"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Les derniers rapports à l'intérieur de {{NAME}} rapportés par les utilisateurs"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3207,8 +3246,7 @@ msgstr "Les mots de passe ne correspondent pas"
msgid "The requested URL '%s' was not found on this server"
msgstr "L'URL demandée « %s » n'a pas été trouvée sur ce serveur"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "La plus simple de nos alertes est la géographique :"
@@ -3219,7 +3257,7 @@ msgstr "La plus simple de nos alertes est la géographique :"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "Le résumé et la description seront également rendus publics (voir notre <a href=\"/privacy\"> politique de confidentialité </a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "L'utilisateur n'a pas pu localiser le problème sur une carte, mais pour voir la zone autour de l'endroit qu'il ou elle a entré"
@@ -3232,23 +3270,24 @@ msgstr ""
"Le <strong>nom</strong> des utilisateurs est affiché publiquement sur les rapports qui n'ont pas été signalés comme <em>anonymes</em>.\n"
"Les noms sont nécessairement uniques."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
-msgstr ""
+msgstr "Il n'y a pas de rapports à montrer."
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Il y a eu un problème pour montrer la page tous les rapports. Réessayez s'il vous plaît ultérieurement."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Il y a eu un problème pour afficher cette page. Merci de réessayer ultérieurement."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Il y a un problème avec votre combinaison email / mot de passe. Si vous ne pouvez pas vous souvenir de votre mot de passe, ou n'en avez pas, remplissez s'il vous plaît la section « s'authentifier par email » du formulaire."
@@ -3261,7 +3300,7 @@ msgstr "Il y a un problème avec votre combinaison email / mot de passe. Réessa
msgid "There was a problem with your update. Please try again."
msgstr "Il y a un problème avec votre mise à jour. Réessayez s'il vous plaît."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Il y a un problème avec votre rapport. Voir s'il vous plaît plus bas."
@@ -3309,16 +3348,16 @@ msgstr ""
"Cet intelocuteur recevra seulement des rapports pour des problèmes qui sont situés sur sa <strong>zone couverte</strong>.\n"
"Un interlocuteur ne recevra aucun rapport tant qu'il ne couvre aucune zone."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Cet email a été envoyé aux deux administrations couvrant l'emplacement du problème parce que l'utilisateur ne l'a pas classé ; ignorez-le s'il vous plaît si vous n'êtes pas l'administration responsable pour la question, ou faites-nous savoir la bonne catégorie de problèmes afin que nous puissions l'ajouter à notre système."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Cet email a été envoyé à plus d'une administration couvrant l'emplacement du problème, la catégorie de problème choisie par l'utilisateur étant présente pour chacune d'entre elles ; ignorez-le s'il vous plaît si vous n'êtes pas l'administration responsable pour la question."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3332,7 +3371,7 @@ msgstr "Ceci est un site en développement, le service peut être interrompu à
msgid "This is a summary of all reports on this site."
msgstr "Ceci est un résumé de tous les rapports pour ce site."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "C'est peut-être parce que le lien est trop ancien ou déjà utilisé, ou l'adresse n'a pas été saisie correctement."
@@ -3359,55 +3398,69 @@ msgstr "Ce problème est en cours"
msgid "This problem is old and of unknown status."
msgstr "Ce problème est vieux et de statut inconnu."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Ce rapport attend une modération."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Ce rapport est actuellement marqué comme fermé."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Ce rapport est actuellement marqué comme résolu."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Ce rapport est actuellement marqué comme ouvert."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Ce rapport a été soumis anonymement"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Cette page Web contient également une photo du problème, fournie par l'utilisateur."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Chronologie"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titre"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Pour <strong>signaler un problème</strong>, cliquez sur la carte à l'emplacement correct."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titre"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Pour afficher les alertes qui vous concernent, saisissez votre code postal ou le nom d'une rue et une localité"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Pour afficher les alertes qui vous concernent, saisissez votre code postal ou le nom d'une rue et une localité"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Pour voir une carte de l'emplacement précis de ce problème"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3421,10 +3474,10 @@ msgstr "Essayez à nouveau"
#: templates/web/base/contact/submit.html:14
msgid "Try emailing us directly:"
-msgstr ""
+msgstr "Essayez en nous envoyant un e-mail directement:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3432,11 +3485,11 @@ msgstr ""
msgid "Unable to fix"
msgstr "Ne peut être résolu"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Non confirmé"
@@ -3453,7 +3506,9 @@ msgstr "Type d'alerte inconnu"
msgid "Unknown error"
msgstr "erreur inconnue"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "ID de problème inconnu"
@@ -3476,11 +3531,11 @@ msgid "Update below added by %s at %s"
msgstr "Mise à jour ci-dessous ajoutée par %s à %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Interlocuteur pour la mise à jour "
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Répartition des problèmes par état"
@@ -3515,24 +3570,24 @@ msgstr "Mise à jour :"
msgid "Updated"
msgstr "Mis à jour"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Mis à jour !"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Mises à jour"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "Les mises à jour sont limitées à %s caractères de long. Merci de raccourcir votre texte"
@@ -3540,27 +3595,30 @@ msgstr "Les mises à jour sont limitées à %s caractères de long. Merci de rac
msgid "Updates on {{title}}"
msgstr "Mises à jour sur {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Mises à jour pour ce problème, FixMyStreet.fr"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "Utiliser la <strong>note</strong> pour enregistrer des détails qui sont seulement affichée aux administrateurs. Les notes ne sont pas affichées publiquement, et ne sont pas envoyés à l'interlocuteur."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Utilisateur"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "plan utilisé"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Utilisateur dé–signalé"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Utilisateur signalé"
@@ -3568,23 +3626,23 @@ msgstr "Utilisateur signalé"
msgid "User search finds matches in users' names and email addresses."
msgstr "La recherche utilisateurs parcourt les noms et adresses courriel."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Utilisateurs"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Valeurs mises à jour"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Voir le rapport sur le site"
@@ -3608,16 +3666,15 @@ msgid "Wards of this council"
msgstr "Localités de cette administration"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Nous avons trouvé plus d'une correspondance pour cet endroit. Nous montrons jusqu'à dix résultats, essayez s'il vous plaît une recherche différente si le vôtre n'est pas ici."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Nous n'avons pas pu confirmé votre compte - désolé."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Nous vous avons envoyé un email contenant un lien pour confirmer votre compte."
@@ -3631,7 +3688,7 @@ msgstr "Nous n&rsquo;affichons jamais votre email"
msgid "We never show your email address or phone number."
msgstr "Nous n&rsquo;affichons jamais votre email ou numéro de téléphone."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Nous sommes conscients que ce problème pourrait être la responsabilité de %s, mais nous n'avons actuellement pas leurs coordonnées. Si vous connaissez une adresse de contact approprié, faites-le nous savoir s'il vous plaît."
@@ -3646,7 +3703,7 @@ msgstr "Nous utiliserons vos informations personnelles en accord avec notre <a
#: templates/web/base/questionnaire/completed-open.html:2
msgid "We&rsquo;re sorry to hear the problem’s not fixed. Why not try writing to your local representatives?"
-msgstr ""
+msgstr "Nous sommes désolés d&rsquo;apprendre que le problème n&esquo;est pas résolu. Pourquoi ne pas essayer d'écrire directement à vos élus locaux ?"
#: templates/web/base/contact/blurb.html:8
msgid "We'd love to hear what you think about this site. Just fill in the form, or send an email to <a href='mailto:%s'>%s</a>:"
@@ -3654,13 +3711,17 @@ msgstr "Nous aimerions beaucoup savoir ce que vous pensez de ce site. Il suffit
#: templates/web/base/contact/submit.html:7
msgid "We’ll get back to you as soon as we can."
+msgstr "Nous reviendrons vers vous dès que nous le pouvons."
+
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr "Quel est le problème, et où est-il?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Édité le"
@@ -3669,24 +3730,30 @@ msgstr "Édité le"
msgid "When sent"
msgstr "Envoyé le"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Tout le bloc d'appartements vides"
#: templates/web/base/tokens/confirm_alert.html:7
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
+msgstr "Pourquoi arrêter là ? <a href=\"/alert\"> déclarer plus d&rsquo;alertes </a> gratuitement."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
msgstr ""
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Avec les recherches à requètes, il est également possible de rechercher des agency_responsible pour limiter les demandes à celles qui sont envoyées à une administration unique. Le terme de recherche est l'ID de l'administration fourni par <a href=\"%s\">MapIt</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "Aimeriez-vous contribuer à FixMyStreet? Notre code est open source et <a href=\"http://fixmystreetf.org\"> disponible sur fixmystreet.org </a>"
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Aimeriez-vous recevoir un autre questionnaire dans 4 semaines, pour vous rappeler de vérifier l'état?"
@@ -3712,15 +3779,13 @@ msgstr "Année"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Oui"
@@ -3786,11 +3851,9 @@ msgstr "Vous avez refusé; merci de remplir le champ ci-dessus"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Vous avez déjà répondu à ce questionnaire. Si vous avez une question, <a href='%s'>entrez en contact avec nous</a>, ou <a href='%s'>affichez votre problème</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Vous avez déjà joint une photo à ce rapport, en joindre un autre la remplacera."
@@ -3799,6 +3862,10 @@ msgstr "Vous avez déjà joint une photo à ce rapport, en joindre un autre la r
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Vous avez déjà joint une photo à cette mise à jour, en joindre un autre la remplacera."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3819,15 +3886,11 @@ msgstr "Votre adresse courriel a bien été confirmée."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Vous avez réussi à vous connecter ; veuillez vérifier et confirmer que vos coordonnées sont exactes :"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Vous n'avez encore créés aucun rapport. <a href=\"%s\">Rapportez un problème maintenant.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Vous devez maintenant cliquer sur le lien que nous venons de vous envoyer par courriel."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Vous devez <a href=\"%s\">ajouter des interlocuteurs</a> (comme des municipalités ou des services publics) pour que des rapports puissent être envoyés."
@@ -3838,18 +3901,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr "Vous devez ajouter des interlocuteurs (comme des municipalités ou des services) avant de pouvoir ajouter les catégories de problèmes qu'il peuvent gérer (ex. trous dans la chaussée ou éclairage) et ajouter les contacts (ex. adresse courriel) à qui les rapports sont envoyés. "
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Vous voulez vraiment renvoyer?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Vos rapports"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3858,22 +3919,17 @@ msgstr "Vos rapports"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Votre email"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Votre adresse email"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Votre adresse mail:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3883,24 +3939,23 @@ msgstr "Votre email:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Votre information sera utilisée seulement en accord avec notre <a href=\"/privacy\">politique de confidentialité</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Votre nom"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Votre nom :"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3913,19 +3968,15 @@ msgstr "Votre mot de passe a été changé"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Votre numéro de téléphone"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Votre rapport"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Vos rapports"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Vos mises à jour"
@@ -3933,23 +3984,31 @@ msgstr "Vos mises à jour"
msgid "Your&nbsp;email:"
msgstr "votre&nbsp;email&nbsp;:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Tous les rapports"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "par %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Rapports clos"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "administration"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "n'a pas utilisé le plan"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "Par exemple '%s' ou '%s'"
@@ -3958,17 +4017,22 @@ msgstr "Par exemple '%s' ou '%s'"
msgid "edit user"
msgstr "saisissez l'utilisateur"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Rapports résolus"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "de %d utilisateurs différents"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "dernière mise à jour %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "moins d'une minute"
@@ -4013,14 +4077,13 @@ msgstr "marqué comme planifié"
msgid "marked as unable to fix"
msgstr "marqué comme impossible à résoudre"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "s.o."
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr " ou "
@@ -4030,16 +4093,16 @@ msgstr "Clickez ici pour vous localiser automatiquement"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "saisi initialement: &ldquo;%s&rdquo;"
@@ -4052,8 +4115,8 @@ msgstr "autres lieux:"
msgid "reopened"
msgstr "réouvert"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "déconnexion"
@@ -4069,17 +4132,20 @@ msgstr "L'administration locale"
msgid "there is no pin shown as the user did not use the map"
msgstr "Il n'y a aucune épingle affichée parce que l'utilisateur n'a pas utilisé la carte"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "Ce type de problème local"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "aujourd'hui"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Rapports résolus"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "plan utilisé"
@@ -4103,7 +4169,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> rapport récemment"
msgstr[1] "<big>%s</big> rapports récemment"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4117,7 +4183,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d supporter"
msgstr[1] "%d supporters"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4138,7 +4204,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Nous n'avons pas encore de détails pour l'administration responsable de ce lieu."
msgstr[1] "Nous n'avons pas encore de détails pour les administrations responsables de ce lieu."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4159,7 +4225,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> résolu le mois passé"
msgstr[1] "<big>%s</big> résolus le mois passé"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4173,5 +4239,143 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Nous n'avons pas encore de détails pour l'autre administration responsable de ce lieu."
msgstr[1] "Nous n'avons pas encore de détails pour les autres administrations responsables de ce lieu."
-#~ msgid "For council(s):"
-#~ msgstr "Pour la ou les administration(s) :"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Pas d'inquiétude&mdash; nous conservons votre alerte pendant que vous vérifiez votre adresse courriel.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Pas d'inquiétude&mdash; nous conservons votre rapport pendant que vous vérifiez votre adresse courriel.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Pas d'inquiétude&mdash; nous conservons votre mise à jour pendant que vous vérifiez votre adresse courriel.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Si vous ne pouvez pas voir le plan, <a href='%s' rel='nofollow'>sautez cette étape</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Non</strong>, je n'en ai pas, laissez-moi m'authentifier par email :"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Vous êtes un <strong>développeur</strong> ? Vous aimeriez contribuer à FixMyStreet ?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Problèmes clos à proximité <small>(dans l'intervalle de&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Contacter FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Avez-vous un mot de passe FixMyBarangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "Administrateur FixMyStreet.fr"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Si vous ne le faites pas, votre alerte ne sera pas activée"
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Si vous ne le faites pas, votre problème ne sera pas envoyé."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Si vous ne le faites pas, votre mise à jour ne sera pas envoyée."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nouveaux rapports local sur reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nouveaux rapports pour {{COUNCIL}} au sein de {{WARD}} sur reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nouveaux rapports sur reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nouveaux rapports sur reportemptyhomes.com près de {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nouveaux rapports à {{COUNCIL}} sur reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "De nouveaux rapports au sein de {{name}} 's sur reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Nouvelle mise à jour:"
+
+#~ msgid "No problems found."
+#~ msgstr "Aucun problème trouvé."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Aucun problème n'a encore été signalé."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Maintenant pour envoyer votre rapport&hellip; avez-vous un mot de passe FixMyStreet.fr ?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Maintenant pour envoyer votre mise à jour&hellip; avez-vous un mot de passe FixMyStreet.fr ?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Notre code est open source et <a href=\"http://github.com/grischard/fixmystreet\">disponible sur GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Merci de <a class=\"tab_link\" href=\"#report\">consulter</a> aux mises à jour qui ont été faites."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Merci de consulter les mises à jour qui ont été laissées."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problèmes à l'intérieur de %s, FixMyStreet.fr"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Propriétés récemments rapportés à remettrent en visibilité sur reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publier la réponse"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Signalé %s, à %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Rapports sur et autour de la carte"
+
+#~ msgid "Sign in by email"
+#~ msgstr "S'authentifier par email"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Connecté en tant que %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "L'email de confirmation <strong>peut</strong> prendre quelques minutes pour arriver — <em>merci</em> de patienter."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Les détails de votre problème sont disponibles à partir de l'onglet autre au-dessus."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Les détails de votre problème sont disponibles sur le côté droit de cette page."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Les derniers rapports locaux rapportés par les utilisateurs"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Les dernières propriétés libres rapportées par les utilisateurs"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Les derniers rapports pour {{COUNCIL}} rapportés par les utilisateurs"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Les derniers rapports pour {{COUNCIL}} dans {{WARD}} rapportés par les utilisateurs"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Les derniers rapports à l'intérieur de {{NAME}} rapportés par les utilisateurs"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Pour <strong>signaler un problème</strong>, cliquez sur la carte à l'emplacement correct."
+
+#~ msgid "User"
+#~ msgstr "Utilisateur"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Vous devez maintenant cliquer sur le lien que nous venons de vous envoyer par courriel."
+
+#~ msgid "Your email address:"
+#~ msgstr "Votre adresse mail:"
+
+#~ msgid "Your report"
+#~ msgstr "Votre rapport"
diff --git a/locale/he_IL.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/he_IL.UTF-8/LC_MESSAGES/FixMyStreet.po
index c1607570b..770854daf 100644
--- a/locale/he_IL.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/he_IL.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -9,18 +9,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/fixmystreet/language/he_IL/)\n"
+"Language-Team: Hebrew (Israel) (http://www.transifex.com/mysociety/fixmystreet/language/he_IL/)\n"
"Language: he_IL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr ""
@@ -33,11 +33,13 @@ msgstr ""
msgid " or "
msgstr "×ו"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr ""
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
@@ -46,11 +48,13 @@ msgstr ""
msgid "%d edits by %s"
msgstr ""
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr ""
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr ""
@@ -63,15 +67,47 @@ msgstr ""
msgid "%s - Summary reports"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr ""
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr ""
@@ -83,59 +119,54 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/base/admin/report_blocks.html:41
+#: templates/web/base/admin/users.html:31
+msgid "(Email in abuse table)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
-#: templates/web/base/admin/users.html:31
-msgid "(Email in abuse table)"
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
msgstr ""
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr ""
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr ""
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr ""
@@ -143,25 +174,24 @@ msgstr ""
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr ""
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr ""
@@ -174,12 +204,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr ""
@@ -192,28 +224,22 @@ msgstr ""
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr ""
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -224,8 +250,8 @@ msgstr ""
msgid "About us"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -247,7 +273,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -260,10 +286,14 @@ msgstr ""
msgid "Add user"
msgstr ""
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr ""
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr ""
@@ -276,21 +306,24 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr ""
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr ""
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+msgid "All Reports as CSV"
+msgstr ""
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr ""
@@ -313,8 +346,7 @@ msgstr ""
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr ""
@@ -323,16 +355,12 @@ msgstr ""
msgid "Anonymous"
msgstr ""
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr ""
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr ""
@@ -347,22 +375,24 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -383,12 +413,12 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -408,12 +438,16 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -424,27 +458,28 @@ msgstr ""
msgid "Category"
msgstr ""
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "קטגוריה"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "קטגוריה: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "החלף ססמ×"
@@ -477,54 +512,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr ""
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr ""
@@ -532,22 +573,22 @@ msgstr ""
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "תצורה"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -555,7 +596,7 @@ msgstr ""
msgid "Confirm"
msgstr "×שר"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "×שר חשבון"
@@ -575,7 +616,7 @@ msgstr "×ישור"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "×ישר"
@@ -586,13 +627,18 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "×ישר:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr ""
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "צור קשר"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -607,8 +653,13 @@ msgstr "צור קשר"
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr ""
@@ -626,7 +677,7 @@ msgstr "עירייה"
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -641,7 +692,7 @@ msgstr ""
msgid "Count"
msgstr "ספירה"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "צור דו\"ח"
@@ -650,17 +701,19 @@ msgstr "צור דו\"ח"
msgid "Create category"
msgstr "צור קטגוריה"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "צור דו\"ח"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr ""
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr ""
@@ -670,10 +723,15 @@ msgid "Current state"
msgstr ""
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -683,11 +741,16 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "נמחק"
@@ -705,9 +768,9 @@ msgstr "פרטי×"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr ""
@@ -715,23 +778,25 @@ msgstr ""
msgid "Devolved"
msgstr ""
-#: templates/web/base/admin/edit-league.html:8
-msgid "Diligency prize league table"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
msgstr ""
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+msgid "Do you have a %s password?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr ""
@@ -739,8 +804,8 @@ msgstr ""
msgid "Don't like forms?"
msgstr "×œ× ×והב טפסי×?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -759,7 +824,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "ערוך"
@@ -770,7 +836,7 @@ msgstr "ערוך פרטי גוף"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -785,15 +851,15 @@ msgstr "ערוך עידכון %d"
msgid "Editing user %d"
msgstr "ערוך משתמש %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "עורך"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -801,7 +867,7 @@ msgstr "עורך"
msgid "Email"
msgstr "דו×ר ×לקטרוני"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "דו×ר ×לקטרוני הוסף לרשימת ×”×ž×©×ª×ž×©×™× ×œ×¨×¢×”"
@@ -817,7 +883,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "דו×ר ×לקטרוני כבר ברשימת ×”×ž×©×ª×ž×©×™× ×œ×¨×¢×”"
@@ -830,38 +896,36 @@ msgid "Email me updates"
msgstr "שלח לי דו×ר ×לקטרוני על עדכוני×"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "דו×ר ×לקטרוני:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "דו×ר ×לקטרוני: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -890,7 +954,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -903,10 +967,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr ""
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr ""
@@ -914,13 +976,12 @@ msgstr ""
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -931,7 +992,6 @@ msgstr ""
msgid "Enter details of the problem"
msgstr ""
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -941,6 +1001,10 @@ msgstr ""
msgid "Error"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -954,12 +1018,19 @@ msgstr ""
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr ""
@@ -972,8 +1043,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr ""
@@ -981,36 +1051,14 @@ msgstr ""
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr ""
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr ""
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1021,21 +1069,16 @@ msgstr ""
msgid "Fixed"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr ""
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr ""
@@ -1045,11 +1088,11 @@ msgstr ""
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1066,7 +1109,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr ""
@@ -1085,9 +1128,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr ""
@@ -1110,8 +1164,7 @@ msgstr ""
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
@@ -1120,17 +1173,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr ""
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1138,41 +1191,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr ""
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1186,7 +1235,7 @@ msgstr ""
msgid "Hide pins"
msgstr ""
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr ""
@@ -1202,7 +1251,7 @@ msgstr ""
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -1229,8 +1278,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr ""
@@ -1248,18 +1297,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1269,16 +1306,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1308,7 +1344,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr ""
@@ -1333,14 +1369,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr ""
@@ -1348,7 +1383,7 @@ msgstr ""
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1360,12 +1395,12 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1373,7 +1408,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr ""
@@ -1381,12 +1416,12 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1404,10 +1439,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1419,7 +1463,7 @@ msgstr ""
msgid "Last editor"
msgstr ""
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr ""
@@ -1454,7 +1498,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr ""
@@ -1467,11 +1511,10 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1491,6 +1534,14 @@ msgstr ""
msgid "Message"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr ""
@@ -1518,27 +1569,25 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr ""
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1551,21 +1600,25 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr ""
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+msgid "Nearly done! Now check your email&hellip;"
+msgstr ""
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1574,12 +1627,12 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1587,8 +1640,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr ""
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1615,32 +1668,13 @@ msgstr ""
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+msgid "New template"
msgstr ""
#: templates/web/base/pagination.html:13
@@ -1654,14 +1688,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr ""
@@ -1689,20 +1721,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr ""
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1720,8 +1743,6 @@ msgid "No supporters"
msgstr ""
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr ""
@@ -1734,8 +1755,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1743,7 +1764,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1756,7 +1784,7 @@ msgid "Not reported to council"
msgstr ""
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr ""
@@ -1766,7 +1794,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr ""
@@ -1775,22 +1803,20 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1820,20 +1846,18 @@ msgstr ""
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr ""
@@ -1841,11 +1865,6 @@ msgstr ""
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr ""
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1862,32 +1881,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr ""
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr ""
@@ -1902,12 +1915,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1916,6 +1929,7 @@ msgid "Password (optional)"
msgstr ""
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr ""
@@ -1923,7 +1937,7 @@ msgstr ""
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1932,11 +1946,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr ""
@@ -1947,14 +1959,21 @@ msgstr ""
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr ""
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr ""
@@ -1966,22 +1985,18 @@ msgstr ""
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr ""
@@ -1991,22 +2006,20 @@ msgstr ""
msgid "Please check the passwords and try again"
msgstr ""
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr ""
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2016,7 +2029,7 @@ msgstr ""
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2024,7 +2037,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2033,7 +2046,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr ""
@@ -2044,15 +2057,15 @@ msgstr ""
msgid "Please enter a password"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2060,7 +2073,7 @@ msgid "Please enter a valid email"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr ""
@@ -2069,21 +2082,19 @@ msgstr ""
msgid "Please enter some details"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr ""
@@ -2096,8 +2107,8 @@ msgstr ""
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2136,7 +2147,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2159,19 +2170,23 @@ msgstr ""
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+msgid "Please select a body."
+msgstr ""
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2180,21 +2195,17 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr ""
@@ -2203,8 +2214,8 @@ msgid "Please write your update here"
msgstr ""
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2225,22 +2236,36 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr ""
@@ -2256,12 +2281,12 @@ msgstr ""
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr ""
@@ -2277,12 +2302,10 @@ msgstr ""
msgid "Problems in this area"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr ""
@@ -2291,12 +2314,11 @@ msgstr ""
msgid "Problems recently reported fixed on FixMyStreet"
msgstr ""
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2308,20 +2330,16 @@ msgstr ""
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
+msgid "Problems within %s, %s"
msgstr ""
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2335,39 +2353,31 @@ msgstr ""
msgid "Provide an update"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr ""
@@ -2383,12 +2393,11 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2414,8 +2423,7 @@ msgstr ""
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -2423,7 +2431,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2453,17 +2461,18 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Recent local problems, %s"
+msgstr "שלח לי דו×ר ×לקטרוני על בעיות מקומיות חדשות"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr ""
@@ -2471,23 +2480,27 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
@@ -2496,7 +2509,7 @@ msgstr ""
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2505,63 +2518,58 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2569,18 +2577,21 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+msgid "Reported:"
+msgstr ""
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2593,18 +2604,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2619,26 +2633,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2651,7 +2671,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2683,20 +2703,23 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+msgid "Sent report back"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2705,8 +2728,8 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2722,34 +2745,23 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr ""
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr ""
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr ""
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2765,8 +2777,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2774,24 +2787,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2807,16 +2827,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2830,7 +2851,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2845,45 +2871,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2894,18 +2917,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2916,7 +2940,7 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2924,9 +2948,17 @@ msgstr ""
msgid "Survey Results"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+msgid "Templates"
+msgstr ""
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -2935,6 +2967,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2956,7 +2989,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2964,7 +2997,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2982,19 +3015,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3036,30 +3069,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -3077,10 +3098,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3101,20 +3118,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3131,8 +3136,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3143,7 +3147,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3154,23 +3158,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3183,7 +3188,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3223,16 +3228,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3246,7 +3251,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3273,55 +3278,67 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3337,8 +3354,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3346,11 +3363,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3367,7 +3384,9 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3390,11 +3409,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3429,24 +3448,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3454,27 +3473,28 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+msgid "Updates to this problem, %s"
msgstr ""
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3482,23 +3502,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3522,16 +3542,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3545,7 +3564,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3570,11 +3589,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3583,7 +3606,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3591,16 +3614,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3626,15 +3655,13 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr ""
@@ -3697,11 +3724,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3710,6 +3735,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3730,15 +3759,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3749,18 +3774,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr ""
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr ""
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3769,22 +3792,17 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr ""
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3794,24 +3812,23 @@ msgstr ""
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3824,19 +3841,15 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr ""
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3844,23 +3857,30 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "צור דו\"ח"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:5
+msgid "closed reports"
+msgstr ""
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr ""
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3869,17 +3889,21 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+msgid "fixed reports"
+msgstr ""
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr ""
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr ""
@@ -3924,14 +3948,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr ""
@@ -3941,16 +3964,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3963,8 +3986,8 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3980,17 +4003,19 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:4
+msgid "unfixed reports"
+msgstr ""
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4014,7 +4039,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4028,7 +4053,7 @@ msgid_plural "%d supporters"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4049,7 +4074,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4070,7 +4095,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
diff --git a/locale/hr.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/hr.UTF-8/LC_MESSAGES/FixMyStreet.po
index 79e8efb6e..0d8772428 100644
--- a/locale/hr.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/hr.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -10,18 +10,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Croatian (http://www.transifex.com/projects/p/fixmystreet/language/hr/)\n"
+"Language-Team: Croatian (http://www.transifex.com/mysociety/fixmystreet/language/hr/)\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "i"
@@ -34,11 +34,13 @@ msgstr "i"
msgid " or "
msgstr "ili"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d potvrđena upozorenja, %d nepotvrđena"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d kontakti vijeća &ndash; %d potvrđeni, %d nepotvrđeni"
@@ -47,11 +49,13 @@ msgstr "%d kontakti vijeća &ndash; %d potvrđeni, %d nepotvrđeni"
msgid "%d edits by %s"
msgstr "%d izmjene od strane %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d ažuriranje uživo"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d Upitnici poslani &ndash; %d odgovoreno (%s%%)"
@@ -64,15 +68,61 @@ msgstr ""
msgid "%s - Summary reports"
msgstr "%s - Sažetak izvješća"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"Popravi.to ima niz RSS i e-mail upozorenja za lokalne probleme, ukljuÄujući\n"
+"upozorenja za sve probleme u određenom odjelu ili vijeću ili za sve probleme\n"
+"na određenoj udaljenosti od pojedine lokaciji."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"Popravi.to ima niz RSS i e-mail upozorenja za lokalne probleme, ukljuÄujući\n"
+"upozorenja za sve probleme u određenom odjelu ili vijeću ili za sve probleme\n"
+"na određenoj udaljenosti od pojedine lokaciji."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"Popravi.to Å¡alje razliÄite kategorije problema\n"
+"određenom odgovornom tijelu, tako da problemi u granicama određenog odgovornog tijela\n"
+"možda ne odgovaraju problemima koji su poslani odgovornog tijelu.Na primjer, prijave grafita\n"
+"bit će poslane općinskom vijeću i tako će se pojaviti u upozorenjima za oba vijeća&rsquo; ali će se samo pojaviti u upozorenju \"Unutar granica\" \n"
+"županijskog vijeća."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr ""
@@ -84,59 +134,57 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Email na crnoj listi)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Ime"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Vaš broj telefona"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(zadana udaljenost koja obuhvaća približno 200,000 stanovnika)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(u suprotnom RSS feed može biti podešen, unutar"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(zatvoreno)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(popravljeno)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(grafiti, ilegalno odlaganje otpada, oštećeni kolnici, klupe, lampe...)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(nije poslano odgovornom tijelu)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(nije obavezno)"
@@ -144,25 +192,24 @@ msgstr "(nije obavezno)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(poslano na obje adrese)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(vašu email adresu i broj telefona držimo u tajnosti)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(vaš email držimo u tajnosti)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Izaberi kategoriju --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Izaberite vrstu posjeda --"
@@ -175,12 +222,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Ukoliko ne vidite kartu, <a href='%s' rel='nofollow'>preskoÄite ovaj korak</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> postojeći problemi"
@@ -193,28 +242,22 @@ msgstr "<strong>No</strong> Potvrdi moju prijavu e-mailom"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>No</strong> Potvrdi moje ažuriranje e-mailom"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>No</strong> prijavi se e-mailom"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>No</strong>, Nemam, prijavi me e-mailom:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>No</strong>, potvrdi moju prijavu e-mailom:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>No</strong>, potvrdi moje ažuriranje e-mailom:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -225,8 +268,8 @@ msgstr "<strong>Da</strong> Imam password"
msgid "About us"
msgstr "O nama"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -248,7 +291,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -261,10 +304,14 @@ msgstr "Dodaj novu kategoriju"
msgid "Add user"
msgstr ""
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Dodano %s"
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Još jednom:"
@@ -277,21 +324,25 @@ msgstr "Upozorenje %d kreirano za %s, tip %s, parametri%s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Upozorenje %d onemogućeno (kreirano%s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Javi mi buduće promjene"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Sve Prijave"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Sve Prijave"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Sve prijave"
@@ -314,8 +365,7 @@ msgstr "Sve unešene informacije bit će poslane na"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Sve informacije koje nam dostavite bit će proslijeđene <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Ažuriranjem je ovaj problem evidentiran kao popravljen."
@@ -324,16 +374,12 @@ msgstr "Ažuriranjem je ovaj problem evidentiran kao popravljen."
msgid "Anonymous"
msgstr "Anonimno"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonimno:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Jeste li <strong>developer</strong>? Biste li htjeli doprinijeti ideji popravi.to?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Jeste li programer?"
@@ -348,22 +394,24 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -384,12 +432,12 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Onemogući e-mail adrese"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -409,12 +457,16 @@ msgstr ""
msgid "By Date"
msgstr "Po datumu"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Ne možete vidjeti mapu? <em>PreskoÄi ovaj korak</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -425,27 +477,28 @@ msgstr "Ne možete vidjeti mapu? <em>PreskoÄi ovaj korak</em>"
msgid "Category"
msgstr "Kategorija"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr " Postotak popravaka za kategoriju > staro 4 tjedna"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategorija:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategorija: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Promijeni lozinku"
@@ -478,54 +531,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Kliknite mapu da prijavite problem"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Zatvoreno"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Zatvorilo je odgovorno tijelo"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Zatvorene prijave"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Zatvoreno:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Najbliži problemi <small>(within&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Koordinate:"
@@ -533,22 +592,22 @@ msgstr "Koordinate:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Cobrand podaci:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Konfiguriraj Endpoint"
@@ -556,7 +615,7 @@ msgstr "Konfiguriraj Endpoint"
msgid "Confirm"
msgstr "Potvrdi"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Potvrdi raÄun"
@@ -576,7 +635,7 @@ msgstr "Potvrda"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Potvrđeno"
@@ -587,13 +646,18 @@ msgstr "Potvrđene prijave između %s i %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Potvrđeno:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontaktiraj potvrdi.to"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontaktiraj nas"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -608,8 +672,14 @@ msgstr "Kontaktiraj nas"
msgid "Contact the team"
msgstr "Kontaktiraj tim"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinate:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Nepoznati korisnik"
@@ -627,7 +697,7 @@ msgstr "Vijeće"
msgid "Council contacts for %s"
msgstr "Kontakti vijeća za %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "odgovorno tijelo ref:&nbsp;%s"
@@ -642,7 +712,7 @@ msgstr "Vijeće:"
msgid "Count"
msgstr "BrojaÄ"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Kreiraj izvješće"
@@ -651,17 +721,19 @@ msgstr "Kreiraj izvješće"
msgid "Create category"
msgstr "Kreiraj kategoriju"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Kreiraj izvješće"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Kreirano"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Kreirano:"
@@ -671,10 +743,15 @@ msgid "Current state"
msgstr "Trenutno stanje"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -684,11 +761,16 @@ msgstr "Nadzorna ploÄa"
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Izbrisano"
@@ -706,9 +788,9 @@ msgstr "Detalji"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detalji:"
@@ -716,23 +798,27 @@ msgstr "Detalji:"
msgid "Devolved"
msgstr "Prenešeno"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "nije korištena karta"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Imaš li popravi.to lozinku?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Imaš li popravi.to lozinku?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Ne&rsquo;znam"
@@ -740,8 +826,8 @@ msgstr "Ne&rsquo;znam"
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -760,7 +846,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Uredi"
@@ -771,7 +858,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -786,15 +873,15 @@ msgstr "Uređivanje ažuriranja %d"
msgid "Editing user %d"
msgstr "Uređivane korisnika %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Urednik"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -802,7 +889,7 @@ msgstr "Urednik"
msgid "Email"
msgstr "E-mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "E-mail dodan na listu zloupotrebe"
@@ -818,7 +905,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "E-mail je već na listi zloupotrebe"
@@ -831,38 +918,36 @@ msgid "Email me updates"
msgstr "Pošalji mi e-mail o ažuriranjima"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-mail:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Prazan stan ili kućica"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Prazna kuća ili bungalov"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Prazan ured ili poslovni prostor"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Prazan kafić ili bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Prazne javne zgrade - škola, bolnica, itd."
@@ -891,7 +976,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -904,10 +989,8 @@ msgstr "Unesi obližnji poštanski broj ili ime ulice i kvarta"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Unesi obližnji poštanski broj ili ime ulice i kvarta"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Unesi ime obližnje ulice i kvarta"
@@ -915,13 +998,12 @@ msgstr "Unesi ime obližnje ulice i kvarta"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Unesi novu lozinku:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -932,7 +1014,6 @@ msgstr "Unesi lozinku"
msgid "Enter details of the problem"
msgstr "Unesi detalje o problemu"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -942,6 +1023,10 @@ msgstr "Unesi detalje o problemu"
msgid "Error"
msgstr "Greška"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -955,12 +1040,19 @@ msgstr "Primjeri:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Dodatni podaci:"
@@ -973,8 +1065,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Prvi put"
@@ -982,44 +1073,14 @@ msgstr "Prvi put"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "Popravi.to"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "Popravi.to admin:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"Popravi.to ima niz RSS i e-mail upozorenja za lokalne probleme, ukljuÄujući\n"
-"upozorenja za sve probleme u određenom odjelu ili vijeću ili za sve probleme\n"
-"na određenoj udaljenosti od pojedine lokaciji."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"Popravi.to Å¡alje razliÄite kategorije problema\n"
-"određenom odgovornom tijelu, tako da problemi u granicama određenog odgovornog tijela\n"
-"možda ne odgovaraju problemima koji su poslani odgovornog tijelu.Na primjer, prijave grafita\n"
-"bit će poslane općinskom vijeću i tako će se pojaviti u upozorenjima za oba vijeća&rsquo; ali će se samo pojaviti u upozorenju \"Unutar granica\" \n"
-"županijskog vijeća."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1030,21 +1091,16 @@ msgstr ""
msgid "Fixed"
msgstr "Popravljeno"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Popravljeno - odgovorno tijelo"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Popravljeno - Korisnik"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Popravljene prijave"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Popravljeno:"
@@ -1054,11 +1110,11 @@ msgstr "Popravljeno:"
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "OznaÄi korisnika"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "OznaÄen"
@@ -1075,7 +1131,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "OznaÄen:"
@@ -1094,9 +1150,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Zaboravili ste šifru?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "ÄŒesto postavljana pitanja"
@@ -1119,8 +1186,7 @@ msgstr "Primite ažuriranja %s problema"
msgid "Get updates of problems in this %s"
msgstr "Primite ažuriranja problema u ovom %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Prijavi se na RSS izvor"
@@ -1129,17 +1195,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Idi"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Pošalji upitnik?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Grafikon nastanka problema prema položaju tijekom vremena"
@@ -1147,41 +1213,37 @@ msgstr "Grafikon nastanka problema prema položaju tijekom vremena"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Sivo osjenÄani su councils koji viÅ¡e ne postoje"
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Je li ovaj problem popravljen?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Jeste li prije prijavljivali problem odgovornom tijelu ili je ovo prvi put?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Pomoć"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Vrste upozorenja za lokalne probleme &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Zdravo %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1195,7 +1257,7 @@ msgstr "Sakrij staro"
msgid "Hide pins"
msgstr "Sakrij pinove"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Povijest"
@@ -1211,7 +1273,7 @@ msgstr "Kako prijaviti problem"
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Nažalost, ne možeš potvrditi nepotvrđena izvješća"
@@ -1238,8 +1300,8 @@ msgstr "Nažalost, ne možemo provjeriti token. Ako ste kopirali URL iz e-maila,
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1257,18 +1319,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1278,16 +1328,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Ako iznesete problem ovdje sadržaj i detalji problema bit će javni, ali će problem <strong>not</strong> biti prijavljen vijeću."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Ako koristite e-mail na Webu ili 'junk mail' filtere, provjerite svoje bulk / spam mail mape: ponekad su naÅ¡e poruke oznaÄene na taj naÄin."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Ako želite iznijeti javno ažuriranje o problemu, molimo unesite ga ovdje\n"
"(imajte na umu da neće biti poslano odgovornom tijelu). Na primjer, kakvo je vaše mišljenje o rješavanju problema?"
@@ -1319,7 +1369,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Ilegalan ID"
@@ -1344,14 +1394,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "Nadalje, sljedeća svojstva koja nisu dio Open311 v2 specifikacija su vraćena: agencijski _poslano_datum-vrijeme, naslov (takoÄ‘er vraćen kao dio opisa), suÄelje_koriÅ¡teno, brojaÄ_komentara, ime_pretražitelja(prisutno samo ako je tražitelj dopustio prikaz imena na ovoj stranici)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "U tijeku"
@@ -1359,7 +1408,7 @@ msgstr "U tijeku"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1371,12 +1420,12 @@ msgstr "UkljuÄi nepotvrÄ‘ene prijave"
msgid "Incorrect has_photo value \"%s\""
msgstr "Pogrešno ima_foto vrijednost\"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1384,7 +1433,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr "Nevažeća odgovorna_vrijednost agencije %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Nevažeći datum završetka"
@@ -1392,12 +1441,12 @@ msgstr "Nevažeći datum završetka"
msgid "Invalid format %s specified."
msgstr "Naveden nevažeći %s format."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Nevažeći datum poÄetka"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1415,10 +1464,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1430,7 +1488,7 @@ msgstr "Ostani prijavljen na ovom raÄunalu"
msgid "Last editor"
msgstr "Posljednji "
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Posljednje ažuriranje"
@@ -1465,7 +1523,7 @@ msgstr "Lokalni RSS izvori i e-mail upozorenja"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Lokalni RSS izvori i e-mail upozorenja za‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Lokalna upozorenja"
@@ -1478,11 +1536,10 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1502,6 +1559,14 @@ msgstr ""
msgid "Message"
msgstr "Poruka"
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Poruka:"
@@ -1529,27 +1594,25 @@ msgstr "Više problema u blizini"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Ime"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Ime:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1562,12 +1625,12 @@ msgstr "Najbliža imenovana cesta smještena pokraj oznake na mapi (automatski g
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Najbliži poštanski broj pokraj oznake na mapi (automatski generiran): %s (%sm away)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Najbliža cesta smještena pokraj oznake na mapi (automatski generirano pomoću Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1575,10 +1638,15 @@ msgstr ""
"Najbliža cesta smještena pokraj oznake na mapi (automatically generated by Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Skoro uÄinjeno! Sada provjeri svoj e-mail..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Skoro uÄinjeno! Sada provjeri svoj e-mail..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Novi <br>problemi"
@@ -1587,12 +1655,12 @@ msgstr "Novi <br>problemi"
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Novi kontakt dodan u kategoriju"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1600,9 +1668,9 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr "Novi lokalni problemi na Popravi.to"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nove lokalne prijave na kućoprazna.joj"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
+msgstr ""
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1628,33 +1696,15 @@ msgstr "Novi problemi unutar {{NAME}} granice na Popravi.to"
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nove prijave za {{COUNCIL}} unutar{{WARD}} na kucoprazna.joj"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nove prijave na praznakuco.joj"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nove prijave na praznakuco.joj blizu{{POÅ TANSKI BROJ}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nove prijave {{ODGOVORNOM TIJELU}} na praznakuco.joj"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nove prijave u djelokrugu {{IME}} na praznakuco.joj"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Novo stanje"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr ""
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Novo stanje"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1667,14 +1717,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Ne"
@@ -1702,20 +1750,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Nisu pronađeni problemi."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Još uvijek nisu prijavljeni nikakvi problemi."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1733,8 +1772,6 @@ msgid "No supporters"
msgstr "Bez podrške"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Nijedan"
@@ -1747,8 +1784,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1756,7 +1793,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1769,7 +1813,7 @@ msgid "Not reported to council"
msgstr "Nije prijavljeno odgovornom tijelu"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Napomena"
@@ -1779,7 +1823,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Imajte na umu da kada ukljuÄujemo nepotvrÄ‘ene prijave koristimo datum kada je prijava napravljena koji ne mora biti u istom mjesecu kada je prijava potvrÄ‘ena pa stoga datumi mogu varirati"
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Napomena:"
@@ -1788,22 +1832,20 @@ msgstr "Napomena:"
msgid "Note: <strong>%s</strong>"
msgstr "Napomena: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Podnesite svoju prijavu&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Podnesite svoju prijavu&hellip; imate li Popravi.to lozinku?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Pošaljite svoje ažuriranje&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Pošaljite svoje ažuriranje&hellip; imate li Popravi.to lozinku?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1833,20 +1875,18 @@ msgstr "Stariji <br>problemi"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Otvori"
@@ -1854,11 +1894,6 @@ msgstr "Otvori"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Otvori izvješća"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1875,32 +1910,26 @@ msgstr "Open311 prvotna web stranica"
msgid "Open311 specification"
msgstr "Open311 specifikacija"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Ili problemi prijavljeni:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Ili se možete pretplatiti na upozorenja unutar vašeg vijeća &rsquo;:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Drugo"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Naš kod je open source i <a href=\"http://github.com/mysociety/fixmystreet\">dostupan na GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Vlasnik"
@@ -1915,12 +1944,12 @@ msgstr "Stranica nije pronađena"
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "DjelomiÄno"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1929,6 +1958,7 @@ msgid "Password (optional)"
msgstr "Lozinka (neobvezno)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Lozinka:"
@@ -1936,7 +1966,7 @@ msgstr "Lozinka:"
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1945,11 +1975,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr "Telefonski broj (neobavezan)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefon:"
@@ -1960,14 +1988,23 @@ msgstr "Telefon:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Slika"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Potrebna informacija"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Potrebna informacija"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Slika:"
@@ -1979,22 +2016,18 @@ msgstr "Fotografije posljednjih obližnjih prijava"
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planirano"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Molimo<a class=\"tab_link\" href=\"#report\">pregledajte</a> poslana ažuriranja."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Molimo da budete pristojni, jezgroviti i jasni."
@@ -2004,22 +2037,20 @@ msgstr "Molimo da budete pristojni, jezgroviti i jasni."
msgid "Please check the passwords and try again"
msgstr "Provjeri lozinku i pokušaj ponovno"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Provjeri svoj e-mail"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Provjerite je li vaÅ¡a e-mail adresa toÄna"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2029,15 +2060,16 @@ msgstr "Izaberi kategoriju"
msgid "Please choose a property type"
msgstr "Izaberi tip imovine"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"Molimo<strong>not</strong> prijavite probleme pomoću sljedećeg obrasca; poruke idu\n"
@@ -2049,7 +2081,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Unesi poruku"
@@ -2060,15 +2092,15 @@ msgstr "Unesi poruku"
msgid "Please enter a password"
msgstr "Unesi lozinku"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Unesi predmet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2076,7 +2108,7 @@ msgid "Please enter a valid email"
msgstr "Unesi valjani e-mail"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Unesi valjanu e-mail adresu"
@@ -2085,21 +2117,19 @@ msgstr "Unesi valjanu e-mail adresu"
msgid "Please enter some details"
msgstr "Unesi detalje"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Unesi svoj e-mail"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Unesi svoju e-mail adresu"
@@ -2112,8 +2142,8 @@ msgstr "Unesi svoje ime"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Molimo unesite svoje puno ime, odgovorno tijelo treba ovu informaciju – ako ne želite da vaÅ¡e ime bude prikazano na stranici, odznaÄite kvadratić ispod"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2152,7 +2182,7 @@ msgstr "Popunite detalje o problemu u nastavku."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Popunite detalje o problemu u nastavku i opišite lokaciju što preciznije."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Molimo navedite želite li primiti novi upitnik"
@@ -2175,19 +2205,24 @@ msgstr "Napominjemo da vaša prijava <strong>još nije poslana</strong>. Izaberi
msgid "Please note:"
msgstr "Napominjemo:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Molimo navedite obrazloženje ponovnog otvaranja ove prijave"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Molimo unesite tekst i fotografiju "
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Jeste li do sada ikada prijavljivali problem odgovoronom tijelu"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Izaberite izvor koji želite"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Izaberite izvor koji želite"
@@ -2196,21 +2231,17 @@ msgstr "Izaberite izvor koji želite"
msgid "Please select the type of alert you want"
msgstr "Izaberite tip upozorenja koji želite"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Navedite je li problem rješen "
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Pregledajte ažuriranja"
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Molimo uÄitajte samo JPEG slike"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Napiši poruku"
@@ -2219,8 +2250,8 @@ msgid "Please write your update here"
msgstr "Ovdje ažurirajte"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2241,22 +2272,36 @@ msgstr "Objavio %s (<strong>%s</strong>) na %s"
msgid "Posted by %s at %s"
msgstr "Objavio %s na %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privatno"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problem"
@@ -2272,12 +2317,12 @@ msgstr "Problem %s potvrđen"
msgid "Problem %s sent to council %s"
msgstr "Problem %s poslan odgovornom tijelu %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Analiza problema prema stanju"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problem oznaÄen kao otvoren."
@@ -2293,12 +2338,10 @@ msgstr "Problemi"
msgid "Problems in this area"
msgstr "Problemi u ovom podruÄju"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Okolni problemi"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemi na mapi"
@@ -2307,12 +2350,11 @@ msgstr "Problemi na mapi"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problems nedavno prijavljeni kao popravljeni na Popravi.to"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemi unutar%.1fkm od ove lokacije"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2324,20 +2366,17 @@ msgstr "Problemi unutar %s"
msgid "Problems within %s ward"
msgstr "Problemi unutar %s ward"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemi unutar%s, Popravi.to"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemi unutar %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemi unutar granice:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Objekti nedavno prijavljeni za ponovno korištenje na praznakuco.joj"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2351,39 +2390,31 @@ msgstr "Tip objekta:"
msgid "Provide an update"
msgstr "Ažuriranje"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Lozinka nije obvezna, ali će vam omogućiti lakše prijavljivanje problema, ažuriranja i upravljanje vašim izvješćima."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Upitnik"
@@ -2399,12 +2430,11 @@ msgstr "Upitnik %d poslan za problem %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Upitnik popunila osoba koja je prijavila problem"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2430,8 +2460,7 @@ msgstr "RSS izvor za %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS izvor za %s, unutar %s ward"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS izvor za okolne probleme"
@@ -2439,7 +2468,7 @@ msgstr "RSS izvor za okolne probleme"
msgid "RSS feed of problems in this %s"
msgstr "RSS izvor za probleme u ovom %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2469,17 +2498,18 @@ msgstr "RSS izvor za ažuriranja ovog problema"
msgid "Receive email when updates are left on this problem."
msgstr "Primite e-mail s ažuriranjima ovog problema"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Nedavni lokalni problemi, Popravi.to"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Nedavno<br>popravljeno"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Nedavno prijavljeni problemi"
@@ -2487,23 +2517,27 @@ msgstr "Nedavno prijavljeni problemi"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Popravi.to prvenstveno služi za izvjeÅ¡tavanje fiziÄkih problema koji se mogu popraviti. Ako vaÅ¡ problem nije prikladan za prijavljivanje preko ove stranice, uvijek se možete obratiti direktno svom vijeću preko njihove web stranice."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Ukloni oznaku"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Ukloni fotografiju (nije moguće poništiti!)"
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Prijavi problem"
@@ -2512,7 +2546,7 @@ msgstr "Prijavi problem"
msgid "Report abuse"
msgstr "Prijavi zloupotrebu"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Prijava za %s"
@@ -2521,63 +2555,59 @@ msgstr "Prijava za %s"
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Prijavi, pregledaj ili raspravljaj o lokalnim problemima"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Prijavljeno %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Prijavljeno %s, za %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Prijavljeno anonimno %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Prije prijavljeno"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Prijavio %s za %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Prijavljeno %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Prijavljeno %s u kategoriju anonimno u %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Prijavio %s u kategoriju %s u %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Prijavio %s anonimno %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Prijavio %s %s u %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Prijavio %s u kategoriju %s anonimno u %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Prijavio %s u %s kategoriju %s u %s"
@@ -2585,18 +2615,22 @@ msgstr "Prijavio %s u %s kategoriju %s u %s"
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Prijavljeno %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Prijavljivanje problema"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2609,18 +2643,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Prijave na i oko mape"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Ponovno pošalji prijavu"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2635,26 +2672,32 @@ msgstr "Cestovni operater za ovu imenovanu cestu (izveden iz cestovnog referentn
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Cestovni operater za ovu imenovanu cestu (sa OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Spremi promjene"
@@ -2667,7 +2710,7 @@ msgstr "Pretraži prijave"
msgid "Search Users"
msgstr "Pretraži korisnike"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2699,20 +2742,25 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Odaberite tip upozorenja i kliknite na gumb za RSS izvor, ili unesite svoju e-mail adresu kako biste se pretplatili na e-mail upozorenja."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Otvori izvješća"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Pošalji %s %s naknadno"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Poslano:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Servis:"
@@ -2721,8 +2769,8 @@ msgstr "Servis:"
msgid "Share"
msgstr "Podijeli"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2738,34 +2786,23 @@ msgid "Show pins"
msgstr "Prikaži pinove"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Prijavi se"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Prijavi se putem e-maila"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Prijavi se ili kreiraj korisniÄki raÄun"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Odjavi se"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Prijavljen kao %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Neke kategorije mogu zahtijevati dodatne informacije."
@@ -2781,8 +2818,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Fotografije nedavnih prijava"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Tekst za lakšu lokalizaciju"
@@ -2790,24 +2828,32 @@ msgstr "Tekst za lakšu lokalizaciju"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Žao nam je,ne pokrivamo podruÄje na kojem se nalazi taj problem."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Žao nam je, došlo je do greške pri potvrđivanju problema."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Žao nam je, ne možemo pronaći tu lokaciju."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Žao nam je, nije moguće analizirati tu lokaciju. Molimo pokušajte ponovno."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Žao nam je, nije moguće analizirati tu lokaciju. Molimo pokušajte ponovno."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2823,16 +2869,17 @@ msgstr "Stanje"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Stanje:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistika"
@@ -2846,7 +2893,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr "I dalje otvoreno, putem upitnika %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2861,45 +2913,42 @@ msgstr "Predmet"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Predmet:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Pošalji"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Pošalji promjene"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Pošalji upitnik"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2910,18 +2959,19 @@ msgstr ""
msgid "Subscribe"
msgstr "Pretplati se"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Pretplati se na e-mail upozorenja"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Sažetak"
@@ -2932,7 +2982,7 @@ msgstr "Sažetak"
msgid "Summary reports"
msgstr "Sažetak prijava"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2940,9 +2990,18 @@ msgstr ""
msgid "Survey Results"
msgstr "Rezultati ispitivanja"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Ažuriranja"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Tekst"
@@ -2951,6 +3010,7 @@ msgid "Text only version"
msgstr "Tekst samo verzija"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Tekst:"
@@ -2972,7 +3032,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Hvala na uÄitavanju slike. Sada trebamo locirati problem pa vas molimo da unesete naziv obližnje ulice ili poÅ¡tanski broj u gornji okvir :&nbsp;:"
@@ -2980,7 +3040,7 @@ msgstr "Hvala na uÄitavanju slike. Sada trebamo locirati problem pa vas molimo
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Hvala, drago nam je Äuti da je problem rijeÅ¡en! Htjeli bismo vas joÅ¡ samo upitati jeste li dosada prijavljivali problem odgovornom tijelu?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Slika nije ispravno uÄitana (%s), molimo pokuÅ¡ajte ponovno."
@@ -2998,20 +3058,19 @@ msgstr "Lokacija se ne nalazi u Hrvatskoj. Molimo pokušajte ponovno."
msgid "That postcode was not recognised, sorry."
msgstr "Žao nam je, poštanski broj nije prepoznat."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Navedeni problem će biti ponovno poslan"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Navedeni problem će biti ponovno poslan"
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Navedena prijava je uklonjena s Popravi.to"
@@ -3053,30 +3112,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Molimo<strong> priÄekajte </strong> &mdash; <em>email</em> potvrde."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Pojedinosti problema dostupne su u gornjem dijelu stranice"
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Pojedinosti problema dostupne su u desnom dijelu stranice"
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Greška je: %s"
@@ -3094,10 +3141,6 @@ msgstr "Informacija o najbližoj cesti može biti netoÄna ili irelevantna u slu
msgid "The latest local problems reported by users"
msgstr "Posljednji prijavljeni problemi "
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Posljednji lokalni izvještaji "
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Posljednji problemi za {{ODGOVORNO TIJELO}} "
@@ -3118,21 +3161,9 @@ msgstr "Posljednji riješeni problemi"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Posljednji prijavljeni problemi za {{IME}}"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Posljednji prijavljeni napušteni objekti"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Zadnje prijave za {{COUNCIL}} dostavljene od strane korisnika"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Zadnje prijave za {{COUNCIL}} unutar {{WARD}} dostavljene od strane korisnika"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Zadnje prijave unutar granice {{NAME}} dostavljene od strane korisnika"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3148,8 +3179,7 @@ msgstr "Lozinke se ne podudaraju"
msgid "The requested URL '%s' was not found on this server"
msgstr "Traženi URL '%s' nije pronađen na ovom serveru"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Dojavljivanja problema preko karte:"
@@ -3160,7 +3190,7 @@ msgstr "Dojavljivanja problema preko karte:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Korisnik nije mogao locirati problem na karti, ali možete vidjeti podruÄje oko navedene lokacije"
@@ -3171,23 +3201,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "DoÅ¡lo je do problema pri uÄitavanju svih prijava. Molimo pokuÅ¡ajte ponovno."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "DoÅ¡lo je do problema pri uÄitavanju ove stranice. Molimo pokuÅ¡ajte ponovno."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Došlo je do problema s kombinacijom Vašeg e-maila i lozinke.Ako se ne možete sjetiti ili nemate lozinku, molimo odaberite &lsquo; model prijave putem e-maila &rsquo;."
@@ -3200,7 +3231,7 @@ msgstr "Došlo je do problema s kombinacijom Vaše e-maila i lozinke. Molimo pok
msgid "There was a problem with your update. Please try again."
msgstr "Došlo je do problema pri ažuriranju. Molimo pokušajte ponovno."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Došlo je do problema pri prijavi. Detalje pogledajte u nastavku."
@@ -3240,16 +3271,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Kako korisnik nije kategorizirao problem ,ovaj e-mail poslan je oboma odgovornim tijelima koji pokrivaju mjesto problema. Molimo vas da zanemarite e-mail ukoliko problem ne ulazi u vaÅ¡e podruÄje ili nam javite o kakvoj je kategoriji problema rijeÄ kako bismo ga unijeli u naÅ¡ sustav."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Kako je odabrana kategorija predviđena za više odgovornih tijela, ovaj e-mail poslan je na adrese nekoliko ureda koje prekrivaju mjesto problema. Molimo vas da zanemarite e-mail ukoliko niste nadležni za ovaj problem."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3263,7 +3294,7 @@ msgstr "Ovo je stranica za razvojne programere; ovdje se sve može prekinuti u b
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3290,55 +3321,69 @@ msgstr "Problem je i dalje aktualan"
msgid "This problem is old and of unknown status."
msgstr "Odabrani problem je star i nismo upoznati s trenutnim stanjem."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Ova prijava je trenutno oznaÄena kao zatvorena."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Prijava je trenutno oznaÄena kao popravljena."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Prijava je trenutno oznaÄena kao otvorena."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Stranica sadrži i fotografiju problem, dodanu od strane korisnika."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Vremenska skala"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Naslov"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Kako<strong>biste prijavili problem</strong>, na karti oznaÄite toÄnu lokaciju."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Naslov"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Kako biste vidjeli lokalne probleme,molimo Vas da unesete poÅ¡tanski broj ili naziv ulice i podruÄje."
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Kako biste vidjeli lokalne probleme,molimo Vas da unesete poÅ¡tanski broj ili naziv ulice i podruÄje."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Karta toÄne lokacije ovog problema"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3354,8 +3399,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3363,11 +3408,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Nepotvrđeno"
@@ -3384,7 +3429,9 @@ msgstr "Nepoznat tip upozorenja"
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Nepoznat IB problema"
@@ -3407,11 +3454,11 @@ msgid "Update below added by %s at %s"
msgstr "Ažuriranje u nastavku dodao %s u %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3446,24 +3493,24 @@ msgstr "Ažuriranje:"
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Ažurirano!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Ažuriranja"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3471,27 +3518,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr "Ažuriranja za {{naslov}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Ažuriranja za ovaj problem,Popravi.to"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "korištena karta"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "KorisniÄka oznaka uklonjena"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Korisnik oznaÄen"
@@ -3499,23 +3549,23 @@ msgstr "Korisnik oznaÄen"
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Korisnici"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Vrijednosti ažurirane"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Pogledaj prijave na stranici"
@@ -3539,16 +3589,15 @@ msgid "Wards of this council"
msgstr "Općine ove županije"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Pronađeno je više rezultata za tnavedenulokaciju. Prikazano je do deset rezlutata. Ukoliko nije naveden traženi problem, molimo pokušajte s drugom pretragom."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Poslali smo Vam e-mail s linkom za potvrdu korisniÄkog raÄuna."
@@ -3562,7 +3611,7 @@ msgstr "Nikada ne prikazujemo vašu e-mail adresu"
msgid "We never show your email address or phone number."
msgstr "Nikada ne prikazujemo vašu e-mail adresu ili telefonski broj."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Shvaćamo da bi za ovaj problem moglo biti odgovorno% s, međutim, trenutno nemamo nikakve pojedinosti o njihovom kontaktu. Ako znate odgovarajuću kontakt adresu, molimo Vas da nam se javite."
@@ -3587,11 +3636,15 @@ msgstr "Rado bismo Äuli VaÅ¡e miÅ¡ljenje o ovoj stranici. Da biste to uÄinili
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Prilikom ažuriranja"
@@ -3600,7 +3653,7 @@ msgstr "Prilikom ažuriranja"
msgid "When sent"
msgstr "Prilikom slanja"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Cijeli blok praznih stanova"
@@ -3608,16 +3661,22 @@ msgstr "Cijeli blok praznih stanova"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Osim pretraživanja prijava, moguće je pretražiti i odgovorne_agencije kako biste ograniÄili prijave na one poslane odreÄ‘enom uredu. Pojam za pretraživanje je IB pojedinog ureda kojeg možete saznati pomoću <a href=\"%s\">MaPit</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Želite li za 4 tjedna primiti još jedan upitnik koji bi Vas podsjetio da provjerite status?"
@@ -3643,15 +3702,13 @@ msgstr "Godina"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Da"
@@ -3714,11 +3771,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Već ste ogovorili na upitnik. Ako imate nekih pitanja, molimo da nam<a href='%s'>se javite</a>, ili<a href='%s'>pregledate problem koji vas zanima</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Već ste priložiti fotografiju ovoj prijavi, ako dodate novu, zamijenit će prethodno postojeću."
@@ -3727,6 +3782,10 @@ msgstr "Već ste priložiti fotografiju ovoj prijavi, ako dodate novu, zamijenit
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Već ste priložiti fotografiju ovom ažuriranju, ako dodate novu, zamijenit će prethodno postojeću."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3747,15 +3806,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "UapjeÅ¡no ste se prijavili; molimo provjerite i potvrdite toÄnost VaÅ¡ih podataka:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3766,18 +3821,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Jeste li sigurni da želite ponovno poslati?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Vaše prijave"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3786,22 +3839,17 @@ msgstr "Vaše prijave"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Vaš e-mail"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Vaša e-mail adresa"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Vaša e-mail adresa:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3811,24 +3859,23 @@ msgstr "Vaš e-mail:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "VaÅ¡e informacije će se koristiti iskljuÄivo u skladu s naÅ¡im<a href=\"/privacy\">pravilima o privatnosti</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Ime"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Ime:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3841,19 +3888,15 @@ msgstr "Vaša lozinka je promijenjena"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Vaš broj telefona"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Vaša prijava"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Vaše prijave"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Vaša ažuriranja"
@@ -3861,23 +3904,31 @@ msgstr "Vaša ažuriranja"
msgid "Your&nbsp;email:"
msgstr "Vaš&nbsp;e-mail:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Sve prijave"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "od %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Zatvorene prijave"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "odgovorno tijelo"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "nije korištena karta"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "npr. ‘%s’ ili‘%s’"
@@ -3886,17 +3937,22 @@ msgstr "npr. ‘%s’ ili‘%s’"
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Popravljene prijave"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "od %d razliÄitih korisnika"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "manje od minute"
@@ -3941,14 +3997,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/a"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "ili"
@@ -3958,16 +4013,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3980,8 +4035,8 @@ msgstr "druga podruÄja:"
msgid "reopened"
msgstr "ponovno otvoreno"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "odjavi se"
@@ -3997,17 +4052,20 @@ msgstr "lokalno odgovorno tijelo"
msgid "there is no pin shown as the user did not use the map"
msgstr "nema oznake jer korisnik nije oznaÄio problem na karti"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "ovaj tip "
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "danas"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Popravljene prijave"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "korištena karta"
@@ -4032,7 +4090,7 @@ msgstr[0] "<big>%s</big> novija prijava"
msgstr[1] "<big>%s</big> novije prijave"
msgstr[2] "<big>%s</big> novije prijave"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4048,7 +4106,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4072,7 +4130,7 @@ msgstr[0] "Još uvijek nemamo podatke za odgovorno tijelo koja pokriva ovu lokac
msgstr[1] "Još uvijek nemamo podatke za odgovorna tijela koja pokrivaju ovu lokaciju."
msgstr[2] "Još uvijek nemamo podatke za odgovorna tijela koja pokrivaju ovu lokaciju."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4096,7 +4154,7 @@ msgstr[0] "<big>%s</big> popravljeno u posljednjih mjesec dana"
msgstr[1] "<big>%s</big> popravljeno u posljednjih mjesec dana"
msgstr[2] "<big>%s</big> popravljeno u posljednjih mjesec dana"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4112,5 +4170,113 @@ msgstr[0] "Još <strong>nemamo</strong> podatke za drugo odgovorno tijelo koje j
msgstr[1] "Još <strong>nemamo</strong> podatke za ostala odgovorna tijela koja su odgovorna za ovu lokaciju."
msgstr[2] "Još <strong>nemamo</strong> podatke za ostala odgovorna tijela koja su odgovorna za ovu lokaciju."
-#~ msgid "For council(s):"
-#~ msgstr "Za županiju(e):"
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Ukoliko ne vidite kartu, <a href='%s' rel='nofollow'>preskoÄite ovaj korak</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>No</strong>, Nemam, prijavi me e-mailom:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Jeste li <strong>developer</strong>? Biste li htjeli doprinijeti ideji popravi.to?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Najbliži problemi <small>(within&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontaktiraj potvrdi.to"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Imaš li popravi.to lozinku?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "Popravi.to admin:"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nove lokalne prijave na kućoprazna.joj"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nove prijave za {{COUNCIL}} unutar{{WARD}} na kucoprazna.joj"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nove prijave na praznakuco.joj"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nove prijave na praznakuco.joj blizu{{POÅ TANSKI BROJ}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nove prijave {{ODGOVORNOM TIJELU}} na praznakuco.joj"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nove prijave u djelokrugu {{IME}} na praznakuco.joj"
+
+#~ msgid "No problems found."
+#~ msgstr "Nisu pronađeni problemi."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Još uvijek nisu prijavljeni nikakvi problemi."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Podnesite svoju prijavu&hellip; imate li Popravi.to lozinku?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Pošaljite svoje ažuriranje&hellip; imate li Popravi.to lozinku?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Naš kod je open source i <a href=\"http://github.com/mysociety/fixmystreet\">dostupan na GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Molimo<a class=\"tab_link\" href=\"#report\">pregledajte</a> poslana ažuriranja."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Pregledajte ažuriranja"
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemi unutar%s, Popravi.to"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Objekti nedavno prijavljeni za ponovno korištenje na praznakuco.joj"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Prijavljeno %s, za %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Prijave na i oko mape"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Prijavi se putem e-maila"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Prijavljen kao %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "Molimo<strong> priÄekajte </strong> &mdash; <em>email</em> potvrde."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Pojedinosti problema dostupne su u gornjem dijelu stranice"
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Pojedinosti problema dostupne su u desnom dijelu stranice"
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Posljednji lokalni izvještaji "
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Posljednji prijavljeni napušteni objekti"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Zadnje prijave za {{COUNCIL}} dostavljene od strane korisnika"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Zadnje prijave za {{COUNCIL}} unutar {{WARD}} dostavljene od strane korisnika"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Zadnje prijave unutar granice {{NAME}} dostavljene od strane korisnika"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Kako<strong>biste prijavili problem</strong>, na karti oznaÄite toÄnu lokaciju."
+
+#~ msgid "Your email address:"
+#~ msgstr "Vaša e-mail adresa:"
+
+#~ msgid "Your report"
+#~ msgstr "Vaša prijava"
diff --git a/locale/it.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/it.UTF-8/LC_MESSAGES/FixMyStreet.po
index fb37b73e7..01121110d 100644
--- a/locale/it.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/it.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -11,18 +11,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/fixmystreet/language/it/)\n"
+"Language-Team: Italian (http://www.transifex.com/mysociety/fixmystreet/language/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "e"
@@ -35,11 +35,13 @@ msgstr "e"
msgid " or "
msgstr "o"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d segnalazioni confermate, %d non confermate"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d contatti del Comune &ndash; %d confermati, %d non confermati"
@@ -48,11 +50,13 @@ msgstr "%d contatti del Comune &ndash; %d confermati, %d non confermati"
msgid "%d edits by %s"
msgstr "%d modificato da %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d aggiornamenti in tempo reale"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d questionari inviati &ndash; %d compilati (%s%%)"
@@ -65,15 +69,55 @@ msgstr "%d a %d di %d"
msgid "%s - Summary reports"
msgstr "%s - Riassunto sulle segnalazioni"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet offre un servizio di RSS feed e di avvertimenti via email sui problemi locali, inclusiâŽ\n"
+"gli avvertimenti per problemi in un particolare quartiere o comune, o tutti i problemiâŽ\n"
+"da una certa distanza da una specifica zona."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet offre un servizio di RSS feed e di avvertimenti via email sui problemi locali, inclusiâŽ\n"
+"gli avvertimenti per problemi in un particolare quartiere o comune, o tutti i problemiâŽ\n"
+"da una certa distanza da una specifica zona."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s quartiere, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, segnalati al %s"
@@ -85,59 +129,57 @@ msgstr "%s dentro al quartiere %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Non ti preoccupare &mdash; ci penseremo noi alla tua segnalazione mentre controlli l'email.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Non ti preoccupare &mdash; ci penseremo noi al tuo problema segnalato mentre controlli l'email.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Non ti preoccupare &mdash; ci penseremo noi al tuo aggiornamento mentre controlli l'email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Email nella tabella degli abusi)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Il tuo nome"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Il tuo numero di telefono"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(una distanza predefinita che copre approssimativamente 200,000 persone)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(alternativamente gli RSS feed possono essere personalizzati, dentro "
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(chiuso)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(risolto)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(come gli atti vandalici, le discariche abusive, la pavimentazione e l'illuminazione stradale rotta)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(non inviato al Comune)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(opzionale)"
@@ -145,25 +187,24 @@ msgstr "(opzionale)"
msgid "(public)"
msgstr "(pubblico)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(inviato ad entrambi)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(non mostreremo mai la tua email o il tuo numero di telefono)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(non mostreremo mai la tua email)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Scegli una categoria --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Scegli un tipo di proprietà --"
@@ -176,12 +217,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Se non puoi vedere la mappa, <a href='%s' rel='nofollow'>salta questo passaggio</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> problemi in tempo reale"
@@ -194,28 +237,22 @@ msgstr "<strong>No</strong> Lasciami confermare la mia segnalazione via email"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>No</strong> Lasciami confermare il mio aggiornamento via email"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>No</strong> lasciami entrare con l'email"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>No</strong>, Non c'e l'ho, lasciami entrare con la mia email:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>No</strong>, lasciami confermare la mia segnalazione via email:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>No</strong>, lasciami confermare il mio aggiornamento via email:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -226,8 +263,8 @@ msgstr "<strong>Si</strong> Ho già la password"
msgid "About us"
msgstr "Chi siamo"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -249,7 +286,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Aggiungi un corpo"
@@ -262,10 +299,14 @@ msgstr "Aggiungi una nuova categoria"
msgid "Add user"
msgstr "Aggiungi un'utente"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Aggiunti %s"
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Ancora:"
@@ -278,21 +319,25 @@ msgstr "Segnalazione %d creata per %s tipo %s, parametri %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Segnalazione %d disabilitata (creata %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Avvisami su futuri aggiornamenti"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Tutte le segnalazioni"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Tutte le segnalazioni"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Tutte le segnalazioni"
@@ -315,8 +360,7 @@ msgstr "Tutte le informazioni che aggiungi qui, saranno inviate all'ufficio comp
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Tutte le informazioni che aggiungi qui saranno inviate al <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Un aggiornamento ha riportato questo problema come risolto."
@@ -325,16 +369,12 @@ msgstr "Un aggiornamento ha riportato questo problema come risolto."
msgid "Anonymous"
msgstr "Anonimo"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonimo:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Sei uno <strong>sviluppatore</strong>? Vorresti contribuire a FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Sei uno sviluppatore?"
@@ -349,22 +389,25 @@ msgstr "Area coperta"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Assegna ad un corpo esterno:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Assegna ad una categoria differente:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Assegna ad un corpo esterno:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Assegna ad una subdivisione:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Assegnato a %s"
@@ -385,12 +428,12 @@ msgstr ""
msgid "Back"
msgstr "Indietro"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Vietare l'indirizzo email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Corpi"
@@ -410,12 +453,16 @@ msgstr "Corpo:"
msgid "By Date"
msgstr "Per data"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Non puoi vedere la mappa? <em>Salta questo passaggio</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -426,27 +473,28 @@ msgstr "Non puoi vedere la mappa? <em>Salta questo passaggio</em>"
msgid "Category"
msgstr "Categoria"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Categoria:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Categoria: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Cambia la Password"
@@ -479,54 +527,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Clicca sulla mappa per riportare un problema"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Chiuso"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Chiuso dal comune"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Segnalazione chiusa"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Chiuso:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Problemi più vicini <small>(within&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Coordinate:"
@@ -534,22 +588,22 @@ msgstr "Coordinate:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Dati del Cobrand:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Configurazione"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Configura il punto finale"
@@ -557,7 +611,7 @@ msgstr "Configura il punto finale"
msgid "Confirm"
msgstr "Conferma"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Conferma l'account"
@@ -577,7 +631,7 @@ msgstr "Conferma"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Confermato"
@@ -588,13 +642,18 @@ msgstr "La segnalazione è confermata tra %s e %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Confermato:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Contatto FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Contattaci"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -609,8 +668,14 @@ msgstr "Contattaci"
msgid "Contact the team"
msgstr "Contatta il team"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Coordinate:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Non posso trovare l'utente"
@@ -628,7 +693,7 @@ msgstr "Comune"
msgid "Council contacts for %s"
msgstr "I contatti del comune per %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -643,7 +708,7 @@ msgstr "Comune:"
msgid "Count"
msgstr "Contare"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Crea una segnalazione"
@@ -652,17 +717,19 @@ msgstr "Crea una segnalazione"
msgid "Create category"
msgstr "Crea una categoria"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Crea una segnalazione"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Creato"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Creato:"
@@ -672,10 +739,15 @@ msgid "Current state"
msgstr "Stato corrente"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -685,11 +757,16 @@ msgstr "Pannello di controllo"
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Eliminato"
@@ -707,9 +784,9 @@ msgstr "Dettagli"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Dettagli:"
@@ -717,23 +794,27 @@ msgstr "Dettagli:"
msgid "Devolved"
msgstr "Devoluto:"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "mappa non usata"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Hai già la password per FixMyBrarangay?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Hai già la password per FixMyStreet?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Non lo so"
@@ -741,8 +822,8 @@ msgstr "Non lo so"
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -761,7 +842,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Modifica"
@@ -772,7 +854,7 @@ msgstr "Modifica dettagli corpo"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -787,15 +869,15 @@ msgstr "Modifica aggiornamento %d"
msgid "Editing user %d"
msgstr "Modifica utente %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Editor"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -803,7 +885,7 @@ msgstr "Editor"
msgid "Email"
msgstr "Email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Email aggiunta alla lista abusi"
@@ -819,7 +901,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Email già presente nella lista abusi"
@@ -832,38 +914,36 @@ msgid "Email me updates"
msgstr "Inviami via email gli aggiornamenti"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Email: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Case o bungalow vuoti"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Uffici o altri locali commerciali vuoti"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Pub o bar vuoti"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Edifici pubblici - scuole, ospedali, ecc vuoti"
@@ -892,7 +972,7 @@ msgstr "Data di fine"
msgid "Endpoint"
msgstr "Punto finale"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -905,10 +985,8 @@ msgstr "Inserisci il piu vicino codice postale UK, o il nome di una strada e una
msgid "Enter a nearby postcode, or street name and area"
msgstr "Inserisci il piu vicino codice postale UK o il nome di una strada e l'area"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Inserisci il nome di una strada nelle vicinanze e una città o solo in nome della città "
@@ -916,13 +994,12 @@ msgstr "Inserisci il nome di una strada nelle vicinanze e una città o solo in n
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Inserisci una nuova password:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -933,7 +1010,6 @@ msgstr "Inserisci una password"
msgid "Enter details of the problem"
msgstr "Inserisci i dettagli del problema"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -943,6 +1019,10 @@ msgstr "Inserisci i dettagli del problema"
msgid "Error"
msgstr "Errore"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -956,12 +1036,19 @@ msgstr "Esempi:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Dati extra:"
@@ -974,8 +1061,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Prima volta"
@@ -983,39 +1069,14 @@ msgstr "Prima volta"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet amministrazione:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreet offre un servizio di RSS feed e di avvertimenti via email sui problemi locali, inclusiâŽ\n"
-"gli avvertimenti per problemi in un particolare quartiere o comune, o tutti i problemiâŽ\n"
-"da una certa distanza da una specifica zona."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1026,21 +1087,16 @@ msgstr ""
msgid "Fixed"
msgstr "Risolto"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Risolto - Comune"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Risolto - Utente"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Problemi risolti"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Risolto:"
@@ -1050,11 +1106,11 @@ msgstr "Risolto:"
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Utente segnalato"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Segnalato"
@@ -1071,7 +1127,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Segnalato:"
@@ -1090,9 +1146,22 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Hai dimenticato la tua password?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Assegna ad un corpo esterno:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Assegna ad un corpo esterno:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Domande Frequenti"
@@ -1115,8 +1184,7 @@ msgstr "Ottieni gli aggiornamenti di %s problemi"
msgid "Get updates of problems in this %s"
msgstr "Ottieni gli aggiornamenti dei problemi in questo %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Dammi un' RSS feed"
@@ -1125,17 +1193,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Vai"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1143,41 +1211,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Le linee evidenziate in grigio sono i comuni che non esistono più."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "E' stato risolto questo problema?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Avevi mai segnalato un problema ad un comune precedentemente, o questa è la tua prima volta?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Aiuto"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Qui trovi i tipi di avvertimenti sui problemi locali per &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Ciao %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1191,7 +1255,7 @@ msgstr ""
msgid "Hide pins"
msgstr ""
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Cronologia"
@@ -1207,7 +1271,7 @@ msgstr "Come segnalare un problema"
msgid "How to send successful reports"
msgstr "Come inviare segnalazioni di successo"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Mi spiace non puoi confermare le segnalazioni non confermate."
@@ -1234,8 +1298,8 @@ msgstr "Mi spiace non possiamo validare questo token. Se hai copiato l'URL dall'
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1253,18 +1317,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Se non lo fai, il tuo avviso non sarà attivato."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Se non lo fai, il tuo problema non sarà postato."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Se non lo fai, il tuo aggiornamento non sarà postato."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1274,16 +1326,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Se invii un problema qui, il soggetto e i dettagli del problema saranno pubblici ma il problema <strong>non</strong> verrà segnalato al comune."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Se usi un' email su un sito web o hai un filtro per la posta indesiderata, dovresti controllare anche la cartella dello spam o posta indesiderata: qualche volta i nostri messaggi finiscono li."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Se desideri lasciare un'aggiornamento pubblico sullo stato del problema, per favore inseriscilo quiâŽ\n"
"(tieni presente che non verrà inviato al comune). Per esempio, com'è stata laâŽ\n"
@@ -1316,7 +1368,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "ID illegale"
@@ -1341,14 +1393,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "In corso"
@@ -1356,7 +1407,7 @@ msgstr "In corso"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1368,12 +1419,12 @@ msgstr "Includi segnalazioni non confermate"
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1381,7 +1432,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr ""
@@ -1389,12 +1440,12 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1412,10 +1463,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1427,7 +1487,7 @@ msgstr "Lasciami loggato su questo computer"
msgid "Last editor"
msgstr "Ultima modifica"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Ultimo aggiornamento:"
@@ -1462,7 +1522,7 @@ msgstr "RSS feed locali ed avvertimenti via email"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "RSS feed locali ed avvertimenti via email per ‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Segnalazioni locali"
@@ -1475,11 +1535,10 @@ msgid "MAP"
msgstr "MAPPA"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Mappa"
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1499,6 +1558,16 @@ msgstr ""
msgid "Message"
msgstr "Messaggio"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Assegna ad un corpo esterno:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Assegna ad un corpo esterno:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Messaggio:"
@@ -1526,27 +1595,25 @@ msgstr "Più problemi vicini"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Nome"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Nome:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Nome: %s"
@@ -1559,21 +1626,26 @@ msgstr "Il più vicino nome della strada al segno posizionato sulla mappa (autom
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Quasi fatto! Ora controlla la tua email..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Quasi fatto! Ora controlla la tua email..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nuovi <br>problemi"
@@ -1582,12 +1654,12 @@ msgstr "Nuovi <br>problemi"
msgid "New body added"
msgstr "Nuovo corpo aggiunto"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Nuova categoria contatto aggiunta"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1595,8 +1667,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr "Nuovi problemi locali su FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1623,33 +1695,15 @@ msgstr "Nuovi problemi dentro i confini di {{NAME}} su FixMyStreet"
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nuova segnalazione per {{COUNCIL}} dentro il quartiere {{WARD}} su reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nuove segnalazioni dentro i confini di {{NAME}} su reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Nuovo stato"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Nuovo aggiornamento:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Nuovo stato"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1662,14 +1716,12 @@ msgstr "Prossimo"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "No"
@@ -1697,20 +1749,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Nessun ulteriore aggiornamento"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Nessun problema trovato."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Nessun problema è stato ancora segnalato."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Nessun risultato ritornato"
@@ -1728,8 +1771,6 @@ msgid "No supporters"
msgstr "Nessun sostenitore"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Nessuno"
@@ -1742,8 +1783,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1751,7 +1792,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Non responsabile"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Non responsabile"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1764,7 +1813,7 @@ msgid "Not reported to council"
msgstr "Non segnalato al comune"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Nota"
@@ -1774,7 +1823,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Tieni presente che per includere delle segnalazioni non confermate, usiamo la data della creazione della segnalazione, la quale potrebbe non essere nello stesso mese in cui la segnalazione stessa è stata poi confermata, quindi i numeri potrebbero saltare un po."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Nota:"
@@ -1783,22 +1832,20 @@ msgstr "Nota:"
msgid "Note: <strong>%s</strong>"
msgstr "Nota: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Ora per inserire la tua segnalazione&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Ora per inserire la tua segnalazione&hellip; Hai già la password per FixMyStreet?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Ora per inserire il tuo aggiornamento&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Ora per inserire il tuo aggiornamento&hellip; Hai già la password per FixMyStreet?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1828,20 +1875,18 @@ msgstr "Vecchi <br>problemi"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Aperto"
@@ -1849,11 +1894,6 @@ msgstr "Aperto"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Segnalazione aperta"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1870,32 +1910,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "O puoi iscriverti agli avvisi basati sul tuo quartiere o comune di appartenenza:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Altro"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Il nostro codice è open source e <a href=\"http://github.com/mysociety/fixmystreet\">disponibile su GitHub</a>"
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Proprietario"
@@ -1910,12 +1944,12 @@ msgstr "Pagina non trovata"
msgid "Parent"
msgstr "Parente"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Parziale"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1924,6 +1958,7 @@ msgid "Password (optional)"
msgstr "Password (opzionale)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Password:"
@@ -1931,7 +1966,7 @@ msgstr "Password:"
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Numero di telefono"
@@ -1940,11 +1975,9 @@ msgstr "Numero di telefono"
msgid "Phone number (optional)"
msgstr "Numero di telefono (opzionale)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefono:"
@@ -1955,14 +1988,23 @@ msgstr "Telefono:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Questa informazione è richiesta"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Questa informazione è richiesta"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto:"
@@ -1974,22 +2016,18 @@ msgstr "Foto delle piu vicine e recenti segnalazioni"
msgid "Place pin on map"
msgstr "Inserisci il cursore sulla mappa"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Pianificato"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Per favore <a class=\"tab_link\" href=\"#report\">dai un'occhiata</a> agli aggiornamenti che sono stati lasciati."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Per favore cerca di essere educato, conciso e dritto al punto."
@@ -1999,22 +2037,20 @@ msgstr "Per favore cerca di essere educato, conciso e dritto al punto."
msgid "Please check the passwords and try again"
msgstr "Per favore controlla la password e prova ancora"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Per favore controlla la tua email"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Per favore controlla che il tuo indirizzo email è corretto"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2024,15 +2060,16 @@ msgstr "Per favore scegli una categoria"
msgid "Please choose a property type"
msgstr "Per favore scegli un tipo di proprietà"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"Per favore <strong>non</strong> segnalare i problemi attraverso questo form; i messaggi inseriti qui arrivanoâŽ\n"
@@ -2044,7 +2081,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Per favore non abusarne&nbsp;&mdash; abusandone il comune svaluterà il servizio per tutti gli utenti."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Per favore inserisci un messaggio"
@@ -2055,15 +2092,15 @@ msgstr "Per favore inserisci un messaggio"
msgid "Please enter a password"
msgstr "Per favore inserisci la password"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Per favore inserisci il soggetto"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2071,7 +2108,7 @@ msgid "Please enter a valid email"
msgstr "Per favore inserire un email valida"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Per favore inserire un indirizzo email valido"
@@ -2080,21 +2117,19 @@ msgstr "Per favore inserire un indirizzo email valido"
msgid "Please enter some details"
msgstr "Per favore inserire qualche dettaglio "
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Per favore inserisci la tua email"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Per favore inserisci il tuo indirizzo email"
@@ -2107,8 +2142,8 @@ msgstr "Per favore inserisci il tuo nome"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Per favore inserisci il tuo nome completo, i comuni hanno bisogno di questa informazione - Se non vuoi che il tuo nome venga mostrato sul sito, deseleziona il box qui sotto"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2147,7 +2182,7 @@ msgstr "SI prega di inserire i dettagli del problema"
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Si prega di compilare il modulo sottostante con i dettagli del problema, e descrivere la posizione nel modo più preciso possibile, nella casella dettagli."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Per favore indicare se si vuole ricevere un altro questionario"
@@ -2170,19 +2205,24 @@ msgstr "La tua segnalazione <strong>non è stata inviata</strong>. Scegli una ca
msgid "Please note:"
msgstr "Attenzione:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Per favore provvedi ad alcune spiegazioni perché stai riaprendo questa segnalazione"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Per favore provvedi a del testo come ad una foto"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Per favore dicci se hai mai precedentemente riportato un problema al tuo comune "
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Si prega di selezionare il feed che si vuole"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Si prega di selezionare il feed che si vuole"
@@ -2191,21 +2231,17 @@ msgstr "Si prega di selezionare il feed che si vuole"
msgid "Please select the type of alert you want"
msgstr "Per favore seleziona il tipo di avvertimento che desideri"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Si prega di indicare se il problema è stato risolto"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Per favore dai un'occhiata agli aggiornamenti che sono stati aggiunti"
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Per favore utilizza soltanto il formato JPG"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Per favore scrivi un messaggio"
@@ -2214,8 +2250,8 @@ msgid "Please write your update here"
msgstr "Per favore scrivi il tuo aggiornamento qui"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2236,22 +2272,36 @@ msgstr "Postato da %s (<strong>%s</strong>) al %s"
msgid "Posted by %s at %s"
msgstr "Postato da %s al %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Precedente"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Privacy"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privato"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problema"
@@ -2267,12 +2317,12 @@ msgstr "Problema %s confermato"
msgid "Problem %s sent to council %s"
msgstr "Problema %s inviato al comune %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problema marcato come aperto."
@@ -2288,12 +2338,10 @@ msgstr "Problemi"
msgid "Problems in this area"
msgstr "Problemi in questa area"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemi vicino"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemi sulla mappa"
@@ -2302,12 +2350,11 @@ msgstr "Problemi sulla mappa"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problemi recentemente segnalati e risolti su FIxMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2319,20 +2366,17 @@ msgstr "Problemi dentro %s"
msgid "Problems within %s ward"
msgstr "Problemi dentro %s quartiere"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemi dentro %s, FIxMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemi dentro %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemi dentro i confini di:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "L'indirizzo della proprietà:"
@@ -2346,39 +2390,31 @@ msgstr "Tipo di proprietà:"
msgid "Provide an update"
msgstr "Fornisci un'aggiornamento"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Scegliere una password è opzionale, ma farlo ti acconsentirà di riportare più facilmente le future segnalazioni, di aggiungere degli aggiornamenti e gestire le tue segnalazioni."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Risposte pubbliche:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Pubblica la foto"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Pubblica la risposta"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Questionario"
@@ -2394,12 +2430,11 @@ msgstr "Questionario %d inviato per il problema %d"
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2425,8 +2460,7 @@ msgstr "RSS feed di %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS feed di %s, dentro al quartiere %s "
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS feed dei problemi vicino"
@@ -2434,7 +2468,7 @@ msgstr "RSS feed dei problemi vicino"
msgid "RSS feed of problems in this %s"
msgstr "RSS feed per i problemi in questo %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2464,17 +2498,18 @@ msgstr "RSS feed degli aggiornamenti su questa segnalazione"
msgid "Receive email when updates are left on this problem."
msgstr "Ricevi un'email quando gli aggiornamenti sono aggiunti su questa segnalazione."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Recenti problemi locali, FIxMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Recentemente <br>risolti"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Problemi segnalati di recente"
@@ -2482,23 +2517,28 @@ msgstr "Problemi segnalati di recente"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Ricorda che FIxMyStreet serve per segnalare problemi materiali che possono essere risolti. Se il tuo non è un problema appropriato, da segnalare attraverso questo sito, ti ricordiamo che puoi sempre contattare tu direttamente il comune attraverso il suo sito internet."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "Modifica utente"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Segnala un problema"
@@ -2507,7 +2547,7 @@ msgstr "Segnala un problema"
msgid "Report abuse"
msgstr "Segnala un abuso"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2516,83 +2556,82 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Segnala, conosci e discuti sui problemi della tua città "
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Riportati %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Riportati %s, a %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Riportati anonimamente al %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Segnalati prima"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Segnalato da %s al %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Riportati %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Riportato nella categoria %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Riportato nella categoria %s anonimamente alle %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Riportato nella categoria %s da %s alle %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Riportato nella categoria %s"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Riportati %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Stai segnalando un problema"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2605,18 +2644,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr "Segnalazioni in attesa di approvazione"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Segnalazioni sulla e intorno alla mappa"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Segnalazioni pubblicate"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Rinvia la segnalazione"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "E' il posto giusto?"
@@ -2631,26 +2673,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Salva modifiche"
@@ -2663,7 +2711,7 @@ msgstr "Ricerca Segnalazioni"
msgid "Search Users"
msgstr "Ricerca Utenti"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Ricerca segnalazioni"
@@ -2695,20 +2743,25 @@ msgstr ""
msgid "Select an area"
msgstr "Seleziona un'area"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Seleziona quale tipo di avvertimento vorresti e clicca sul bottone per gli RSS feed oppure inserisci il tuo indirizzo email per iscriverti agli avvertimenti via email."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Segnalazione aperta"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Inviato:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2717,8 +2770,8 @@ msgstr ""
msgid "Share"
msgstr "Condividi"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2734,34 +2787,23 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Entra"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Entra inserendo l'email"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Entra o crea un nuovo account"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Entra come %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Qualche categoria potrebbe richiedere ulteriori informazioni."
@@ -2777,8 +2819,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Qualche foto di segnalazioni recenti"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2786,24 +2829,32 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Ci scusiamo, non possiamo trovare questa zona."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Ci scusiamo, non possiamo analizzare questa zona. Per favore prova ancora."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Ci scusiamo, non possiamo analizzare questa zona. Per favore prova ancora."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Data di inizio:"
@@ -2819,16 +2870,17 @@ msgstr "Stato"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Stato:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Stati"
@@ -2842,7 +2894,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr "Ancora aperto, attraverso il questionario %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Sottocategoria: %s"
@@ -2857,45 +2914,42 @@ msgstr "Soggetto"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Soggetto:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Invia"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Invia modifiche"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Invia questionario"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Inviato"
@@ -2906,18 +2960,19 @@ msgstr "Inviato"
msgid "Subscribe"
msgstr "Sottoscrivi"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Iscrivimi alle email di avviso"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Sommario"
@@ -2928,7 +2983,7 @@ msgstr "Sommario"
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Sondaggio"
@@ -2936,9 +2991,18 @@ msgstr "Sondaggio"
msgid "Survey Results"
msgstr "Risultati sondaggio"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Aggiornamenti"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Testo"
@@ -2947,6 +3011,7 @@ msgid "Text only version"
msgstr "Solo versione testuale"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Testo:"
@@ -2968,7 +3033,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Grazie per aver aggiunto la tua foto. Abbiamo adesso bisogno di localizzare il problema, quindi inserisci il nome della strada piu vicina o il codice postale nel box qui sopra&nbsp;:"
@@ -2976,7 +3041,7 @@ msgstr "Grazie per aver aggiunto la tua foto. Abbiamo adesso bisogno di localizz
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Grazie, è fantastico sapere che è stato risolto! Possiamo soltanto chiederti se avevi gia segnalato altri problemi al tuo comune precedentemente?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2994,20 +3059,19 @@ msgstr "Questa posizione non sembra essere nel Regno Unito, si prega di riprovar
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Questo problema è stato risolto"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "La segnalazione non può essere vista su %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Quella segnalazione è stata rimossa da FixMyStreet"
@@ -3049,30 +3113,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "Il comune non sarà in grado di fare qualcosa finchè non lascerai più dettagli possibili sul problema che stai segnalando. Per favore descrivi l'esatta location (es. nel muro), che cos'è, da quanto tempo c'è, una descrizione (e una foto del problema se ne hai una), ecc.."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "L'errore era: %s"
@@ -3090,10 +3142,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Gli ultimi problemi per {{COUNCIL}} segnalati dagli utenti"
@@ -3114,22 +3162,10 @@ msgstr "Gli ultimi problemi risolti segnalati dagli utenti"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Gli ultimi problemi dentro i confini di {{NAME}} segnalati dagli utenti"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Le ultime segnalazioni per {{COUNCIL}} riportate dagli utenti"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Le ultime segnalazioni per {{COUNCIL}} dentro i confini del quartiere {{WARD}} riportate dagli utenti"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Le ultime segnalazioni dentro i confini di {{NAME}} riportate dagli utenti"
-
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
msgstr ""
@@ -3144,8 +3180,7 @@ msgstr "Le passwords non corrispondono"
msgid "The requested URL '%s' was not found on this server"
msgstr "L'URL richiesta '%s' non è stata trovata su questo serverjavascript:;"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3156,7 +3191,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3167,23 +3202,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "E' accaduto un problema visualizzando questa pagine. Per favore riprova ancora più tardi"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "E' accaduto un problema con la tua combinazione email/password. Se non ti ricordi la password, o non né hai ancora una, per favore riempi qui gli &lsquo; ed entra con l'email&rsquo, nella sezione del form"
@@ -3196,7 +3232,7 @@ msgstr "E' accaduto un problema con la tua combinazione email/password. Per favo
msgid "There was a problem with your update. Please try again."
msgstr "C'è stato un problema con il tuo aggiornamento. Per favore prova ancora."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Ci sono stati dei problemi con la tua segnalazione. Per favore guarda qui sotto."
@@ -3236,16 +3272,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Questa email è stata inviata ad entrambi i comuni che coprono la zona del problema, visto che l'utente non ha aggiunto una categoria; per favore ignorate l'email se non siete il comune corretto che deve gestire il problema, o fateci sapere qual'e la categoria di questo problema così da poterla aggiungere nel nostro sistema."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3259,7 +3295,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3286,55 +3322,69 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Questo report è stato sottomesso in maniera anonima"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titolo"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Per <strong>segnalare un problema</strong>, clicca sulla mappa nella corretta zona."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titolo"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Per sapere quali segnalazioni locali abbiamo per te, inserisci per favore il tuo codice postale o il nome della via e della zona"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Per sapere quali segnalazioni locali abbiamo per te, inserisci per favore il tuo codice postale o il nome della via e della zona"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3350,8 +3400,8 @@ msgstr "Prova ancora"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3359,11 +3409,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Non confermato"
@@ -3380,7 +3430,9 @@ msgstr ""
msgid "Unknown error"
msgstr "Errore sconosciuto"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3403,11 +3455,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3442,24 +3494,24 @@ msgstr "Aggiornamento:"
msgid "Updated"
msgstr "Aggiornato"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Aggiornato!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Aggiornamenti"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3467,27 +3519,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "Ottieni gli aggiornamenti di %s problemi"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Utente"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "mappa usata"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3495,23 +3550,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Utenti"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3535,16 +3590,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Abbiamo trovato più di una corrispondenza per questa posizione. Mostriamo fino a dieci risultati, per favore prova una ricerca differente se quello che cercavi non è qui."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3558,7 +3612,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr "Non mostriamo mai il tuo indirizzo email e numero di telefono."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3583,11 +3637,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3596,7 +3654,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3604,16 +3662,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3639,15 +3703,13 @@ msgstr "Anno"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Si"
@@ -3710,11 +3772,9 @@ msgstr "Hai rifiutato; Per favore riempi il box qui sopra "
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3723,6 +3783,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3743,15 +3807,11 @@ msgstr "Il tuo indirizzo email è stato confermato con successo."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Ti sei correttamente iscritto; per favore controlla e conferma i tuoi dettagli:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3762,18 +3822,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr ""
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Tue segnalazioni"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3782,22 +3840,17 @@ msgstr "Tue segnalazioni"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "La tua email"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Tuo indirizzo email"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Tuo indirizzo email:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3807,24 +3860,23 @@ msgstr "La tua email:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Il tuo nome"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Il tuo nome:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3837,19 +3889,15 @@ msgstr "La tua password è stata cambiata"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Il tuo numero di telefono"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "La tua segnalazione"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Tue segnalazioni"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3857,23 +3905,31 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr "La tua&nbsp;email:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Tutte le segnalazioni"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "da %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Segnalazione chiusa"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "comune"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "mappa non usata"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3882,17 +3938,22 @@ msgstr ""
msgid "edit user"
msgstr "Modifica utente"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Problemi risolti"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "da %d utenti differenti"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "ultimo aggiornamento %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "meno di un minuto"
@@ -3937,14 +3998,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "non disponibile"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "o"
@@ -3954,16 +4014,16 @@ msgstr "oppure fatti localizzare automaticamente"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3976,8 +4036,8 @@ msgstr "altre aree:"
msgid "reopened"
msgstr "riaperto"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3993,17 +4053,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "oggi"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Problemi risolti"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "mappa usata"
@@ -4027,7 +4090,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> segnalazione recente"
msgstr[1] "<big>%s</big> segnalazioni recenti"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4041,7 +4104,7 @@ msgid_plural "%d supporters"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4062,7 +4125,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Non abbiamo ancora i dettagli sul comune che copre questa zona."
msgstr[1] "Non abbiamo ancora i dettagli sui comuni che coprono questa zona."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4083,7 +4146,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> risolti nel mese passato"
msgstr[1] "<big>%s</big> risolti nel mese passato"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4096,3 +4159,111 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] "<strong>Non</strong>abbiamo ancora dettagli per un'altro comune che copre questa zona."
msgstr[1] "<strong>Non</strong>abbiamo ancora dettagli sugli altri comuni che coprono questa zona."
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Non ti preoccupare &mdash; ci penseremo noi alla tua segnalazione mentre controlli l'email.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Non ti preoccupare &mdash; ci penseremo noi al tuo problema segnalato mentre controlli l'email.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Non ti preoccupare &mdash; ci penseremo noi al tuo aggiornamento mentre controlli l'email.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Se non puoi vedere la mappa, <a href='%s' rel='nofollow'>salta questo passaggio</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>No</strong>, Non c'e l'ho, lasciami entrare con la mia email:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Sei uno <strong>sviluppatore</strong>? Vorresti contribuire a FixMyStreet?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Problemi più vicini <small>(within&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Contatto FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Hai già la password per FixMyBrarangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet amministrazione:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Se non lo fai, il tuo avviso non sarà attivato."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Se non lo fai, il tuo problema non sarà postato."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Se non lo fai, il tuo aggiornamento non sarà postato."
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nuova segnalazione per {{COUNCIL}} dentro il quartiere {{WARD}} su reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nuove segnalazioni dentro i confini di {{NAME}} su reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Nuovo aggiornamento:"
+
+#~ msgid "No problems found."
+#~ msgstr "Nessun problema trovato."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Nessun problema è stato ancora segnalato."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Ora per inserire la tua segnalazione&hellip; Hai già la password per FixMyStreet?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Ora per inserire il tuo aggiornamento&hellip; Hai già la password per FixMyStreet?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Il nostro codice è open source e <a href=\"http://github.com/mysociety/fixmystreet\">disponibile su GitHub</a>"
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Per favore <a class=\"tab_link\" href=\"#report\">dai un'occhiata</a> agli aggiornamenti che sono stati lasciati."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Per favore dai un'occhiata agli aggiornamenti che sono stati aggiunti"
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemi dentro %s, FIxMyStreet"
+
+#~ msgid "Publish the response"
+#~ msgstr "Pubblica la risposta"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Riportati %s, a %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Segnalazioni sulla e intorno alla mappa"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Entra inserendo l'email"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Entra come %s"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Le ultime segnalazioni per {{COUNCIL}} riportate dagli utenti"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Le ultime segnalazioni per {{COUNCIL}} dentro i confini del quartiere {{WARD}} riportate dagli utenti"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Le ultime segnalazioni dentro i confini di {{NAME}} riportate dagli utenti"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Per <strong>segnalare un problema</strong>, clicca sulla mappa nella corretta zona."
+
+#~ msgid "User"
+#~ msgstr "Utente"
+
+#~ msgid "Your email address:"
+#~ msgstr "Tuo indirizzo email:"
+
+#~ msgid "Your report"
+#~ msgstr "La tua segnalazione"
diff --git a/locale/lt_LT.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/lt_LT.UTF-8/LC_MESSAGES/FixMyStreet.po
index ab9ccab51..9155de2f8 100644
--- a/locale/lt_LT.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/lt_LT.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -9,18 +9,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/fixmystreet/language/lt_LT/)\n"
+"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/mysociety/fixmystreet/language/lt_LT/)\n"
"Language: lt_LT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "ir"
@@ -33,11 +33,13 @@ msgstr "ir"
msgid " or "
msgstr "arba"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d patvirtinti pranešimai, %d nepatvirtinti"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d tarybos kontaktai &ndash; %d patvirtinti, %d nepatvirtinti"
@@ -46,11 +48,13 @@ msgstr "%d tarybos kontaktai &ndash; %d patvirtinti, %d nepatvirtinti"
msgid "%d edits by %s"
msgstr "%d pakeitimai pagal %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d tiesioginiai atnaujinimai"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d klausimynai išsiųsti &ndash; %d atsakyti (%s%%)"
@@ -63,15 +67,62 @@ msgstr "%d į %d iš %d"
msgid "%s - Summary reports"
msgstr "%s - SuvestinÄ—s ataskaitos"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"FixMyStreet sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s rajonas, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, pranešta %s"
@@ -83,59 +134,56 @@ msgstr "%s, viduje %s rajonas"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Nesijaudinkite &mdash; jūsų pranešimas nedings, kol tikrinsite savo elektroninį paštą.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Nesijaudinkite &mdash; jūsų problema nedings, kol tikrinsite savo elektroninį paštą.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Nesijaudinkite &mdash; jūsų atnaujinimas nedings, kol tikrinsite savo elektroninį paštą.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Elektroninis paštas piktnaudžiavo lentelėje)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Telefono numeris"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(numatytasis atstumas, kuris apima maždaug 200.000 žmonių)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(arba RSS srautas gali būti pritaikytas pagal"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(uždaryta)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(atlikta)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(pavyzdžiui, grafitis, šiukšlės, duobė kelyje ar gatvės apšvietimas)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(neišsiųsta savivaldybei)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(pasirinktinai)"
@@ -143,25 +191,24 @@ msgstr "(pasirinktinai)"
msgid "(public)"
msgstr "(viešas)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(išsiųsta į abu)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(mes niekada nerodome jūsų el. pašto arba telefono numerio)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(mes niekada nerodome jūsų el. pašto)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Išsirinktite kategorija --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Pasirinkite nuosavybÄ—s tipÄ… --"
@@ -177,12 +224,14 @@ msgstr ""
"TurbÅ«t dÄ—l to \"padengta sritis\" yra tuÅ¡Äia (žemiau).<br>\n"
"Galbūt pridėkite <code>MAPIT_TYPES</code> į savo config failą?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Jeigu jūs nematote žemėlapio, <a href='%s' rel='nofollow'>tada praleiskite šitą žingsnį </a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> Problemos tiesiogiai"
@@ -195,28 +244,22 @@ msgstr "<strong>Ne</strong> Leisti patvirtinti mano pranešimą el. paštu"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Ne</strong> Leisti patvirtinti mano atnaujinimą el. paštu"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Ne</strong> leisti man prisijungti el. paštu"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Ne</strong>, Aš nesu, leisti man prisijungti el. paštu:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Ne</strong>, leisti man patvirtinti mano pranešimą el. paštu:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Ne</strong>Ä leisti patvirtinti mano atnaujinimÄ… el. paÅ¡tu:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -227,8 +270,8 @@ msgstr "<strong>Taip</strong> Aš turiu slaptažodį"
msgid "About us"
msgstr "Apie Mus"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -253,7 +296,7 @@ msgstr "Pridėkite kontaktą naudodami žemiau pateikta anketa"
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "pridÄ—ti institucijÄ…"
@@ -266,10 +309,15 @@ msgstr "PridÄ—ti naujÄ… kategorijÄ…"
msgid "Add user"
msgstr "PridÄ—ti vartotojÄ…"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "PridÄ—ta %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Laukiama "
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Dar kartÄ…:"
@@ -282,21 +330,25 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Įspėti mane apie atnaujinimus"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Visi Pranešimai"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Visi Pranešimai"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Visi pranešimai"
@@ -321,8 +373,7 @@ msgstr ""
"Visa jūsų suteikta informacija bus išsiųsta į \n"
"<strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Atnaujinimas - Problema sutvarkyta"
@@ -331,16 +382,12 @@ msgstr "Atnaujinimas - Problema sutvarkyta"
msgid "Anonymous"
msgstr "Anoniminis"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anoniminis:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Esi <strong>aplikacijų kūrėjas</strong>? Norėtum prisidėti prie projekto FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Ar esi aplikacijų kūrėjas?"
@@ -355,22 +402,25 @@ msgstr "Vietovė pažymėta"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr "Šiuo metu puslapis ir %s yra neveikiantis, sukurti pranešimai bus išsiųsti problemos siuntėjui, o ne kontaktui pateiktame pranešimo kategorijoje."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Priskirti išoriniai institucijai:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Priskirti kitai kategorijai:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Priskirti išoriniai institucijai:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Priskirti padaliniui:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Priskirta to %s"
@@ -391,12 +441,12 @@ msgstr "Laukiama "
msgid "Back"
msgstr "Atgal"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Drausti el. paštą"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Institucijos"
@@ -416,12 +466,16 @@ msgstr "Institucija:"
msgid "By Date"
msgstr "Pagal DatÄ…"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Nematote žemėlapio? <em>Praleiskite šitą žingsnį</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -432,27 +486,28 @@ msgstr "Nematote žemėlapio? <em>Praleiskite šitą žingsnį</em>"
msgid "Category"
msgstr "Kategorija"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Problemų kategorijoje tvarkymo sparta > 4 savaitės senumo"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategorija:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategorija: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Pakeisti slaptažodį"
@@ -498,54 +553,60 @@ msgstr ""
"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
"to the body too. These will appear in the drop-down menu on the report-a-problem page."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Paspausti Äia arba įvesti dd/mm/yyyy"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Paspaukite ant žemėlapio, kad pranešti problemą"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Uždaryta"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Uždaryta "
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Uždaryti pranešimai"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Uždaryta:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Netoliese esanÄios problemos <small>(within&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "KoordinatÄ—s:"
@@ -553,22 +614,22 @@ msgstr "KoordinatÄ—s:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Cobrand informacija:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Nustatymai"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Nustatyti Pabaigos Tašką"
@@ -576,7 +637,7 @@ msgstr "Nustatyti Pabaigos Tašką"
msgid "Confirm"
msgstr "Patvirtinti"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Patvirtinti paskyrÄ…"
@@ -596,7 +657,7 @@ msgstr "Patvirtinimas"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Patvirtinta"
@@ -607,13 +668,18 @@ msgstr "Patvirtinti pranešimai tarp %s ir %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Patvirtinta:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Susiekti su FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Susiekite su Mumis"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -628,8 +694,14 @@ msgstr "Susiekite su Mumis"
msgid "Contact the team"
msgstr "Susisiekite su komanda"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "KoordinatÄ—s:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Vartotojas nerastas"
@@ -647,7 +719,7 @@ msgstr "SavivaldybÄ—"
msgid "Council contacts for %s"
msgstr "Tarybos kontaktai skirti %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -662,7 +734,7 @@ msgstr "SavivaldybÄ—:"
msgid "Count"
msgstr "SkaiÄiavimas"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Sukurti pranešimą"
@@ -671,17 +743,19 @@ msgstr "Sukurti pranešimą"
msgid "Create category"
msgstr "Sukurti kategorijÄ…"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Sukurti pranešimą"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Sukurta"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Sukurta:"
@@ -691,10 +765,15 @@ msgid "Current state"
msgstr "Esama būsena"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Å iuo metu ne viena institucija nÄ—ra sukurta."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -704,11 +783,16 @@ msgstr "Įrankių juosta"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Padalinys atliko per 5 darbo dienas"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Ištrinta"
@@ -726,9 +810,9 @@ msgstr "Išsamiau"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Išsamiau:"
@@ -736,23 +820,26 @@ msgstr "Išsamiau:"
msgid "Devolved"
msgstr "Perduota"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
+msgstr ""
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Diligency prize league table"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Ar jūs turite FixMyBarangay slaptažodį?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Ar jūs turite FixMyStreet slaptažodį?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Don&rsquo;t nežinau"
@@ -760,8 +847,8 @@ msgstr "Don&rsquo;t nežinau"
msgid "Don't like forms?"
msgstr "Nepatinka anketos?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -783,7 +870,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Redaguoti"
@@ -794,7 +882,7 @@ msgstr "Redaguoti institucijos informacijÄ…"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -809,15 +897,15 @@ msgstr "Atnaujinimo redagavimas %d"
msgid "Editing user %d"
msgstr "Redaguoti vartotojÄ… %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Redaktorius"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -825,7 +913,7 @@ msgstr "Redaktorius"
msgid "Email"
msgstr "El. paštas"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "El. paštas pridėtas prie piktnaudžiavimo sąrašo"
@@ -841,7 +929,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "El. paštas jau yra piktnaudžiavimo sąraše"
@@ -854,38 +942,36 @@ msgid "Email me updates"
msgstr "Atsiųsti man atnaujinimus"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "El. paštas:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "El. paštas: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Apleistas butas"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Apleistas namas"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Apleista įtaiga arba kitas komercinės paskirties objektas"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Apleistas baras"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Apleistas vieÅ¡osios paskirties pastatas - mokyklaÄ ligonine ir t.t"
@@ -921,7 +1007,7 @@ msgstr "Pabaigos Data:"
msgid "Endpoint"
msgstr "Pabaigos taškas"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Įveskite Z&uuml;rich gatvės pavadinimą"
@@ -934,10 +1020,8 @@ msgstr "Įveskite artimiausia pašto kodą arba gatvės pavadinimą ir rajoną"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Įveskite artimiausia pašto kodą arba gatvės pavadinimą ir rajoną"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Įveskite artimiausios gatvės pavadinimą ir rajoną"
@@ -945,13 +1029,12 @@ msgstr "Įveskite artimiausios gatvės pavadinimą ir rajoną"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Įveskite artimiausia pašto kodą arba gatvės pavadinimą ir rajoną"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Įveskite nauja slaptažodį:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -962,7 +1045,6 @@ msgstr "Įveskite slaptažodį"
msgid "Enter details of the problem"
msgstr "įveskite problemos detales"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -972,6 +1054,10 @@ msgstr "įveskite problemos detales"
msgid "Error"
msgstr "Klaida"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -985,12 +1071,19 @@ msgstr "Pavyzdžiai:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "Apibūdinkite kas negerai, tikslią vietą ir kiek ilgai tai tęsiasi..."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Papildoma informacija:"
@@ -1003,8 +1096,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Filtruoti pranešimo sąraša"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Pirmas kartas"
@@ -1012,45 +1104,14 @@ msgstr "Pirmas kartas"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Suvarkyti tai pasirenkant <strong>pažymėta vietovę</strong> <em>Redaguoti informaciją</em>formą."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet admin:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1061,21 +1122,16 @@ msgstr ""
msgid "Fixed"
msgstr "Sutvarkyta"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Sutvarkyta - Savivaldybe"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Sutvarkyta - Vartotojas"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Sutvarkyti pranešimai"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Sutvarkyta:"
@@ -1085,11 +1141,11 @@ msgstr "Sutvarkyta:"
msgid "Flag as deleted"
msgstr "Pažymeti kaip ištrinta"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Pažymėti vartotoją"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Pažymėta"
@@ -1106,7 +1162,7 @@ msgstr "Flagged users are listed on the <a href='%s'>flagged</a> page."
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Pažymėta:"
@@ -1125,9 +1181,22 @@ msgstr "Daugiau informacijos rasite <a href='http://fixmystreet.org/customising/
msgid "Forgotten your password?"
msgstr "Pamiršote slaptažodį?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Priskirti išoriniai institucijai:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Priskirti išoriniai institucijai:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Dažniausiai Užduodami Klausimai"
@@ -1150,8 +1219,7 @@ msgstr "Gauti šių problemų %s atnaujinimus"
msgid "Get updates of problems in this %s"
msgstr "Gauti problemų atnaujinimus iš %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Suteikti man RSS srautÄ…"
@@ -1160,17 +1228,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Pirmyn"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Ar ruošiates išsiųsti klausimyną?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Problemų sukurimo grafikas pagal statusą per laiką"
@@ -1178,41 +1246,37 @@ msgstr "Problemų sukurimo grafikas pagal statusą per laiką"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Pilkos eilutÄ—s nurodo nebeegsituojanÄius savivaldybÄ—s narius."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Ar ši problema buvo sutvarkyta?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Ar esate pranešęs apie problema anksÄiau, o gal tai pirmas kartas?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Pagalba"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Čia pateikti vietinių problemų tipų pranešimai skirti &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Labas %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1226,7 +1290,7 @@ msgstr "PaslÄ—pti senus"
msgid "Hide pins"
msgstr "PaslÄ—pti smeigtukus"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Istorija"
@@ -1242,7 +1306,7 @@ msgstr "Kaip pranešti apie problema"
msgid "How to send successful reports"
msgstr "Kaip išsiųsti sėkminga pranešimą"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "ApgailestaujameÄ bet jÅ«s negalite patvirtinti nepatvirtintų praneÅ¡imų."
@@ -1269,8 +1333,8 @@ msgstr "Apgailestaujame, bet žymė nebuvo patvirtinta. Prašome patikrinti ar j
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1292,18 +1356,6 @@ msgstr ""
"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
"the menu. Make sure you use the same category name in the bodies if you want this to happen."
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Priešingu atveju jūsų pranešimas nebus aktyvuotas."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Priešingu atveju jūsų pranešimas nebus patalpintas."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Priešingu atveju jūsų atnaujinimas nebus patalpintas."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1313,16 +1365,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Jeigu jÅ«s patalpinsite problema Äia, tada problemos tema ir informacija taps vieÅ¡ai prieinama, taÄiau <strong>nebus</strong> iÅ¡siųsta į savivaldybÄ™."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Patikrinkite savo el. pašto \"Junk mail\" arba \"Spam\" skyrius, nes kartais musų žinutės būna nusiųstos ten."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Jeigu norite palikti viešą problemos atnaujinimÄ… praÅ¡ome įvesti jį Äia\n"
"(tai nebus nusiųsta į savivaldybę). Pvz, ką manote apie problemos sprendimo eigą?"
@@ -1362,7 +1414,7 @@ msgstr ""
"FixMyStreet <strong>user</strong> will be attributed as the creator of those updates\n"
"when they are shown on the site. Enter the ID (number) of that user."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "NeteisÄ—tas ID"
@@ -1387,14 +1439,13 @@ msgstr "į piknaudžiavimo lentelę?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Apdorojama"
@@ -1402,7 +1453,7 @@ msgstr "Apdorojama"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "PridÄ—ti siuntÄ—jo asmeninÄ™ informacija"
@@ -1414,12 +1465,12 @@ msgstr "Pridėti nepatvirtintus pranešimus"
msgid "Incorrect has_photo value \"%s\""
msgstr "Incorrect has_photo value \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Internal notes"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Internal referral"
@@ -1427,7 +1478,7 @@ msgstr "Internal referral"
msgid "Invalid agency_responsible value %s"
msgstr "Invalid agency_responsible value %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Klaidina pabaigos data"
@@ -1435,12 +1486,12 @@ msgstr "Klaidina pabaigos data"
msgid "Invalid format %s specified."
msgstr "Pasirinktas klaidingas formatas %s."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Klaidinga pradžios data"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1458,10 +1509,19 @@ msgstr "Patikrinkite <a href=\"%s\">mūsų D.U.K</a> gal atsakymas yra ten."
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1473,7 +1533,7 @@ msgstr "Palikti mane prisijungusi su šiuo komputeriu"
msgid "Last editor"
msgstr "Paskutinis redaktorius"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Paskutinis atnaujinimas:"
@@ -1508,7 +1568,7 @@ msgstr "Vietiniai RSS srautai ir el. pašto pranešimai"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Vietiniai RSS srautai ir el. pašto pranešimai skirti ‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Vietiniai pranešimai"
@@ -1521,11 +1581,10 @@ msgid "MAP"
msgstr "MAP"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Žemėlapis"
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1545,6 +1604,16 @@ msgstr ""
msgid "Message"
msgstr "Žinutė"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Priskirti išoriniai institucijai:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Priskirti išoriniai institucijai:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Žinutė:"
@@ -1572,27 +1641,25 @@ msgstr "Daugiau Å¡alia esanÄių problemų"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Vardas"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Vardas:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Vardas: %s"
@@ -1605,12 +1672,12 @@ msgstr "Artimiausia gatvė esanti šalia smeigtuko (automatiškai sugeneruota na
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Artimiausias pašto kodas esantis šalia smeigtuko žemėlapyje (sugeneruota automatiškai): %s (%sm toliau)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Artimiausia gavtė esanti šalia smeigtuko žemėlapyje (sugeneruota automatiškai naudojant Bing Maps): %s "
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1618,10 +1685,15 @@ msgstr ""
"Artimiausia gavtė esanti šalia smeigtuko žemėlapyje (sugeneruota automatiškai naudojant Bing Maps): %s \n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Beveik baigta! Dabar patikrinkite savo el. paštą..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Beveik baigta! Dabar patikrinkite savo el. paštą..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Naujos <br>problemos"
@@ -1630,12 +1702,12 @@ msgstr "Naujos <br>problemos"
msgid "New body added"
msgstr "Nauja dalis pridÄ—ta"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Naujas kategorijos kontaktas pridetas"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "New internal note:"
@@ -1643,9 +1715,10 @@ msgstr "New internal note:"
msgid "New local problems on FixMyStreet"
msgstr "Naujos vietinÄ—s problemos FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "New internal note:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1671,33 +1744,15 @@ msgstr "Naujos problemos {{NAME}} riba FixMyStreet"
msgid "New reports"
msgstr "Nauji pranešimai"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "New reports on reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "New reports on reportemptyhomes.com near {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "New reports to {{COUNCIL}} on reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "New state"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Naujas atnaujinimas:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "New state"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1710,14 +1765,12 @@ msgstr "Kitas"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Ne"
@@ -1745,20 +1798,11 @@ msgstr "Pažymėtos problemos nerastos"
msgid "No flagged users found."
msgstr "Pažymėti vartotojai nerasti."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Jokių kitų atnaujinimai"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Jokių problemų nerasta."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Jokių problemų dar nepranešta."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Jokių rezultatų"
@@ -1778,8 +1822,6 @@ msgid "No supporters"
msgstr "Jokių rėmėjų"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "NÄ— vienas"
@@ -1796,8 +1838,8 @@ msgstr ""
" Depending on the implementation, staff users may have access to the dashboard (summary of\n"
" activity across their body), the ability to hide reports or set special report statuses."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1805,7 +1847,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Neatsakingas"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Neatsakingas"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Ne mano padaliniui"
@@ -1818,7 +1868,7 @@ msgid "Not reported to council"
msgstr "Nepranešta savivaldybei"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Pastaba"
@@ -1828,7 +1878,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Pastaba:"
@@ -1837,22 +1887,20 @@ msgstr "Pastaba:"
msgid "Note: <strong>%s</strong>"
msgstr "Pastaba: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Dabar patvirtinti jūsų report&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Dabar patvirtinti jūsų report&hellip; ar jūs turite FixMyStreet slaptažodį?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Dabar patvirtinti jūsų update&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Dabar patvirtinti jūsų update&hellip; ar jūs turite FixMyStreet slaptažodį?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "Gerai"
@@ -1882,20 +1930,18 @@ msgstr "SenesnÄ—s <br>problemos"
msgid "One-line summary"
msgstr "Vieno eilutÄ—s santrauka"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Atidaryta"
@@ -1903,11 +1949,6 @@ msgstr "Atidaryta"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Atidaryti pranešimai"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1924,32 +1965,26 @@ msgstr "Open311 initiative web page"
msgid "Open311 specification"
msgstr "Open311 specification"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Arba problemos praneštos:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Arba jūs galite prenumeruoti įspėjimą atsižvelgiant į jūsų rajoną arba savivaldybę:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Kita"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Savininkas"
@@ -1964,12 +1999,12 @@ msgstr "Puslapis nerastas"
msgid "Parent"
msgstr "Parent"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Dalinis"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1978,6 +2013,7 @@ msgid "Password (optional)"
msgstr "Slaptažodis (nebūtina)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Slaptažodis:"
@@ -1985,7 +2021,7 @@ msgstr "Slaptažodis:"
msgid "Permalink"
msgstr "Permalink"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Telefono numeris"
@@ -1994,11 +2030,9 @@ msgstr "Telefono numeris"
msgid "Phone number (optional)"
msgstr "Telefono numeris (nebūtina)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefonas:"
@@ -2009,14 +2043,21 @@ msgstr "Telefonas:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Nuotrauka"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Nuotrauka:"
@@ -2028,22 +2069,18 @@ msgstr "Naujausios gretimų pranešimų nuotraukos"
msgid "Place pin on map"
msgstr "Padėkite smeigtuką ant žemėlapio"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Suplanuota"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Prašome <a class=\"tab_link\" href=\"#report\">peržvelgti</a> pateiktus atnaujinimus."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Prašome būti mandagūs, rašyti glaustai ir tiksliai."
@@ -2053,22 +2090,20 @@ msgstr "Prašome būti mandagūs, rašyti glaustai ir tiksliai."
msgid "Please check the passwords and try again"
msgstr "Prašome patikrinti slaptažodžius ir pabandykite dar kartą"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Prašome patikrinti savo el. paštą"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Prašome patikrinti ar jūsų el. pašto adresas teisingas "
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2078,15 +2113,16 @@ msgstr "Prašome pasirinkti kategoriją"
msgid "Please choose a property type"
msgstr "Prašome pasirinkti nuosavybės tipą"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Prašome ištaisyti klaidas "
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"PraÅ¡ome <strong>nepraneÅ¡ti</strong> problemų naudojant Å¡iÄ… anketÄ…; žinutÄ—s iÅ¡siunÄiamos\n"
@@ -2098,7 +2134,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Prašome neįžeidinėti&nbsp;&mdash; įžeidinėjimai nuvertina paslaugą visiems vartotojams."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Prašome įvesti žinutę"
@@ -2109,15 +2145,15 @@ msgstr "Prašome įvesti žinutę"
msgid "Please enter a password"
msgstr "Prašome įvesti slaptažodį"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Prašome įvesti temą"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2125,7 +2161,7 @@ msgid "Please enter a valid email"
msgstr "Prašome įvesti galiojantį el. paštą"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Prašome įvesti galiojantį el. pašto adresą"
@@ -2134,21 +2170,19 @@ msgstr "Prašome įvesti galiojantį el. pašto adresą"
msgid "Please enter some details"
msgstr "Prašome įvesti daugiau informacijos"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Prašome įvesti savo el. paštą"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Prašome įvesti savo el. pašto adresą"
@@ -2161,8 +2195,8 @@ msgstr "Prašome įvesti savo vardą"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "PraÅ¡ome įvesti savo vardÄ… ir pavardÄ™, savivalldybei reikalinga jÅ«sų informacija - jeigu pageidaujate, kad jÅ«sų vardas nebÅ«tu pateiktas puslapyje nužymÄ—kite langelį apaÄioje"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2201,7 +2235,7 @@ msgstr "Prašome užpildyti problemos detales."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "PraÅ¡ome pateikti problemos detales žemiau esanÄioje anketoje ir kuo tiksliau apibÅ«dinkite vietÄ…."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Prašome nurodyti, ar norite gauti kitą klausimyną."
@@ -2224,19 +2258,24 @@ msgstr "Atkreipkite dėmesį, kad jūsų pranešimas dar <strong>nėra išsiųst
msgid "Please note:"
msgstr "Atkreipkite dėmėsį:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Prašome pateikti priežastis, kodėl jūs naujinate šį pranešimą"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Prašome pateikti šiek tiek teksto, taip pat nuotrauką"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "PraÅ¡ome pasakyti ar esate pranešęs apie problemÄ… savo savivaldybei anksÄiau"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Prašome pasirinkti jūsų pageidaujama srautą"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Prašome pasirinkti jūsų pageidaujama srautą"
@@ -2245,21 +2284,17 @@ msgstr "Prašome pasirinkti jūsų pageidaujama srautą"
msgid "Please select the type of alert you want"
msgstr "Prašome pasirinkti pageidaujama įspėjimo tipą"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Prašome nurodyti, ar problema buvo sutvarkyta"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Prašome peržvelgti atnaujinimus, kurie buvo palikti."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Prašome įkelti tik JPEG formato nuotrauką"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Prašome įvesti žinutę"
@@ -2268,8 +2303,8 @@ msgid "Please write your update here"
msgstr "PraÅ¡ome raÅ¡tyti savo naujinimÄ… Äia"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2290,22 +2325,36 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Ankstesnis"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Privatumas"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privatus"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problema"
@@ -2321,12 +2370,12 @@ msgstr ""
msgid "Problem %s sent to council %s"
msgstr "Problema %s išsiųsta savivaldybei %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Problemos pasiskirstymas pagal valstybÄ—s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problema pažymėta kaip atidaryta"
@@ -2342,12 +2391,10 @@ msgstr "Problemos"
msgid "Problems in this area"
msgstr "Problemos šioje srityje"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Å alia esanÄios problemos"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemos žemėlapyje"
@@ -2356,12 +2403,11 @@ msgstr "Problemos žemėlapyje"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Neseniai praneštos problemos FixMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemos %.1fkm atstumu aplink šią vietovę"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2373,20 +2419,17 @@ msgstr "Problemos viduje %s"
msgid "Problems within %s ward"
msgstr "Problemos %s rajone"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemos %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemos viduje %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemos apibrėžtose ribose:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Properties recently reported as put back to use on reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "NuosavybÄ—s adresas:"
@@ -2400,39 +2443,31 @@ msgstr "NuosavybÄ—s tipas:"
msgid "Provide an update"
msgstr "Pateikti naujinimÄ…"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Pateikti vardÄ… ir slaptažodį yra nebÅ«tina, taÄiau pateiktus bus jums papraÅ¡Äiau praneÅ¡ti problemas, pateikti naujinimus ir tvarkyti savo praneÅ¡imus."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Pateikti slaptažodį yra nebÅ«tina, taÄiau pateiktus bus jums papraÅ¡Äiau praneÅ¡ti problemas, pateikti naujinimus ir tvarkyti savo praneÅ¡imus."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Viešas atsakymas:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Paskelbti nuotraukÄ…"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Paskelbti atsakymÄ…"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Anketa/Klausimynas"
@@ -2448,12 +2483,11 @@ msgstr "Anketa %d išsiųsta dėl problemos %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Questionnaire filled in by problem reporter"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2479,8 +2513,7 @@ msgstr "RSS srautas %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS srautas %s, viduje %s rajono"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "Å alia esanÄių problemų RSS srautas"
@@ -2488,7 +2521,7 @@ msgstr "Å alia esanÄių problemų RSS srautas"
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2518,17 +2551,18 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Recent local problems, %s"
+msgstr "Atsiųsti man naujas vietines problemas"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr ""
@@ -2536,23 +2570,27 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
@@ -2561,7 +2599,7 @@ msgstr ""
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2570,63 +2608,58 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2634,18 +2667,22 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Visi Pranešimai"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2658,18 +2695,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2684,26 +2724,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2716,7 +2762,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2748,20 +2794,24 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Atidaryti pranešimai"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2770,8 +2820,8 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2787,34 +2837,23 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr ""
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr ""
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr ""
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2830,8 +2869,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2839,24 +2879,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2872,16 +2919,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2895,7 +2943,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2910,45 +2963,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2959,18 +3009,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2981,7 +3032,7 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2989,9 +3040,18 @@ msgstr ""
msgid "Survey Results"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Gauti atnaujinimus"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -3000,6 +3060,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -3021,7 +3082,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -3029,7 +3090,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -3047,20 +3108,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Problema pažymėta kaip atidaryta"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3102,30 +3162,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -3143,10 +3191,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3167,20 +3211,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3197,8 +3229,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3209,7 +3240,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3220,23 +3251,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3249,7 +3281,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3289,16 +3321,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3312,7 +3344,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3339,55 +3371,67 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3403,8 +3447,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3412,11 +3456,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3433,7 +3477,9 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3456,11 +3502,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3495,24 +3541,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3520,27 +3566,29 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "Gauti šių problemų %s atnaujinimus"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3548,23 +3596,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3588,16 +3636,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3611,7 +3658,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3636,11 +3683,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3649,7 +3700,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3657,16 +3708,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3692,15 +3749,13 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr ""
@@ -3763,11 +3818,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3776,6 +3829,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3796,15 +3853,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3815,18 +3868,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr ""
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr ""
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3835,22 +3886,17 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr ""
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3860,24 +3906,23 @@ msgstr ""
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3890,19 +3935,15 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr ""
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3910,23 +3951,31 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Visi pranešimai"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Uždaryti pranešimai"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr ""
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3935,17 +3984,22 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Sutvarkyti pranešimai"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr ""
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr ""
@@ -3990,14 +4044,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr ""
@@ -4007,16 +4060,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -4029,8 +4082,8 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -4046,17 +4099,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Sutvarkyti pranešimai"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4081,7 +4137,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4097,7 +4153,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4121,7 +4177,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4145,7 +4201,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4161,5 +4217,92 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#~ msgid "For council(s):"
-#~ msgstr "Savivaldybei(-Ä—ms):"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Nesijaudinkite &mdash; jūsų pranešimas nedings, kol tikrinsite savo elektroninį paštą.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Nesijaudinkite &mdash; jūsų problema nedings, kol tikrinsite savo elektroninį paštą.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Nesijaudinkite &mdash; jūsų atnaujinimas nedings, kol tikrinsite savo elektroninį paštą.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Jeigu jūs nematote žemėlapio, <a href='%s' rel='nofollow'>tada praleiskite šitą žingsnį </a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Ne</strong>, Aš nesu, leisti man prisijungti el. paštu:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Esi <strong>aplikacijų kūrėjas</strong>? Norėtum prisidėti prie projekto FixMyStreet?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Netoliese esanÄios problemos <small>(within&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Susiekti su FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Ar jūs turite FixMyBarangay slaptažodį?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet admin:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Priešingu atveju jūsų pranešimas nebus aktyvuotas."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Priešingu atveju jūsų pranešimas nebus patalpintas."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Priešingu atveju jūsų atnaujinimas nebus patalpintas."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "New local reports on reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "New reports on reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "New reports on reportemptyhomes.com near {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "New reports to {{COUNCIL}} on reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Naujas atnaujinimas:"
+
+#~ msgid "No problems found."
+#~ msgstr "Jokių problemų nerasta."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Jokių problemų dar nepranešta."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Dabar patvirtinti jūsų report&hellip; ar jūs turite FixMyStreet slaptažodį?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Dabar patvirtinti jūsų update&hellip; ar jūs turite FixMyStreet slaptažodį?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Prašome <a class=\"tab_link\" href=\"#report\">peržvelgti</a> pateiktus atnaujinimus."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Prašome peržvelgti atnaujinimus, kurie buvo palikti."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemos %s, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Properties recently reported as put back to use on reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Paskelbti atsakymÄ…"
diff --git a/locale/ms.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/ms.UTF-8/LC_MESSAGES/FixMyStreet.po
index 61c8afd54..6bcc52a27 100644
--- a/locale/ms.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/ms.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -9,18 +9,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:32+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Malay (http://www.transifex.com/projects/p/fixmystreet/language/ms/)\n"
+"Language-Team: Malay (http://www.transifex.com/mysociety/fixmystreet/language/ms/)\n"
"Language: ms\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " dan "
@@ -33,11 +33,13 @@ msgstr " dan "
msgid " or "
msgstr " atau "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d alert disahkan, %d belum disah"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d cara hubungan majlis &ndash; %d disahkan, %d belum disah"
@@ -46,11 +48,13 @@ msgstr "%d cara hubungan majlis &ndash; %d disahkan, %d belum disah"
msgid "%d edits by %s"
msgstr "%d suntingan daripada %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d update secara langsung"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d soalan selidik dihantar &ndash; %d dijawabi (%s%%)"
@@ -63,15 +67,47 @@ msgstr "%d kepada %d daripada %d"
msgid "%s - Summary reports"
msgstr "%s - Laporan Ringkasan"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ruj;&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s kawasan pentadbiran, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, dilaporkan pada %s"
@@ -83,59 +119,57 @@ msgstr "%s, dalam kawasan pentadbiran %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Jangan bimbang &mdash; kita akan mengantungkan alert akan sambil anda menyemak emel anda.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Jangan bimbang &mdash; kita akan mengantungkan laporan masalah anda sambil anda menyemak emel anda.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Jangan bimbang &mdash; kita akan mengantungkan update akan sambil anda menyemak emel anda.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Emel dalam jadual penyalahguna)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Nama anda"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Nombor telefon anda"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(jarak lalai mengandunging 200,000 orang secara kasar)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(manakala RSS feed disesuaikan, dalam"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(ditutup)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(tetap)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(seperti graffiti, fly tipping, paving slabs rosak, atau lampu jalan)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(tidak dihantar kepada majlis)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(tidak diwajibkan)"
@@ -143,25 +177,24 @@ msgstr "(tidak diwajibkan)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(hantar kepada kedua-dua)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(kita tidak akan menunjukkan alamat emel atau nombor telefon anda)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(kita tidak akan menunjukkan alamat emel anda)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Pilih kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Pilih jenis harta --"
@@ -177,12 +210,14 @@ msgstr ""
"Mungkin ini kenapa \"kawasan ditutupi\" adalah kosong (bawah).<br>\n"
"Tambahkan <code>MAPIT_TYPES</code> ke dalam fail konfigurasi anda?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> masalah"
@@ -195,28 +230,22 @@ msgstr "<strong>Tidak</strong> Benarkan aku mengesahkan laporanku dengan emel"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Tidak</strong> Benarkan aku mengesahkan kemas kiniku dengan emel"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Tidak</strong> benarkan aku log masuk dengan emel"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Tidak</strong>, Aku tidak, benarkan aku log masuk dengan emel:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Tidak</strong>, benarkan aku mengesahkan laporanku dengan emel:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Tidak</strong> Benarkan aku mengesahkan kemas kiniku dengan emel"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -227,8 +256,8 @@ msgstr "<strong>Ya</strong> Aku ada kata laluan"
msgid "About us"
msgstr "Tentang kita"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -250,7 +279,7 @@ msgstr "Tambahkan cara hubungan dengan borang dibawah"
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Tambah badan"
@@ -263,10 +292,15 @@ msgstr "Tambah kategori baru"
msgid "Add user"
msgstr "Tambah pengguna"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "%s telah ditambahi"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Mengunggu penyederhanaan"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Sekali lagi:"
@@ -279,21 +313,25 @@ msgstr "Alert %d diciptakan untuk %s, jenis %s, parameter %s/%s"
msgid "Alert %d disabled (created %s)"
msgstr "Pemberitahuan %d dihenti (dibuat pada %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Maklumkan aku sebarang kemas kini masa depan"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Semua Laporan"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Semua Laporan"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Semua laporan"
@@ -316,8 +354,7 @@ msgstr "Semua maklumat yang disediakan anda akan dihantar kepada"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Ada kemas kini menanda masalah ini sebagai diselesai."
@@ -326,16 +363,12 @@ msgstr "Ada kemas kini menanda masalah ini sebagai diselesai."
msgid "Anonymous"
msgstr "Tanpa nama"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Tanpa Nama:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Adakan anda developer?"
@@ -350,22 +383,25 @@ msgstr "Kawasan dilintungi"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Ditugaskan kepada badan luaran:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Ditugaskan kepada kategori lain:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Ditugaskan kepada badan luaran:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Ditugaskan kepada bahagian bawah:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Ditugaskan kepada %s"
@@ -386,12 +422,12 @@ msgstr "Mengunggu penyederhanaan"
msgid "Back"
msgstr "Balik"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Melarang alamat emel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Badan"
@@ -411,12 +447,16 @@ msgstr "Badan:"
msgid "By Date"
msgstr "Dengan Tarikh"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -427,27 +467,28 @@ msgstr ""
msgid "Category"
msgstr "Kategori"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Kategori rata masalah diselesai > 4 minggu"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategori: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Menukar Kata Laluan"
@@ -480,54 +521,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Klik sini atau masukkan sebagai dd/mm/yyyy"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klik peta untuk melaporkan masalah"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Ditutup"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Ditutup oleh majlis"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Laporan ditutup"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Ditutup:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Kordinat:"
@@ -535,22 +582,22 @@ msgstr "Kordinat:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Data Cobrand"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Konfigurasi"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Mengkonfigurasi Endpoint"
@@ -558,7 +605,7 @@ msgstr "Mengkonfigurasi Endpoint"
msgid "Confirm"
msgstr "Sah"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Mengesahkan Akaun"
@@ -578,7 +625,7 @@ msgstr "Pengesahan"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Disahkan"
@@ -589,13 +636,18 @@ msgstr "Laporan disahkan antara %s dan %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Disahkan:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Menghubungi FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Menghubungi Kita"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -610,8 +662,14 @@ msgstr "Menghubungi Kita"
msgid "Contact the team"
msgstr "Menghubungi pasukan"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Kordinat:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Tidak dapat mencari pengguna"
@@ -629,7 +687,7 @@ msgstr "Majlis"
msgid "Council contacts for %s"
msgstr "Hubungan Majlis untuk %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "Rujukan majlis:&nbsp;%s"
@@ -644,7 +702,7 @@ msgstr "Majlis:"
msgid "Count"
msgstr "Kiraan"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Laporan baru"
@@ -653,17 +711,19 @@ msgstr "Laporan baru"
msgid "Create category"
msgstr "Kategori baru"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Laporan baru"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Diwujudkan"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Diwujudkan:"
@@ -673,10 +733,15 @@ msgid "Current state"
msgstr "Keadaan semasa"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Belum ada badan wujud pada masa kini."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -686,11 +751,16 @@ msgstr "Papan pemuka"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Diuruskan oleh bahagian bawah dalam 5 hari bekerja"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Dipadam"
@@ -708,9 +778,9 @@ msgstr "Perincian"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Perincian:"
@@ -718,23 +788,27 @@ msgstr "Perincian:"
msgid "Devolved"
msgstr "Didelegasikan"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "tidak mengguna peta"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Jadual liga hadiah ketekunan"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Adakan anda mempunyai kata laluan FixMyBarangay?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Adakan anda mempunyai kata laluan FixMyStreet?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Tidak tahu"
@@ -742,8 +816,8 @@ msgstr "Tidak tahu"
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -762,7 +836,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Menyunting"
@@ -773,7 +848,7 @@ msgstr "Edit perincian badah"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -788,15 +863,15 @@ msgstr "Sedang mengemaskini %d"
msgid "Editing user %d"
msgstr "Sedang edit pengguna %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Editor"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -804,7 +879,7 @@ msgstr "Editor"
msgid "Email"
msgstr "Emel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Emel ditambahkan kepada senarai penyalahguna"
@@ -820,7 +895,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Emel telah dalam senarai penyalahguna"
@@ -833,38 +908,36 @@ msgid "Email me updates"
msgstr "Emel aku kemas kini"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Emel:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Emel: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Flat atau apartmen lama"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Rumah kosong atau banglo"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Pejabat kosing atau komersial lain"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Pub kosong atau bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Bangunan awam kosong - sekolah, hospital, lain-lain"
@@ -893,7 +966,7 @@ msgstr "Tarikh Akhir:"
msgid "Endpoint"
msgstr "Endpoint"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Masukkan nama jalan Z&uuml;rich"
@@ -906,10 +979,8 @@ msgstr "Masukkan poskod UK terdekat, atau nama jalan dan kawasan"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Masukkan poskod terdekat, atau nama jalan dan kawasan"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Masukkan nama jalan dan kawasan terdekat"
@@ -917,13 +988,12 @@ msgstr "Masukkan nama jalan dan kawasan terdekat"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Masukkan kata laluan baru"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -934,7 +1004,6 @@ msgstr "Masukkan kata laluan"
msgid "Enter details of the problem"
msgstr "Masukkan perincian masalah tersebut"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -944,6 +1013,10 @@ msgstr "Masukkan perincian masalah tersebut"
msgid "Error"
msgstr "Ralat"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -957,12 +1030,19 @@ msgstr "Contoh:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Data tambahan:"
@@ -975,8 +1055,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Tapis senarai laporan"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Pertama kali"
@@ -984,36 +1063,14 @@ msgstr "Pertama kali"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "Admin FixMyStreet:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1024,21 +1081,16 @@ msgstr ""
msgid "Fixed"
msgstr "Diselesai"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Diselesai - Majlis"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Diselesai - Pengguna"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Laporan selesai"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Selesai:"
@@ -1048,11 +1100,11 @@ msgstr "Selesai:"
msgid "Flag as deleted"
msgstr "Tanda sebagai dipadam"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Tanda pengguna"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Ditanda"
@@ -1069,7 +1121,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Ditanda:"
@@ -1088,9 +1140,22 @@ msgstr "Untuk maklumat lanjut, lihat <a href='http://fixmystreet.org/customising
msgid "Forgotten your password?"
msgstr "Terlupai kata laluan anda?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Ditugaskan kepada badan luaran:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Ditugaskan kepada badan luaran:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Soalan lazim"
@@ -1113,8 +1178,7 @@ msgstr "Dapatkan kemas kini %s masalah"
msgid "Get updates of problems in this %s"
msgstr "Dapatkan kemas kini masalah di %"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Berikan aku RSS feed"
@@ -1123,17 +1187,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Pergi"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Teruskan dengan menghantar soalan selidik?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Graf masalah dibuat dengan status dari masa ke masa"
@@ -1141,41 +1205,37 @@ msgstr "Graf masalah dibuat dengan status dari masa ke masa"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Garis kelabu adalah majlis yang tidak laji wujud."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Adakan masalah ini telah diselesai?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Adakan anda pernah melaporkan masalah kepada majlis, atau inikah pertama kali anda?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Bantuan"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hi %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1189,7 +1249,7 @@ msgstr "Sembunyikan lama"
msgid "Hide pins"
msgstr "Sembunyikan pin"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Sejarah"
@@ -1205,7 +1265,7 @@ msgstr "Bagaimana melaporkan masalah"
msgid "How to send successful reports"
msgstr "Bagaimana untuk menghantar laporan berjaya"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Anda tidak boleh mengesahkan laporan yang belum disahkan."
@@ -1232,8 +1292,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1251,18 +1311,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Jika anda tidak, pemberitahuan anda tidak akan diaktifkan."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Jika anda tidak, masalah anda tidak akan dipaparkan."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Jika anda tidak, kemas kini anda tidak akan dipaparkan."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1272,16 +1320,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1311,7 +1358,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "ID tak sah"
@@ -1336,14 +1383,13 @@ msgstr "Dalam table penyalahguna?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Dijalani"
@@ -1351,7 +1397,7 @@ msgstr "Dijalani"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Termasuk perincian peribadi pelapor"
@@ -1363,12 +1409,12 @@ msgstr "Termasuk laporan yang belum disahkan"
msgid "Incorrect has_photo value \"%s\""
msgstr "Nilai has_photo \"%s\" salah"
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Nota dalaman"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Rujukan dalaman"
@@ -1376,7 +1422,7 @@ msgstr "Rujukan dalaman"
msgid "Invalid agency_responsible value %s"
msgstr "Nilai agency_responsible %s salah"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Tarikh berakhir yang tak sah"
@@ -1384,12 +1430,12 @@ msgstr "Tarikh berakhir yang tak sah"
msgid "Invalid format %s specified."
msgstr "Format dinyatakan %s salah"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Tarikh mula yang tak sah"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1407,10 +1453,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1422,7 +1477,7 @@ msgstr "Teruskan log masuk aku dalam komputer ini"
msgid "Last editor"
msgstr "Editor terakhir"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Kemas kini terakhir:"
@@ -1457,7 +1512,7 @@ msgstr "RSS feed tempatan dan pemberitahuan emel"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "RSS feed tempatan dan pemberitahuan emel untuk '%s'"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Pemberitahuan tempatan"
@@ -1470,14 +1525,12 @@ msgid "MAP"
msgstr "PETA"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "ditanda sebagai ditutupi"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1495,6 +1548,16 @@ msgstr ""
msgid "Message"
msgstr "Pesanan"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Ditugaskan kepada badan luaran:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Ditugaskan kepada badan luaran:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Pesanan:"
@@ -1522,27 +1585,25 @@ msgstr "Lebih masalah terdekat"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Nama"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Nama:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Nama: %s"
@@ -1555,21 +1616,26 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Hampir Dilakukan! Sila periksa emel anda sekarang..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Hampir Dilakukan! Sila periksa emel anda sekarang..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Masalah<br>baru"
@@ -1578,12 +1644,12 @@ msgstr "Masalah<br>baru"
msgid "New body added"
msgstr "Badan baru ditambahi"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Kategori hubungan baru ditambahi"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Nota dalaman baru:"
@@ -1591,9 +1657,10 @@ msgstr "Nota dalaman baru:"
msgid "New local problems on FixMyStreet"
msgstr "Masalah tempatan baru dalam FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Laporan tempatan baru dalam reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nota dalaman baru:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1619,33 +1686,15 @@ msgstr "Masalah baru dalam sempadan {{NAME}} dalam FixMyStreet"
msgid "New reports"
msgstr "Laporan baru"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Laporan baru untuk {{COUNCIL}} dalam {{WARD}} kawasan pentadbiran dalam reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Laporan baru dalam reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Laporan baru dekat {{POSTCODE}} dalam reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Laporan baru untuk {{COUNCIL}} dalam reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Laporan baru dalam sempadan {{NAME}} dalam reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Negeri baru"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Kemas kini baru:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Negeri baru"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1658,14 +1707,12 @@ msgstr "Seterusnya"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Tidak"
@@ -1693,20 +1740,11 @@ msgstr "Belum ada masalah yang ditanda."
msgid "No flagged users found."
msgstr "Belum ada pengguna yang ditanda."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Tiada kemaskini baru."
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Tiada masalah."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Belum ada masalah yang dilaporkan."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Tiada keputusan."
@@ -1724,8 +1762,6 @@ msgid "No supporters"
msgstr "Tiada penyokong"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Tiada"
@@ -1738,8 +1774,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1747,7 +1783,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Tidak Bertanggungjawab"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Tidak Bertanggungjawab"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Bukan untuk bahagian bawah aku"
@@ -1760,7 +1804,7 @@ msgid "Not reported to council"
msgstr "Tidak dilaporkan kepada majlis"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Nota"
@@ -1770,7 +1814,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "ta:"
@@ -1779,22 +1823,20 @@ msgstr "ta:"
msgid "Note: <strong>%s</strong>"
msgstr "Nota: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Hantarkan kemas kini anda sekarang&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Hantarkan kemas kini anda sekarang&hellip; adakan anda mempunyai kata laluan FixMyStreet?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1826,20 +1868,18 @@ msgstr "Lebih tua <br>masalah"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Terbuka"
@@ -1847,11 +1887,6 @@ msgstr "Terbuka"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Laporan terbuka"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1868,32 +1903,26 @@ msgstr "Laman web inisiatif Open311"
msgid "Open311 specification"
msgstr "Spesifikasi Open311"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Atau masalah dilaporkan kepada:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Lain-lain"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Sumber kode kita adalah terbuka dan <a href=\"http://github.com/mysociety/fixmystreet\">terdapat dalam GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Pemilik"
@@ -1908,12 +1937,12 @@ msgstr "Laman Tidak Dijumpai"
msgid "Parent"
msgstr "Induk"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Separa"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1922,6 +1951,7 @@ msgid "Password (optional)"
msgstr "Kata Laluan (tidah diwajibkan)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Kata Laluan:"
@@ -1929,7 +1959,7 @@ msgstr "Kata Laluan:"
msgid "Permalink"
msgstr "Permalink"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Nombor telefon"
@@ -1938,11 +1968,9 @@ msgstr "Nombor telefon"
msgid "Phone number (optional)"
msgstr "Nombor telefon (tidak diwajibkan)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefon:"
@@ -1953,14 +1981,21 @@ msgstr "Telefon:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto:"
@@ -1972,22 +2007,18 @@ msgstr "Foto laporan terdekat baru-baru ini "
msgid "Place pin on map"
msgstr "Letakkan pin atas peta"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Dirancang"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Sila bersopan, ringkas dan tepat."
@@ -1997,22 +2028,20 @@ msgstr "Sila bersopan, ringkas dan tepat."
msgid "Please check the passwords and try again"
msgstr "Sila periksa kata laluan dan cuba lagi"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Sila periksa emel anda"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Sila periksa sama ada alamat emel anda adalah betul"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2022,7 +2051,7 @@ msgstr "Sila pilihkan kategori"
msgid "Please choose a property type"
msgstr "Sila pilihkan jenis bangunan"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2030,7 +2059,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2039,7 +2068,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Sila masukkan pesanan"
@@ -2050,15 +2079,15 @@ msgstr "Sila masukkan pesanan"
msgid "Please enter a password"
msgstr "Sila masukkan kata laluan"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Sila masukkan tajuk"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2066,7 +2095,7 @@ msgid "Please enter a valid email"
msgstr "Silah masukkan emel yang benar"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Sila masukkan alamat emel yang benah"
@@ -2075,21 +2104,19 @@ msgstr "Sila masukkan alamat emel yang benah"
msgid "Please enter some details"
msgstr "Sila masukkan perincian"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Sila masukkan emel anda"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Sila masukkan alamat emel anda"
@@ -2102,8 +2129,8 @@ msgstr "Sila masukkan nama pertama anda"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Sila masukkan nama penuh anda, majlis memerlukan maklumat ini - Jika anda tidak ingin nama anda dikemukakan dalam laman, untik kota dibawah"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2142,7 +2169,7 @@ msgstr "Sila isikan perincian untuk masalah tersebut"
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2165,19 +2192,24 @@ msgstr ""
msgid "Please note:"
msgstr "Sila nota:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Pilihkan badan"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2186,21 +2218,17 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Sila memuat naik imej JPEG sahaja"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Sila tuliskan pesanan"
@@ -2209,8 +2237,8 @@ msgid "Please write your update here"
msgstr "Sila tuliskan kemas kini anda di sini"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2231,22 +2259,36 @@ msgstr "Dipostkan oleh %s (<strong>%s</strong>) pada %s"
msgid "Posted by %s at %s"
msgstr "Dipostkan oleh %s pada %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Sebelumnya"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Peribadi"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Masalah"
@@ -2262,12 +2304,12 @@ msgstr "Masalah %s dipastikan"
msgid "Problem %s sent to council %s"
msgstr "Masalah %s dihantar kepada majlis %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Pecahan masalah bagi negeri"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Masalah ditanda sebagai terbukan"
@@ -2283,12 +2325,10 @@ msgstr "Masalah-masalah"
msgid "Problems in this area"
msgstr "Masalah dalam kawasan ini"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Masalah terdekat"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Masalah atas peta"
@@ -2297,12 +2337,11 @@ msgstr "Masalah atas peta"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Masalah yang dilaporkan diselesai pada FixMyStreet baru-baru ini"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Masalah dalam %.1fkm dalam lokasi ini"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2314,20 +2353,17 @@ msgstr "Masalah dalam %s"
msgid "Problems within %s ward"
msgstr "Masalah dalam kawasan pentadbiran %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Masalah dalam %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Masalah dalam %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Masalah dalam sempadan"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Bangunan yang dilaporkan diguna semula dalam reportemptyhomes.com baru-baru ini"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Alamat bangunan"
@@ -2341,39 +2377,31 @@ msgstr "Jenis bangunan:"
msgid "Provide an update"
msgstr "Sediakan kemas kini"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Tindak balas awam:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Terbitkan foto"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Terbitkan tindak balas"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Soalan selidik"
@@ -2389,12 +2417,11 @@ msgstr "Soalan selidik %d dihantar untuk masalah %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Soalan selidik diisikan oleh pelapor masalah"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2420,8 +2447,7 @@ msgstr "Feed RSS untuk %s"
msgid "RSS feed of %s, within %s ward"
msgstr "Feed RSS untuk %s, dalam kawasan pentadbiran %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "Feed RSS untuk masalah berdekatan"
@@ -2429,7 +2455,7 @@ msgstr "Feed RSS untuk masalah berdekatan"
msgid "RSS feed of problems in this %s"
msgstr "Feed RSS untuk masalah dalam %s ini"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2459,17 +2485,18 @@ msgstr "Feed RSS untuk kemas kini bagi masalah ini"
msgid "Receive email when updates are left on this problem."
msgstr "Terima emel semasa kemas kini ditinggalkan bagi masalah ini"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Masalah tempatan baru-baru ini, FixMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Diselesai <br>baru-baru ini"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Masalah yang dilaporkan baru-baru ini"
@@ -2477,23 +2504,28 @@ msgstr "Masalah yang dilaporkan baru-baru ini"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "edit pengguna"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
@@ -2502,7 +2534,7 @@ msgstr ""
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2511,63 +2543,58 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2575,18 +2602,22 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Semua Laporan"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2599,18 +2630,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2625,26 +2659,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2657,7 +2697,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2689,20 +2729,24 @@ msgstr ""
msgid "Select an area"
msgstr "Pilihkan kawasan"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Laporan terbuka"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Dihantar kepada %s %s kemudian"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Dihantar:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Servis:"
@@ -2711,8 +2755,8 @@ msgstr "Servis:"
msgid "Share"
msgstr "Kongsi"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2728,34 +2772,23 @@ msgid "Show pins"
msgstr "Tunjukkan pin"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Log masuk"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Log masuk dengan emel"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Log masuk atau daftarkan akaun"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Log keluar"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Log masuk sebagai %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2771,8 +2804,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2780,24 +2814,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Tarikh bermula:"
@@ -2813,16 +2854,17 @@ msgstr "Negeri"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Negeri:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Stats"
@@ -2836,7 +2878,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr "Masuk dibuka, melalui soalan selidik, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Subkategori: %s"
@@ -2851,45 +2898,42 @@ msgstr "Tajuk"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Tajuk:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Hantar"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Hantar perubahan"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Hantar soalan selidik"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Dihantarkan"
@@ -2900,18 +2944,19 @@ msgstr "Dihantarkan"
msgid "Subscribe"
msgstr "Melanggan"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Langgankan pemberitahuan emel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Ringkasan"
@@ -2922,7 +2967,7 @@ msgstr "Ringkasan"
msgid "Summary reports"
msgstr "Laporan ringkasan"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Kajian"
@@ -2930,9 +2975,18 @@ msgstr "Kajian"
msgid "Survey Results"
msgstr "Hasil Kajian"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Kemas kini"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Teks"
@@ -2941,6 +2995,7 @@ msgid "Text only version"
msgstr "Versi teks sahaja"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Teks:"
@@ -2962,7 +3017,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2970,7 +3025,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2988,20 +3043,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Masalah ini telah diselesai"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3043,30 +3097,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -3084,10 +3126,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3108,20 +3146,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3138,8 +3164,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Pemberitahuan yang paling mudah adalah jenis geografi kita:"
@@ -3150,7 +3175,7 @@ msgstr "Pemberitahuan yang paling mudah adalah jenis geografi kita:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3161,23 +3186,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3190,7 +3216,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3230,16 +3256,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3253,7 +3279,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3280,55 +3306,68 @@ msgstr "Masalah ini dalam kemajuan"
msgid "This problem is old and of unknown status."
msgstr "Masalah ini lama dan dalam keadaan tidak diketahui."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Laporan ini menunggui sederhana."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Laporan ini ditanda sebagai ditutupi sekarang."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Laporan ini ditanda sebagai diselesai sekarang."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Laporan ini ditanda sebagai terbuka sekarang."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Laporan ini dikemukakan tanpa nama"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Laman web tersebut juga mengandungi foto masalah, dibekalkan oleh pengguna."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Garis masa"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Tajuk"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Untuk <strong>melaporkan masalah</strong>, klik lokasi yang betul atas peta."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Tajuk"
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Melihat lokasi tepat atas peta bagi isu ini"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3344,8 +3383,8 @@ msgstr "Cuba lagi"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3353,11 +3392,11 @@ msgstr ""
msgid "Unable to fix"
msgstr "Tidak dapat diselesai"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Belum dipastikan"
@@ -3374,7 +3413,9 @@ msgstr "Jenis pemberitahuan tak diketahui"
msgid "Unknown error"
msgstr "Ralat tidak diketahui"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "ID masalah tidak diketahui"
@@ -3397,11 +3438,11 @@ msgid "Update below added by %s at %s"
msgstr "Kemaskini di bawah ditambah oleh %s pada %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Kemas kini badan"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Pecahan kemaskini mengikuti negeri"
@@ -3436,24 +3477,24 @@ msgstr "Kemas kini:"
msgid "Updated"
msgstr "Dikemas kinikan"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Dikemas kinikan!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Kemas kini"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3461,27 +3502,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr "Kemas kini atas {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Kemas kini masalah ini, FixMyStreet"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "Gunakan <strong>nota</strong> untuk melaporkan maklumat yang hanya dipaparkan kepada admin. Nota tidak akan dipapar secara awam dan tidak akan dihantar kepada badan."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Pengguna"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "peta diguna"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Tanda pengguna dipadam"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Pengguna ditanda"
@@ -3489,23 +3533,23 @@ msgstr "Pengguna ditanda"
msgid "User search finds matches in users' names and email addresses."
msgstr "Carian pengguna mencari padanan dalam nama dan alamat emel pengguna."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Pengguna"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Nilai dikemaskinikan"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Melihat laporan di laman"
@@ -3529,16 +3573,15 @@ msgid "Wards of this council"
msgstr "Kawasan pentadbiran majlis ini"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Kita mendapati lebih daripada satu bersesuaian bagi lokasi tersebut. Kita menunjukkan sehingga sepuluh bersesuaian, sila cuba dengan carian lain jika carian anda tidak didapati di sini. "
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Kita belum dapat mengesahkan akaun anda - maaf."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Kita telah menghantarkan anda emel yang mengandungi link untuk mengesahkan akaun anda."
@@ -3552,7 +3595,7 @@ msgstr "Kita tidak akan mempaprkan emel anda"
msgid "We never show your email address or phone number."
msgstr "Kita tidak akan mempaparkan alamat emel atau nombor telefon anda."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Kita sedar bahawa masalah ini mungkin tanggungjawab %s; tetapi, pada masa kini kita tiada maklumat hubungan mereka. Jika anda tahu hubungan sewajanya, sila menghubungi mereka"
@@ -3577,11 +3620,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Bila diedit"
@@ -3590,7 +3637,7 @@ msgstr "Bila diedit"
msgid "When sent"
msgstr "Bila dihantar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Seluruh blok flat kosong"
@@ -3598,16 +3645,22 @@ msgstr "Seluruh blok flat kosong"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3633,15 +3686,13 @@ msgstr "Tahun"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ya"
@@ -3704,11 +3755,9 @@ msgstr "Anda menolak; sila isikan kotak di atas"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Anda telah melampirkan foto untuk laporan ini, lampiran yang lain akan menggantikannya."
@@ -3717,6 +3766,10 @@ msgstr "Anda telah melampirkan foto untuk laporan ini, lampiran yang lain akan m
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Anda telah melampirkan foto untuk kemas kini ini, lampiran yang lain akan menggantikannya."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3737,15 +3790,11 @@ msgstr "Anda telah berjaya memastikan alamat emel anda."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Anda telah berjaya log masuk; sila semak dan pastikan maklumat anda adalah tepat: "
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Anda mesti mengklikkan link dalam emel yang dihantar kepada anda."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Anda perlu <a href=\"%s\">tambah badan</a>(seperti majlis atau jabatan) sebelum laporan mana-mana boleh dihantar."
@@ -3759,18 +3808,16 @@ msgstr ""
"kategori masalah yang mereka boleh mengendalikan (sepertinya jalan berlubang atau jampu jalan) dan\n"
"maklumat hubungan (seperti alamat emel) yang laporan akan dihantarkan."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Pastikan anda menghantar lagi?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Laporan Anda"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3779,22 +3826,17 @@ msgstr "Laporan Anda"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Emel Anda"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Alamat emel anda"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Alamat emel anda:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3804,24 +3846,23 @@ msgstr "Emel anda:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Maklumat anda akan digunakan mengikuti <a href=\"/privacy\">dasar privasi</a> kita"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Nama anda"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Nama anda:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3834,19 +3875,15 @@ msgstr "Kata laluan anda telah diubahi"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Nombor telefon anda"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Laporan anda"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Laporan anda"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Kemas kini anda"
@@ -3854,23 +3891,31 @@ msgstr "Kemas kini anda"
msgid "Your&nbsp;email:"
msgstr "Emel anda:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Semua laporan"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "dari %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Laporan ditutup"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "majlis"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "tidak mengguna peta"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "seperti ‘%s’ atau ‘%s’"
@@ -3879,17 +3924,22 @@ msgstr "seperti ‘%s’ atau ‘%s’"
msgid "edit user"
msgstr "edit pengguna"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Laporan selesai"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "dari %d pengguna lain"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "kemaskini yang lepas %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "kurang dari seminit"
@@ -3934,14 +3984,13 @@ msgstr "ditanda sebagai dijadual"
msgid "marked as unable to fix"
msgstr "ditanda sebagai tak boleh dibaiki"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "tiada"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "atau"
@@ -3951,16 +4000,16 @@ msgstr "atau mengesan aku secara automatik"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "pemasukan asal: &ldquo;%s&rdquo;"
@@ -3973,8 +4022,8 @@ msgstr "kawasan lain:"
msgid "reopened"
msgstr "dibuka semula"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "log keluar"
@@ -3990,17 +4039,20 @@ msgstr "majlis tempatan"
msgid "there is no pin shown as the user did not use the map"
msgstr "pin tidak ditunjukkan sebab pengguna tidak menggunakan peta"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "jenis masalah tempatan ini"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "hari ini"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Laporan selesai"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "peta diguna"
@@ -4023,7 +4075,7 @@ msgid "<big>%s</big> report recently"
msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> laporan baru-baru ini"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4035,7 +4087,7 @@ msgid "%d supporter"
msgid_plural "%d supporters"
msgstr[0] "%d penyokong"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4053,7 +4105,7 @@ msgid "We do not yet have details for the council that covers this location."
msgid_plural "We do not yet have details for the councils that cover this location."
msgstr[0] "Kita belum ada maklumat tentang majlis yang menutupi lokasi ini"
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4071,7 +4123,7 @@ msgid "<big>%s</big> fixed in past month"
msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> diselesai di bulan lepas"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4083,5 +4135,95 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] "Kita <strong>belum</strong> ada maklumat tentang majlis lain yang menutupi lokasi ini."
-#~ msgid "For council(s):"
-#~ msgstr "Untuk majlis:"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Jangan bimbang &mdash; kita akan mengantungkan alert akan sambil anda menyemak emel anda.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Jangan bimbang &mdash; kita akan mengantungkan laporan masalah anda sambil anda menyemak emel anda.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Jangan bimbang &mdash; kita akan mengantungkan update akan sambil anda menyemak emel anda.)"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Tidak</strong>, Aku tidak, benarkan aku log masuk dengan emel:"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Menghubungi FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Adakan anda mempunyai kata laluan FixMyBarangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "Admin FixMyStreet:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Jika anda tidak, pemberitahuan anda tidak akan diaktifkan."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Jika anda tidak, masalah anda tidak akan dipaparkan."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Jika anda tidak, kemas kini anda tidak akan dipaparkan."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Laporan tempatan baru dalam reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Laporan baru untuk {{COUNCIL}} dalam {{WARD}} kawasan pentadbiran dalam reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Laporan baru dalam reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Laporan baru dekat {{POSTCODE}} dalam reportemptyhomes.com"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Laporan baru untuk {{COUNCIL}} dalam reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Laporan baru dalam sempadan {{NAME}} dalam reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Kemas kini baru:"
+
+#~ msgid "No problems found."
+#~ msgstr "Tiada masalah."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Belum ada masalah yang dilaporkan."
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Hantarkan kemas kini anda sekarang&hellip; adakan anda mempunyai kata laluan FixMyStreet?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Sumber kode kita adalah terbuka dan <a href=\"http://github.com/mysociety/fixmystreet\">terdapat dalam GitHub</a>."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Masalah dalam %s, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Bangunan yang dilaporkan diguna semula dalam reportemptyhomes.com baru-baru ini"
+
+#~ msgid "Publish the response"
+#~ msgstr "Terbitkan tindak balas"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Log masuk dengan emel"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Log masuk sebagai %s"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Untuk <strong>melaporkan masalah</strong>, klik lokasi yang betul atas peta."
+
+#~ msgid "User"
+#~ msgstr "Pengguna"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Anda mesti mengklikkan link dalam emel yang dihantar kepada anda."
+
+#~ msgid "Your email address:"
+#~ msgstr "Alamat emel anda:"
+
+#~ msgid "Your report"
+#~ msgstr "Laporan anda"
diff --git a/locale/my_MM.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/my_MM.UTF-8/LC_MESSAGES/FixMyStreet.po
index f2ce5ce05..3b1f42db6 100644
--- a/locale/my_MM.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/my_MM.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -14,18 +14,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:32+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/fixmystreet/language/my_MM/)\n"
+"Language-Team: Burmese (Myanmar) (http://www.transifex.com/mysociety/fixmystreet/language/my_MM/)\n"
"Language: my_MM\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "á‚ွင့္"
@@ -38,11 +38,13 @@ msgstr "á‚ွင့္"
msgid " or "
msgstr "သို႔မဟုá€á€¹"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d အá€á€Šá€¹á€»á€•ဳျá€á€„္းသá€á€­á€±á€•းá€á€ºá€€á€¹ %dအá€á€Šá€¹á€™á€»á€•ဳရေသး"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%ေကာင္စီအဆက္အသြယ္ &ndash; %d အá€á€Šá€¹á€»á€•ဳျပီးျပီ %dအá€á€Šá€¹á€™á€»á€•ဳရေသး"
@@ -51,11 +53,13 @@ msgstr "%ေကာင္စီအဆက္အသြယ္ &ndash; %d အá€á€Šá€
msgid "%d edits by %s"
msgstr "%s မွ %d ကိုျပင္ဆင္á€á€²á€·á€žá€Šá€¹"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d á€á€­á€¯á€€á€¹á€›á€­á€¯á€€á€¹á€¡á€žá€…္ရယူျá€á€„္:"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d စစ်á€á€™á€ºá€¸á€™á€±á€¸á€á€½á€”်းလွှာပို့ပြီး &ndash; %d အဖြေ (%s%%)"
@@ -68,15 +72,49 @@ msgstr "%d မွ %d á %d သို႔"
msgid "%s - Summary reports"
msgstr "အက်ဥ္းá€á€ºá€³á€•္ အစီရင္á€á€¶á€…ာမ်ား"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr "FixMyStreet á€á€¼á€„္ သီးျá€á€¬á€¸ အုပ္á€á€ºá€³á€•္ေရးဌာန သို႔မဟုá€á€¹ ေကာင္စီá€á€…္á€á€¯á€¡á€á€¼á€„္းရိွ ျပႆနာမ်ားအá€á€¼á€€á€¹ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸á‚ွင့္ á€á€…္ဦးá€á€ºá€„္းစီá á€á€­á€€á€ºá€±á€žá€á€ºá€¬á€žá€Šá€¹á€· á€á€Šá€¹á€±á€”ရာ အကြာအေá€á€¸ အá€á€¼á€„္းရိွ ျပႆနာအားလံုးá€á€­á€¯á‚” အပါအá€á€„္ ျပည္á€á€¼á€„္း ျပႆနာမ်ား အá€á€¼á€€á€¹ ကြဲျပားျá€á€¬á€¸á€”ားေသာ RSS feed မ်ားá‚ွင့္ အီးေမးလ္ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸ ရိွသည္á‹"
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr "FixMyStreet á€á€¼á€„္ သီးျá€á€¬á€¸ အုပ္á€á€ºá€³á€•္ေရးဌာန သို႔မဟုá€á€¹ ေကာင္စီá€á€…္á€á€¯á€¡á€á€¼á€„္းရိွ ျပႆနာမ်ားအá€á€¼á€€á€¹ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸á‚ွင့္ á€á€…္ဦးá€á€ºá€„္းစီá á€á€­á€€á€ºá€±á€žá€á€ºá€¬á€žá€Šá€¹á€· á€á€Šá€¹á€±á€”ရာ အကြာအေá€á€¸ အá€á€¼á€„္းရိွ ျပႆနာအားလံုးá€á€­á€¯á‚” အပါအá€á€„္ ျပည္á€á€¼á€„္း ျပႆနာမ်ား အá€á€¼á€€á€¹ ကြဲျပားျá€á€¬á€¸á€”ားေသာ RSS feed မ်ားá‚ွင့္ အီးေမးလ္ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸ ရိွသည္á‹"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr ""
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%sရပ္ကြက္አ%s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s သá€á€„္းပို႔သည္မွာ %s"
@@ -88,59 +126,57 @@ msgstr "%sአ%s ရပ္ကြက္အá€á€¼á€„္း"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(စိá€á€¹á€™á€•ူပါá‚ွင့္ዠသင္ အီးေမးလ္ စစ္ေဆးေနá€á€ºá€­á€”္á€á€¼á€„္ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”က သင္á သá€á€­á€±á€•းá€á€ºá€€á€¹á€€á€­á€¯ ထိန္းသိမ္းထားပါမည္á‹)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(စိá€á€¹á€™á€•ူပါá‚ွင့္ዠသင္ အီးေမးလ္ စစ္ေဆးေနá€á€ºá€­á€”္á€á€¼á€„္ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”က သင္á ျပႆနာ အစီရင္á€á€¶á€…ာကို ထိန္းသိမ္းထားပါမည္á‹)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(စိá€á€¹á€™á€•ူပါá‚ွင့္ዠသင္ အီးေမးလ္ စစ္ေဆးေနá€á€ºá€­á€”္á€á€¼á€„္ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”က သင္á ေနာက္ဆံုး ျပဳျပင္ထားသည့္ အá€á€ºá€€á€¹á€¡á€œá€€á€¹á€€á€­á€¯ ထိန္းသိမ္းထားပါမည္á‹)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(ရိုင္းစိုင္းစြာေျပာသည့္ဇယားá€á€¼á€„္ရွိအီးေမးလ္)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "သင့္အမည္"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "သင္á ဖုန္းနံပါá€á€¹"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(လူအေယာက္ á‚á€á€ á€á€á€ ကိုအá¾á€€á€™á€¹á€¸á€¡á€¬á€¸á€»á€–င့္လႊမ္းမိုးá‚ိုင္ေသာပံုမွန္အကြာအေá€á€¸)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(ေျပာင္းျပန္အားျဖင့္ RSS Feed ကိုျပဳျပင္á‚ိုင္ျပီးአအေá€á€¬á€¡á€á€¼á€„္း"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(ပိá€á€¹á€‘ားသည္)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(ျပင္ျပီးျပီ)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(ဂရပ္ဖီá€á€®áŠ á€…á€Šá€¹á€¸á€€á€™á€¹á€¸á€™á€²á€· အမိႈ္က္စြန္႔ပစ္ျá€á€„္းአလမ္းေဘးပလက္ေဖာင္းအုá€á€¹á€á€²á€™á€ºá€¬á€¸á€€á€ºá€­á€³á€¸á€•ဲ့မႈ သို႔မဟုá€á€¹ လမ္းမီးမလာျá€á€„္းကဲ့သို႔)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(ေကာင္စီသို႔မပို႔ပါ)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(ေရြးá€á€ºá€šá€¹á‚ိုင္á€á€¼á€„့္)"
@@ -148,25 +184,24 @@ msgstr "(ေရြးá€á€ºá€šá€¹á‚ိုင္á€á€¼á€„့္)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(á‚ွစ္á€á€¯á€œá€¶á€¯á€¸á€žá€­á€¯á‚”ပို႔မည္)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(သင္áအီးေမလ္လိပ္စာ သို႔မဟုá€á€¹ ဖုန္းနံပါá€á€¹á€€á€­á€¯á€€á½á€¼á‚္ုပ္á€á€­á€¯á‚”မွ ဘယ္ေá€á€¬á€·á€™á€½á€™á€±á€–ာ္ျပပါ)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(သင္áအီးေမးလ္ကိုကá½á€¼á‚္ုပ္á€á€­á€¯á‚”မွဘယ္ေá€á€¬á€·á€™á€½á€™á€±á€–ာ္ျပပါ)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- ေá€á€«á€„္းစဥ္á€á€…္á€á€¯á€±á€›á€¼á€¸á€•ါ --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- ပစá¥á€Šá€¹á€¸á€¡á€™á€ºá€­á€³á€¸á€¡á€…ားကိုေရြးပါ --"
@@ -179,12 +214,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>သင္ေျမပံုကိုမျမင္ရပါက <a href = '%s'rel = 'nofollow'> ဒီအဆင့္ကိုေက်ာ္လိုက္ပါ</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong> %d </strong>ဘá€á€»á€•ႆနာမ်ား"
@@ -197,28 +234,22 @@ msgstr "<strong>မဟုá€á€¹á€•ါ</strong> ကá½á€¼á‚္ုပ္áအစ
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>မဟုá€á€¹á€•ါ</strong> ကá½á€¼á‚္ုပ္áအသစ္မြမ္းမံျá€á€„္းကိုအီးေမးလ္ျဖင့္အá€á€Šá€¹á€»á€•ဳမည္"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>မဟုá€á€¹á€•ါ</strong> အီးေမးလ္ျဖင့္á€á€„္မည္"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>မဟုá€á€¹á€•ါ</strong>မလုပ္ပါáŠá€¡á€®á€¸á€±á€™á€¸á€œá€¹á€»á€–င့္á€á€„္မည္-"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>မဟုá€á€¹á€•ါ</strong>ကá½á€¼á‚္ုပ္áအစီရင္á€á€¶á€…ာကိုအီးေမးလ္ျဖင့္အá€á€Šá€¹á€»á€•ဳမည္ -"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>မဟုá€á€¹á€•ါ</strong>ကá½á€¼á‚္ုပ္áအသစ္မြမ္းမံျá€á€„္းကိုအီးေမလ္ျဖင့္အá€á€Šá€¹á€»á€•ဳမည္ -"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -229,8 +260,8 @@ msgstr "<strong>ဟုá€á€¹á€€á€²á€·</strong> ကá½á€¼á‚္ုပ္á€á€¼á€„
msgid "About us"
msgstr "ကá½á€¼á‚္ုပ္á€á€­á€¯á‚”အေá¾á€€á€¬á€„္း"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -252,7 +283,7 @@ msgstr "ေအာက္ပါပံုစံကိုသံုးျပီးအ
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "စာကိုယ္ထည့္မည္"
@@ -265,10 +296,15 @@ msgstr "ေá€á€«á€„္းစဥ္အသစ္ထည့္မည္"
msgid "Add user"
msgstr "အသံုးျပဳသူထည့္မည္"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "%sကိုထည့္ျပီးျပီ"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "စိစစ္ျá€á€„္းကိုေစာင့္ဆိုင္းေနá€á€¯á€”္း"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "ထပ္မံá-"
@@ -281,21 +317,25 @@ msgstr "Parameters %s/%s አအမ်ိဳးအစား %s አ%s အá€á€¼á
msgid "Alert %d disabled (created %s)"
msgstr "အသိေပးá€á€ºá€€á€¹%dကိုပိá€á€¹á€‘ားသည္(%sကိုဖန္á€á€®á€¸á€»á€•ီး)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "ေနာက္ထပ္အသစ္မ်ားအá€á€¼á€€á€¹á€œá€Šá€¹á€¸á€€á½á€¼á‚္ုပ္ကိုအသိေပးမည္"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "အစီရင္á€á€¶á€…ာအားလံုး"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "အစီရင္á€á€¶á€…ာအားလံုး"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "အစီရင္á€á€¶á€…ာအားလံုး"
@@ -318,8 +358,7 @@ msgstr "သင္ေထာက္ပံ့ေသာအá€á€ºá€€á€¹á€¡á€œá€€á€¹á€™
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "သင္ေထာက္ပံ့ေသာအá€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸á€¡á€¬á€¸á€œá€¶á€¯á€¸á€€á€­á€¯á€•ို႔မည့္ေနရာမွာ <strong>%s</strong>သို႔ပို႔မည္"
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "ေျဖရွင္းထားသည့္ ျပႆနာကို အမွá€á€¹á€¡á€žá€¬á€¸á€»á€•ဳလုပ္ထားသည္á‹"
@@ -328,16 +367,12 @@ msgstr "ေျဖရွင္းထားသည့္ ျပႆနာကို á
msgid "Anonymous"
msgstr "အမည္မသိ"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "အမည္မသိ-"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "သင္သည္ <strong>developer</strong> á€á€…္ေယာက္လားዠFixMyStreet ကို ကူညီလိုပါသလားá‹"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Developer လား"
@@ -352,22 +387,25 @@ msgstr "ဧရိယာလႊမ္းျá€á€¶á€³ ျá€á€„္း"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "အပိုစာကိုယ္ကိုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "á€á€»á€á€¬á€¸á€±á€á€«á€„္းစဥ္á€á€…္á€á€¯á€žá€­á€¯á‚”ေျပာင္းလဲသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "အပိုစာကိုယ္ကိုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "အေသးစိá€á€¹á€”ယ္နမိá€á€¹á€žá€­á€¯á‚”သá€á€¹á€™á€½á€á€¹á€™á€Šá€¹-"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "%s သို႔ လြဲအပ္မည္"
@@ -388,12 +426,12 @@ msgstr "စိစစ္ျá€á€„္းကိုေစာင့္ဆိုင္
msgid "Back"
msgstr "ေနာက္သို႔"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "အီးေမးလ္လိပ္စာကိုပိ္á€á€¹á€•င္မည္"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "စာကိုယ္မ်ား"
@@ -413,12 +451,16 @@ msgstr "စာကိုယ္ -"
msgid "By Date"
msgstr "ေန႔စြဲအားျဖင့္"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "ေျမပံုကိုမျမင္ဘူးလားዠ<em>ဒီအဆင့္ကိုေက်ာ္မည္</em> "
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -429,27 +471,28 @@ msgstr "ေျမပံုကိုမျမင္ဘူးလားዠ<em>ဒá
msgid "Category"
msgstr "အမ်ိဳးအစား"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "အမ်ိဳးအစား -"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "အမ်ိဳးအစား - %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "စကားá€á€½á€€á€¹á€±á€»á€•ာင္းမည္"
@@ -482,54 +525,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "ဒီေနရာကိုá‚ွိပ္ပါ သို႔ dd/mm/yyyy ကဲ့သို႔ရိုက္ထည့္ပါ"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "ျပႆနာá€á€…္á€á€¯á€€á€­á€¯á€¡á€…ီရင္á€á€¶á€…ာá€á€„္ရင္ေျမပံုကိုá‚ွိပ္ပါ"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "ပိá€á€¹á€™á€Šá€¹"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "ေကာင္စီမွပိá€á€¹á€‘ားသည္"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "အစီရင္á€á€¶á€…ာကိုပိá€á€¹á€™á€Šá€¹"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "ပိá€á€¹á€™á€Šá€¹-"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr ""
@@ -537,22 +586,22 @@ msgstr ""
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "အစီအစဥ္သá€á€¹á€™á€½á€á€¹á€»á€á€„္း"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -560,7 +609,7 @@ msgstr ""
msgid "Confirm"
msgstr "အá€á€Šá€¹á€»á€•ဳမည္"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "အေကာင့္ကိုအá€á€Šá€¹á€»á€•ဳမည္"
@@ -580,7 +629,7 @@ msgstr "အá€á€Šá€¹á€»á€•ဳျá€á€„္း"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "အá€á€Šá€¹á€»á€•ဳá€á€²á€·á€žá€Šá€¹"
@@ -591,13 +640,18 @@ msgstr "%s á‚ွင့္ %s á¾á€€á€¬á€¸á€¡á€…ီရင္á€á€¶á€…ာကိá€
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "အá€á€Šá€¹á€»á€•ဳá€á€²á€·á€á€ºá€­á€”္-"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "FixMyStreet ကိုဆက္သြယ္မည္"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "ကá½á€¼á‚္ုပ္á€á€­á€¯á‚”á‚ွင့္ဆက္သြယ္ပါ"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -612,8 +666,13 @@ msgstr "ကá½á€¼á‚္ုပ္á€á€­á€¯á‚”á‚ွင့္ဆက္သြယ္
msgid "Contact the team"
msgstr "အဖြဲ႕á‚ွင့္ဆက္သြယ္ပါ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "အသံုးျပဳသူရွာမေá€á€¼á‚•ပါ"
@@ -631,7 +690,7 @@ msgstr "ေကာင္စီ"
msgid "Council contacts for %s"
msgstr "%sအá€á€¼á€€á€¹á€±á€€á€¬á€„္စီအဆက္အသြယ္"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "ေကာင္စီ ရည္ညႊန္းá€á€ºá€€á€¹"
@@ -646,7 +705,7 @@ msgstr "ေကာင္စီ-"
msgid "Count"
msgstr "အေရအá€á€¼á€€á€¹"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "အစီရင္á€á€¶á€…ာá€á€…္á€á€¯á€€á€­á€¯á€–န္á€á€®á€¸á€™á€Šá€¹"
@@ -655,17 +714,19 @@ msgstr "အစီရင္á€á€¶á€…ာá€á€…္á€á€¯á€€á€­á€¯á€–န္á€á€®á€¸
msgid "Create category"
msgstr "အမ်ိဳးအစားဖန္á€á€®á€¸á€™á€Šá€¹"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "အစီရင္á€á€¶á€…ာá€á€…္á€á€¯á€€á€­á€¯á€–န္á€á€®á€¸á€™á€Šá€¹"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "ဖန္á€á€®á€¸á€™á€Šá€¹"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "ဖန္á€á€®á€¸á€á€²á€·á€á€ºá€­á€”္-"
@@ -675,10 +736,15 @@ msgid "Current state"
msgstr "ယá€á€¯á€¡á€±á€»á€á€¡á€±á€”"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "ယá€á€¯á€±á€œá€¬á€±á€œá€¬á€†á€šá€¹ စာကိုယ္ ကိုမဖန္á€á€®á€¸á€›á€±á€žá€¸á€•ါ"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -688,11 +754,16 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "ဖ်က္ျပီးျပီ"
@@ -710,9 +781,9 @@ msgstr "အေသးစိá€á€¹á€¡á€á€ºá€€á€¹á€¡á€œá€€á€¹"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "အေသးစိá€á€¹á€¡á€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸-"
@@ -720,23 +791,27 @@ msgstr "အေသးစိá€á€¹á€¡á€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸-"
msgid "Devolved"
msgstr "á€á€…္ေယာက္မွá€á€…္ေယာက္လက္လြဲျá€á€„္း"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "ေျမပံု မသံုးá€á€²á€·á€•ါ"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "FixMyBarangay áစကားá€á€½á€€á€¹á€›á€½á€­á€•ါသလားá‹"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "FixMyStreet áစကားá€á€½á€€á€¹á€›á€½á€­á€•ါသလားá‹"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr ""
@@ -744,8 +819,8 @@ msgstr ""
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -764,7 +839,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "ျပင္ဆင္မည္"
@@ -775,7 +851,7 @@ msgstr "စာကိုယ္ကိုအေသးစိá€á€¹á€»á€•င္မည
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -790,15 +866,15 @@ msgstr "အသစ္မြမ္းမံျá€á€„္း %dကိုျပင္
msgid "Editing user %d"
msgstr "%dအသံုးျပဳသူကိုျပင္ဆင္ေနသည္"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "အယ္ဒီá€á€¬"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -806,7 +882,7 @@ msgstr "အယ္ဒီá€á€¬"
msgid "Email"
msgstr "အီးေမးလ္"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "အလြဲသံုးသည့္စာရင္းထဲá€á€¼á€„္အီးေမးလ္ထည့္ျပီး"
@@ -822,7 +898,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "အလြဲသံုးသည့္စာရင္းထဲá€á€¼á€„္အီးေမးလ္ရွိျပီး"
@@ -835,38 +911,36 @@ msgid "Email me updates"
msgstr "အသစ္မြမ္းမံမႈမ်ားကိုကá½á€¼á‚္ုပ္ထံသို႕အီးေမးလ္ပို႔မည္"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "အီးေမးလ္-"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "အီးေမးလ္ -%s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "á€á€­á€¯á€€á€¹á€á€”္းအလြá€á€¹á€žá€­á€¯á‚”မဟုá€á€¹ maisonette"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "အိမ္အလြá€á€¹á€žá€­á€¯á‚”မဟုá€á€¹á€˜á€”္ဂလိုအလြá€á€¹"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "ရံုးအလြá€á€¹á€žá€­á€¯á‚”မဟုá€á€¹á€á€»á€á€¬á€¸á€…ီးပြားေရးအလြá€á€¹"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "အလြá€á€¹á€¡á€›á€€á€¹á€†á€­á€¯á€„္သို႔မဟုá€á€¹á€˜á€¬á€¸"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "အမ်ားျပည္သူá‚ွင့္ဆိုင္ေသာá€á€­á€¯á€€á€¹á€¡á€œá€¼á€á€¹-ေက်ာင္းáŠá€±á€†á€¸á€›á€¶á€¯á€…သည္ျဖင့္.."
@@ -895,7 +969,7 @@ msgstr "ျပီးသည့္ရက္-"
msgid "Endpoint"
msgstr "ျပီးဆံုးမွá€á€¹-"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "လမ္းနာမည္ ျဖည့္စြက္ပါ"
@@ -908,10 +982,8 @@ msgstr "ယူေကအနီးနားရွိ စာá€á€­á€¯á€€á€¹á€”ံá€
msgid "Enter a nearby postcode, or street name and area"
msgstr "အနီးနားရွိ စာá€á€­á€¯á€€á€¹á€”ံပါá€á€¹áŠá€žá€­á€¯á‚”မဟုá€á€¹á€œá€™á€¹á€¸á€¡á€™á€Šá€¹á‚ွင့္ဧရိယာရိုက္ထည့္ပါ"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "အနီးနားရွိလမ္းအမည္á‚ွင့္ဧရိယာကိုရိုက္ထည့္ပါ"
@@ -919,13 +991,12 @@ msgstr "အနီးနားရွိလမ္းအမည္á‚ွင့္ဧ
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "စကားá€á€½á€€á€¹á€¡á€žá€…္á€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ-"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -936,7 +1007,6 @@ msgstr "စကားá€á€½á€€á€¹á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
msgid "Enter details of the problem"
msgstr "ျပႆနာáအေသးစိá€á€¹á€¡á€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸á€€á€­á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -946,6 +1016,10 @@ msgstr "ျပႆနာáအေသးစိá€á€¹á€¡á€á€ºá€€á€¹á€¡á€œá€€á€¹á€™
msgid "Error"
msgstr "အမွားအယြင္း"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -959,12 +1033,19 @@ msgstr "နမူနာမ်ား -"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "ေနာက္ထပ္အá€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸-"
@@ -977,8 +1058,7 @@ msgstr ""
msgid "Filter report list"
msgstr "အစီရင္á€á€¶á€…ာစာရင္းကိုစစ္ထုá€á€¹á€™á€Šá€¹"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "ပထမအá¾á€€á€­á€™á€¹"
@@ -986,36 +1066,14 @@ msgstr "ပထမအá¾á€€á€­á€™á€¹"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "ကá½á€¼á‚ု္ပ္လမ္းကိုျပင္ေပးပါ"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet á အုပ္á€á€ºá€³á€•္သူ"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr "FixMyStreet á€á€¼á€„္ သီးျá€á€¬á€¸ အုပ္á€á€ºá€³á€•္ေရးဌာန သို႔မဟုá€á€¹ ေကာင္စီá€á€…္á€á€¯á€¡á€á€¼á€„္းရိွ ျပႆနာမ်ားအá€á€¼á€€á€¹ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸á‚ွင့္ á€á€…္ဦးá€á€ºá€„္းစီá á€á€­á€€á€ºá€±á€žá€á€ºá€¬á€žá€Šá€¹á€· á€á€Šá€¹á€±á€”ရာ အကြာအေá€á€¸ အá€á€¼á€„္းရိွ ျပႆနာအားလံုးá€á€­á€¯á‚” အပါအá€á€„္ ျပည္á€á€¼á€„္း ျပႆနာမ်ား အá€á€¼á€€á€¹ ကြဲျပားျá€á€¬á€¸á€”ားေသာ RSS feed မ်ားá‚ွင့္ အီးေမးလ္ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸ ရိွသည္á‹"
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1026,21 +1084,16 @@ msgstr ""
msgid "Fixed"
msgstr "ျပင္ျပီးျပီ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "ျပင္ျပီးျပီ-ေကာင္စီ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "ျပင္ျပီးျပီ-အသံုးျပဳသူ"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "ျပင္ျပီးေá¾á€€á€¬á€„္းအစီရင္á€á€¶á€…ာ"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "ျပင္ျပီးျပီ"
@@ -1050,11 +1103,11 @@ msgstr "ျပင္ျပီးျပီ"
msgid "Flag as deleted"
msgstr "ဖ်က္ျပီးျပီဟုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "သá€á€¹á€™á€½á€á€¹á€žá€Šá€¹á€·á€¡á€žá€¶á€¯á€¸á€»á€•ဳသူ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1071,7 +1124,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "အမွá€á€¹á€¡á€žá€¬á€¸á€»á€•ဳလုပ္ထားျá€á€„္း"
@@ -1090,9 +1143,22 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "သင္áစကားá€á€½á€€á€¹á€±á€™á€·á€žá€¼á€¬á€¸á€»á€•ီလားá‹"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "အပိုစာကိုယ္ကိုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "အပိုစာကိုယ္ကိုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "မá¾á€€á€¬á€á€á€±á€™á€¸á€±á€žá€¬á€±á€™á€¸á€á€¼á€”္းမ်ား"
@@ -1115,8 +1181,7 @@ msgstr "%ျပႆနာáအသစ္မြမ္းမံမႈမ်ားá€
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "ကá½á€¼á‚္ုပ္ကို RSS Feed ေပးပါ"
@@ -1125,17 +1190,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "သြားမည္"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "စစ္á€á€™á€¹á€¸á€€á€­á€¯á€•ို႔ေá€á€¬á€·á€™á€½á€¬á€œá€¬á€¸á‹"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1143,41 +1208,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "ဒီျပႆနာကိုေျဖရွင္းျပီးျပီလား"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "ယá€á€„္က ေကာင္စီထံ ျပႆနာမ်ား အစီရင္á€á€¶á€–ူးသလားዠသို႔မဟုá€á€¹ ဒါက ပထမဦးဆံုး အႀကိမ္လား?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "အကူအညီ"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "မဂá¤á€œá€¬á€•ါ%s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1191,7 +1252,7 @@ msgstr "အေဟာင္းေဖ်ာက္ထားေသာ"
msgid "Hide pins"
msgstr ""
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "ရာဇá€á€„္"
@@ -1207,7 +1268,7 @@ msgstr "ျပႆနာကိုဘယ္လိုအစီရင္á€á€¶á€…ာ
msgid "How to send successful reports"
msgstr "ေကာင္းမြန္ေသာအစီရင္á€á€¶á€…ာကိုဘယ္လိုပို႔မလဲ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "အá€á€Šá€¹á€™á€»á€•ဳရေသးေသာအစီရင္á€á€¶á€…ာကိုသင္အá€á€Šá€¹á€™á€»á€•ဳရေသးပါ"
@@ -1234,8 +1295,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "အိုင္ဒီ"
@@ -1253,18 +1314,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "သင္မျပဳလုပ္ပါကသင္áအသိေပးျá€á€„္းကိုအá€á€Šá€¹á€™á€»á€•ဳေပးá‚ိုင္ပါ"
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "သင္မျပဳလုပ္ပါကသင္áျပႆနာကိုမá€á€„္á‚ိုင္ပါ"
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "သင္မျပဳလုပ္ပါကသင္áမြမ္းမံမႈကိုမá€á€„္á‚ိုင္ပါ"
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1274,16 +1323,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "ျပႆနာ á€á€…္á€á€¯á€€á€­á€¯ ဤေနရာá€á€¼á€„္ á€á€„္သြင္းပါက ျပႆနာá အေသးစိá€á€¹ အá€á€ºá€€á€¹á€¡á€œá€€á€¹á€€á€­á€¯ အမ်ားျပည္သူ ျမင္ေá€á€¼á‚•á‚ိုင္သည္ዠသို႔ေသာ္ ျပႆနာကို ေကာင္စီထံ အစီရင္á€á€¶á€™á€Šá€¹ မဟုá€á€¹á€•ါá‹"
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1313,7 +1361,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "á€á€›á€¬á€¸á€™á€á€„္ေသာအိုင္ဒီ"
@@ -1338,14 +1386,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "လုပ္ေဆာင္ေနဆဲ"
@@ -1353,7 +1400,7 @@ msgstr "လုပ္ေဆာင္ေနဆဲ"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1365,12 +1412,12 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "အá€á€¼á€„္းမွá€á€¹á€…ု"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1378,7 +1425,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "ေနာက္ဆံုးေန႔မမွန္ကန္ပါ"
@@ -1386,12 +1433,12 @@ msgstr "ေနာက္ဆံုးေန႔မမွန္ကန္ပါ"
msgid "Invalid format %s specified."
msgstr "ပံုစံ %s သည္မမွန္ကန္ပါ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "စမည့္ရက္မမွန္ကန္ပါ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1409,10 +1456,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1424,7 +1480,7 @@ msgstr "ဒီကြန္ျပဴá€á€¬á€™á€½á€¬á€á€„္ေနေအာင္
msgid "Last editor"
msgstr "ေနာက္ဆံုးအယ္ဒီá€á€¬"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "ေနာက္ဆံုးအသစ္မြမ္းမံျá€á€„္း-"
@@ -1459,7 +1515,7 @@ msgstr "ျပည္á€á€¼á€„္း RSS feed မ်ားá‚ွင့္ အီá
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "‘%s’ အá€á€¼á€€á€¹ ျပည္á€á€¼á€„္း RSS feed မ်ားá‚ွင့္ အီးေမးလ္ သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "ေဒသá€á€¼á€„္းအသိေပးá€á€ºá€€á€¹"
@@ -1472,14 +1528,12 @@ msgid "MAP"
msgstr "ေျမပံု"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "ပိá€á€¹á€‘ားသည့္ အမွá€á€¹á€¡á€žá€¬á€¸ ျပဳလုပ္ထားသည္"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1497,6 +1551,16 @@ msgstr ""
msgid "Message"
msgstr "စာ"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "အပိုစာကိုယ္ကိုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "အပိုစာကိုယ္ကိုသá€á€¹á€™á€½á€á€¹á€™á€Šá€¹ -"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "စာ-"
@@ -1524,27 +1588,25 @@ msgstr "အနီးနားရွိျပႆနာမ်ားစြာ"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "အမည္"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "အမည္-"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "အမည္ - %s"
@@ -1557,21 +1619,26 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "လုပ္ေဆာင္မႈနီးပါးျပီးပါျပီአသင္áအီးေမးလ္ကိုစစ္ေဆးပါ"
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "လုပ္ေဆာင္မႈနီးပါးျပီးပါျပီአသင္áအီးေမးလ္ကိုစစ္ေဆးပါ"
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "အသစ္<br>ျပႆနာမ်ား"
@@ -1580,12 +1647,12 @@ msgstr "အသစ္<br>ျပႆနာမ်ား"
msgid "New body added"
msgstr "စာကိုယ္အသစ္ထည့္ျပီးျပီ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "ေá€á€«á€„္းစဥ္အသစ္အဆက္အသြယ္ထည့္ျပီးျပီ"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "အá€á€¼á€„္းမွá€á€¹á€…ုအသစ္-"
@@ -1593,9 +1660,10 @@ msgstr "အá€á€¼á€„္းမွá€á€¹á€…ုအသစ္-"
msgid "New local problems on FixMyStreet"
msgstr "ကá½á€¼á‚္ုပ္လမ္းကိုျပင္ေပးပါá€á€¼á€„္ေဒသá€á€¼á€„္းျပႆနာအသစ္မ်ား"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "reportemptyhomes.com မွ ျပည္á€á€¼á€„္း အစီရင္á€á€¶á€…ာသစ္မ်ား"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "အá€á€¼á€„္းမွá€á€¹á€…ုအသစ္-"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1621,33 +1689,15 @@ msgstr ""
msgid "New reports"
msgstr "အစီရင္á€á€¶á€…ာအသစ္မ်ား"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "ျမိဳ႕အသစ္"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "အသစ္မြမ္းမံမႈ - "
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "ျမိဳ႕အသစ္"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1660,14 +1710,12 @@ msgstr "ေနာက္သို႔"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "မရွိပါ"
@@ -1695,20 +1743,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "အသစ္မြမ္းမံမႈမ်ားမေá€á€¼á‚•ပါ"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "ျပႆနာမ်ားမေá€á€¼á‚•ပါ"
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "မည္သည့္ျပႆနာမွအစီရင္မá€á€¶á€›á€±á€žá€¸á€•ါ"
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "ရလဒ္မေá€á€¼á‚•ပါ"
@@ -1726,8 +1765,6 @@ msgid "No supporters"
msgstr "ေထာက္ပံ့ေပးမည့္သူမရွိပါ"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "ဘာမွမဟုá€á€¹"
@@ -1740,8 +1777,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1749,7 +1786,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "á€á€¬á€á€”္ယူမႈမရွိျá€á€„္း"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "á€á€¬á€á€”္ယူမႈမရွိျá€á€„္း"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "ကá½á€¼á‚္ုပ္áအေသးစိá€á€¹á€”ယ္နမိá€á€¹á€¡á€á€¼á€€á€¹á€™á€Ÿá€¯á€á€¹á€•ါ"
@@ -1762,7 +1807,7 @@ msgid "Not reported to council"
msgstr "ေကာင္စီသို႔အစီရင္မá€á€¶á€›á€±á€žá€¸"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "မွá€á€¹á€…ု"
@@ -1772,7 +1817,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "မွá€á€¹á€…ု -"
@@ -1781,22 +1826,20 @@ msgstr "မွá€á€¹á€…ု -"
msgid "Note: <strong>%s</strong>"
msgstr "မွá€á€¹á€…ု <strong> %s </strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "ယá€á€¯á€žá€„္áအစီရင္á€á€¶á€…ာကိုသြင္းá‚ိုင္ပါျပီ &hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "အိုေက"
@@ -1826,20 +1869,18 @@ msgstr "ပိုáေဟာင္းေသာ<br>ျပႆနာမ်ား"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "ဖြင့္မည္"
@@ -1847,11 +1888,6 @@ msgstr "ဖြင့္မည္"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "အစီရင္á€á€¶á€…ာကိုဖြင့္မည္"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1868,32 +1904,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "သို႔မဟုá€á€¹ ျပႆနာမ်ားကိုá€á€„္ျပရန္ေနရာမွာ-"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "á€á€»á€á€¬á€¸"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "ပိုင္ရွင္"
@@ -1908,12 +1938,12 @@ msgstr "စာမ်က္á‚ွာရွာမေá€á€¼á‚•ပါ"
msgid "Parent"
msgstr "ပင္မ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "á€á€…္á€á€€á€¹"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1922,6 +1952,7 @@ msgid "Password (optional)"
msgstr "စကားá€á€½á€€á€¹(ထည့္á€á€ºá€„္မွထည့္ပါ)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "စကားá€á€½á€€á€¹-"
@@ -1929,7 +1960,7 @@ msgstr "စကားá€á€½á€€á€¹-"
msgid "Permalink"
msgstr "အျမဲá€á€™á€¹á€¸á€œá€„့္á€á€¹"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "ဖုန္းနံပါá€á€¹"
@@ -1938,11 +1969,9 @@ msgstr "ဖုန္းနံပါá€á€¹"
msgid "Phone number (optional)"
msgstr "ဖုန္းနံပါá€á€¹(ထည့္á€á€ºá€„္မွထည့္ပါ)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "ဖုန္း-"
@@ -1953,14 +1982,23 @@ msgstr "ဖုန္း-"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "ဓာá€á€¹á€•ံု"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "ဒီအá€á€ºá€€á€¹á€¡á€œá€€á€¹ ျဖည့္စြက္ရန္ လိုအပ္သည္"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "ဒီအá€á€ºá€€á€¹á€¡á€œá€€á€¹ ျဖည့္စြက္ရန္ လိုအပ္သည္"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "ဓာá€á€¹á€•ံု-"
@@ -1972,22 +2010,18 @@ msgstr "မá¾á€€á€¬á€±á€žá€¸á€á€„္ကအနီးအနားက အစီá€
msgid "Place pin on map"
msgstr "ေျမပံုá€á€¼á€„္ပင္á€á€…္á€á€¯á€‘ားမည္"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "စီစဥ္ထားသည့္အá€á€­á€¯á€„္း"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr ""
@@ -1997,22 +2031,20 @@ msgstr ""
msgid "Please check the passwords and try again"
msgstr "စကားá€á€½á€€á€¹á€€á€­á€¯á€»á€•န္စစ္ေဆးျပီးျပန္á¾á€€á€­á€³á€¸á€…ားပါ"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "သင္áအီးေမးလ္ကိုစစ္ပါ"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "သင္áအီးေမးလ္လိပ္စာမွန္áŠá€™á€™á€½á€”္ကိုစစ္ေဆးပါ"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2022,7 +2054,7 @@ msgstr "ေá€á€«á€„္းစဥ္á€á€…္á€á€¯á€€á€­á€¯á€±á€›á€¼á€¸á€•ါ"
msgid "Please choose a property type"
msgstr "ပစá¥á€Šá€¹á€¸á€¡á€™á€ºá€­á€³á€¸á€¡á€…ားá€á€…္á€á€¯á€€á€­á€¯á€±á€›á€¼á€¸á€•ါ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2030,7 +2062,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2039,7 +2071,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "စာá€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
@@ -2050,15 +2082,15 @@ msgstr "စာá€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
msgid "Please enter a password"
msgstr "စကားá€á€½á€€á€¹á€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "ေá€á€«á€„္းစီးá€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2066,7 +2098,7 @@ msgid "Please enter a valid email"
msgstr "မွန္ကန္ေသာအီးေမးလ္á€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "မွန္ကန္ေသာအီးေမးလ္လိပ္စာá€á€…္á€á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
@@ -2075,21 +2107,19 @@ msgstr "မွန္ကန္ေသာအီးေမးလ္လိပ္စာ
msgid "Please enter some details"
msgstr "á€á€…္á€á€ºá€­á€³á‚•အá€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸á€€á€­á€¯á€›á€­á€¯á€€á€¹á€‘ည့္ပါ"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "သင္áအီးေမးလ္ကိုရိုက္ထည့္ပါ"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "သင္áအီးေမးလ္လိပ္စာကိုရိုက္ထည့္ပါ"
@@ -2102,8 +2132,8 @@ msgstr "သင္áပထမအမည္ကိုရိုက္ထည့္ပ
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2142,7 +2172,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2165,19 +2195,24 @@ msgstr ""
msgid "Please note:"
msgstr "ေက်းဇူးျပဳျပီးမွá€á€¹á€žá€¬á€¸á€•ါ-"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "သင္ဘာလို႔ဒီသá€á€„္းပို႔á€á€ºá€€á€¹á€€á€­á€¯á€»á€•န္ဖြင့္ရသလဲဆိုသည့္ရွင္းလင္းá€á€ºá€€á€¹á€€á€­á€¯á€±á€»á€•ာျပေပးပါ"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "စာအနည္းငယ္á‚ွင့္ဓာá€á€¹á€•ံုá€á€…္ပံုကိုလည္းေဖာ္ျပေပးပါ"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "သင္áေကာင္စီသို႔သင္ယá€á€„္ကသá€á€„္းပို႔ဖူးေá¾á€€á€¬á€„္းေျပာျပေပးပါ"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "စာကိုယ္á€á€…္á€á€¯á€€á€­á€¯ ေရြးပါá‹"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "သင္လိုá€á€ºá€„္ေသာ feed ကိုေရြးပါ"
@@ -2186,21 +2221,17 @@ msgstr "သင္လိုá€á€ºá€„္ေသာ feed ကိုေရြးပါ
msgid "Please select the type of alert you want"
msgstr "သင္လိုá€á€ºá€„္ေသာ အသိေပးá€á€ºá€€á€¹á€¡á€™á€ºá€­á€³á€¸á€¡á€…ားမ်ားကိုေရြးပါ"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "ျပႆနာေျဖရွင္းျပီးျပီáŠá€™á€›á€½á€„္းျပီးျပီကိုေဖာ္ျပပါ"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "JPEG ပံုá€á€…္ပံုသာá€á€„္ရန္"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "စာá€á€…္ေá¾á€€á€¬á€„္းေရးပါ"
@@ -2209,8 +2240,8 @@ msgid "Please write your update here"
msgstr "သင္áအသစ္မြမ္းမံမႈကိုဒီေနရာမွာေရးပါ"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2231,22 +2262,36 @@ msgstr "%s မွာ %s(<strong>%s</strong>)မွá€á€„္á€á€²á€·á€žá€Šá€¹"
msgid "Posted by %s at %s"
msgstr "%s မွာ %s မွá€á€„္á€á€²á€·á€žá€Šá€¹"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "ယá€á€„္က"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "ကိုယ္ပိုင္"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "ျပႆနာ"
@@ -2262,12 +2307,12 @@ msgstr "ျပႆနာ %s သည္အá€á€Šá€¹á€»á€–စ္á€á€²á€·á€žá€Šá€¹"
msgid "Problem %s sent to council %s"
msgstr "ေကာင္စီ %s သို႔ ျပႆနာ %s ကိုပို႔လိုက္ပါျပီ"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "ျပည္နယ္မွ ျပႆနာကိုထပ္မံá€á€¼á€²á€…ိá€á€¹á€œá€­á€¯á€€á€¹á€žá€Šá€¹"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "ျပႆနာကို ဖြင့္ထားသည္"
@@ -2283,12 +2328,10 @@ msgstr "ျပႆနာမ်ား"
msgid "Problems in this area"
msgstr "ဒီဧရိယာအá€á€¼á€„္းရွိျပႆနာမ်ား"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "အနီးနားရွိျပႆနာမ်ား"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "ေျမပံုေပášá€€ ျပႆနာမ်ား"
@@ -2297,12 +2340,11 @@ msgstr "ေျမပံုေပášá€€ ျပႆနာမ်ား"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "FixMyStreet ေပášá€á€¼á€„္ လá€á€¹á€á€±á€œá€¬ á€á€„္ျပထားသည့္ ျပႆနာမ်ားကို ျပင္ဆင္ထားá¿á€•ီး ျဖစ္သည္á‹"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2314,20 +2356,17 @@ msgstr ""
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "ဒီဧရိယာအá€á€¼á€„္းရွိျပႆနာမ်ား"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2341,39 +2380,31 @@ msgstr ""
msgid "Provide an update"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "နာမည္á‚ွင့္ စကားá€á€½á€€á€¹á€€á€­á€¯ မထည့္သြင္းá€á€ºá€„္လွ်င္ ရသည္ዠနံပါá€á€¹á‚ွင့္ စကားá€á€½á€€á€¹ ထည့္သြင္းပါက ျပႆနာမ်ားကို á€á€„္ျပျá€á€„္းአupdate မ်ား ျပဳလုပ္ျá€á€„္းá‚ွင့္ အစီရင္á€á€¶á€…ာမ်ား စီမံá€á€”္႔á€á€¼á€²á€»á€á€„္းá€á€­á€¯á‚”ကို ပိုမိုလြယ္ကူစြာ ျပဳလုပ္á‚ိုင္မည္á‹"
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "စကားá€á€½á€€á€¹á€€á€­á€¯ မထည့္သြင္းá€á€ºá€„္လွ်င္ ရသည္ዠစကားá€á€½á€€á€¹ ထည့္သြင္းပါက ျပႆနာမ်ားကို á€á€„္ျပျá€á€„္းአupdate မ်ား ျပဳလုပ္ျá€á€„္းá‚ွင့္ အစီရင္á€á€¶á€…ာမ်ား စီမံá€á€”္႔á€á€¼á€²á€»á€á€„္းá€á€­á€¯á‚”ကို ပိုမိုလြယ္ကူစြာ ျပဳလုပ္á‚ိုင္မည္á‹"
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "စစ္á€á€™á€¹á€¸á€±á€™á€¸á€á€¼á€”္းလႊာ"
@@ -2389,12 +2420,11 @@ msgstr "%d ျပႆနာ အá€á€¼á€€á€¹ %d ေပးပို႔သည့္
msgid "Questionnaire filled in by problem reporter"
msgstr "ျပႆနာ အစီရင္á€á€¶á€žá€° ျဖည့္စြက္ရမည့္ စစ္á€á€™á€¹á€¸á€±á€™á€¸á€á€¼á€”္းလႊာ"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2420,8 +2450,7 @@ msgstr "%s á RSS feed"
msgid "RSS feed of %s, within %s ward"
msgstr "%s အုပ္á€á€ºá€³á€•္ေရးဌာန အá€á€¼á€„္းရိွ %s á RSS feed"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "အနီးအနားရိွ ျပႆနာမ်ားá RSS feed"
@@ -2429,7 +2458,7 @@ msgstr "အနီးအနားရိွ ျပႆနာမ်ားá RSS fee
msgid "RSS feed of problems in this %s"
msgstr "ဒီ %s ရိွ ျပႆနာမ်ားá RSS feed"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2459,17 +2488,18 @@ msgstr "လက္ရိွ ျပႆနာကို update ျပဳလုပ္
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "လá€á€¹á€á€±á€œá€¬ ျပည္á€á€¼á€„္း ျပႆနာမာ်ား"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "မá¾á€€á€¬á€±á€žá€¸á€™á€®á€€ <br> ျပင္ဆင္á¿á€•ီး"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "ျပႆနာမ်ားကို မá¾á€€á€¬á€±á€žá€¸á€™á€®á€€ အစီရင္á€á€¶ á€á€„္ျပá¿á€•ီး"
@@ -2477,23 +2507,28 @@ msgstr "ျပႆနာမ်ားကို မá¾á€€á€¬á€±á€žá€¸á€™á€®á€€ အá
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "ဓာá€á€¹á€•ံု ဖယ္ရွားရန္ (မá¿á€•ီးေျမာက္á‚ိုင္ပါ)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "သုံးစြဲသူအား ျပင္ဆင္ျá€á€„္း"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "ျပႆနာကို အစီရင္á€á€¶ á€á€„္ျပရန္"
@@ -2502,7 +2537,7 @@ msgstr "ျပႆနာကို အစီရင္á€á€¶ á€á€„္ျပရနá
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2511,63 +2546,58 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "ေဒသá€á€¼á€„္း ျပႆနာမ်ားကို အစီရင္á€á€¶á€»á€á€„္းአá¾á€€á€Šá€¹á€·á‚ႈျá€á€„္းá‚ွင့္ ေဆြးေá‚ြးျá€á€„္း"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2575,18 +2605,22 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "အစီရင္á€á€¶á€…ာအားလံုး"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "ျပႆနာကို အစီရင္á€á€¶ á€á€„္ျပျá€á€„္း"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2599,18 +2633,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "အစီရင္á€á€¶ ျပန္လည္ေပးပို႔ရန္"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2625,26 +2662,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "ဘယ္ဘက္ကို လွည့္ပါ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "ညာဘက္ကို လွည့္ပါ"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "ေျပာင္းလဲမႈမ်ားကို သိမ္းဆည္းရန္"
@@ -2657,7 +2700,7 @@ msgstr "အစီရင္á€á€¶á€…ာမ်ားကို ရွာေဖြá€
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "အစီရင္á€á€¶á€…ာမ်ားကို ရွာေဖြရန္"
@@ -2689,20 +2732,24 @@ msgstr ""
msgid "Select an area"
msgstr "ဧရိယာá€á€…္á€á€¯á€€á€­á€¯ ေရြးပါá‹"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "အစီရင္á€á€¶á€…ာကိုဖြင့္မည္"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2711,8 +2758,8 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2728,34 +2775,23 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "á€á€„္ရန္"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "အီးေမးလ္ျဖင့္ á€á€„္ရန္"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "á€á€„္ရန္ သို႔မဟုá€á€¹ အေကာင့္á€á€…္á€á€¯ ဖန္á€á€®á€¸á€›á€”္"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "%s အေနျဖင့္ á€á€„္ထားသည္"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2771,8 +2807,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2780,24 +2817,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2813,16 +2857,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2836,7 +2881,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2851,45 +2901,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2900,18 +2947,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "အက်ဥ္းá€á€ºá€³á€•္"
@@ -2922,7 +2970,7 @@ msgstr "အက်ဥ္းá€á€ºá€³á€•္"
msgid "Summary reports"
msgstr "အစီရင္á€á€¶á€…ာအက်ဥ္းá€á€ºá€³á€•္"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "စစ္á€á€™á€¹á€¸"
@@ -2930,9 +2978,18 @@ msgstr "စစ္á€á€™á€¹á€¸"
msgid "Survey Results"
msgstr "စစ္á€á€™á€¹á€¸á€›á€œá€’္"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "မြမ္းမံထားေသာအသစ္မ်ားရယူရန္"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "စာ"
@@ -2941,6 +2998,7 @@ msgid "Text only version"
msgstr "စာဗားရွင္းသာ"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "စာ-"
@@ -2962,7 +3020,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2970,7 +3028,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "ေက်းဇူးá€á€„္ပါသည္ዠျပင္ဆင္á¿á€•ီး ျဖစ္ေá¾á€€á€¬á€„္း á¾á€€á€¬á€¸á€žá€­á€›á á€á€™á€¹á€¸á€žá€¬á€™á€­á€•ါသည္ዠသင့္အေနျဖင့္ ယá€á€„္က ေကာင္စီထံ ျပႆနာá€á€…္á€á€¯á€€á€­á€¯ အစီရင္á€á€¶á€á€„္ျပဖူးပါသလား?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2988,20 +3046,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "ထိုျပႆနာကိုယá€á€¯á€•င္ျပန္ပို႔ပါမည္"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "ထိုျပႆနာကိုယá€á€¯á€•င္ျပန္ပို႔ပါမည္"
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "ဒီအစီရင္á€á€¶á€…ာကို %s ေပášá€á€¼á€„္မá¾á€€á€Šá€¹á€·á‚ိုင္ပါ"
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "ကá½á€¼á‚္ုပ္လမ္းကိုျပင္ေပးပါ မွဒီအစီရင္á€á€¶á€…ာကိုဖယ္ျပီးပါျပီ"
@@ -3043,30 +3100,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "á€á€ºá€­á€³á‚•ယြင္းမႈမွာ - %s"
@@ -3084,10 +3129,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr "အသံုးျပဳသူမ်ားမွေပးပို႔လာေသာေဒသá€á€¼á€„္း ျပႆနာအသစ္မ်ား"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "အသံုးျပဳသူမ်ားမွေပးပို႔လာေသာေဒသá€á€¼á€„္းအစီရင္á€á€¶á€…ာအသစ္မ်ား"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "သံုးစြဲသူမ်ားမွ{{ေကာင္စီ}} အá€á€¼á€€á€¹á€±á€•းပို႔လာေသာျပႆနာအသစ္မ်ား"
@@ -3108,20 +3149,8 @@ msgstr "အသံုးျပဳသူမ်ားမွျပင္ျပီး
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3138,8 +3167,7 @@ msgstr "စကားá€á€½á€€á€¹á€™á€ºá€¬á€¸á€žá€Šá€¹á€™á€á€°á€Šá€®á€•ါ"
msgid "The requested URL '%s' was not found on this server"
msgstr "သင္ေá€á€¬á€„္းဆိုေသာ URL %s ကိုဒီဆာဗာမွာရွာမေá€á€¼á‚•ပါ"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3150,7 +3178,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3161,23 +3189,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "အီးေမးလ္á‚ွင့္ လ်ွိဳ႕á€á€½á€€á€¹á€”ံပါá€á€¹á€á€¼á€„္ ျပႆနာ ျဖစ္ေပášá€á€²á€·á€•ါသည္ዠသင္á လွ်ိဳ႕á€á€½á€€á€¹á€”ံပါá€á€¹á€€á€­á€¯ မမွá€á€¹á€™á€­á€•ါက သို႔မဟုá€á€¹ မရိွေသးပါက ေလွ်က္လႊာá \"အီးေမးလ္ျဖင့္ á€á€„္ရန္\" ေနရာá€á€¼á€„္ ျဖည့္ပါá‹"
@@ -3190,7 +3219,7 @@ msgstr "အီးေမးလ္ သို႔မဟုá€á€¹ စကားá€á€½á
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3230,16 +3259,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3253,7 +3282,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3280,55 +3309,68 @@ msgstr "ဒီျပႆနာကိုေျဖရွင္းေနဆဲျဖ
msgid "This problem is old and of unknown status."
msgstr "ဒီျပႆနာသည္အရမ္းá¾á€€á€¬á€»á€•ီျဖစ္ျပီး အေျá€á€¡á€±á€”ကိုမသိရပါ"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "ဒီအစီရင္á€á€¶á€…ာသည္အá€á€Šá€¹á€»á€•ဳျá€á€„္းကိုေစာင့္ဆိုင္းေနဆဲျဖစ္သည္"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "ဒီျပႆနာကို ပိá€á€¹á€‘ားသည္ဟုေလာေလာဆယ္သá€á€¹á€™á€½á€á€¹á€‘ားသည္"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "ဒီျပႆနာကိုေလာေလာဆယ္ေျဖရွင္းျပီးျပီဟုသá€á€¹á€™á€½á€á€¹á€‘ားသည္"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "ဒီအစီရင္á€á€¶á€…ာကိုယá€á€¯á€±á€œá€¬á€±á€œá€¬á€†á€šá€¹á€–ြင့္ထားသည္"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "ဒီအစီရင္á€á€¶á€…ာကိုအမည္မသိသူမွá€á€„္သြင္းá€á€²á€·á€žá€Šá€¹"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "ဒီ web စာမ်က္á‚ွာသည္ အသံုးျပဳသူမွရိုက္ထားေသာ ျပႆနာáဓာá€á€¹á€•ံုá€á€…္ပံုပါá€á€„္သည္"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
msgstr ""
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "ျပည္á€á€¼á€„္း သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸ ေဖာ္ျပရန္အá€á€¼á€€á€¹ သင္á စာá€á€­á€¯á€€á€¹á€±á€žá€á²á€¬á€¡á€™á€½á€á€¹ သို႔မဟုá€á€¹ လမ္းနာမည္á‚ွင့္ ဧရိယာကို ထည့္သြင္းပါá‹"
+
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "ျပည္á€á€¼á€„္း သá€á€­á€±á€•းá€á€ºá€€á€¹á€™á€ºá€¬á€¸ ေဖာ္ျပရန္အá€á€¼á€€á€¹ သင္á စာá€á€­á€¯á€€á€¹á€±á€žá€á²á€¬á€¡á€™á€½á€á€¹ သို႔မဟုá€á€¹ လမ္းနာမည္á‚ွင့္ ဧရိယာကို ထည့္သြင္းပါá‹"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3344,8 +3386,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3353,11 +3395,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3374,7 +3416,9 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3397,11 +3441,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3436,24 +3480,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3461,27 +3505,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "ဒီျပႆနာမ်ားကို FixMyStreet သို႔á€á€„္ျပပါá‹"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "စီမံသူá€á€¼á€„္သာ ေဖာ္ျပေပးသည့္ အေသးစိá€á€¹á€€á€­á€¯ မွá€á€¹á€á€™á€¹á€¸á€á€„္ရန္ မွá€á€¹á€…ုကို အသုံးျပဳပါዠမွá€á€¹á€…ုမ်ားကို လူအမ်ားမေá€á€¼á‚”ျမင္ရ သလို အဖြဲ႔ထံသို႔လည္း မေပးပို႔á‚ိုင္ပါá‹"
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "အသံုးျပဳသူ"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "ေျမပံု အသံုးျပဳထားá¿á€•ီး"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "သုံးစြဲသူ အမွá€á€¹á€¡á€žá€¬á€¸ ျပဳလုပ္ျá€á€„္းကို ဖယ္ရွားလိုက္သည္á‹"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "သုုံးစြဲသူက အမွá€á€¹á€¡á€žá€¬á€¸ ျပဳလုပ္ျá€á€„္း"
@@ -3489,23 +3536,23 @@ msgstr "သုုံးစြဲသူက အမွá€á€¹á€¡á€žá€¬á€¸ ျပဳá
msgid "User search finds matches in users' names and email addresses."
msgstr "သုံးစြဲသူရွာေဖြမႈသည္ áŽá€á€­á€¯á‚”á အီးေမးလိပ္စာá‚ွင့္ နာမည္မ်ားရွိ á€á€°á€Šá€®á€™á‚ˆá€™á€ºá€¬á€¸á€€á€­á€¯ ေá€á€¼á‚”ရွိá‚ိုင္သည္ዠ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "အသံုးျပဳသူမ်ား"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "ဆိုက္ေပášá€á€¼á€„္ အစီရင္á€á€¶á€…ာ á¾á€€á€Šá€¹á€·á‚ႈျá€á€„္း"
@@ -3529,16 +3576,15 @@ msgid "Wards of this council"
msgstr "ေကာင္စီအဖြဲ႔မ်ား"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "ယá€á€¯á€á€Šá€¹á€±á€”ရာ အá€á€¼á€€á€¹ á€á€…္á€á€¯á€‘က္ပိုသည့္ ေနရာမ်ား ေá€á€¼á‚”ရွိထားပါသည္ዠá€á€°á€Šá€®á€žá€Šá€¹á€· ေနရာဆယ္á€á€¯á€€á€­á€¯ ေá€á€¼á‚”ရွိထားပါသည္ዠယá€á€¯á€á€Šá€¹á€±á€”ရာ မဟုá€á€¹á€•ါက အျá€á€¬á€¸á€›á€½á€¬á€±á€–ြမႈမ်ား ထပ္မံျပဳလုပ္ပါá‹"
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "သင့္ account ကိုအá€á€Šá€¹ မျပဳá‚ိုင္ေသးပါ- á€á€™á€¹á€¸á€”ည္းပါá€á€šá€¹á‹"
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "မိမိá€á€­á€¯á‚”သည္ သင့္ account ကိုအá€á€Šá€¹á€»á€•ဳေပးမည့္ လင့္á€á€¹á€•ါá€á€„္ေသာ အီးေမးကို ေပးပို႔ထားပါသည္á‹"
@@ -3552,7 +3598,7 @@ msgstr "သင့္အီးေမးလိပ္စာကို ျပသ သá
msgid "We never show your email address or phone number."
msgstr "မိမိá€á€­á€¯á‚”သည္ သင့္ဖုန္းနံပါá€á€¹ သို႔မဟုá€á€¹ အီးေမးလိပ္စာကို ျပသသြားမည္ မဟုá€á€¹á€•ါ"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "မိမိá€á€­á€¯á‚”သည္ %s; áá€á€¬á€á€”္ျဖစ္ေá¾á€€á€¬á€„္း သá€á€­á€»á€•ဳမိေသာ္လည္း မိမိá€á€­á€¯á‚”á€á€¼á€„္ áŽá€á€­á€¯á‚”ကို ဆက္သြယ္ရန္ အေသးစိá€á€¹ မရွိေသးပါዠအကယ္á သင့္ေá€á€¬á€¹á€žá€Šá€¹á€· လိပ္စာရွိပါက ေက်းဇူးျပဳá¿á€•ီး ဆက္သြယ္ေပးပါá‹"
@@ -3577,11 +3623,15 @@ msgstr "မိမိá€á€­á€¯á‚”အေနနဲ႔ ယá€á€¯á€†á€­á€¯á€€á€¹á€”á€
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "ျပင္ဆင္á€á€²á€·á€žá€Šá€¹á€· အá€á€ºá€­á€”္"
@@ -3590,7 +3640,7 @@ msgstr "ျပင္ဆင္á€á€²á€·á€žá€Šá€¹á€· အá€á€ºá€­á€”္"
msgid "When sent"
msgstr "ေပးပို႔á€á€²á€·á€žá€Šá€¹á€· အá€á€ºá€­á€”္"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "á€á€­á€¯á€€á€¹á€á€”္းလြá€á€¹á€™á€ºá€¬á€¸ ရွိရာ ဘေလာက္"
@@ -3598,18 +3648,24 @@ msgstr "á€á€­á€¯á€€á€¹á€á€”္းလြá€á€¹á€™á€ºá€¬á€¸ ရွိရာ ဘá
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
"ေá€á€¬á€„္းဆို ရွာေဖြမႈမ်ားá‚ွင့္ အá€á€° အုပ္á€á€ºá€³á€•္ေရးá€á€…္á€á€¯á€…ီကို ေပးပို႔သည့္ ေá€á€¬á€„္းဆိုá€á€ºá€€á€¹á€™á€ºá€¬á€¸á€€á€­á€¯ ကန္႔သá€á€¹á€›á€”္ ေအဂ်င္စီá€á€¬á€á€”္ အá€á€¼á€€á€¹á€›á€½á€¬á€±á€–ြမႈမ်ားလည္း ျဖစ္\n"
"á‚ိုင္ေá€á€º ျဖစ္သည္ዠရွာေဖြမႈသည္ အုပ္á€á€ºá€³á€•္ေရး အေထာက္အထားျဖစ္á¿á€•ီး MaPit မွေထာက္ပံ့ ေပးထားသည္á‹"
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "သင့္အေနျဖင့္ ေလးပá€á€¹á€¡á€á€¼á€„္း အျá€á€¬á€¸á€±á€™á€¸á€á€¼á€”္းမ်ား ရရွိလိုá¿á€•ီး အေျá€á€¡á€±á€”ကို သá€á€­á€›á€±á€…ရန္ သá€á€­á€±á€•းလိုပါသလားá‹"
@@ -3635,15 +3691,13 @@ msgstr "á€á€¯á‚ွစ္"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "ဟုá€á€¹á€žá€Šá€¹á‹"
@@ -3709,11 +3763,9 @@ msgstr ""
"မွာ သင့္ျပႆနာကို သြားေရာက္ á¾á€€á€Šá€¹á€·á€›á€°á‚ိုင္ပါသည္ዠ\n"
"\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "ဒီအစီရင္á€á€¶á€…ာá€á€¼á€„္ ဓာá€á€¹á€•ုံá€á€¼á€²á€á€„္ထားá¿á€•ီ ျဖစ္á¿á€•ီး အျá€á€¬á€¸á€á€…္á€á€¯ á€á€¼á€²á€á€„္ျá€á€„္းသည္ အရင္ေနရာá€á€¼á€„္ အစားထိုးသြားပါမည္á‹"
@@ -3722,6 +3774,10 @@ msgstr "ဒီအစီရင္á€á€¶á€…ာá€á€¼á€„္ ဓာá€á€¹á€•ုံá€
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "ယá€á€¯ ျပင္ဆင္မြမ္းမံမႈကို ဓာá€á€¹á€•ုံျဖင့္ á€á€¼á€²á€á€„္ထားá¿á€•ီး ျဖစ္á¿á€•ီး အျá€á€¬á€¸á€á€…္á€á€¯á€á€¼á€²á€á€„္လွ်င္ အရင္ေနရာá€á€¼á€„္ အစားထိုးေပးသြားမည္ ျဖစ္သည္á‹"
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3744,15 +3800,11 @@ msgstr "သင္á အီးေမးလ္လိပ္စာကို ေအá
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "သင္ ေအာင္ျမင္စြာ á€á€„္ေရာက္á‚ိုင္á€á€²á€·á€•ါá¿á€•ီዠသင္á အေသးစိá€á€¹ အá€á€ºá€€á€¹á€¡á€œá€€á€¹ မွန္ကန္မႈ ရိွ မရိွ စစ္ေဆးá¿á€•ီး အá€á€Šá€¹á€»á€•ဳပါá‹"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "ယá€á€¯ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚” ေပးပို႔လိုက္သည့္ အီးေမးလ္ရိွ လင့္á€á€¹á€€á€­á€¯ á‚ွိပ္ပါá‹"
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "အစီအရင္á€á€¶á€…ာမ်ား မေပးပို႔မီ (ေကာင္စီမ်ား သို႔မဟုá€á€¹ ႒ာနမ်ားကဲ့သို႔) အဖြဲ႔á€á€á€ºá€­á€³á‚”ကို ထည့္သြင္းရန္ လိုအပ္သည္"
@@ -3763,18 +3815,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr "သင့္အေနျဖင့္ (ေကာင္စီမ်ားá‚ွင့္ ႒ာနကဲ့သို႔) အဖြဲ႔မ်ား ထည့္သြင္းá‚ိုင္ရန္ လိုအပ္ေသာေá¾á€€á€¬á€„့္ သင့္အေနျဖင့္ (က်င္းáŠá€á€ºá€­á€³á€„့္မ်ား သို႔မဟုá€á€¹ လမ္းမီးá€á€­á€¯á€„္ကဲ့သုိ႔) ကိုင္á€á€¼á€šá€¹á‚ိုင္သည့္ ျပႆနာမ်ားကို ထည့္သြင္းá‚ိုင္သလို (အီးေမးလ္ လိပ္စာ ကဲ့သို႔) အဆက္အသြယ္မ်ားျဖင့္ အစီအရင္á€á€¶á€…ာမ်ားကို ေပးပို႔á‚ိုင္သည္á‹"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "သင္ အမွန္á€á€€á€šá€¹ ျပန္လည္ ေပးပို႔á€á€ºá€„္ပါသလား?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "သင္á အစီရင္á€á€¶á€…ာမ်ား"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3783,22 +3833,17 @@ msgstr "သင္á အစီရင္á€á€¶á€…ာမ်ား"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "သင္á အီးေမးလ္"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "သင္á အီးေမးလ္လိပ္စာ"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "သင္á အီးေမးလ္လိပ္စာ"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3808,24 +3853,23 @@ msgstr "သင္á အီးေမးလ္"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "သင့္áအá€á€ºá€€á€¹á€¡á€œá€€á€¹á€™á€ºá€¬á€¸á€€á€­á€¯ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”á သီးသန္႔á€á€Šá€¹á€›á€½á€­á€™á‚ˆ ေပášá€œá€…ီ á‚ွင့္အညီ အသုံးျပဳသြားမည္ ျဖစ္သည္á‹"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "သင့္အမည္"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "သင့္အမည္"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3838,19 +3882,15 @@ msgstr "သင္á စကားá€á€½á€€á€¹á€€á€­á€¯ ေျပာင္းလá
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "သင္á ဖုန္းနံပါá€á€¹"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "သင္á အစီရင္á€á€¶á€…ာ"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "သင္á အစီရင္á€á€¶á€…ာမ်ား"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "သင္á မြမ္းမံျပင္ဆင္ထားမႈမ်ား"
@@ -3858,23 +3898,31 @@ msgstr "သင္á မြမ္းမံျပင္ဆင္ထားမႈá€
msgid "Your&nbsp;email:"
msgstr "သင္á &nbsp; အီးေမးလ္"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "အစီရင္á€á€¶á€…ာအားလံုး"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "%s မွ"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "အစီရင္á€á€¶á€…ာကိုပိá€á€¹á€™á€Šá€¹"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "ေကာင္စီ"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "ေျမပံု မသံုးá€á€²á€·á€•ါ"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "ဥပမာ ‘%s’ သို႔မဟုá€á€¹ ‘%s’"
@@ -3883,17 +3931,22 @@ msgstr "ဥပမာ ‘%s’ သို႔မဟုá€á€¹ ‘%s’"
msgid "edit user"
msgstr "သုံးစြဲသူအား ျပင္ဆင္ျá€á€„္း"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "ျပင္ျပီးေá¾á€€á€¬á€„္းအစီရင္á€á€¶á€…ာ"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "%d မွ မá€á€°á€Šá€®á€±á€žá€¬ သုံးစြဲသူမ်ား"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "ေနာက္ဆုံး ျပဳျပင္မြမ္းမံမႈမ်ား"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "á€á€…္မိနစ္á€á€”္႔သာ"
@@ -3938,14 +3991,13 @@ msgstr "စီစဥ္ထားá¿á€•ီးျဖစ္ေá¾á€€á€¬á€„္း á€
msgid "marked as unable to fix"
msgstr "ျပင္ဆင္á မရေá¾á€€á€¬á€„္း အမွá€á€¹á€¡á€žá€¬á€¸ ျပဳလုပ္ထားသည္"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "မအားေသးပါ"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "သို႔မဟုá€á€¹"
@@ -3955,16 +4007,16 @@ msgstr "သို႔မဟုá€á€¹ အလိုအေလ်ာက္ လမ္á
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "နဂိုá€á€„္ေရာက္ထားမႈ: &ldquo;%s&rdquo;"
@@ -3977,8 +4029,8 @@ msgstr "အျá€á€¬á€¸ ဧရိယာမ်ား"
msgid "reopened"
msgstr "ျပန္ဖြင့္ပါ"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "ထြက္ရန္"
@@ -3994,17 +4046,20 @@ msgstr "ျပည္á€á€¼á€„္းေကာင္စီ"
msgid "there is no pin shown as the user did not use the map"
msgstr "အသုံးျပဳသူ မသုံးသည့္ ေျမပုံကို ပင္အပ္ျဖင့္ မေဖာ္ျပထားပါ"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "ေဒသá€á€¼á€„္း ျပႆနာသာျဖစ္သည္á‹"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "ယေန႔"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "ျပင္ျပီးေá¾á€€á€¬á€„္းအစီရင္á€á€¶á€…ာ"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "ေျမပံု အသံုးျပဳထားá¿á€•ီး"
@@ -4027,7 +4082,7 @@ msgid "<big>%s</big> report recently"
msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> လá€á€¹á€á€±á€œá€¬ á€á€„္ျပထားေသာ အစီရင္á€á€¶á€…ာမ်ား"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4039,7 +4094,7 @@ msgid "%d supporter"
msgid_plural "%d supporters"
msgstr[0] "%d ေထာက္ပံ့ေပးသူမ်ား"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4057,7 +4112,7 @@ msgid "We do not yet have details for the council that covers this location."
msgid_plural "We do not yet have details for the councils that cover this location."
msgstr[0] "ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”သည္ ယá€á€¯á€±á€”ရာကိုá‚ွင့္ ပá€á€¹á€žá€€á€¹á€žá€Šá€¹á€· ေကာင္စီမ်ားအá€á€¼á€€á€¹ အေသးစိá€á€¹á€™á€›á€½á€­á€±á€žá€¸á€•ါ"
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4075,7 +4130,7 @@ msgid "<big>%s</big> fixed in past month"
msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> á¿á€•ီးá€á€²á€·á€žá€Šá€¹á€·á€œá€€ ျပဳျပင္ထားမႈ"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4087,5 +4142,71 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] "ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”á€á€¼á€„္ ဒီá€á€Šá€¹á€±á€”ရာá‚ွင့္ ပá€á€¹á€žá€€á€¹á€žá€Šá€¹á€· အျá€á€¬á€¸á€±á€€á€¬á€„္အá€á€¼á€€á€¹ အေသးစိá€á€¹á€™á€›á€½á€­á€±á€žá€¸á€•ါá‹"
-#~ msgid "For council(s):"
-#~ msgstr "ေကာင္စီ(မ်ား)အá€á€¼á€€á€¹ -"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(စိá€á€¹á€™á€•ူပါá‚ွင့္ዠသင္ အီးေမးလ္ စစ္ေဆးေနá€á€ºá€­á€”္á€á€¼á€„္ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”က သင္á သá€á€­á€±á€•းá€á€ºá€€á€¹á€€á€­á€¯ ထိန္းသိမ္းထားပါမည္á‹)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(စိá€á€¹á€™á€•ူပါá‚ွင့္ዠသင္ အီးေမးလ္ စစ္ေဆးေနá€á€ºá€­á€”္á€á€¼á€„္ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”က သင္á ျပႆနာ အစီရင္á€á€¶á€…ာကို ထိန္းသိမ္းထားပါမည္á‹)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(စိá€á€¹á€™á€•ူပါá‚ွင့္ዠသင္ အီးေမးလ္ စစ္ေဆးေနá€á€ºá€­á€”္á€á€¼á€„္ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚”က သင္á ေနာက္ဆံုး ျပဳျပင္ထားသည့္ အá€á€ºá€€á€¹á€¡á€œá€€á€¹á€€á€­á€¯ ထိန္းသိမ္းထားပါမည္á‹)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>သင္ေျမပံုကိုမျမင္ရပါက <a href = '%s'rel = 'nofollow'> ဒီအဆင့္ကိုေက်ာ္လိုက္ပါ</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>မဟုá€á€¹á€•ါ</strong>မလုပ္ပါáŠá€¡á€®á€¸á€±á€™á€¸á€œá€¹á€»á€–င့္á€á€„္မည္-"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "သင္သည္ <strong>developer</strong> á€á€…္ေယာက္လားዠFixMyStreet ကို ကူညီလိုပါသလားá‹"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "FixMyStreet ကိုဆက္သြယ္မည္"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "FixMyBarangay áစကားá€á€½á€€á€¹á€›á€½á€­á€•ါသလားá‹"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet á အုပ္á€á€ºá€³á€•္သူ"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "သင္မျပဳလုပ္ပါကသင္áအသိေပးျá€á€„္းကိုအá€á€Šá€¹á€™á€»á€•ဳေပးá‚ိုင္ပါ"
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "သင္မျပဳလုပ္ပါကသင္áျပႆနာကိုမá€á€„္á‚ိုင္ပါ"
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "သင္မျပဳလုပ္ပါကသင္áမြမ္းမံမႈကိုမá€á€„္á‚ိုင္ပါ"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.com မွ ျပည္á€á€¼á€„္း အစီရင္á€á€¶á€…ာသစ္မ်ား"
+
+#~ msgid "New update:"
+#~ msgstr "အသစ္မြမ္းမံမႈ - "
+
+#~ msgid "No problems found."
+#~ msgstr "ျပႆနာမ်ားမေá€á€¼á‚•ပါ"
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "မည္သည့္ျပႆနာမွအစီရင္မá€á€¶á€›á€±á€žá€¸á€•ါ"
+
+#~ msgid "Sign in by email"
+#~ msgstr "အီးေမးလ္ျဖင့္ á€á€„္ရန္"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "%s အေနျဖင့္ á€á€„္ထားသည္"
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "အသံုးျပဳသူမ်ားမွေပးပို႔လာေသာေဒသá€á€¼á€„္းအစီရင္á€á€¶á€…ာအသစ္မ်ား"
+
+#~ msgid "User"
+#~ msgstr "အသံုးျပဳသူ"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "ယá€á€¯ ကá½á€¼á‚ု္ပ္á€á€­á€¯á‚” ေပးပို႔လိုက္သည့္ အီးေမးလ္ရိွ လင့္á€á€¹á€€á€­á€¯ á‚ွိပ္ပါá‹"
+
+#~ msgid "Your email address:"
+#~ msgstr "သင္á အီးေမးလ္လိပ္စာ"
+
+#~ msgid "Your report"
+#~ msgstr "သင္á အစီရင္á€á€¶á€…ာ"
diff --git a/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
index 19533c6e7..19a17b697 100644
--- a/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -14,18 +14,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-24 06:19+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-10-15 09:47+0000\n"
"Last-Translator: pere <pere-transifex@hungry.com>\n"
-"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/fixmystreet/language/nb_NO/)\n"
+"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/mysociety/fixmystreet/language/nb_NO/)\n"
"Language: nb_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " og "
@@ -38,11 +38,13 @@ msgstr " og "
msgid " or "
msgstr " eller "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d bekreftede varsler, %d ubekreftede"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d administrasjonskontakter &ndash; %d bekreftet, %d ubekreftet"
@@ -51,11 +53,13 @@ msgstr "%d administrasjonskontakter &ndash; %d bekreftet, %d ubekreftet"
msgid "%d edits by %s"
msgstr "%d redigeringer av %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d aktive oppdateringer"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d spørreskjema sendt &ndash; %d besvart (%s%%)"
@@ -68,15 +72,54 @@ msgstr "%d til %d av %d"
msgid "%s - Summary reports"
msgstr "%s - oppsummeringsrapporter"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"Fiksgatami har ulike RSS-strømmer og e-postlister om lokale problemer, dette inkluderer problemer meldt innenfor en bestemt bydel eller administrasjon, eller et område med problemer\n"
+"innen en angitt distanse fra en bestemt posisjon."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"Fiksgatami har ulike RSS-strømmer og e-postlister om lokale problemer, dette inkluderer problemer meldt innenfor en bestemt bydel eller administrasjon, eller et område med problemer\n"
+"innen en angitt distanse fra en bestemt posisjon."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr "FiksGataMi sender forskjellige kategorier problemer til forskjellige administrasjoner, problemer som gjelder flere administrasjoner blir sendt til alle de det gjelder."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s bydel, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, rapportert %s"
@@ -88,59 +131,57 @@ msgstr "%s, innefor bydel %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> -bidragsytere"
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Ta det med ro; vi tar vare på varselet ditt mens du sjekker e-posten din.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Ta det med ro &mdash; vi tar vare på varselet ditt mens du sjekker e-posten din.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Ta det med ro &mdash; vi tar vare på oppdateringen din mens du sjekker e-posten din.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Epost i misbrukstabellen)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Ditt navn"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Ditt telefonnummer"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(en standardavstand som dekker en befolkning på omtrent 200 000)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(alternativt kan RSS-strømmen tilpasses, innenfor"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(lukket)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(løst)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(som tagging, søppel, hull i veien, eller ødelagte gatelys)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(ikke rapportert til administrasjonen)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(valgfritt)"
@@ -148,25 +189,24 @@ msgstr "(valgfritt)"
msgid "(public)"
msgstr "(offentlig)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(sendt til begge)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(vi viser aldri din e-postadresse eller telefonnummer)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(vi viser aldri din e-postadresse)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Velg en kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Velg en eiendomsstype --"
@@ -179,12 +219,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr "<code>MAPIT_URL</code> er satt (<code>%s</code>) men ingen <code>MAPIT_TYPES</code>.<br>Dette er antagelig hvorfor \"dekket område\" er tom (under).<br>Kanskje du skal legge til noen <code>MAPIT_TYPES</code> i konfigurasjonsfilen?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Hvis du ikke kan se kartet, <a href='%s' rel='nofollow'>hopp over dette steget</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> aktive problemer"
@@ -197,28 +239,22 @@ msgstr "<strong>Nei</strong> La meg bekrefte min rapport med e-post"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Nei</strong> La meg bekrefte min oppdatering med e-post"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Nei</strong>, la meg logge inn med e-post:"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Nei</strong>, det gjør jeg ikke. La meg logge inn med e-post:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nei</strong>, la meg bekrefte min rapport med e-post:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nei</strong>, la meg bekrefte min oppdatering med e-post:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -229,8 +265,8 @@ msgstr "<strong>Ja</strong>, jeg har et passord"
msgid "About us"
msgstr "Om oss"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -252,7 +288,7 @@ msgstr "Legg til en kontakt ved å bruke formen under."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Legg til administrasjon"
@@ -265,10 +301,15 @@ msgstr "Legg til ny kategori"
msgid "Add user"
msgstr "Legg til bruker"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "La til %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Avventer moderasjon"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Gjenta:"
@@ -281,21 +322,25 @@ msgstr "Varsel %d opprettet for %s, type %s, parameter %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Varsel %d koblet ut (opprettet %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Send meg varsel ved fremtidige oppdateringer"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Alle rapporter"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Alle rapporter"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alle rapporter"
@@ -318,8 +363,7 @@ msgstr "All informasjonen du har lagt inn her vil bli sendt til"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "All informasjonen du har lagt inn her vil bli sendt til <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "En oppdatering markerte dette problemet som fikset."
@@ -328,16 +372,12 @@ msgstr "En oppdatering markerte dette problemet som fikset."
msgid "Anonymous"
msgstr "Anonym"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonym:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Er du en <strong>utvikler</strong>? Kunne du tenke deg å bidra til FiksGataMi?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Er du en utvikler?"
@@ -352,22 +392,25 @@ msgstr "Dekket område"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr "Da reproduksjonsstedet og %s ikke stemmer, vil meldingen som er laget her, bli sendt til problemrapportøren, og ikke til kontakten som er gitt for meldingformålet."
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Tildel til ekstern administrasjon:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Flytt til en annen kategori:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Tildel til ekstern administrasjon:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Tildelt underavdeling:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Tildelt %s"
@@ -388,12 +431,12 @@ msgstr "Avventer moderasjon"
msgid "Back"
msgstr "Tilbake"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Bannlys epostadresse"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Administrasjoner"
@@ -413,12 +456,16 @@ msgstr "Administrasjon:"
msgid "By Date"
msgstr "PÃ¥ dato"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Hvis du ikke kan se kartet, <em>hopp over dette steget</em>."
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -429,27 +476,28 @@ msgstr "Hvis du ikke kan se kartet, <em>hopp over dette steget</em>."
msgid "Category"
msgstr "Kategori"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Løsningsrate fordelt på kategori for problemer > 4 uker gamle"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategori: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Bytt passord"
@@ -491,54 +539,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr "Velg et <strong>kategorinavn</strong> som gir mening for innbyggerne (f.eks. \"Hull i veien\", \"Gatelys\") men som også er nyttig for administrasjonen. Disse vil dukke opp i nedtrekksmenyen på rapporter-et-problem-siden."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
-msgstr "Klikk her eller tast inn dato på formater dd/mm/åååå"
+msgstr "Klikk her eller tast inn dato på formatet dd/mm/åååå"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klikk i kartet for å rapportere et problem"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Lukket"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "(ikke rapportert til administrasjonen)"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Fiksede rapporter"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Lukket:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "De nærmeste problemene <small>(innenfor&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Koordinater:"
@@ -546,22 +600,22 @@ msgstr "Koordinater:"
msgid "Cobrand"
msgstr "Merkevaresamarbeid"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Merkevaresamarbeidsdata:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Merkevaresamarbeid:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Oppsett"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Sett opp endepunkt"
@@ -569,7 +623,7 @@ msgstr "Sett opp endepunkt"
msgid "Confirm"
msgstr "Bekreft"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Bekreft konto"
@@ -589,7 +643,7 @@ msgstr "Bekreftelse"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Bekreftet"
@@ -600,13 +654,18 @@ msgstr "Bekreftede rapporter mellom %s og %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Bekreftet:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontakt FiksGataMi"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontakt oss"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -621,8 +680,14 @@ msgstr "Kontakt oss"
msgid "Contact the team"
msgstr "Kontakt prosjektgruppen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinater:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Kunne ikke finne bruker"
@@ -640,7 +705,7 @@ msgstr "Administrasjon"
msgid "Council contacts for %s"
msgstr "Administrasjonskontakter for %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "administrasjonsreferanse:&nbsp;%s"
@@ -655,7 +720,7 @@ msgstr "Administrasjon:"
msgid "Count"
msgstr "Antall"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Lag en rapport"
@@ -664,17 +729,19 @@ msgstr "Lag en rapport"
msgid "Create category"
msgstr "Lag kategori"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Lag en rapport"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Opprettet"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Opprettet:"
@@ -684,10 +751,15 @@ msgid "Current state"
msgstr "Gjeldende tilstand"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "I øyeblikket er ikke laget noen instanser."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -697,11 +769,16 @@ msgstr "Oversikt"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Behandlet av underavdeling innen 5 arbeidsdager"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Slettet"
@@ -719,9 +796,9 @@ msgstr "Detaljer"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detaljer:"
@@ -729,23 +806,27 @@ msgstr "Detaljer:"
msgid "Devolved"
msgstr "Delegert"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "brukte ikke kart"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Arbeidshester"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Har du et FixMyBarangay-passord?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Har du et FiksGataMi-passord?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Vet ikke"
@@ -753,8 +834,8 @@ msgstr "Vet ikke"
msgid "Don't like forms?"
msgstr "Liker ikke skjemaer?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -776,7 +857,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Rediger"
@@ -787,7 +869,7 @@ msgstr "Rediger detaljer for administrasjon"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -802,15 +884,15 @@ msgstr "Redigerer oppdatering %d"
msgid "Editing user %d"
msgstr "Redigerer bruker %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Oppdatert av"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -818,7 +900,7 @@ msgstr "Oppdatert av"
msgid "Email"
msgstr "E-post"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Epost lagt til misbruksliste"
@@ -834,7 +916,7 @@ msgstr "Epostvarsel laget"
msgid "Email alert deleted"
msgstr "Epostvarsel slettet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Epost allerede i misbrukslisten"
@@ -847,40 +929,38 @@ msgid "Email me updates"
msgstr "Send meg oppdateringer"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-post:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "E-post: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Tom leilighet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Tomt hus eller bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Tomt kontor eller forretningsbygg"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Tom pub eller bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
-msgstr "Tom offentlig bygning - skole, sykehos, etc."
+msgstr "Tom offentlig bygning - skole, sykehus, etc."
#: templates/web/base/admin/body-form.html:162
#: templates/web/base/admin/body-form.html:163
@@ -891,7 +971,7 @@ msgid ""
" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
msgstr ""
"Bruk <strong>Open311 update-sending</strong> hvis målet er å sende og motta\n"
-"oppdateringer til eksisterende rapporter. Hvis du ikke er sikker, skjer det nok ikke S la den forbli uavkrysset. For mer informasjon, se\n"
+"oppdateringer til eksisterende rapporter. Hvis du ikke er sikker, skjer det nok ikke, så la den forbli uavkrysset. For mer informasjon, se\n"
"<a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>denne artikkelen</a>."
#: templates/web/base/admin/body-form.html:222
@@ -901,7 +981,7 @@ msgid ""
" different endpoint (and send method) from the body's. For example, if reports for some categories of\n"
" problem must be emailed, while others can be sent over Open311."
msgstr ""
-"Bruk <strong>can be devolved</strong> settingen hvis en eller flere kontakter ha\n"
+"Bruk <strong>can be devolved</strong> settingen hvis en eller flere kontakter har\n"
"et ulikt leveringspunkt (og sendemetode) fra administrasjonenen. For eksempel, hvis noen meldingstyper enten må \n"
" e-postes, mens andre kan sendes med Open311."
@@ -913,7 +993,7 @@ msgstr "Slutt-dato:"
msgid "Endpoint"
msgstr "Endepunkt"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Skriv inn et veinavn i Z&uuml;rich"
@@ -926,10 +1006,8 @@ msgstr "Skriv inn et britisk postnummer i nærheten, eller veinavn og sted"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Skriv inn postnummer i nærheten, eller veinavn og sted"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Skriv inn et veinavn og sted"
@@ -937,13 +1015,12 @@ msgstr "Skriv inn et veinavn og sted"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Velg et nærliggende gatenavn og område, postnummer eller distrikt i Delhi"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Skriv inn et nytt passord:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -954,7 +1031,6 @@ msgstr "Skriv inn et nytt passord"
msgid "Enter details of the problem"
msgstr "Legg inn detaljer om problemet"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -964,6 +1040,10 @@ msgstr "Legg inn detaljer om problemet"
msgid "Error"
msgstr "Feil"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -977,12 +1057,20 @@ msgstr "Eksempler:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "Forklar hva som er galt, nøyaktig hvor det er og hvor lenge det har vært galt..."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "Ekstern URL"
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
-msgstr ""
+msgstr "Ekstern URL"
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Ekstra data:"
@@ -995,8 +1083,7 @@ msgstr "Klarte ikke sende melding"
msgid "Filter report list"
msgstr "Filtrer rapportliste"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Første gang"
@@ -1004,38 +1091,14 @@ msgstr "Første gang"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Fiks dette ved å velge en <strong>area covered</strong> i <em> Edit body details</em>-skjemaet nedenfor."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FiksGataMi"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FiksGataMi-administrator:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"Fiksgatami har ulike RSS-strømmer og e-postlister om lokale problemer, dette inkluderer problemer meldt innenfor en bestemt bydel eller administrasjon, eller et område med problemer\n"
-"innen en angitt distanse fra en bestemt posisjon."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr "FiksGataMi sender forskjellige kategorier problemer til forskjellige administrasjoner, problemer som gjelder flere administrasjoner blir sendt til alle de det gjelder."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1046,21 +1109,16 @@ msgstr "FiksGataMi sender forskjellige kategorier problemer til forskjellige adm
msgid "Fixed"
msgstr "Løst"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Løst - Administrasjon"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Løst - Bruker"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Fiksede rapporter"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Løst:"
@@ -1070,11 +1128,11 @@ msgstr "Løst:"
msgid "Flag as deleted"
msgstr "Merk som slettet"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Flag bruker"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Flagget:"
@@ -1091,7 +1149,7 @@ msgstr "Flaggede brukere er listet opp på <a href='%s'>flaggede</a>-siden."
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Flaggede brukere er ikke begrenset på noe måte. Dette er bare en liste med brukere som har blitt markert for å gi dem oppmerksomhet."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Flagget:"
@@ -1110,9 +1168,22 @@ msgstr "For mer informasjon, se <a href='http://fixmystreet.org/customising/fms_
msgid "Forgotten your password?"
msgstr "Glemt passordet ditt?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Tildel til ekstern administrasjon:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Tildel til ekstern administrasjon:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Ofte spurte spørsmål"
@@ -1135,8 +1206,7 @@ msgstr "FÃ¥ oppdateringer for problemer i denne %s"
msgid "Get updates of problems in this %s"
msgstr "FÃ¥ oppdateringer for problemer i denne %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Gi meg en RSS-strøm"
@@ -1145,17 +1215,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr "Glad for å høre at det er i orden!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Søk"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Skal det sendes spørreskjema?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Graf over problemoppretting fordelt på status over tid"
@@ -1163,41 +1233,37 @@ msgstr "Graf over problemoppretting fordelt på status over tid"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Linjer med grå bakgrunn er administrasjoner som ikke lenger eksisterer."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Har dette problemet blitt løst?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Har du rapportert et problem til en administrasjon før, eller er dette første gangen?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Hjelp"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Her er de forskjellige typene lokale problemvarsler for &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hei, %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1211,7 +1277,7 @@ msgstr "Skjul gamle"
msgid "Hide pins"
msgstr "Skjul nåler"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historie"
@@ -1227,7 +1293,7 @@ msgstr "Hvordan rapportere et problem"
msgid "How to send successful reports"
msgstr "Hvordan sende inn rapporter som løses"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Jeg er redd du ikke kan bekrefte ubekreftede rapporter."
@@ -1254,8 +1320,8 @@ msgstr "Jeg er redd vi ikke kunne verifisere den referansen. Hvis du kopierte we
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1271,19 +1337,7 @@ msgstr "Identifiser en <strong>parent</strong> hvis instansen selv er en del av
msgid ""
"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
-msgstr "Hvis to eller flere instanser er lokalisert på samme sted, kombinerer FiksGataMi identiske kategorier i en enkelt oppføring menyen. Kontroller at du bruker samme kategorinavn for instansene, hvis det det er ønskelig."
-
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Hvis du ikke gjør dette vil ikke ditt varsel bli aktivert"
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Hvis du ikke gjør dette vil ikke din rapport bli publisert"
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Hvis du ikke gjør dette vil ikke din oppdatering bli publisert"
+msgstr "Hvis to eller flere instanser er lokalisert på samme sted, kombinerer FiksGataMi identiske kategorier i en enkelt oppføring i menyen. Kontroller at du bruker samme kategorinavn for instansene, hvis dette er ønskelig."
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
@@ -1294,16 +1348,16 @@ msgstr "Hvis du får mer informasjon om status for problemet ditt, vær så snil
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Hvis du sender inn et problem hit, så vil emne og detaljer for problemet være offentlig, men problemet vil <strong>ikke</strong> bli rapportert til administrasjonen."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Hvis du bruker web-basert e-post eller har filtre for søppel-e-post på din e-postkonto, kan du i noen tilfellet måtte se etter våre meldinger der."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Hvis du ønsker å legge til en offentlig kommentar på problemet, legg den til her\n"
"(denne blir ikke sendt til administrasjonen). Du kan for eksempel\n"
@@ -1321,7 +1375,7 @@ msgid ""
" Check that your cobrand supports this feature before switching it on."
msgstr ""
"Hvis du har aktivert Open311 update-sending ovenfor, vil Open311 vanligvis bare godta OPEN eller CLOSED status i\n"
-"sine oppdateringer. Aktiver <strong>extended Open311 stauses</strong> hvis du vil tillate ekstra tilstander.\n"
+"sine oppdateringer. Aktiver <strong>extended Open311 statuses</strong> hvis du vil tillate ekstra tilstander.\n"
"Sjekk at cobrand støtter denne funksjonen før du slår den på."
#: templates/web/base/admin/body-form.html:194
@@ -1330,7 +1384,7 @@ msgid ""
"If you've enabled Open311 update-sending above, enable <strong>suppression of alerts</strong> \n"
" if you do <strong>not</strong> want that user to be notified whenever these updates are created."
msgstr ""
-"Hvis du har aktiviert Open311 update-sending ovenfor, aktiver <strong>suppression of alerts</strong>,\n"
+"Hvis du har aktivert Open311 update-sending ovenfor, aktiver <strong>suppression of alerts</strong>,\n"
"hvis du <strong>ikke</strong> ønsker å varsle denne brukeren hver gang disse oppdateringene blir laget."
#: templates/web/base/admin/body-form.html:177
@@ -1343,7 +1397,7 @@ msgstr ""
"Hvis du har aktivert Open311 update-sending ovenfor, må du identifisere hvilke FiksGataMi <strong>bruker</ strong> som blir kreditert for oppdateringer \n"
"når de blir vist på nettstedet. Vis ID (nummer) for denne brukeren."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Ugyldig ID"
@@ -1368,14 +1422,13 @@ msgstr "I misbrukstabell?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "I tillegg er følgende attributter som ikke er del av Open311 v2-spesifikasjonen returnert: agency_sent_datetime, title (også returnert som del av description), interface_used, comment_count, requestor_name (kun tilstede hvis innsender tillot at navnet kunne vises på dette nettstedet)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Under arbeid"
@@ -1383,9 +1436,9 @@ msgstr "Under arbeid"
msgid "Inbox zero, here we come!"
msgstr "Tom innboks, her kommer vi!"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
-msgstr "Inkluder rapporørens personlige detaljer"
+msgstr "Inkluder rapportørens personlige detaljer"
#: templates/web/base/admin/stats.html:76
msgid "Include unconfirmed reports"
@@ -1395,12 +1448,12 @@ msgstr "Inkluder ubekreftede problemer"
msgid "Incorrect has_photo value \"%s\""
msgstr "Feil has_photo-verdi \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Interne notater"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Interne referanser"
@@ -1408,7 +1461,7 @@ msgstr "Interne referanser"
msgid "Invalid agency_responsible value %s"
msgstr "Ugyldig agency_responsible-verdi %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Ugyldig slutt-dato"
@@ -1416,12 +1469,12 @@ msgstr "Ugyldig slutt-dato"
msgid "Invalid format %s specified."
msgstr "Ugyldig format %s oppgitt."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Ugyldig startdato"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1439,10 +1492,19 @@ msgstr "Det er ofte raskest å <a href=\"%s\">sjekke FAQ-en vår</a> og se om sv
msgid "It’s on its way to the council right now."
msgstr "Den er på tur mot myndigheten akkurat nå."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1454,7 +1516,7 @@ msgstr "Husk min innlogging på denne datamaskinen"
msgid "Last editor"
msgstr "Sist redigert av"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Siste oppdatering:"
@@ -1489,7 +1551,7 @@ msgstr "Lokal RSS-strøm og e-postvarsel"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Lokal RSS-strøm og e-postvarsel for ‘%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Lokale varsler"
@@ -1502,14 +1564,12 @@ msgid "MAP"
msgstr "KART"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Kart"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "markert som lukket"
+msgstr "Marker som sendt"
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1517,16 +1577,26 @@ msgstr "Merk brukere hvis adferd du ønsker å ha en sjekk på som <strong>flagg
#: templates/web/base/reports/index.html:24
msgid "Marked fixed/closed in the past eight weeks"
-msgstr ""
+msgstr "Merket fikset/lukket i løpet av de siste åtte ukene"
#: templates/web/base/reports/index.html:25
msgid "Marked fixed/closed more than eight weeks ago"
-msgstr ""
+msgstr "Merket fikset/lukket mer enn åtte uker siden"
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Melding"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Tildel til ekstern administrasjon:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Tildel til ekstern administrasjon:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Melding:"
@@ -1554,27 +1624,25 @@ msgstr "Flere problemer i nærheten"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Navn"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Navn:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Navn: %s"
@@ -1587,12 +1655,12 @@ msgstr "Nærmeste navngitte vei til nålen plassert på kartet (automatisk gener
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Nærmeste postnummer til nålen plassert på kartet (automatisk generert): %s (%sm unna)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Nærmeste vei til nålen plassert på kartet (automatisk generert ved hjelp av Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1600,10 +1668,15 @@ msgstr ""
"Nærmeste vei til nålen plassert på kartet (automatisk generert ved hjelp av Bing Maps) er: %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Nesten ferdig! Nå må du sjekke e-posten din..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Nesten ferdig! Nå må du sjekke e-posten din..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nye <br>problemer"
@@ -1612,12 +1685,12 @@ msgstr "Nye <br>problemer"
msgid "New body added"
msgstr "Ny administrasjon lagt til"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Ny kategorikontakt lagt til"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Nytt internt notat:"
@@ -1625,9 +1698,10 @@ msgstr "Nytt internt notat:"
msgid "New local problems on FixMyStreet"
msgstr "Nye lokale problemer på FiksGataMi"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nye lokale rapporter på reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Nytt internt notat:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1653,33 +1727,15 @@ msgstr "Nye rapporter innenfor grensen til {{NAME}} på FiksGataMi"
msgid "New reports"
msgstr "Nye rapporter"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nye rapporter for {{COUNCIL}} innenfor {{WARD}} bydel på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nye rapporter på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nye rapporter på reportemptyhomes.com nær postnummer {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nye rapporter til {{COUNCIL}} på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nye rapporter innenfor grensen til {{NAME}} på reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Ny tilstand"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Ny oppdatering:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Ny tilstand"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1692,14 +1748,12 @@ msgstr "Neste"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nei"
@@ -1727,20 +1781,11 @@ msgstr "Fant ingen flaggede problemer."
msgid "No flagged users found."
msgstr "Fant ingen flaggede brukere."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Ingen flere oppdateringer"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Ingen problemer ble funnet."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Ingen problemer er rapportert"
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Ingen resultater returnert"
@@ -1761,8 +1806,6 @@ msgid "No supporters"
msgstr "Ingen støttespillere"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Ingen"
@@ -1776,11 +1819,11 @@ msgid ""
msgstr ""
"Vanlige (offentlige) brukere bør ikke være forbundet med noen <strong>instans</ strong>. <br>\n"
"Autoriserte brukere i staben kan være forbundet med den instansen de representerer. <br>\n"
-"Avhengig av implementeringen, kan ansatte brukere har tilgang til dashbordet (sammendrag av \n"
+"Avhengig av implementeringen, kan ansatte brukere ha tilgang til dashbordet (sammendrag av \n"
"aktivitet for hele instansen), mulighet å skjule meldinger eller sette status for spesialrapporter."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1788,7 +1831,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Ikke ansvarlig"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Ikke ansvarlig"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Ikke for min underavdeling"
@@ -1801,7 +1852,7 @@ msgid "Not reported to council"
msgstr "Ikke rapportert til administrasjonen"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Merk"
@@ -1811,7 +1862,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Merk at når vi tar med ubekreftede rapporter så brukes datoen rapporten var opprettet, hvilket ikke trenger være den samme måneden som rapporten var bekreftet, så tallene kan hoppe litt opp og ned."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Merk:"
@@ -1820,22 +1871,20 @@ msgstr "Merk:"
msgid "Note: <strong>%s</strong>"
msgstr "Note: <strong>%d</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "På tide å sende din rapport&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "På tide å sende din rapport&hellip; har du et FiksGataMi-passord?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "På tide å registrere din oppdatering&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "På tide å registrere din oppdatering&hellip; har du et FiksGataMi-passord?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1865,35 +1914,28 @@ msgstr "Eldre <br>problemer"
msgid "One-line summary"
msgstr "Enlinjers oppsummering"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Ã…pen"
#: templates/web/base/reports/index.html:22
msgid "Open for more than four weeks, with an update within the past eight weeks"
-msgstr ""
-
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Ã…pne rapporter"
+msgstr "Åpen i mer enn fire uker, med en oppdatering i løpet av de siste åtte ukene"
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
-msgstr ""
+msgstr "Åpen, men har ikke hatt noen oppdateringer på åtte uker"
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
@@ -1907,32 +1949,26 @@ msgstr "Open311-initiativets nettside"
msgid "Open311 specification"
msgstr "Open311-spesifikasjon"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Eller problemer meldt til:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Eller du kan abonnere på varsel basert på bydel eller administrasjon du hører inn under:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Annet"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Vår kildekode er fri programvare og <a href=\"http://github.com/mysociety/fixmystreet\">tilgjengelig på GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Eier"
@@ -1947,12 +1983,12 @@ msgstr "Fant ikke siden"
msgid "Parent"
msgstr "Forelder"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Delvis"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1961,6 +1997,7 @@ msgid "Password (optional)"
msgstr "Passord (valgfritt)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Passord:"
@@ -1968,7 +2005,7 @@ msgstr "Passord:"
msgid "Permalink"
msgstr "Permalink"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Telefonnummer"
@@ -1977,11 +2014,9 @@ msgstr "Telefonnummer"
msgid "Phone number (optional)"
msgstr "Telefonnummer (valgfritt)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefon:"
@@ -1992,14 +2027,23 @@ msgstr "Telefon:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Bilde"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Denne informasjonen er påkrevd"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Denne informasjonen er påkrevd"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Bilde:"
@@ -2011,22 +2055,18 @@ msgstr "Bilder av nye problemer i nærheten"
msgid "Place pin on map"
msgstr "Plasser tegnestiften på kartet"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planlagt"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Vennligst <a class=\"tab_link\" href=\"#report\">se over</a> oppdateringene som har blitt lagt inn."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Vær høflig, poengtert og kortfattet."
@@ -2036,22 +2076,20 @@ msgstr "Vær høflig, poengtert og kortfattet."
msgid "Please check the passwords and try again"
msgstr "Vennligst sjekk passordene og prøv igjen"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Vennligst sjekk e-posten du oppgav"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Vennligst sjekk at du har skrevet en gyldig e-postadresse"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2061,15 +2099,16 @@ msgstr "Velg en kategori"
msgid "Please choose a property type"
msgstr "Velg en type egenskap"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Husk å rette opp feilene nedenfor."
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"Vennligst <strong>ikke</strong> rapporter feil gjennom denne siden; meldingene går til\n"
@@ -2081,7 +2120,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Ikke vær ufin &mdash; å kjefte på din administrasjon skader verdien av tjenesten for alle brukerne."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Vennligst legg til en melding"
@@ -2092,15 +2131,15 @@ msgstr "Vennligst legg til en melding"
msgid "Please enter a password"
msgstr "Skriv inn et passord"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Vennligst legg inn et emne"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2108,7 +2147,7 @@ msgid "Please enter a valid email"
msgstr "Legg til en gyldig e-post"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Legg inn din e-post"
@@ -2117,21 +2156,19 @@ msgstr "Legg inn din e-post"
msgid "Please enter some details"
msgstr "Legg inn opplysninger om problemet"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Legg inn din e-post"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Vennligst tast inn din e-postadresse"
@@ -2144,8 +2181,8 @@ msgstr "Vennligst tast inn ditt fornavn"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Vennligst legg inn ditt fulle navn, administrasjoner som mottar ditt problem trenger dette - hvis du ikke ønsker at ditt navn skal vises, fjern haken under"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2186,13 +2223,13 @@ msgstr ""
"Vennligst fyll inn skjemaet under med detaljene om problemet,\n"
"og beskriv plasseringen så nøyaktig som mulig i boksen for detaljer."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Vennligst indiker om du ønsker å motta et nytt spørreskjema"
#: templates/web/fixmystreet/report/updates-sidebar-notes.html:4
msgid "Please note that updates are not sent to the council."
-msgstr "Vær oppmerksom på at oppdaterginger ikke blir videresendt til administrasjonen."
+msgstr "Vær oppmerksom på at oppdateringer ikke blir videresendt til administrasjonen."
#: templates/web/base/report/update-form.html:7
msgid "Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
@@ -2209,19 +2246,24 @@ msgstr "Merk at din rapport <strong>ennå ikke er sendt</strong. Velg en katego
msgid "Please note:"
msgstr "Vennligst merk deg:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Vennligst bidra med en forklaring for hvorfor du gjenåpner denne problemrapporten"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
-msgstr "Vennligst bidra med litt tekst i tilegg til et bilde"
+msgstr "Vennligst bidra med litt tekst i tillegg til et bilde"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Vennligst opplys om du har rapportert et problem til din administrasjon tidligere"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Velg en administrasjon"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Velg den kilden du ønsker"
@@ -2230,21 +2272,17 @@ msgstr "Velg den kilden du ønsker"
msgid "Please select the type of alert you want"
msgstr "Vennligst velg hvilken type varsel du ønsker"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Vennligs oppgi om dette problemet er blitt fikset eller ikke"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Vennligst se over oppdateringene som har blitt lagt inn."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Vennligst last opp kun JPEG-bilder"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Skriv inn en melding"
@@ -2253,8 +2291,8 @@ msgid "Please write your update here"
msgstr "Vennligst skriv inn din oppdatering her"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2275,22 +2313,36 @@ msgstr "Lagt inn av %s (<strong>%s</strong>) %s"
msgid "Posted by %s at %s"
msgstr "Sendt inn av %s %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Forrige"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Personvern"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privat"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problem"
@@ -2306,12 +2358,12 @@ msgstr "Problem %s bekreftet"
msgid "Problem %s sent to council %s"
msgstr "Problem %s sendt til administrasjon %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Tilstandsfordeling av problemer"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problem markert som åpent."
@@ -2327,12 +2379,10 @@ msgstr "Problemer"
msgid "Problems in this area"
msgstr "Problemer i dette området"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemer i nærheten"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemer på kartet"
@@ -2341,12 +2391,11 @@ msgstr "Problemer på kartet"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problemer nylig rapportert fikset på FiksGataMi"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemer innenfor %.1fkm av denne posisjonen"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2358,20 +2407,17 @@ msgstr "Problemer innenfor %s"
msgid "Problems within %s ward"
msgstr "Problemer innenfor %s bydel"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemer innenfor %s, Fiksgatami"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemer innenfor %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemer innenfor grensene av:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Eiendommer nylig rapportert som gått tilbake i bruk på reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Eiendomsadresse:"
@@ -2385,39 +2431,31 @@ msgstr "Type egenskap:"
msgid "Provide an update"
msgstr "Bidra med en oppdatering"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Det er valgfritt å oppgi navn og passord, men hvis du gjør det kan du enklere rapportere problemer, legge igjen oppdateringer og håndtere rapportene dine."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
-msgstr "Det er valgfritt å oppgi et passord, men om du gjør det vil det bli enklere for deg å rapportere problemer, legge inn oppdateringer og holde oversikt over dine rapporter"
+msgstr "Det er valgfritt å oppgi et passord, men hvis du gjør det vil det bli enklere for deg å rapportere problemer, legge inn oppdateringer og holde oversikt over dine rapporter"
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Offentlig respons:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publiser bilde"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publiser svar"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Spørreskjema"
@@ -2433,12 +2471,11 @@ msgstr "Spørreskjema %d sendt for problem %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Spørreskjema fylt inn av feilrapportøren"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2464,8 +2501,7 @@ msgstr "RSS-strøm fra %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS-strøm av %s, innenfor %s bydel"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS-strøm med problemer i nærheten"
@@ -2473,7 +2509,7 @@ msgstr "RSS-strøm med problemer i nærheten"
msgid "RSS feed of problems in this %s"
msgstr "RSS-strøm for problemer i denne %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2503,41 +2539,47 @@ msgstr "RSS-strøm med oppdateringer for dette problemet"
msgid "Receive email when updates are left on this problem."
msgstr "Motta e-post når det er oppdateringer på dette problemet"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Nylige lokale problemer, FiksGataMi."
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Nylig løste <br>problemer"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Nylig meldte problemer"
#: templates/web/zurich/report/new/notes.html:5
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
-msgstr "Husk at FiksGataMi primert er laget for å rapportere fysiske problemer som kan bli fikset. Hvis ditt problem ikke er egnet for å sende inn via denne tjenesten, husk at du kan kontakte administrasjonen direkte via deres egen nettside."
+msgstr "Husk at FiksGataMi primert er laget for å rapportere fysiske problemer som kan bli fikset. Hvis ditt problem ikke er egnet for å sende inn via denne tjenesten, så husk at du kan kontakte administrasjonen direkte via deres egen nettside."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Fjern flagg"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Fjern bilde (kan ikke gjøres om!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "rediger bruker"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr "Rapport"
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Rapporter et problem"
@@ -2546,7 +2588,7 @@ msgstr "Rapporter et problem"
msgid "Report abuse"
msgstr "Rapporter misbruk"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Rapport på %s"
@@ -2555,83 +2597,82 @@ msgstr "Rapport på %s"
msgid "Report your problem"
msgstr "Rapporter problemet ditt"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Rapporter, finn eller diskuter lokale problemer"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Rapportert %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Rapportert %s, til %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Rapportert anonymt %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Rapportert tidligere"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Publisert av %s %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Rapportert %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Rapportert i kategorien %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Rapportert i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Rapportert i kategorien %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Publisert av %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
-msgstr "Rapporter av %s av %s %s"
+msgstr "Rapportert av %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Rapportert av %s i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Rapportert av %s i kategorien %s av %s %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Rapportert i kategorien %s"
+msgstr "Rapportert i løpet av de siste fire ukene"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Rapportert %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Legger til et problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Rapporter"
@@ -2644,18 +2685,21 @@ msgstr "Rapportene begrenses til %s tegn. Rapporten må forkortes."
msgid "Reports awaiting approval"
msgstr "Rapporter som venter på godkjenning"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Problemer i og rundt kartet"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Publiserte rapporter"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Send rapport på nytt"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Riktig sted?"
@@ -2670,26 +2714,32 @@ msgstr "Veioperatør for denne navngitte veien (utledet fra veiens referansenumm
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Veioperatør for denne navngitte veien (fra OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Roter til venstre"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Roter til høyre"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "Satelitt"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Lagre endringer"
@@ -2702,7 +2752,7 @@ msgstr "Søk i rapporter"
msgid "Search Users"
msgstr "Søk i brukere"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Søk i rapporter"
@@ -2734,20 +2784,25 @@ msgstr "Velg en bestemt administrasjon for å se problemer som er sendt dit."
msgid "Select an area"
msgstr "Velg et område"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Velg hvilken type varsel du ønsker og klikk på knappen for en RSS-kilde, eller skriv inn din e-postadresse for å abonnere på et e-postvarsel."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Ã…pne rapporter"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Sendt til %s %s senere"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Sendt:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Tjeneste:"
@@ -2756,8 +2811,8 @@ msgstr "Tjeneste:"
msgid "Share"
msgstr "Dele"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2773,34 +2828,23 @@ msgid "Show pins"
msgstr "Vis nåler"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Logg inn"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Logg inn via epost"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Logg inn eller opprett en konto"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Logg ut"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Logget inn som %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Noen kategorier krever kanskje mer informasjon"
@@ -2819,8 +2863,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Noen bilder av nylig meldte problemer"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Noe tekst å oversette"
@@ -2828,24 +2873,32 @@ msgstr "Noe tekst å oversette"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Beklager det ser ut til å være et \"Crown dependency\"-postnummer, som vi ikke dekker."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Beklager, men det oppsto et problem når vi forsøkte å bekrefte problemrapporten din"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Beklager, vi kunne ikke finne det stedet."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Beklager, vi kunne ikke tolke den posisjonen. Vennligst prøv på nytt."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Beklager, vi kunne ikke tolke den posisjonen. Vennligst prøv på nytt."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Start-dato:"
@@ -2861,16 +2914,17 @@ msgstr "Tilstand"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Tilstand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistikk"
@@ -2884,7 +2938,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr "Fortsatt åpen via spørreskjema, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Underkategori: %s"
@@ -2899,45 +2958,42 @@ msgstr "Emne"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Emne:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Send inn"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Send inn endringer"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Send inn spørreskjema"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Sendt inn"
@@ -2948,18 +3004,19 @@ msgstr "Sendt inn"
msgid "Subscribe"
msgstr "Abonner"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Jeg ønsker å abonnere på e-postvarsel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Oppsummering"
@@ -2970,7 +3027,7 @@ msgstr "Oppsummering"
msgid "Summary reports"
msgstr "Oppsummeringsrapporter"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Spørreundersøkelse"
@@ -2978,9 +3035,18 @@ msgstr "Spørreundersøkelse"
msgid "Survey Results"
msgstr "Resultater fra spørreundersøkelsen"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Oppdateringer"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Tekst"
@@ -2989,6 +3055,7 @@ msgid "Text only version"
msgstr "Tekst-versjon"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Tekst:"
@@ -2999,7 +3066,7 @@ msgstr "Takk for at du rapporterte dette problemet!"
#: templates/web/base/tokens/error.html:7
msgid "Thank you for trying to confirm your update or problem. We seem to have an error ourselves though, so <a href=\"%s\">please let us know what went on</a> and we'll look into it."
-msgstr "Takk for at du forsøker å bekrefte din oppdatering eller ditt problem. Vi ser ut til å ha en feil hos oss, så <a href=\"%s\">vær så snill å fortell oss hva som skjedde</a> så skal vi se på saken."
+msgstr "Takk for at du forsøker å bekrefte din oppdatering eller ditt problem. Vi ser ut til å ha en feil hos oss, så <a href=\"%s\">vær så snill å fortelle oss hva som skjedde</a> så skal vi se på saken."
#: templates/web/base/tokens/confirm_update.html:15
msgid "Thank you for updating this issue!"
@@ -3010,21 +3077,21 @@ msgstr "Takk for at du oppdaterte dette problemet!"
msgid "Thank you for your feedback"
msgstr "Takk for din tilbakemelding"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
-msgstr "Takk for at du lastet opp ditt bilde. Vi må nå plassere ditt problem, så vær så snill å skriv inn navnet på en vei eller et postnummer i området i boksen ovenfor&nbsp;:"
+msgstr "Takk for at du lastet opp ditt bilde. Vi må nå plassere ditt problem, så vær så snill å skrive inn navnet på en vei eller et postnummer i området i boksen ovenfor&nbsp;:"
#: templates/web/base/questionnaire/creator_fixed.html:9
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Takk, glad for å høre at problemet er fikset! Vi vil gjerne spørre deg om du har rapportert et problem til en administrasjon tidligere?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
-msgstr "Bildet ser ikke ut til å blitt lastet opp riktig (%s), prøv på nytt."
+msgstr "Bildet ser ikke ut til å ha blitt lastet opp riktig (%s), prøv på nytt."
#: perllib/FixMyStreet/App/Controller/Council.pm:97
msgid "That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again."
-msgstr "Det stedet dekkes ikke av noen administrasjon, kanskje det er til havs eller utenfor lander - vennligst forsøk et annet sted."
+msgstr "Det stedet dekkes ikke av noen administrasjon, kanskje det er til havs eller utenfor landet - vennligst forsøk et annet sted."
#: perllib/FixMyStreet/App/Controller/Location.pm:126
msgid "That location does not appear to be in the UK; please try again."
@@ -3036,20 +3103,19 @@ msgstr "Det stedet virker ikke å være i Storbritannia. Vennligst prøv igjen."
msgid "That postcode was not recognised, sorry."
msgstr "Det postnummeret ble ikke gjenkjent, beklager."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Det problemet vil nå bli sendt på nytt."
+msgstr "Det problemer har blitt markert som sendt."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Det problemet vil nå bli sendt på nytt."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
-msgstr "Dene rapporten kan ikke vises på %s."
+msgstr "Den rapporten kan ikke ses på %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Den rapporten har blitt fjernet fra FiksGataMi."
@@ -3086,7 +3152,7 @@ msgid ""
" If you leave this blank, <strong>send method defaults to email</strong>."
msgstr ""
"<Strong>Sendemetoden</strong> bestemmer hvordan problemmeldinger blir sendt til administrasjonen.\n"
-"Hvis du lar dette stå tomt, <strong>sender metodestandarden til e-post</strong>."
+"Hvis du lar dette stå tomt, <strong>er sendemetoden som standard til e-post</strong>."
#: templates/web/base/open311/index.html:90
msgid "The Open311 v2 attribute agency_responsible is used to list the administrations that received the problem report, which is not quite the way the attribute is defined in the Open311 v2 specification."
@@ -3101,10 +3167,6 @@ msgstr ""
"Administrasjonens <strong>navn</strong> identifiserer instansen (for eksempel, <em>Borsetshire District Council</em>)\n"
"og kan bli vist utad."
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Bekreftelsese-posten <strong>kan</strong> bruke noen minutter før den kommer frem &mdash; så vær tålmodig."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
@@ -3114,27 +3176,19 @@ msgstr ""
" vegg), hva det er, hvor lenge det har vært der, en beskrivelse (og et bilde av\n"
" problemet hvis du har et), osv."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Detaljene om ditt problem er tilgjengelig under den andre fanen ovenfor."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Detaljene om ditt problem er tilgjengelig på høyre kant av denne siden."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "The diligency prize league tabellen viser redaktørenes aktivitet, (hvem som har redigert flest)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Feilen var: %s"
#: templates/web/base/open311/index.html:86
msgid "The following Open311 v2 attributes are returned for each request: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code and service_name."
-msgstr "De følgende Open311 v2-atributtene blir returnert for hver forespørsel: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code and service_name."
+msgstr "De følgende Open311 v2-atributtene blir returnert for hver forespørsel: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code og service_name."
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:159
#: perllib/FixMyStreet/Geocode/OSM.pm:144
@@ -3146,10 +3200,6 @@ msgstr "Følgende informasjon om nærmeste vei kan være unøyaktig eller irrele
msgid "The latest local problems reported by users"
msgstr "De siste lokale problemer rapportert av brukere"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "De siste lokale rapporter rapportert av brukere"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "De siste problemer for {{COUNCIL}} rapportert av brukere"
@@ -3170,21 +3220,9 @@ msgstr "De siste problemer rapportert fikset av brukere"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "De siste problemer innenfor grensen til {{NAME}} rapportert av brukere"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "De siste eiendommer rapportert tilbake i bruk av brukere"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "De siste rapporter for {{COUNCIL}} rapportert av brukere"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "De siste rapporter for {{COUNCIL}} innenfor {{WARD}} bydel rapporter av brukere"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "De siste rapporter innenfor grensen til {{NAME}} rapportert av brukere"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3200,8 +3238,7 @@ msgstr "Passordene er ikke like"
msgid "The requested URL '%s' was not found on this server"
msgstr "Den forespurte URL '%s' ble ikke funnet på denne tjeneren"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Den enkleste meldingen er vår geografiske:"
@@ -3212,7 +3249,7 @@ msgstr "Den enkleste meldingen er vår geografiske:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "Oppsummeringen og beskrivelsen vil også offentliggjøres (se våre <a href=\"/privacy\">personvernregler</a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Brukeren kunne ikke plassere problemet på et kart, men sjekk området rundt stedet de skrev inn"
@@ -3225,36 +3262,37 @@ msgstr ""
"Brukerens <strong>navn</strong> vises offentlig på rapporter som ikke er markert med <em>anonym</em>.\n"
"Navn er ikke nødvendigvis unike."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr "Det er ingen rapporter å vise."
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Det var problemer med å vise 'Alle rapporter'-siden. Vennligst prøv igjen senere."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Det var problemer med å vise denne siden. Vennligst prøv igjen senere."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Det var problemer med din e-post/passord-kombinasjon. Hvis du har glemt ditt passord, eller hvis du ikke har et, vennligst fyll inn «Logg inn via e-post»-delen av skjemaet"
#: perllib/FixMyStreet/App/Controller/Alert.pm:355
msgid "There was a problem with your email/password combination. Please try again."
-msgstr "Det var problemer med din epost/passord-kombinasjon. Vær så snill å forsøk igjen."
+msgstr "Det var problemer med din epost/passord-kombinasjon. Vær så snill å forsøke igjen."
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:272
msgid "There was a problem with your update. Please try again."
-msgstr "Det var problemer med din oppdatering. Vær så snill å forsøk igjen."
+msgstr "Det var problemer med din oppdatering. Vær så snill å forsøke igjen."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Det var problemer med din rapport. Vennligst se under."
@@ -3286,13 +3324,13 @@ msgid ""
" Consequently, none of its categories will appear in the drop-down category menu when users report problems.\n"
" Currently, users <strong>cannot report problems to this body</strong>."
msgstr ""
-"Denne administrasjonen dekker ikke noe område. Dette betyr at instansen ikke har jurisdiksjon over rapporterte problemer<em> på noe sted </ em> .\n"
+"Denne administrasjonen dekker ikke noe område. Dette betyr at instansen ikke har jurisdiksjon over rapporterte problemer <em>på noe sted</em> .\n"
"Følgelig vil ingen av kategoriene vises i rullegardinkategori-menyen når brukere rapporterer problemer.\n"
"For tiden <strong>kan ikke brukerne rapportere problemer til denne administrasjonen</strong>."
#: templates/web/base/admin/body.html:54
msgid "This body has no contacts. This means that currently problems reported to this body <strong>will not be sent</strong>."
-msgstr "Denne instansen har ingen kontakter. Det betyr at i dag vil rapporterte problemer til denne instansen <strong>ikke bli sendt</strong>."
+msgstr "Denne instansen har ingen kontakter. Det betyr at for tiden vil rapporterte problemer til denne instansen <strong>ikke bli sendt</strong>."
#: templates/web/base/admin/body-form.html:52
#: templates/web/base/admin/body-form.html:53
@@ -3303,16 +3341,16 @@ msgstr ""
"Denne instansen får bare rapporter for problemer som er lokalisert i <strong>area covered</strong>.\n"
"En instans vil ikke få noen meldinger om det ikke dekker minst ett område."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Denne e-posten har blitt sendt til begge administrasjonene som dekker stedet for problemet, da brukeren ikke kategoriserte det. Vær så snill å ignorere den hvis dere ikke er korrekt administrasjon for å håndtere denne saken, eller gi oss beskjed om hvilken kategori av problemer dette er så vi kan legge det til i vårt system."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Denne e-posten har blitt sendt til flere administrasjoner som dekker stedet for problemet, da den valgte kategorien er tilgjengelig for disse. Vær så snill å ignorere e-posten hvis dere ikke er korrekt administrasjon for å håndtere denne saken."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3326,7 +3364,7 @@ msgstr "Dette er et utviklernettsted. Ting kan knekke når som helst og database
msgid "This is a summary of all reports on this site."
msgstr "Dette er en opplisting av alle problemene i denne tjenesten."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "Dette kan være fordi lenken er for gammel eller allerede brukt, eller at lenken ikke ble kopiert riktig."
@@ -3351,57 +3389,71 @@ msgstr "Dette problemet er under arbeid"
#: templates/web/base/report/banner.html:9
msgid "This problem is old and of unknown status."
-msgstr "Dette problemet er gammel og med ukjent status."
+msgstr "Dette problemet er gammelt og med ukjent status."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Denne rapporten avventer moderasjon"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Denne rapporten er for tiden markert som lukket."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Denne rapporten er for tiden markert som fikset."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Denne rapporten er for tiden markert som åpen."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Denne rapporten ble rapportert anonymt"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Denne nettsiden inneholder også et bilde av problemet, sendt inn av brukeren."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Tidslinje"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Tittel"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "For å <strong>rapportere et problem</strong>, klikk på riktig sted på kartet."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Tittel"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Du finner lokale problemer ved å søke på ditt postnummer, veinavn eller sted"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Du finner lokale problemer ved å søke på ditt postnummer, veinavn eller sted"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
-msgstr "For å se en kart med en mer presis plassering for dette problemet."
+msgstr "For å se et kart med en mer presis plassering for dette problemet."
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3417,8 +3469,8 @@ msgstr "Prøv igjen"
msgid "Try emailing us directly:"
msgstr "Forsøk å sende epost direkte til oss:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3426,11 +3478,11 @@ msgstr "Forsøk å sende epost direkte til oss:"
msgid "Unable to fix"
msgstr "Kan ikke fikses"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Ubekreftet"
@@ -3447,7 +3499,9 @@ msgstr "Ukjent varsel-type"
msgid "Unknown error"
msgstr "Ukjent feil"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Ukjent problem-Id"
@@ -3470,11 +3524,11 @@ msgid "Update below added by %s at %s"
msgstr "Oppdateringen under lagt til av %s %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Oppdater administrasjon"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Tilstandsfordeling for oppdateringer"
@@ -3509,24 +3563,24 @@ msgstr "Oppdatering:"
msgid "Updated"
msgstr "Oppdatert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Oppdatert!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Oppdateringer"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "Oppdateringer er begrenset til %s tegn i lengde. Vennligst skriv en kortere tekst."
@@ -3534,27 +3588,30 @@ msgstr "Oppdateringer er begrenset til %s tegn i lengde. Vennligst skriv en kort
msgid "Updates on {{title}}"
msgstr "Oppdateringer av {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Oppdateringer til dette problemet, FiksGataMi"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
-msgstr "Bruk <strong>notatet</strong> for å notere detaljer som skal vises frem i admin-grensesnittet. Notater vises ikke offentlig og blir ikke sendt til myndigheten."
+msgstr "Bruk <strong>notater</strong> for å notere detaljer som skal vises frem i admin-grensesnittet. Notater vises ikke offentlig og blir ikke sendt til myndigheten."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Bruker"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "brukte kart"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Brukerflagg fjernet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Bruker flagget"
@@ -3562,23 +3619,23 @@ msgstr "Bruker flagget"
msgid "User search finds matches in users' names and email addresses."
msgstr "Brukersøk leter etter treff gjennom brukernavn og epostadresser. "
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Brukere"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Verdier oppdatert"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Se rapport på nettstedet"
@@ -3602,16 +3659,15 @@ msgid "Wards of this council"
msgstr "Bydeler innenfor denne administrasjonen"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Vi fant mer en ett treff for den plassen. Vi viser opp til ti treff, så forsøk et annet søk hvis din plass ikke er her."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Vi har ikke klart å bekrefte din konto - beklager."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Vi har sendt deg en epost som inneholder link for å bekrefte din konto."
@@ -3625,9 +3681,9 @@ msgstr "Vi viser aldri din e-postadresse"
msgid "We never show your email address or phone number."
msgstr "Vi viser aldri din e-postadresse eller ditt telefonnummer"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
-msgstr "Vi innser at %s kan være ansvarlig for dette problemet, men vi mangler for tiden kontaktinformasjon for dem. Hvis du vet om en egnet kontaktadresse, ta kontakt med oss."
+msgstr "Vi innser at %s kan være ansvarlig for dette problemet, men vi mangler for tiden kontaktinformasjon for dem. Hvis du vet om en egnet kontaktadresse, så ta kontakt med oss."
#: templates/web/base/index-steps.html:31
msgid "We send it to the council on your behalf"
@@ -3650,11 +3706,15 @@ msgstr "Vi ønsker å få din tilbakemelding om hva du mener om denne tjenesten.
msgid "We’ll get back to you as soon as we can."
msgstr "Vi tar kontakt med deg så snart vi kan."
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr "Hva er problemet og hvor skjer det?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "NÃ¥r redigert"
@@ -3663,7 +3723,7 @@ msgstr "NÃ¥r redigert"
msgid "When sent"
msgstr "NÃ¥r sendt"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Hel blokk med tomme leiligheter"
@@ -3671,16 +3731,22 @@ msgstr "Hel blokk med tomme leiligheter"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr "Hvorfor stoppe der? <a href=\"/alert\">Sett opp flere varsler</a> gratis."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
-msgstr "Når du søker etter forespørsler, så er det også mulig å søke etter agency_responsible for å begrense det til forespørsler som er sendt til en enkelt adminstrasjon. Søktetermen er administrasjons-IDen som oppgitt av <a href=\"%s\">MaPit</a>."
+msgstr "Når du søker etter forespørsler, så er det også mulig å søke etter agency_responsible for å begrense det til forespørsler som er sendt til en enkelt adminstrasjon. Søketermen er administrasjons-IDen som oppgitt av <a href=\"%s\">MaPit</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "Kunne du tenke deg å bidra til FiksGataMi? Kildekoden vår er fri programvare og <a href=\"http://fixmystreet.org\">tilgjengelig via fixmystreet.org</a>."
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Kunne du tenke deg å motta en ny forespørsel om 4 uker, som minner deg om å sjekke status?"
@@ -3706,15 +3772,13 @@ msgstr "Ã…r"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ja"
@@ -3749,7 +3813,7 @@ msgstr "Du kan legge en misbrukers epostadresse til misbrukslista, hvilket autom
#: templates/web/fixmystreet/contact/index.html:121
msgid "You can contact technical support on <a href='mailto:%s'>%s</a>"
-msgstr "Du kan kontakte teknisk støtte via "
+msgstr "Du kan kontakte teknisk støtte via <a href='mailto:%s'>%s</a>"
#: templates/web/base/admin/flagged.html:5
msgid ""
@@ -3779,11 +3843,9 @@ msgstr "Du avviste; vennligst fyll inn boksen ovenfor"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Du har allerede besvart dette spørreskjemaet. Hvis du har spørsmål, vennligst <a href='%s'>ta kontakt</a>, eller <a href='%s'>se på ditt problem</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Du har allerede lagt ved et bilde til dette problemet. Ã… legge ved et annet vil bytte ut dette."
@@ -3792,6 +3854,10 @@ msgstr "Du har allerede lagt ved et bilde til dette problemet. Ã… legge ved et a
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Du har allerede lagt ved et bilde til denne oppdateringen. Ã… legge ved et annet vil bytte ut dette."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3812,15 +3878,11 @@ msgstr "Du har nå lykkes med å bekrefte din e-postadresse."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Du har lykkes med å logge inn. Vennligst sjekk og bekreft at dine detaljer er korrekte:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Du har ikke laget en rapport ennå. <a href=\"%s\">Rapporter et problem nå.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Du må nå åpne lenken i e-posten vi akkurat sendte deg."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Du må <a href=\"%s\">add some bodies</a> (som kommuner eller avdelinger) før rapporten kan bli sendt. "
@@ -3833,18 +3895,16 @@ msgstr ""
"Du må legge til instanser (for eksempel kommuner eller avdelinger), slik at du deretter kan legge til \n"
"grupper av problemer de kan håndtere (som hull i gater og veier, eller gatelys) og kontakter (som en e-postadresse) som meldinger kan sendes til."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Ønsker du virkelig å sende på nytt?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Dine rapporter"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3853,22 +3913,17 @@ msgstr "Dine rapporter"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Din e-post"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Din e-postadresse"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Din e-postadresse:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3878,24 +3933,23 @@ msgstr "Din e-post"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Vi vil kun bruke personlig informasjon om deg i henhold til våre <a href=\"/faq#privacy\">personvernsregler.</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Ditt navn"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Ditt navn:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3908,19 +3962,15 @@ msgstr "Ditt passord har blitt endret"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Ditt telefonnummer"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Dine rapporter"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Dine oppdateringer"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Dine oppdateringer"
@@ -3928,23 +3978,31 @@ msgstr "Dine oppdateringer"
msgid "Your&nbsp;email:"
msgstr "Din&nbsp;e-post:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Alle rapporter"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "av %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Fiksede rapporter"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "administrasjon"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "brukte ikke kart"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "for eksempel «%s» eller «%s»"
@@ -3953,17 +4011,22 @@ msgstr "for eksempel «%s» eller «%s»"
msgid "edit user"
msgstr "rediger bruker"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Fiksede rapporter"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "fra %d forskjellige brukere"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "sist oppdatert %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "mindre enn et minutt"
@@ -4006,16 +4069,15 @@ msgstr "markert som planlagt"
#: templates/web/base/report/updates.html:53
msgid "marked as unable to fix"
-msgstr "marker som uløselig"
+msgstr "markert som uløselig"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/a"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "eller"
@@ -4025,16 +4087,16 @@ msgstr "eller finn min posisjon automatisk"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "opprinnelig lagt inn: &ldquo;%s&rdquo;"
@@ -4047,8 +4109,8 @@ msgstr "andre områder:"
msgid "reopened"
msgstr "åpnet på nytt"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "logg ut"
@@ -4064,17 +4126,20 @@ msgstr "den lokale administrasjonen"
msgid "there is no pin shown as the user did not use the map"
msgstr "Det vises ingen nål på grunn av at brukeren ikke brukte kartet"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "denne type lokalt problem"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "idag"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Fiksede rapporter"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "brukte kart"
@@ -4098,7 +4163,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> rapportert<br>nylig"
msgstr[1] "<big>%s</big> rapportert<br>nylig"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4112,7 +4177,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d støttespiller"
msgstr[1] "%d støttespillere"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4133,7 +4198,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Vi har ennå ikke detaljer for administrasjonen som dekker dette stedet."
msgstr[1] "Vi har ennå ikke detaljer for administrasjonene som dekker dette stedet."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4154,7 +4219,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> fikset siste måned"
msgstr[1] "<big>%s</big> fikset siste måned"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4168,5 +4233,143 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Vi har ennå <strong>ikke</strong> detaljene for den andre administrasjonen som dekker dette stedet."
msgstr[1] "Vi har ennå <strong>ikke</strong> detaljene for de andre administrasjonene som dekker dette stedet."
-#~ msgid "For council(s):"
-#~ msgstr "For administrasjon(ene):"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Ta det med ro; vi tar vare på varselet ditt mens du sjekker e-posten din.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Ta det med ro &mdash; vi tar vare på problemrapporten din mens du sjekker e-posten din.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Ta det med ro &mdash; vi tar vare på oppdateringen din mens du sjekker e-posten din.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Hvis du ikke kan se kartet, <a href='%s' rel='nofollow'>hopp over dette steget</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Nei</strong>, det gjør jeg ikke. La meg logge inn med e-post:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Er du en <strong>utvikler</strong>? Kunne du tenke deg å bidra til FiksGataMi?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "De nærmeste problemene <small>(innenfor&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontakt FiksGataMi"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Har du et FixMyBarangay-passord?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FiksGataMi-administrator:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Hvis du ikke gjør dette vil ikke ditt varsel bli aktivert"
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Hvis du ikke gjør dette vil ikke din rapport bli publisert"
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Hvis du ikke gjør dette vil ikke din oppdatering bli publisert"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nye lokale rapporter på reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nye rapporter for {{COUNCIL}} innenfor {{WARD}} bydel på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nye rapporter på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nye rapporter på reportemptyhomes.com nær postnummer {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nye rapporter til {{COUNCIL}} på reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nye rapporter innenfor grensen til {{NAME}} på reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Ny oppdatering:"
+
+#~ msgid "No problems found."
+#~ msgstr "Ingen problemer ble funnet."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Ingen problemer er rapportert"
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "På tide å sende din rapport&hellip; har du et FiksGataMi-passord?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "På tide å registrere din oppdatering&hellip; har du et FiksGataMi-passord?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Vår kildekode er fri programvare og <a href=\"http://github.com/mysociety/fixmystreet\">tilgjengelig på GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Vennligst <a class=\"tab_link\" href=\"#report\">se over</a> oppdateringene som har blitt lagt inn."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Vennligst se over oppdateringene som har blitt lagt inn."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemer innenfor %s, Fiksgatami"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Eiendommer nylig rapportert som gått tilbake i bruk på reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publiser svar"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Rapportert %s, til %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Problemer i og rundt kartet"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Logg inn via epost"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Logget inn som %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "E-postbekreftelsen <strong>kan</strong> bruke noen minutter før den kommer frem &mdash; så vær tålmodig."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Detaljene om ditt problem er tilgjengelig under den andre fanen ovenfor."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Detaljene om ditt problem er tilgjengelig på høyre kant av denne siden."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "De siste lokale rapporter rapportert av brukere"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "De siste eiendommer rapportert tilbake i bruk av brukere"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "De siste rapporter for {{COUNCIL}} rapportert av brukere"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "De siste rapporter for {{COUNCIL}} innenfor {{WARD}} bydel rapportert av brukere"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "De siste rapporter innenfor grensen til {{NAME}} rapportert av brukere"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "For å <strong>rapportere et problem</strong>, klikk på riktig sted på kartet."
+
+#~ msgid "User"
+#~ msgstr "Bruker"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Du må nå åpne lenken i e-posten vi akkurat sendte deg."
+
+#~ msgid "Your email address:"
+#~ msgstr "Din e-postadresse:"
+
+#~ msgid "Your report"
+#~ msgstr "Dine rapporter"
diff --git a/locale/nl_NL.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nl_NL.UTF-8/LC_MESSAGES/FixMyStreet.po
index 50ba74fd9..019eb04ae 100644
--- a/locale/nl_NL.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/nl_NL.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -9,18 +9,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/fixmystreet/language/nl_NL/)\n"
+"Language-Team: Dutch (Netherlands) (http://www.transifex.com/mysociety/fixmystreet/language/nl_NL/)\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "en"
@@ -33,11 +33,13 @@ msgstr "en"
msgid " or "
msgstr "of"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d geverifieerde meldingen, %d ongeverifieerd"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d gemeente contactpersonen &ndash; %d geverifieerd, %d ongeverifieerd"
@@ -46,11 +48,13 @@ msgstr "%d gemeente contactpersonen &ndash; %d geverifieerd, %d ongeverifieerd"
msgid "%d edits by %s"
msgstr "%d bewerkingen door %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d live updates"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d vragenlijsten verzonden &ndash; %d beantwoord (%s%%)"
@@ -63,15 +67,50 @@ msgstr ""
msgid "%s - Summary reports"
msgstr "%s - Overzichtsverslagen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr "FixMyStreet heeft diverse RSS feeds en e-mail meldingen voor lokale problemen zoals meldingen voor problemen in bepaalde wijken of gemeentes, of alle problemen binnen een bepaalde straal."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr "FixMyStreet heeft diverse RSS feeds en e-mail meldingen voor lokale problemen zoals meldingen voor problemen in bepaalde wijken of gemeentes, of alle problemen binnen een bepaalde straal."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr "FixMyStreet heeft diverse categorieën per gemeente voor problemen daarom kan het voorkomen dat problemen binnen de gemeentegrenzen niet getoond worden in een bepaalde gemeente."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s district, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr ""
@@ -83,59 +122,57 @@ msgstr "%s, in %s district"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Email in misbruiktabel)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Jouw naam"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Je telefoonnummer"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(een stand afstand waarbinnen ongeveer 200.000 mensen leven)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(als alternatief kan je de RSS feed aanpassen binnen"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(gesloten)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(opgelost)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(zoals graffiti, zwerfafval, losliggende tegels of straatverlichting) "
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(niet verstuurd naar de gemeente)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(optioneel)"
@@ -143,25 +180,24 @@ msgstr "(optioneel)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(verstuurd naar beide)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(we zullen je telefoonnummer of e-mailadres niet tonen)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(we zullen je e-mailadres niet tonen)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Kies een categorie --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Kies een woning type --"
@@ -174,12 +210,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Als je geen kaart ziet, <a href='%s' rel='nofollow'>sla dan deze stap over</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> actieve problemen"
@@ -192,28 +230,22 @@ msgstr "<strong>Nee</strong> Laat me mijn melding per e-mail bevestigen"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Nee</strong> Laat me mijn update per e-mail bevestigen"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Nee</strong> Laat me inloggen per e-mail"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Nee</strong>, die heb ik niet, laat me inloggen per e-mail:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nee</strong> Laat me mijn melding per e-mail bevestigen"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nee</strong> Laat me mijn update per e-mail bevestigen"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -224,8 +256,8 @@ msgstr "<strong>Ja</strong, ik heb een wachtwoord"
msgid "About us"
msgstr "Over ons"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -247,7 +279,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -260,10 +292,14 @@ msgstr "Voeg een nieuwe categorie toe"
msgid "Add user"
msgstr ""
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "%s toegevoegd"
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Nogmaals:"
@@ -276,21 +312,25 @@ msgstr "Melding %d gemaakt voor %s, type %s, parameters %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Melding %d inactief gemaakt (gemaakt %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Meld het me als er updates zijn"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Alle meldingen"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Alle meldingen"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alle meldingen"
@@ -313,8 +353,7 @@ msgstr "Alle informatie die je ingevuld hebt zal worden verstuurd naar"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Alle informatie die je hier opgeeft zal worden verzonden naar <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Een update heeft dit probleem als opgelost gemarkeerd."
@@ -323,16 +362,12 @@ msgstr "Een update heeft dit probleem als opgelost gemarkeerd."
msgid "Anonymous"
msgstr "Anoniem"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anoniem:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Ben je een <strong>ontwikkelaar</strong>? Wil je bijdragen aan FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Ben je een ontwikkelaar?"
@@ -347,22 +382,24 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -383,12 +420,12 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Verban e-mailadres"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -408,12 +445,16 @@ msgstr ""
msgid "By Date"
msgstr "Op datum"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Kan je de kaart niet zien? <em>Sla deze stap over</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -424,27 +465,28 @@ msgstr "Kan je de kaart niet zien? <em>Sla deze stap over</em>"
msgid "Category"
msgstr "Categorie"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Doorloopsnelheid voor problemen in categorie >4 weken oud"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Categorie:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Categorie: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Verander Wachtwoord"
@@ -477,54 +519,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klik op de kaart om een probleem te melden"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Gesloten"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Gesloten door gemeente"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Gesloten meldingen"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Gesloten:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Dichtstbijzijnde problemen <small>(binnen %skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Co&ouml;rdinaten:"
@@ -532,22 +580,22 @@ msgstr "Co&ouml;rdinaten:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Cobrand data:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Configureer eindpunt"
@@ -555,7 +603,7 @@ msgstr "Configureer eindpunt"
msgid "Confirm"
msgstr "Bevestig"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Bevestig account"
@@ -575,7 +623,7 @@ msgstr "Bevestiging"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Bevestigd"
@@ -586,13 +634,18 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Bevestigd:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Neem contact op met FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Contacteer ons"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -607,8 +660,14 @@ msgstr "Contacteer ons"
msgid "Contact the team"
msgstr "Neem contact op met het team"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Co&ouml;rdinaten:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Kan de gebruiker niet vinden"
@@ -626,7 +685,7 @@ msgstr "Gemeente"
msgid "Council contacts for %s"
msgstr "Gemeente contactpersongen voor %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "gemeente ref.: %s"
@@ -641,7 +700,7 @@ msgstr "Gemeente:"
msgid "Count"
msgstr "Aantal"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Maak een melding"
@@ -650,17 +709,19 @@ msgstr "Maak een melding"
msgid "Create category"
msgstr "Maak een categorie"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Maak een melding"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Aangemaakt"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Aangemaakt:"
@@ -670,10 +731,15 @@ msgid "Current state"
msgstr "Huidige status"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -683,11 +749,16 @@ msgstr "Dashboard"
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Verwijderd"
@@ -705,9 +776,9 @@ msgstr "Details"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Details:"
@@ -715,23 +786,27 @@ msgstr "Details:"
msgid "Devolved"
msgstr "Overgedragen"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "kaart niet gebruikt"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Toewijdingsranglijst"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Heb je een FixMyBarangay wachtwoord?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Heb je een FixMyStreet wachtwoord?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Geen idee"
@@ -739,8 +814,8 @@ msgstr "Geen idee"
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -759,7 +834,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Bewerk"
@@ -770,7 +846,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -785,15 +861,15 @@ msgstr "Bewerk update %d"
msgid "Editing user %d"
msgstr "Bewerk gebruiker %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Redacteur"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -801,7 +877,7 @@ msgstr "Redacteur"
msgid "Email"
msgstr "Email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Email toegevoegd aan zwarte lijst"
@@ -817,7 +893,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Email staat al op zwarte lijst"
@@ -830,38 +906,36 @@ msgid "Email me updates"
msgstr "Email me updates"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Lege flat of maisonette"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Leeg huis of bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Leeg kantoor of ander commercieel"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Lege kroeg of bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Leeg publiek gebouw - school, ziekenhuis etc."
@@ -890,7 +964,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -903,10 +977,8 @@ msgstr "Vul een dichtstbijzijnde UK postcode, of straatnaam en plaats in"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Geef dichtstbijzijnde postcode, of straatnaam en plaats"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Geef dichtstbijzijnde straatnaam en plaats"
@@ -914,13 +986,12 @@ msgstr "Geef dichtstbijzijnde straatnaam en plaats"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Geef nieuw wachtwoord:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -931,7 +1002,6 @@ msgstr "Geef wachtwoord "
msgid "Enter details of the problem"
msgstr "Geef details van het probleem"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -941,6 +1011,10 @@ msgstr "Geef details van het probleem"
msgid "Error"
msgstr "Foutmelding"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -954,12 +1028,19 @@ msgstr "Voorbeelden:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Extra info:"
@@ -972,8 +1053,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Eerste keer"
@@ -981,36 +1061,14 @@ msgstr "Eerste keer"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet admin:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr "FixMyStreet heeft diverse RSS feeds en e-mail meldingen voor lokale problemen zoals meldingen voor problemen in bepaalde wijken of gemeentes, of alle problemen binnen een bepaalde straal."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr "FixMyStreet heeft diverse categorieën per gemeente voor problemen daarom kan het voorkomen dat problemen binnen de gemeentegrenzen niet getoond worden in een bepaalde gemeente."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1021,21 +1079,16 @@ msgstr "FixMyStreet heeft diverse categorieën per gemeente voor problemen daaro
msgid "Fixed"
msgstr "Opgelost"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Opgelost - Gemeente"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Opgelost - Gebruiker"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Opgeloste meldingen"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Opgelost:"
@@ -1045,11 +1098,11 @@ msgstr "Opgelost:"
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Gemarkeerde gebruikr"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Gemarkeerd"
@@ -1066,7 +1119,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Gemarkeerd:"
@@ -1085,9 +1138,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Wachtwoord vergeten?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Veelgestelde Vragen"
@@ -1110,8 +1174,7 @@ msgstr "Updates over %s problemen ontvangen"
msgid "Get updates of problems in this %s"
msgstr "Updates in deze %s ontvangen"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Geef me een RSS feed"
@@ -1120,17 +1183,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Gaan"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Vragenlijst versturen?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Grafiek van problemen aangemaakt per status na verloop van tijd"
@@ -1138,41 +1201,37 @@ msgstr "Grafiek van problemen aangemaakt per status na verloop van tijd"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Grijze lijnen zijn gemeentes die niet meer bestaan."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Is dit probleem opgelost?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Heb je al eens eerder een probleem aan de gemeente gemeld, of is dit jouw eerste keer?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Help"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Hier zijn de soorten meldingen van lokale problemen voor '%s'."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hoi %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1186,7 +1245,7 @@ msgstr "Verberg oud"
msgid "Hide pins"
msgstr "Verberg spelden"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Geschiedenis"
@@ -1202,7 +1261,7 @@ msgstr "Hoe een melding maken"
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Ik ben bang dat je geen ongeverifieerde meldingen kunt bevestigen."
@@ -1229,8 +1288,8 @@ msgstr "Ik ben bang dat we je token niet kunnen valideren. Als je de URL uit een
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1248,18 +1307,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1269,16 +1316,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Het onderwerp en details van het probleem worden publiek zichtbaar als je deze instuurt, maar het probleem zal <strong>niet</strong> worden verzonden aan de gemeente."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Als je een gratis e-mailadres of spamfilter hebt kan het voorkomen dat deze de e-mail tegenhoud. "
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr "Als je een publieke update over dit probleem wil maken vul ht dan hier in. Deze wordt niet neer de gemeente gestuurd. Bijvoorbeeld hoe was jouw ervaring met het oplossen van dit probleem?"
#: templates/web/base/admin/body.html:149
@@ -1308,7 +1355,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Illegaal ID"
@@ -1333,14 +1380,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "Daarnaast worden de volgende attributen, die niet onderdeel zijn van de Open311 v2 specificatie meegestuurd: agency_sent_datetime, title (ook meegestuurd als onderdeel van de description), interface_used, comment_count, requestor_name (alleen aanwezig als deze getoond mag worden op de site)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "In Behandeling"
@@ -1348,7 +1394,7 @@ msgstr "In Behandeling"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1360,12 +1406,12 @@ msgstr "Ongeverifiëerde meldingen meesturen"
msgid "Incorrect has_photo value \"%s\""
msgstr "Ongeldige has_photo waarde \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1373,7 +1419,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr "Ongeldige agency_responsible waarde %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Ongeldige einddatum"
@@ -1381,12 +1427,12 @@ msgstr "Ongeldige einddatum"
msgid "Invalid format %s specified."
msgstr "Ongeldig formaat %s gespecifieerd"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Ongeldige startdatum"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1404,10 +1450,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1419,7 +1474,7 @@ msgstr "Hou me ingelogd op deze computer"
msgid "Last editor"
msgstr "Laatste bewerker"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Laatste update:"
@@ -1454,7 +1509,7 @@ msgstr "Lokale RSS feeds en e-mail meldingen"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Lokale RSS feeds en e-mail meldingen voor '%s'"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Lokale melding"
@@ -1467,11 +1522,10 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1491,6 +1545,14 @@ msgstr ""
msgid "Message"
msgstr "Bericht"
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Bericht:"
@@ -1518,27 +1580,25 @@ msgstr "Meer problemen dichtbij"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Naam"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Naam:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1551,12 +1611,12 @@ msgstr "Dichtstbijzijnde straat met naam voor lokatie op de kaart (automatisch g
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Dichtstbijzijnde postcode voor lokatie op de kaart (automatisch gegenereerd): %s (%sm afstand)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Dichtstbijzijnde straat voor lokatie op de kaart (automatisch gegenereerd via Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1564,10 +1624,15 @@ msgstr ""
"Dichtstbijzijnde weg op basis van de gemarkeerde plek op de kaart (automatisch gegenereerd door Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Bijna klaar! Kijk nu in je e-mail..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Bijna klaar! Kijk nu in je e-mail..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nieuw <br>problemen"
@@ -1576,12 +1641,12 @@ msgstr "Nieuw <br>problemen"
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Nieuw contactpersonen voor categorie toegevoegd"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1589,9 +1654,9 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr "Nieuwe lokale problemen op FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nieuwe lokale meldingen op reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
+msgstr ""
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1617,33 +1682,15 @@ msgstr "Nieuwe problemen binnen de grenzen van {{NAME}} op FixMyStreet"
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nieuwe melding voor {{COUNCIL}} binnen {{WARD}} district op reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nieuwe meldingen op reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nieuwe meldingen op reportemptyhomes.com dichtbij {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nieuwe melding voor {{COUNCIL}} op reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nieuwe melding binnen de grenzen van {{NAME}} op reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Nieuwe status"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr ""
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Nieuwe status"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1656,14 +1703,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nee"
@@ -1691,20 +1736,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Geen problemen gevonden."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Er zijn nog geen problemen gemeld."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1722,8 +1758,6 @@ msgid "No supporters"
msgstr "Geen medestanders"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Geen"
@@ -1736,8 +1770,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1745,7 +1779,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1758,7 +1799,7 @@ msgid "Not reported to council"
msgstr "Niet gemeld bij de gemeente"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Opmerking"
@@ -1768,7 +1809,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Let op dat als je onbevestigde meldingen meeneemt we de datum gebruiken waarop de melding is gemaakt, dit kan afwijken van de maand waarin de melding is bevestigd dus dan kunnen de cijfers afwijken."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Opmerking:"
@@ -1777,22 +1818,20 @@ msgstr "Opmerking:"
msgid "Note: <strong>%s</strong>"
msgstr "Opmerking: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Nu om je melding te verzend&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Nu om je melding te verzend&hellip; heb je een FixMyStreet wachtwoord?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Nu om je update te verzend&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Nu om je update te verzend&hellip; heb je een FixMyStreet wachtwoord?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1822,20 +1861,18 @@ msgstr "Oudere<br>problemen"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Open"
@@ -1843,11 +1880,6 @@ msgstr "Open"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Open meldingen"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1864,32 +1896,26 @@ msgstr "Open311 initiatief website"
msgid "Open311 specification"
msgstr "Open311 specificatie"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Of problemen gemeld aan:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Of je kan je abonneren op een melding gebaseerd op welke gemeente je woont:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Anders"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Onze code is open source en <a href=\"http://github.com/mysociety/fixmystreet\">te vinden op GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Eigenaar"
@@ -1904,12 +1930,12 @@ msgstr "Pagina Niet Gevonden"
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Gedeeltelijk"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1918,6 +1944,7 @@ msgid "Password (optional)"
msgstr "Wachtwoord (optioneel)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Wachtwoord:"
@@ -1925,7 +1952,7 @@ msgstr "Wachtwoord:"
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1934,11 +1961,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr "Telefoonnummer (optioneel)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefoonnummer:"
@@ -1949,14 +1974,23 @@ msgstr "Telefoonnummer:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Deze informatie is verplicht"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Deze informatie is verplicht"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto:"
@@ -1968,22 +2002,18 @@ msgstr "Foto's van recente meldingen dichtbij"
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Gepland"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "<a class=\"tab_link\" href=\"#report\">Neem een kijkje</a> bij de updates die zijn achtergelaten."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Wees beleefd, precies en beknopt"
@@ -1993,22 +2023,20 @@ msgstr "Wees beleefd, precies en beknopt"
msgid "Please check the passwords and try again"
msgstr "Controleer de wachtwoorden en probeer opnieuw"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Controleer je e-mail"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Controleer of je e-mailadres klopt"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2018,15 +2046,16 @@ msgstr "Kies een categorie"
msgid "Please choose a property type"
msgstr "Kies een pand type"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr "Maak alsjeblieft <strong>geen</strong> meldingen van problemen via dit formulier; meldingen gaan naar het team van FixMyStreet, en komen niet terecht bij de gemeente. Ga <a href=\"/\">naar de hoofdpagina</a> en volg de instructies."
@@ -2035,7 +2064,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Geef bericht in"
@@ -2046,15 +2075,15 @@ msgstr "Geef bericht in"
msgid "Please enter a password"
msgstr "Geef wachtwoord"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Geef onderwerp"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2062,7 +2091,7 @@ msgid "Please enter a valid email"
msgstr "Geef een geldig e-mailadres"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Geef een geldig e-mailadres"
@@ -2071,21 +2100,19 @@ msgstr "Geef een geldig e-mailadres"
msgid "Please enter some details"
msgstr "Geef details"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Geef een geldig e-mailadres"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Geef een geldig e-mailadres"
@@ -2098,8 +2125,8 @@ msgstr "Geef je voornaam"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Geef je volledige naam, gemeentes hebben deze informatie nodig. Mocht je niet willen dat je naam op de site getoond wordt, haal dan de vink beneden weg."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2138,7 +2165,7 @@ msgstr "Vul de details van het probleem in."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Vul zoveel mogelijk details in het veld beneden in. Vermeld ook de locatie zo precies mogelijk."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Geef aan of je een vragenlijst wilt ontvangen"
@@ -2161,19 +2188,24 @@ msgstr "Let op dat je melding <strong>nog niet is verzonden</strong>. Kies een c
msgid "Please note:"
msgstr "Let op:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Geef een reden op waarom je deze melding heropent"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Vermeld wat tekst en een foto"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Geef aan of je het probleem al eerder hebt doorgegeven aan de gemeente"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Kies de feed die je wilt"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Kies de feed die je wilt"
@@ -2182,21 +2214,17 @@ msgstr "Kies de feed die je wilt"
msgid "Please select the type of alert you want"
msgstr "Kies de melding die je wilt"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Geef aan of het probleem is verholpen"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Kijk eens naar de updates die zijn achter gelaten."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Je kan alleen een JPEG foto insturen"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Schrijf een bericht"
@@ -2205,8 +2233,8 @@ msgid "Please write your update here"
msgstr "Schrijf je update hier"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2227,22 +2255,36 @@ msgstr "Geplaatst door %s (<strong>%s</strong>) bij %s"
msgid "Posted by %s at %s"
msgstr "Geplaatst door %s bij %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privé"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Probleem"
@@ -2258,12 +2300,12 @@ msgstr "Probleem %s bevestigd"
msgid "Problem %s sent to council %s"
msgstr "Probleem %s verzonden naar gemeente %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Probleem verdeeld per status"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Probleem gemarkeerd als open"
@@ -2279,12 +2321,10 @@ msgstr "Problemen"
msgid "Problems in this area"
msgstr "Problemen in dit gebied"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemen dichtbij"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemen op de kaart"
@@ -2293,12 +2333,11 @@ msgstr "Problemen op de kaart"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Recent gemelde problemen op FixMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemen binnen een straal van %.1fkm van deze lokatie"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2310,20 +2349,17 @@ msgstr "Problemen binnen %s"
msgid "Problems within %s ward"
msgstr "Problemen binnen wijk %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemen binnen %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemen binnen %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemen binnen de grenzen van:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Recent gemelde hergebruikte panden op reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2337,39 +2373,31 @@ msgstr "Pand soort:"
msgid "Provide an update"
msgstr "Geef een update"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Het is optioneel om een wachtwoord op de geven, maar hiermee is het makkelijker om in de toekomst problemen te melden, updates te plaatsen en je meldingen te beheren."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Vragenlijst"
@@ -2385,12 +2413,11 @@ msgstr "Vragenlijst %d verzonden voor probleem %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Vragenlijst ingevuld door melder"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2416,8 +2443,7 @@ msgstr "RSS feed van %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS feed van %s, binnen wijk %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS feed van nabije problemen"
@@ -2425,7 +2451,7 @@ msgstr "RSS feed van nabije problemen"
msgid "RSS feed of problems in this %s"
msgstr "RSS feed van problemen in dit %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2455,17 +2481,18 @@ msgstr "RSS feed van updates voor dit probleem"
msgid "Receive email when updates are left on this problem."
msgstr "Ontvang een e-mail als updates worden achtergelaten bij dit probleem."
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Recente lokale problemen, FixMystreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Recent <br>opgelost"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Recent gemelde problemen"
@@ -2473,23 +2500,27 @@ msgstr "Recent gemelde problemen"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Onthoud dat FixMyStreet zich richt op het melden van fysieke problemen die opgelost kunnen worden. Als jouw probleem niet gepast is voor het melden via onze site kun je altijd direct contact opnemen met de gemeente via hun eigen website."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Verwijder markering"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Verwijder foto (kan niet ongedaan worden!)"
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Meld een probleem"
@@ -2498,7 +2529,7 @@ msgstr "Meld een probleem"
msgid "Report abuse"
msgstr "Meld misbruik"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Meld op %s"
@@ -2507,63 +2538,59 @@ msgstr "Meld op %s"
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Meld, bekijk of discussier over lokale problemen"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Gemeld %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Gemeld %s aan %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Anoniem gemeld bij %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Eerder gemeld"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Gemeld door %s bij %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Gemeld %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Anoniem gemeld in de categorie %s bij %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Gemeld in de categorie %s door %s bij %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Anoniem door %s gemeld bij %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Gemeld door %s door %s bij %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Anoniem gemeld bij %s in de categorie %s door %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Gemeld door %s in de categorie %s door %s bij %s"
@@ -2571,18 +2598,22 @@ msgstr "Gemeld door %s in de categorie %s door %s bij %s"
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Gemeld %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Meld een probleem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2595,18 +2626,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Melding op en nabij de kaart"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Herstuur melding"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2621,26 +2655,32 @@ msgstr "Wegbeheerder voor deze straat (afgeleid van wegnummer en type): %s"
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Wegbeheerder voor deze straat (uit OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Wijzigingen opslaan"
@@ -2653,7 +2693,7 @@ msgstr "Zoek Meldingen"
msgid "Search Users"
msgstr "Zoek Gebruikers"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2685,20 +2725,25 @@ msgstr "Selecteer een gemeente om te zien welke rapporten hierheen zijn gestuurd
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Selecteer op welke melding je wilt hebben en klik op de knop om een RSS feed te maken, of vul je e-mailadres in om je abonneren op een e-mailmelding."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Open meldingen"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Verzonden aan %s %s later"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Verzonden:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Service:"
@@ -2707,8 +2752,8 @@ msgstr "Service:"
msgid "Share"
msgstr "Deel"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2724,34 +2769,23 @@ msgid "Show pins"
msgstr "Toon spelden"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Inloggen"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Inloggen via e-mail"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Inloggen of maak een account"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Uitloggen"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Ingelogd als %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Sommige categorie&euml;n hebben extra informatie nodig."
@@ -2767,8 +2801,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2776,24 +2811,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2809,16 +2851,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2832,7 +2875,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2847,45 +2895,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2896,18 +2941,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2918,7 +2964,7 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2926,9 +2972,18 @@ msgstr ""
msgid "Survey Results"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Updates ontvangen"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -2937,6 +2992,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2958,7 +3014,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2966,7 +3022,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2984,20 +3040,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Dit probleem is opgelost"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3039,30 +3094,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "De details van je probleem zijn beschikbaar in het andere tabblad."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "De details van je probleem zijn beschikbaar aan de rechter kant van de pagina."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "De foutmelding was: %s"
@@ -3080,10 +3123,6 @@ msgstr "De volgende informatie over de dichtstbijzijnde weg kan onjuist of niet
msgid "The latest local problems reported by users"
msgstr "Laatste lokale problemen gemeld door gebruikers"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Laatste lokale meldingen gemaakt door gebruikers"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Laatste problemen voor {{COUNCIL}} gemeld door gebruiker"
@@ -3104,21 +3143,9 @@ msgstr "Laatste problemen die als opgelost zijn gemeld door gebruikers"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Laatste problemen binnen de grenzen van {{NAME}} gemeld door gebruikers"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Laatste panden die teruggemeld zijn door gebruikers"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Laatste meldingen voor {{COUNCIL}} gemeld door gebruikers"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Laatste meldingen voor {{COUNCIL}} binnen de wijk {{WARD}} gemeld door gebruikers"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Laatste meldingen binnen de grenzen van {{NAME}} gemeld door gebruikers"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3134,8 +3161,7 @@ msgstr "Wachtwoorden komen niet overeen"
msgid "The requested URL '%s' was not found on this server"
msgstr "De opgevraagde URL '%s' is niet gevonden op de server"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "De simpelste melding is onze geografische:"
@@ -3146,7 +3172,7 @@ msgstr "De simpelste melding is onze geografische:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "The gebruiker kon het probleem niet vinden op de kaart, maar het gebied rond de lokatie wordt op de kaart getoond"
@@ -3157,23 +3183,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Er was een probleem bij het tonen van de Alle Meldingen pagina. Probeer het later nog eens."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Er was een probleem bij het tonen van deze pagina. Probeer het later nog eens."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Er was een probleem met je e-mailadres/wachtwoord combinatie. Als je het wachtwoord niet kunt herinneren, of je hebt er geen een, vul dan het formulier &lsquo;inloggen via email&rsquo; in."
@@ -3186,7 +3213,7 @@ msgstr "Er was een probleem met je e-mailadres/wachtwoord combinatie. Probeer he
msgid "There was a problem with your update. Please try again."
msgstr "Er was een probleem met je update. Probeer het later nog eens."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Er was een probleem met je melding. Zie beneden."
@@ -3226,16 +3253,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Deze e-mail is naar meerdere contactpersonen gestuurd die mogelijk geïnteresseerd zijn in deze lokatie omdat de gebruiker geen categorie heeft aangegeven. Negeer deze melding als je niet de juiste contactpersoon bent, of laat ons weten in welke categorie dit probleem valt zodat we dit kunnen toevoegen aan ons systeem."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Deze e-mail is naar meerdere contactpersonen gestuurd die mogelijk geïnteresseerd zijn in deze lokatie. Negeer deze melding als je niet de juiste contactpersoon bent."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3249,7 +3276,7 @@ msgstr "Dit is een ontwikkelingssite; er kunnen mogelijk problemen optreden, en
msgid "This is a summary of all reports on this site."
msgstr "Dit is een samenvatting van alle meldingen op deze site."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3276,55 +3303,69 @@ msgstr "Aan dit probleem wordt gewerkt"
msgid "This problem is old and of unknown status."
msgstr "Dit probleem is oud, en de status is onbekend."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Deze melding is momenteel gemarkeerd als gesloten."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Deze melding is momenteel gemarkeerd als opgelost."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Deze melding is momenteel gemarkeerd als openstaand."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Deze pagina bevat een door de gebruiker aangeleverde foto van het probleem."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Tijdslijn"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titel"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Klik op de kaart op de juiste lokatie om <strong>een probleem te melden</strong>."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Vul je postcode of straatnaam en plaats in om te kijken welke lokale meldingen we voor je hebben."
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Vul je postcode of straatnaam en plaats in om te kijken welke lokale meldingen we voor je hebben."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3340,8 +3381,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3349,11 +3390,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3370,7 +3411,9 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3393,11 +3436,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3432,24 +3475,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3457,27 +3500,29 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "Updates over %s problemen ontvangen"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3485,23 +3530,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3525,16 +3570,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3548,7 +3592,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3573,11 +3617,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3586,7 +3634,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3594,16 +3642,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3629,15 +3683,13 @@ msgstr "Jaar"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ja"
@@ -3700,11 +3752,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Je hebt deze vragenlijst al ingevuld. Als je vragen hebt kan je <a href='%s'>contact opnemen</a> of <a href='%s'>je probleem bekijken</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Je hebt al een foto toegevoegd aan deze melding, als je nog een foto toevoegt overschrijft deze die."
@@ -3713,6 +3763,10 @@ msgstr "Je hebt al een foto toegevoegd aan deze melding, als je nog een foto toe
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Je hebt al een foto toegevoegd aan deze update, als je nog een foto toevoegt overschrijft deze die."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3733,15 +3787,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Je bent ingelogd; controleer of je gegevens nog kloppen:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3752,18 +3802,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Weet je zeker dat je dit opnieuw wilt versturen?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Jouw meldingen"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3772,22 +3820,17 @@ msgstr "Jouw meldingen"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Jouw e-mail"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Jouw e-mailadres"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Jouw e-mailadres:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3797,24 +3840,23 @@ msgstr "Jouw e-mail:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Je informatie wordt alleen gebruikt zoals vermeld in onze <a href=\"/privacy\">privacy policy</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Jouw naam"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Jouw naam:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3827,19 +3869,15 @@ msgstr "Je wachtwoord is gewijzigd"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Je telefoonnummer"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Jouw melding"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Jouw meldingen"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Jouw updates"
@@ -3847,23 +3885,31 @@ msgstr "Jouw updates"
msgid "Your&nbsp;email:"
msgstr "Jouw e-mail"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Alle meldingen"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "door %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Gesloten meldingen"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "gemeente"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "kaart niet gebruikt"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "bv. '%s' of '%s'"
@@ -3872,17 +3918,22 @@ msgstr "bv. '%s' of '%s'"
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Opgeloste meldingen"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "door %d verschillende gebruikers"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "minder dan een minuut"
@@ -3927,14 +3978,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/b"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "of"
@@ -3944,16 +3994,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3966,8 +4016,8 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3983,17 +4033,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Opgeloste meldingen"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4017,7 +4070,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4031,7 +4084,7 @@ msgid_plural "%d supporters"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4052,7 +4105,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4073,7 +4126,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4087,5 +4140,110 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] ""
msgstr[1] ""
-#~ msgid "For council(s):"
-#~ msgstr "For gemeente(s):"
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Als je geen kaart ziet, <a href='%s' rel='nofollow'>sla dan deze stap over</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Nee</strong>, die heb ik niet, laat me inloggen per e-mail:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Ben je een <strong>ontwikkelaar</strong>? Wil je bijdragen aan FixMyStreet?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Dichtstbijzijnde problemen <small>(binnen %skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Neem contact op met FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Heb je een FixMyBarangay wachtwoord?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet admin:"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nieuwe lokale meldingen op reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nieuwe melding voor {{COUNCIL}} binnen {{WARD}} district op reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nieuwe meldingen op reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nieuwe meldingen op reportemptyhomes.com dichtbij {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nieuwe melding voor {{COUNCIL}} op reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nieuwe melding binnen de grenzen van {{NAME}} op reportemptyhomes.com"
+
+#~ msgid "No problems found."
+#~ msgstr "Geen problemen gevonden."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Er zijn nog geen problemen gemeld."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Nu om je melding te verzend&hellip; heb je een FixMyStreet wachtwoord?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Nu om je update te verzend&hellip; heb je een FixMyStreet wachtwoord?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Onze code is open source en <a href=\"http://github.com/mysociety/fixmystreet\">te vinden op GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "<a class=\"tab_link\" href=\"#report\">Neem een kijkje</a> bij de updates die zijn achtergelaten."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Kijk eens naar de updates die zijn achter gelaten."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemen binnen %s, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Recent gemelde hergebruikte panden op reportemptyhomes.com"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Gemeld %s aan %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Melding op en nabij de kaart"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Inloggen via e-mail"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Ingelogd als %s"
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "De details van je probleem zijn beschikbaar in het andere tabblad."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "De details van je probleem zijn beschikbaar aan de rechter kant van de pagina."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Laatste lokale meldingen gemaakt door gebruikers"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Laatste panden die teruggemeld zijn door gebruikers"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Laatste meldingen voor {{COUNCIL}} gemeld door gebruikers"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Laatste meldingen voor {{COUNCIL}} binnen de wijk {{WARD}} gemeld door gebruikers"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Laatste meldingen binnen de grenzen van {{NAME}} gemeld door gebruikers"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Klik op de kaart op de juiste lokatie om <strong>een probleem te melden</strong>."
+
+#~ msgid "Your email address:"
+#~ msgstr "Jouw e-mailadres:"
+
+#~ msgid "Your report"
+#~ msgstr "Jouw melding"
diff --git a/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
index 585cb859a..d07075a7a 100644
--- a/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -11,18 +11,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/fixmystreet/language/nn_NO/)\n"
+"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/mysociety/fixmystreet/language/nn_NO/)\n"
"Language: nn_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr " og "
@@ -35,11 +35,13 @@ msgstr " og "
msgid " or "
msgstr " eller "
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d stadfesta varsel, %d ikkje stadfesta"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d administrasjonskontaktar &ndash; %d stadfesta, %d ikkje stadfesta"
@@ -48,11 +50,13 @@ msgstr "%d administrasjonskontaktar &ndash; %d stadfesta, %d ikkje stadfesta"
msgid "%d edits by %s"
msgstr "%d redigeringar av %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d aktive oppdateringar"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d spørjeskjema sendt &ndash; %d svart (%s%%)"
@@ -65,15 +69,54 @@ msgstr ""
msgid "%s - Summary reports"
msgstr "%s – oppsummeringsrapportar"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"Fiksgatami har ulike RSS-straumar og e-postlister om lokale problem, dette inkluderer problem meldt innanfor ein viss bydel eller administrasjon, eller eit område med problem\n"
+"innan ein gitt distanse frå ein viss posisjon."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"Fiksgatami har ulike RSS-straumar og e-postlister om lokale problem, dette inkluderer problem meldt innanfor ein viss bydel eller administrasjon, eller eit område med problem\n"
+"innan ein gitt distanse frå ein viss posisjon."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr "FiksGataMi sender ulike kategoriar problem til ulike administrasjonar, problem som gjeld fleire administrasjonar vert send til alle dei det gjeld."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s bydel, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr ""
@@ -85,59 +128,56 @@ msgstr "%s, innanfor bydelen %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Epost i misbruktabellen)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Namnet ditt:"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(ein standardavstand som dekkjer ein folkesetnad på omtrent 200 000)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(alternativt kan RSS-straumen tilpassast, innanfor"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(lukka)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(løyst)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(som tagging, søppel, hol i vegen, eller øydelagte gatelys)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(ikkje rapportert til administrasjonen)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(valfritt)"
@@ -145,25 +185,24 @@ msgstr "(valfritt)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(sendt til begge)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(vi viser aldri e-postadressa di eller telefonnummeret ditt)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(vi viser aldri e-postadressa di)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Vel ein kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Vel ein eigedomstype --"
@@ -176,12 +215,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Viss du ikkje kan sjå kartet, <a href='%s' rel='nofollow'>hopp over dette steget</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> aktive problem"
@@ -194,28 +235,22 @@ msgstr ""
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Nei</strong>, det gjer eg ikkje. La meg logga inn med e-post:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nei</strong>, la meg stadfesta rapporten min med e-post:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nei</strong>, la meg stadfesta oppdateringa mi med e-post:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -226,8 +261,8 @@ msgstr "<strong>Ja</strong>, eg har eit passord"
msgid "About us"
msgstr "Om oss"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -249,7 +284,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -262,10 +297,14 @@ msgstr "Legg til ny kategori"
msgid "Add user"
msgstr ""
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "La til %s"
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Gjenta:"
@@ -278,21 +317,25 @@ msgstr "Varsel %d oppretta for %s, type %s, parameter %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Varsel %d kobla ut (oppretta %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Send meg varsel ved framtidige oppdateringar"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr ""
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Alle rapportar"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alle rapportar"
@@ -315,8 +358,7 @@ msgstr "All informasjonen du har lagt inn her vil sendast til"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "All informasjonen du har lagt inn her vil sendast til <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Ei oppdatering markerte dette problemet som løyst."
@@ -325,16 +367,12 @@ msgstr "Ei oppdatering markerte dette problemet som løyst."
msgid "Anonymous"
msgstr "Anonym"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonym:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr ""
@@ -349,22 +387,24 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -385,12 +425,12 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Bannlys e-postadresse"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -410,12 +450,16 @@ msgstr ""
msgid "By Date"
msgstr "PÃ¥ dato"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -426,27 +470,28 @@ msgstr ""
msgid "Category"
msgstr "Kategori"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Løysingsrate fordelt på kategori for problem > 4 veker gamle"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategori: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Byt passord"
@@ -479,54 +524,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Lukka"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "(ikkje rapportert til administrasjonen)"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Lukka rapportar"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Lukka:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Dei næraste problema <small>(innanfor&nbsp;%skm)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Koordinatar:"
@@ -534,22 +585,22 @@ msgstr "Koordinatar:"
msgid "Cobrand"
msgstr "Merkevaresamarbeid"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Data om merkevaresamarbeid:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Merkevaresamarbeid:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -557,7 +608,7 @@ msgstr ""
msgid "Confirm"
msgstr "Stadfest"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Stadfest konto"
@@ -577,7 +628,7 @@ msgstr "Stadfesting"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Stadfesta"
@@ -588,13 +639,18 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Stadfesta:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontakt FiksGataMi"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontakt oss"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -609,8 +665,14 @@ msgstr "Kontakt oss"
msgid "Contact the team"
msgstr "Kontakt prosjektgruppa"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinatar:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Kunne ikkje finna brukaren"
@@ -628,7 +690,7 @@ msgstr "Administrasjon"
msgid "Council contacts for %s"
msgstr "Administrasjonskontaktar for %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -643,7 +705,7 @@ msgstr "Administrasjon:"
msgid "Count"
msgstr "Mengd"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Lag ein rapport"
@@ -652,17 +714,19 @@ msgstr "Lag ein rapport"
msgid "Create category"
msgstr "Lag kategori"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Lag ein rapport"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Oppretta"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Oppretta:"
@@ -672,10 +736,15 @@ msgid "Current state"
msgstr "Gjeldande tilstand"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -685,11 +754,16 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Sletta"
@@ -707,9 +781,9 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detaljar:"
@@ -717,23 +791,27 @@ msgstr "Detaljar:"
msgid "Devolved"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "brukte ikkje kart"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Arbeidshestar"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr ""
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Har du eit FiksGataMi-passord?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Veit ikkje"
@@ -741,8 +819,8 @@ msgstr "Veit ikkje"
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -761,7 +839,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Rediger"
@@ -772,7 +851,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -787,15 +866,15 @@ msgstr "Redigerer oppdatering %d"
msgid "Editing user %d"
msgstr "Redigerer brukar %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Oppdatert av"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -803,7 +882,7 @@ msgstr "Oppdatert av"
msgid "Email"
msgstr "E-post"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "E-post lagd til misbrukliste"
@@ -819,7 +898,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "E-post allereie i misbruklista"
@@ -832,38 +911,36 @@ msgid "Email me updates"
msgstr "Send meg oppdateringar"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "E-post:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Tom leilegheit"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Tomt hus eller bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Tomt kontor eller forretningsbygg"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Tom pub eller bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Tom offentleg bygning – skule, sjukehus, osb."
@@ -892,7 +969,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -905,10 +982,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr "Skriv inn postnummer i nærleiken, eller vegnamn og stad"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr ""
@@ -916,13 +991,12 @@ msgstr ""
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Skriv inn eit nytt passord:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -933,7 +1007,6 @@ msgstr "Enter a password"
msgid "Enter details of the problem"
msgstr "Legg inn detaljar om problemet"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -943,6 +1016,10 @@ msgstr "Legg inn detaljar om problemet"
msgid "Error"
msgstr "Feil"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -956,12 +1033,19 @@ msgstr "Døme:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr ""
@@ -974,8 +1058,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Første gong"
@@ -983,38 +1066,14 @@ msgstr "Første gong"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr ""
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FiksGataMi-administrator:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"Fiksgatami har ulike RSS-straumar og e-postlister om lokale problem, dette inkluderer problem meldt innanfor ein viss bydel eller administrasjon, eller eit område med problem\n"
-"innan ein gitt distanse frå ein viss posisjon."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr "FiksGataMi sender ulike kategoriar problem til ulike administrasjonar, problem som gjeld fleire administrasjonar vert send til alle dei det gjeld."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1025,21 +1084,16 @@ msgstr "FiksGataMi sender ulike kategoriar problem til ulike administrasjonar, p
msgid "Fixed"
msgstr "Løyst"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Løyst – Administrasjon"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Løyst – Brukar"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Løyste rapportar"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Løyst:"
@@ -1049,11 +1103,11 @@ msgstr "Løyst:"
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Flagg brukar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Flagga:"
@@ -1070,7 +1124,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Flagga:"
@@ -1089,9 +1143,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Ofte spurde spurnader"
@@ -1114,8 +1179,7 @@ msgstr ""
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Gje meg ein RSS-straum"
@@ -1124,17 +1188,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Hald fram"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Skal spørjeskjemaet sendast?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Graf over problemoppretting fordelt på status over tid"
@@ -1142,41 +1206,37 @@ msgstr "Graf over problemoppretting fordelt på status over tid"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Linjer med grå bakgrunn er administrasjonar som ikkje lenger eksisterer."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Har dette problemet vorte løyst?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Har du rapportert eit problem til ein administrasjon før, eller er dette første gongen?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Hjelp"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Her er dei ulike typane lokale problemvarsel for &laquo;%s&raquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1190,7 +1250,7 @@ msgstr ""
msgid "Hide pins"
msgstr "Skjul nåler"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historie"
@@ -1206,7 +1266,7 @@ msgstr "Korleis rapportera eit problem"
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Eg er redd du ikkje kan stadfesta ustadfesta rapportar."
@@ -1233,8 +1293,8 @@ msgstr "Eg er redd vi ikkje kunne verifisera den referansen. Viss du kopierte ne
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1252,18 +1312,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1273,16 +1321,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Viss du sender inn eit problem hit, så vil emnet og detaljar for problemet vera offentlege, men problemet vil <strong>ikkje</strong> rapporterast til administrasjonen."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Viss du brukar vevbasert e-post eller har filter for søppel-e-post på e-postkontoen din, kan du i visse tilfelle måtta sjå etter meldingane våre der."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Viss du ynskjer å leggja til ein offentleg kommentar på problemet, legg han til her\n"
"(denne vert ikkje send til administrasjonen). Du kan til dømes\n"
@@ -1315,7 +1363,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Ugyldig ID"
@@ -1340,14 +1388,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "I tillegg er følgjande attributt som ikkje er del av Open311 v2-spesifikasjonen returnert: agency_sent_datetime, title (òg returnert som del av description), interface_used, comment_count, requestor_name (berre tilstades viss innsendar tillét at namnet kunne visast på denne nettstaden)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr ""
@@ -1355,7 +1402,7 @@ msgstr ""
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1367,12 +1414,12 @@ msgstr "Inkluder ikkje-stadfesta problem"
msgid "Incorrect has_photo value \"%s\""
msgstr "Feil has_photo-verdi «%s»"
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1380,7 +1427,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr "Ugyldig agency_responsible-verdi %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Ugyldig slutt-dato"
@@ -1388,12 +1435,12 @@ msgstr "Ugyldig slutt-dato"
msgid "Invalid format %s specified."
msgstr "Ugyldig format %s oppgjeve."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Ugyldig startdato"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1411,10 +1458,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1426,7 +1482,7 @@ msgstr "Hugs mi innlogging på denne datamaskina"
msgid "Last editor"
msgstr "Sist redigert av"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Siste oppdatering:"
@@ -1461,7 +1517,7 @@ msgstr "Lokal RSS-straum og e-postvarsel"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Lokal RSS-straum og e-postvarsel for «%s»"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Lokale varsel"
@@ -1474,11 +1530,10 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1498,6 +1553,14 @@ msgstr ""
msgid "Message"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Melding:"
@@ -1525,27 +1588,25 @@ msgstr "Fleire problem i nærleiken"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Namn"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Namn:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1558,21 +1619,26 @@ msgstr "Næraste namngjevne veg til nålen plassert på kartet (automatisk gener
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Næraste postnummer til nålen plassert på kartet (automatisk generert): %s (%sm unna)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Næraste veg til nålen plassert på karta (automatisk generert ved hjelp av Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Nesten ferdig! No må du sjekka e-posten din …"
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Nesten ferdig! No må du sjekka e-posten din …"
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1581,12 +1647,12 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Ny kategorikontakt lagt til"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1594,9 +1660,9 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr "Nye lokale problem på FiksGataMi"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nye lokale rapportar på reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
+msgstr ""
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1622,33 +1688,15 @@ msgstr "Nye rapportar innanfor grensa til {{NAME}} på FiksGataMi"
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nye rapportar for {{COUNCIL}} innanfor {{WARD}} bydel på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nye rapportar på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nye rapportar på reportemptyhomes.com nær postnummer {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nye rapportar til {{COUNCIL}} på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nye rapportar innanfor grensa til {{NAME}} på reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Ny tilstand"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr ""
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Ny tilstand"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1661,14 +1709,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nei"
@@ -1696,20 +1742,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Fann ingen problem."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Ingen problem er rapporterte"
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1727,8 +1764,6 @@ msgid "No supporters"
msgstr ""
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Ingen"
@@ -1741,8 +1776,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1750,7 +1785,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1763,7 +1805,7 @@ msgid "Not reported to council"
msgstr "Ikkje rapportert til administrasjonen"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Merk"
@@ -1773,7 +1815,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Merk at når vi tek med ustadfesta rapportar, så brukar vi datoen rapporten var oppretta. Det treng vera den same månaden som rapporten var stadfesta, så tala kan hoppa litt opp og ned."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Merk:"
@@ -1782,22 +1824,20 @@ msgstr "Merk:"
msgid "Note: <strong>%s</strong>"
msgstr "Merk: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "På tide å senda rapporten din, har du eit FiksGataMi-passord?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
+msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "På tide å registrera oppdateringa di, har du eit FiksGataMi-passord?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1827,20 +1867,18 @@ msgstr ""
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Opne"
@@ -1848,11 +1886,6 @@ msgstr "Opne"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Opne rapportar"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1869,32 +1902,26 @@ msgstr "Nettsida til Open311-initiativet"
msgid "Open311 specification"
msgstr "Open311-spesifikasjon"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Eller problem meldt til:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Eller du kan abonnera på varsel basert på bydel eller administrasjon du høyrer til under:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Anna"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Kjeldekoda vår er fri programvare og <a href=\"http://github.com/mysociety/fixmystreet\">tilgjengeleg på GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Eigar"
@@ -1909,12 +1936,12 @@ msgstr "Fann ikkje sida"
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Delvis"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1923,6 +1950,7 @@ msgid "Password (optional)"
msgstr ""
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Passord:"
@@ -1930,7 +1958,7 @@ msgstr "Passord:"
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1939,11 +1967,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefon:"
@@ -1954,14 +1980,23 @@ msgstr "Telefon:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr ""
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Denne informasjonen er påkravd"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Denne informasjonen er påkravd"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Bilete:"
@@ -1973,22 +2008,18 @@ msgstr "Bilete av nye problem i nærleiken"
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planlagt"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Ver høfleg, poengtert og kortfatta."
@@ -1998,22 +2029,20 @@ msgstr "Ver høfleg, poengtert og kortfatta."
msgid "Please check the passwords and try again"
msgstr "Ver venleg og sjekk passorda og prøv igjen"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Ver venleg og sjekk e-posten du oppgav"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Ver venleg og sjekk at du har skrive ei gyldig e-postadresse"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2023,15 +2052,16 @@ msgstr "Vel ein kategori"
msgid "Please choose a property type"
msgstr "Vel ein type eigenskap"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr "Ver venleg og <strong>ikkje</strong> rapporter feil gjennom denne sida; meldingane går til gruppa som står bak FiksGataMi, og ikkje til ein administrasjon. For å rapportera eit problem, ver venleg og <a href=\"/\">gå til forsida</a> og følg instruksjonane."
@@ -2040,7 +2070,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Ver venleg og skriv ei melding"
@@ -2051,15 +2081,15 @@ msgstr "Ver venleg og skriv ei melding"
msgid "Please enter a password"
msgstr "Skriv inn eit passord"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Ver venleg og legg inn eit emne"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2067,7 +2097,7 @@ msgid "Please enter a valid email"
msgstr "Ver venleg og legg til ein gyldig e-post"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Ver venleg og legg inn e-postadressa di"
@@ -2076,21 +2106,19 @@ msgstr "Ver venleg og legg inn e-postadressa di"
msgid "Please enter some details"
msgstr "Ver venleg og legg inn opplysningar om problemet"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Ver venleg og legg inn e-posten din"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr ""
@@ -2103,8 +2131,8 @@ msgstr ""
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2145,7 +2173,7 @@ msgstr ""
"Ver venleg og fyll inn skjemaet under med detaljane om problemet,\n"
"og skildra plasseringa så nøyaktig som mogleg i boksen for detaljar."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Ver venleg og indiker om du ynskjer å motta eit nytt spørjeskjema"
@@ -2171,19 +2199,24 @@ msgstr "Merk at rapporten din <strong>enno ikkje er send</strong. Vel ein kateg
msgid "Please note:"
msgstr "Merk:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Ver venleg og bidra med ei forklaring på kvifor du gjenopnar denne problemrapporten"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Ver venleg og bidra med litt tekst i tillegg til eit bilete"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Ver venleg og opplys om du har rapportert eit problem til administrasjonen din tidlegare"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Vel den kjelda du ynskjer"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Vel den kjelda du ynskjer"
@@ -2192,21 +2225,17 @@ msgstr "Vel den kjelda du ynskjer"
msgid "Please select the type of alert you want"
msgstr "Ver venleg og vel kva for ein type varsel du ynskjer"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Ver venleg og oppgje om dette problemet har vorte fiksa eller ikkje"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Ver venleg og sjå over oppdateringane som er lagt inn."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Ver venleg og berre last opp JPEG-bilete"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Skriv inn ei melding"
@@ -2215,8 +2244,8 @@ msgid "Please write your update here"
msgstr ""
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2237,22 +2266,36 @@ msgstr "Lagt inn av %s (<strong>%s</strong>) %s"
msgid "Posted by %s at %s"
msgstr "Sendt inn av %s %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problem"
@@ -2268,12 +2311,12 @@ msgstr "Problem %s stadfesta"
msgid "Problem %s sent to council %s"
msgstr "Problem %s sendt til administrasjon %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Tilstandsfordeling av problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problem markert som ope."
@@ -2289,12 +2332,10 @@ msgstr "Problem"
msgid "Problems in this area"
msgstr "Problem i dette området"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr ""
@@ -2303,12 +2344,11 @@ msgstr ""
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problem nyleg rapportert fiksa på FiksGataMi"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problem innanfor %.1fkm av denne posisjonen"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2320,20 +2360,17 @@ msgstr "Problem innanfor %s"
msgid "Problems within %s ward"
msgstr "Problem innanfor %s bydel"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problem innanfor %s, FiksGataMi"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problem innanfor %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problem innanfor grensene av:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Eigedomar nyleg rapportert som tilbake i bruk på reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2347,39 +2384,31 @@ msgstr "Type eigenskap:"
msgid "Provide an update"
msgstr "Bidra med ei oppdatering"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Det er valfritt å oppgje eit passord, men om du gjer det vil det verta enklare for deg å rapportera problem, leggja inn oppdateringar og halda oversyn over rapportane dine"
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Spørjeskjema"
@@ -2395,12 +2424,11 @@ msgstr "Spørjeskjema %d sendt for problem %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Spørjeskjema fylt inn av feilrapportøren"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2426,8 +2454,7 @@ msgstr "RSS-straum frå %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS-straum av %s, innanfor %s bydel"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS-straum med problem i nærleiken"
@@ -2435,7 +2462,7 @@ msgstr "RSS-straum med problem i nærleiken"
msgid "RSS feed of problems in this %s"
msgstr "RSS-straum for problem i denne %s-en"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2465,17 +2492,18 @@ msgstr "RSS-straum med oppdateringar for dette problemet"
msgid "Receive email when updates are left on this problem."
msgstr "Motta e-post når det er oppdateringar på dette problemet"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Nye lokale problem, FiksGataMi."
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Nyleg melde problem"
@@ -2483,23 +2511,27 @@ msgstr "Nyleg melde problem"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Hugs at FiksGataMi primert er laga for å rapportera fysiske problem som kan fiksast. Viss problemet ditt ikkje er eigna for å senda inn via denne tenesta, hugs at du kan kontakta administrasjonen direkte via deira eiga nettside."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Fjern flagg"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Fjern bilete (kan ikkje gjerast om!)"
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Rapporter eit problem"
@@ -2508,7 +2540,7 @@ msgstr "Rapporter eit problem"
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Rapport på %s"
@@ -2517,63 +2549,59 @@ msgstr "Rapport på %s"
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Rapporter, finn eller diskuter lokale problem"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Rapportert %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Rapportert %s, til %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Rapportert anonymt %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Rapportert tidlegare"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Publisert av %s %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Rapportert %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Rapportert i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Rapportert i kategorien %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Publisert av %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Rapportert av %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Rapportert av %s i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Rapportert av %s i kategorien %s av %s %s"
@@ -2581,18 +2609,22 @@ msgstr "Rapportert av %s i kategorien %s av %s %s"
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Rapportert %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Legger til eit problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2605,18 +2637,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Problem i og rundt kartet"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Send rapport på nytt"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2631,26 +2666,32 @@ msgstr "Vegoperatør for denne namngjevne vegen (utleia frå vegreferansenummer
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Vegoperatør for denne namngjevne vegen (frå OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Lagra endringar"
@@ -2663,7 +2704,7 @@ msgstr "Søk i rapportar"
msgid "Search Users"
msgstr "Søk i brukarar"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2695,20 +2736,25 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Vel kva for ein type varsel du ynskjer og klikk på knappen for ei RSS-kjelde, eller skriv inn e-postadressa di for å abonnera på eit e-postvarsel."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Opne rapportar"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Sendt til %s %s seinare"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Sendt:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Teneste:"
@@ -2717,8 +2763,8 @@ msgstr "Teneste:"
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2734,34 +2780,23 @@ msgid "Show pins"
msgstr "Vis nåler"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Logg inn"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Logg inn via epost"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Logg inn eller opprett ein konto"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Logg ut"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Logga inn som %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Somme kategoriar krev kanskje meir informasjon"
@@ -2777,8 +2812,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Nokre bilete av nyleg melde problem"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Noko tekst å omsetja"
@@ -2786,24 +2822,32 @@ msgstr "Noko tekst å omsetja"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Orsak, det ser ut til å vera eit «Crown dependency»-postnummer, som vi ikkje dekkjer."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Orsak, men det oppstod eit problem når vi freista å stadfesta problemrapporten din"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Orsak, vi kunne ikkje finna den staden."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Orsak, vi kunne ikkje tolka den posisjonen. Ver venleg og prøv på nytt."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Orsak, vi kunne ikkje tolka den posisjonen. Ver venleg og prøv på nytt."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2819,16 +2863,17 @@ msgstr "Tilstand"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Tilstand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistikk"
@@ -2842,7 +2887,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2857,45 +2907,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Emne:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Send inn"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Send inn endringar"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Send inn spørjeskjema"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2906,18 +2953,19 @@ msgstr ""
msgid "Subscribe"
msgstr "Abonner"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Eg ynskjer å abonnera på e-postvarsel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Oppsummering"
@@ -2928,7 +2976,7 @@ msgstr "Oppsummering"
msgid "Summary reports"
msgstr "Oppsummeringsrapportar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2936,9 +2984,18 @@ msgstr ""
msgid "Survey Results"
msgstr "Resultat frå spørjeundersøkinga"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Oppdateringar"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Tekst"
@@ -2947,6 +3004,7 @@ msgid "Text only version"
msgstr "Tekst-utgåve"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Tekst:"
@@ -2971,7 +3029,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2979,7 +3037,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Takk, glad for å høyra at problemet er løyst! Vi vil gjerne spørja deg om du har rapportert eit problem til ein administrasjon tidlegare?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Biletet ser ikkje ut til å ha vorte lasta opp riktig (%s), prøv på nytt."
@@ -2997,20 +3055,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr "Det postnummeret vart ikkje gjenkjent, orsak."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Det problemet vil no sendast på nytt."
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Det problemet vil no sendast på nytt."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Den rapporten har vorte fjerna frå FiksGataMi."
@@ -3052,30 +3109,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Stadfestingse-posten <strong>kan</strong> bruka nokre minutt før han kjem fram &mdash; så ver tålmodig."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Detaljane om problemet ditt er tilgjengelege på høgre kant av denne sida."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Feilen var: %s"
@@ -3093,10 +3138,6 @@ msgstr "Følgjande informasjon om næraste veg kan vera unøyaktig eller irrelev
msgid "The latest local problems reported by users"
msgstr "Dei siste lokale problema rapportert av brukarar"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Dei siste lokale rapportane rapportert av brukarar"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Dei siste problema for {{COUNCIL}} rapportert av brukarar"
@@ -3117,21 +3158,9 @@ msgstr "Dei siste problema rapportert fiksa av brukarar"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Dei siste problema innanfor grensa til {{NAME}} rapportert av brukarar"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "Dei siste eigedomane rapportert tilbake i bruk av brukarar"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Dei siste rapportane for {{COUNCIL}} rapportert av brukarar"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Dei siste rapportane for {{COUNCIL}} innanfor {{WARD}} bydel rapportert av brukarar"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Dei siste rapportane innanfor grensa til {{NAME}} rapportert av brukarar"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3147,8 +3176,7 @@ msgstr "Passorda er ikkje like"
msgid "The requested URL '%s' was not found on this server"
msgstr "Fann ikkje URL-en «%s» på denne tenaren"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Den enklaste meldinga er den geografiske:"
@@ -3159,7 +3187,7 @@ msgstr "Den enklaste meldinga er den geografiske:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Brukaren kunne ikkje plassera problemet på eit kart, men sjekk områdde rundt staden dei skreiv inn"
@@ -3170,23 +3198,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Det oppstod problem med å visa «Alle rapportar»-sida. Ver venleg og prøv igjen seinare."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3199,7 +3228,7 @@ msgstr "Det var problem med e-post/passord-kombinasjonen din. Ver venleg og prø
msgid "There was a problem with your update. Please try again."
msgstr "Det var problem med oppdateringa di. Ver venleg og prøv igjen."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Det var problem med rapporten din. Ver venleg og sjå under."
@@ -3239,16 +3268,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Denne e-posten er sendt til begge administrasjonane som dekkjer staden for problemet, sidan brukaren ikkje kategoriserte det. Ver venleg og ignorer e-posten viss de ikkje er korrekt administrasjon for å handtera denne saka, eller gjev oss melding om kva for ein kategori av problem dette er så vi kan leggja det til i systemet vårt."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Denne e-posten er sendt til fleire administrasjonar som dekkjer staden for problemet, sidan den valde kategorien er tilgjengeleg for desse. Ver venleg og ignorer e-posten viss de ikkje er korrekt administrasjon for å handtera denne saka."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3262,7 +3291,7 @@ msgstr "Dette er ein utviklarnettstad. Ting kan knekka når som helst og databas
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3289,55 +3318,68 @@ msgstr "Dette problemet er under arbeid"
msgid "This problem is old and of unknown status."
msgstr "Dette problemet er gammalt og med ukjend status."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Denne rapporten er for tida markert som lukka."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Denne rapporten er for tida markert som fiksa."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Denne rapporten er for tida markert som open."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Denne nettsida inneheld òg eit bilete av problemet, sendt inn av brukaren."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Tidslinje"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Tittel"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Tittel"
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "For å sjå eit kart med ei meir presis plassering for dette problemet"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3353,8 +3395,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3362,11 +3404,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Ikkje stadfesta"
@@ -3383,7 +3425,9 @@ msgstr "Ukjend varsel-type"
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Ukjend problem-ID"
@@ -3406,11 +3450,11 @@ msgid "Update below added by %s at %s"
msgstr "Oppdateringa under vart lagt til av %s %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Tilstandsfordeling for oppdateringar"
@@ -3445,24 +3489,24 @@ msgstr "Oppdatering:"
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Oppdatert!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Oppdateringar"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3470,27 +3514,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr "Oppdateringar av {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Oppdateringar til dette problemet, FiksGataMi"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "brukte kart"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Brukarflagg fjerna"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Brukar flagga"
@@ -3498,23 +3545,23 @@ msgstr "Brukar flagga"
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Brukarar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Verdi oppdatert"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Sjå rapport på nettstaden"
@@ -3538,16 +3585,15 @@ msgid "Wards of this council"
msgstr "Bydelar innanfor denne administrasjonen"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Vi fann meir ein eitt treff for den staden. Vi viser opp til ti treff, så prøv eit anna søk viss staden din ikkje er her."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Vi har sendt deg ein epost som inneheld ei lenkje for å stadfesta kontoen din."
@@ -3561,7 +3607,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Vi innser at %s kan vera ansvarleg for dette problemet, men vi manglar for tida kontaktinformasjon for dei. Viss du veit om ei eigna kontaktadresse, ta kontakt med oss."
@@ -3586,11 +3632,15 @@ msgstr "Vi ynskjer å få tilbakemelding frå deg om kva du meiner om denne tene
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "NÃ¥r redigert"
@@ -3599,7 +3649,7 @@ msgstr "NÃ¥r redigert"
msgid "When sent"
msgstr "NÃ¥r sendt"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Heil blokk med tomme leilegheiter"
@@ -3607,16 +3657,22 @@ msgstr "Heil blokk med tomme leilegheiter"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Når du søkjer etter førespurnader, så er det òg mogleg å søkja etter agency_responsible for å avgrensa det til førespurnader som er sendt til ein einskild adminstrasjon. Søkjetermen er administrasjonssida som du får frå <a href=\"%s\">MaPit</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Kunne du tenkja deg å motta ein ny førespurnad om 4 veker, som minner deg om å sjekka status?"
@@ -3642,15 +3698,13 @@ msgstr "Ã…r"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ja"
@@ -3713,11 +3767,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Du har allereie svart på dette spørjeskjemaet. Viss du har spurnader, ver venleg og <a href='%s'>ta kontakt</a>, eller <a href='%s'>sjå på problemet ditt</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Du har allereie lagt ved eit bilete til dette problemet. Ã… leggja ved eit anna vil byta ut dette."
@@ -3726,6 +3778,10 @@ msgstr "Du har allereie lagt ved eit bilete til dette problemet. Ã… leggja ved e
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Du har allereie lagt ved eit bilete til denne oppdateringa. Ã… leggja ved eit anna vil byta ut dette."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3746,15 +3802,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Du har no logga inn. Ver venleg og sjekk og stadfest at detaljane dine er korrekte:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3765,18 +3817,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Ynskjer du verkeleg å senda på nytt?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Rapportane dine"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3785,22 +3835,17 @@ msgstr "Rapportane dine"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "e-postadressa di:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3810,24 +3855,23 @@ msgstr "E-posten din"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Namnet ditt:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3840,19 +3884,15 @@ msgstr "Passordet ditt har vorte endra"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Oppdateringane dine"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Oppdateringane dine"
@@ -3860,23 +3900,31 @@ msgstr "Oppdateringane dine"
msgid "Your&nbsp;email:"
msgstr "E-posten&nbsp;din:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Alle rapportar"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "av %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Lukka rapportar"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "administrasjon"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "brukte ikkje kart"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3885,17 +3933,22 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Løyste rapportar"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "frå %d ulike brukarar"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "mindre enn eitt minutt"
@@ -3940,14 +3993,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "i/t"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "eller"
@@ -3957,16 +4009,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3979,8 +4031,8 @@ msgstr "andre område:"
msgid "reopened"
msgstr "opna på nytt"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3996,17 +4048,20 @@ msgstr "den lokale administrasjonen"
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "denne typen lokalt problem"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "i dag"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Løyste rapportar"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "brukte kart"
@@ -4030,7 +4085,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> rapport nyleg"
msgstr[1] "<big>%s</big> rapportar nyleg"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4044,7 +4099,7 @@ msgid_plural "%d supporters"
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4065,7 +4120,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Vi har enno ikkje detaljar for administrasjonen som dekkjer denne staden."
msgstr[1] "Vi har enno ikkje detaljar for administrasjonane som dekkjer denne staden."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4086,7 +4141,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> løyst siste månad"
msgstr[1] "<big>%s</big> løyst siste månad"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4100,5 +4155,95 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Vi har enno <strong>ikkje</strong> detaljane for den andre administrasjonen som dekkjer denne staden."
msgstr[1] "Vi har enno <strong>ikkje</strong> detaljane for dei andre administrasjonane som dekkjer denne staden."
-#~ msgid "For council(s):"
-#~ msgstr "For administrasjon(ane):"
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Viss du ikkje kan sjå kartet, <a href='%s' rel='nofollow'>hopp over dette steget</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Nei</strong>, det gjer eg ikkje. La meg logga inn med e-post:"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Dei næraste problema <small>(innanfor&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontakt FiksGataMi"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FiksGataMi-administrator:"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nye lokale rapportar på reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nye rapportar for {{COUNCIL}} innanfor {{WARD}} bydel på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nye rapportar på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nye rapportar på reportemptyhomes.com nær postnummer {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nye rapportar til {{COUNCIL}} på reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nye rapportar innanfor grensa til {{NAME}} på reportemptyhomes.com"
+
+#~ msgid "No problems found."
+#~ msgstr "Fann ingen problem."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Ingen problem er rapporterte"
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "På tide å senda rapporten din, har du eit FiksGataMi-passord?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "På tide å registrera oppdateringa di, har du eit FiksGataMi-passord?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Kjeldekoda vår er fri programvare og <a href=\"http://github.com/mysociety/fixmystreet\">tilgjengeleg på GitHub</a>."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Ver venleg og sjå over oppdateringane som er lagt inn."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problem innanfor %s, FiksGataMi"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Eigedomar nyleg rapportert som tilbake i bruk på reportemptyhomes.com"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Rapportert %s, til %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Problem i og rundt kartet"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Logg inn via epost"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Logga inn som %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "Stadfestingse-posten <strong>kan</strong> bruka nokre minutt før han kjem fram &mdash; så ver tålmodig."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Detaljane om problemet ditt er tilgjengelege på høgre kant av denne sida."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Dei siste lokale rapportane rapportert av brukarar"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "Dei siste eigedomane rapportert tilbake i bruk av brukarar"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Dei siste rapportane for {{COUNCIL}} rapportert av brukarar"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Dei siste rapportane for {{COUNCIL}} innanfor {{WARD}} bydel rapportert av brukarar"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Dei siste rapportane innanfor grensa til {{NAME}} rapportert av brukarar"
+
+#~ msgid "Your email address:"
+#~ msgstr "e-postadressa di:"
diff --git a/locale/pt_CV.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/pt_CV.UTF-8/LC_MESSAGES/FixMyStreet.po
index 4e9b4a573..b8c5557b2 100644
--- a/locale/pt_CV.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/pt_CV.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -4,24 +4,24 @@
# Matthew Somerville <matthew@mysociety.org>, 2011-06-03.
#
# Translators:
-# fixmindelo <francisco.martins@recortes.cv>, 2013
-# mysociety <transifex@mysociety.org>, 2013
+# francisco oliveira martins <francisco.martins@recortes.cv>, 2013
+# mySociety <transifex@mysociety.org>, 2013
msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-10 10:09+0100\n"
-"PO-Revision-Date: 2013-11-20 13:29+0000\n"
-"Last-Translator: mysociety <transifex@mysociety.org>\n"
-"Language-Team: Portuguese (http://www.transifex.com/projects/p/fixmystreet/language/pt/)\n"
-"Language: pt\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
+"Last-Translator: mySociety <transifex@mysociety.org>\n"
+"Language-Team: Portuguese (http://www.transifex.com/mysociety/fixmystreet/language/pt/)\n"
+"Language: pt_CV\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:643
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "e"
@@ -34,11 +34,13 @@ msgstr "e"
msgid " or "
msgstr "ou"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d alertas confirmados,%d não confirmados"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d contatos do Conselho; %d confirmada,%d não confirmados"
@@ -47,11 +49,13 @@ msgstr "%d contatos do Conselho; %d confirmada,%d não confirmados"
msgid "%d edits by %s"
msgstr "%d edições por %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d atualizações directas"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d questionários enviados - %d respondeu (%s%%)"
@@ -64,15 +68,62 @@ msgstr "%d de %d de %d"
msgid "%s - Summary reports"
msgstr "%s - relat￳rios resumidos"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:692
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreetMindelo tem uma variedade de feeds RSS e alertas para problemas locais, incluindo \n"
+"alertas para todos os problemas dentro de uma determinada zona especial ou conselho, ou todos os problemas \n"
+"dentro de uma certa distância de um local em particular."
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreetMindelo tem uma variedade de feeds RSS e alertas para problemas locais, incluindo \n"
+"alertas para todos os problemas dentro de uma determinada zona especial ou conselho, ou todos os problemas \n"
+"dentro de uma certa distância de um local em particular."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"FixMyStreetMindelo envia diferentes categorias de problema âŽ\n"
+"para o conselho apropriado, assim que os problemas dentro do limite de um conselho especial âŽ\n"
+"pode não coincidir com os problemas enviados para que o conselho. Por exemplo, um relatório de graffiti âŽ\n"
+"será enviado ao conselho distrital, então vai aparecer em ambos do distrito âŽ\n"
+"alertas do Conselho, mas só vai aparecer o \"No limite\" alerta âŽ\n"
+"para o conselho do condado."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s ala, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:579
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, reportou em %s"
@@ -81,95 +132,86 @@ msgid "%s, within %s ward"
msgstr "%s, %s dentro da ala"
#: perllib/FixMyStreet/Map/OSM.pm:42
-#, fuzzy
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
-msgstr "Mapa © <a id=\"osm_link\" href=\"http://www.openstreetmap.org/\"> OpenStreetMap </a> e colaboradores, <a href = \"http://creativecommons.org/licenses/by- sa/2.0 / \"> CC-BY-SA </a>"
-
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
msgstr ""
-"(Não se preocupe - nós vamos ficar com o alerta, enquanto você está verificando o seu\"\n"
-"\"E-mail.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Não se preocupe - nós vamos fixa o seu relatório de problema, enquanto você está verificando seu email)"
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-"(Não se preocupe - nós vamos ficar com a sua atualização enquanto você está verificando o seu\"\n"
-"\"E-mail.) "
-#: templates/web/base/admin/report_blocks.html:11
-#: templates/web/base/admin/users.html:29
+#: templates/web/base/admin/report_blocks.html:41
+#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(E-mail na tabela de abuso)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Nome"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Telefone "
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(A distância padrão, que abrange cerca de 50 mil pessoas)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(Alternativamente o feed RSS pode ser personalizado, dentro de"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(fechado)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(Fixo)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(Como ruas e pavimentos esburacados, grafits, arvores caidas, lajes partidas, entulhos, lixo, pardeiros, vandalismo, postes quebrados, vazamentos de agua e esgotos, ou iluminação pública)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(Não reportar ao conselho)"
-#: templates/web/base/report/new/fill_in_details_form.html:218
-#: templates/web/zurich/report/new/fill_in_details_form.html:94
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(opcional)"
#: templates/web/fixmystreet/report/public_label.html:1
-#, fuzzy
msgid "(public)"
-msgstr "Publico"
+msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(remeter para ambos)"
-#: templates/web/base/report/new/fill_in_details_form.html:212
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(é confidencial seu email e seu numero de telefone)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(seu email não será divulgado)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:651
-#: perllib/FixMyStreet/DB/Result/Problem.pm:418
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Escolha uma categoria --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:618
-#: perllib/FixMyStreet/DB/Result/Problem.pm:424
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
+#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Escolha um tipo de categoria --"
@@ -181,12 +223,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small> Se você não pode localizar no mapa, <a href='%s' rel='nofollow'> saltar esta etapa </a>. </small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> problemas ao vivo"
@@ -199,28 +243,22 @@ msgstr "<strong> Não </strong> Deixe-me confirmar o meu relatório por e-mail"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong> Não </strong> Deixe-me confirmar a minha atualização por e-mail"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong> Não </strong>, deixe-me entrar por e-mail"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong> Não </strong>, eu não, deixe-me entrar por e-mail:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:163
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>No</strong>, let me confirm my report by email:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong> Não </strong>, deixe-me confirmar a minha atualização por e-mail:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:141
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -231,8 +269,8 @@ msgstr "<strong> Sim </strong> Eu tenho password"
msgid "About us"
msgstr "Acerca de nós"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:39
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -248,29 +286,34 @@ msgid ""
" categories of problem) to each body."
msgstr ""
-#: templates/web/base/admin/body.html:48
+#: templates/web/base/admin/body.html:56
msgid "Add a contact using the form below."
msgstr ""
#: templates/web/base/admin/bodies.html:74
-#: templates/web/base/admin/body-form.html:233
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/base/admin/body-form.html:240
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Adicionar"
-#: templates/web/base/admin/body.html:108
+#: templates/web/base/admin/body.html:116
#: templates/web/zurich/admin/body.html:31
msgid "Add new category"
msgstr "Adicionar nova categoria"
-#: templates/web/base/admin/users.html:45
+#: templates/web/base/admin/users.html:47
msgid "Add user"
msgstr "Adicionar user"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Adicionado %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Aguardando moderação"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Novamente"
@@ -283,21 +326,25 @@ msgstr "Alerta %d criado por %s, tipo %s, os parâmetros %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "Alerta %d desativada (criado %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Avise-me de atualizações futuras"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Todos os Relatórios"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Todos os Relatórios"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Todos os relatórios"
@@ -320,8 +367,7 @@ msgstr "Todas as informações que você fornecer aqui serão enviados para fixm
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Todas as informações que você fornecer aqui serão enviados para <strong>%s</strong>"
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Uma atualização marcada, problema esta resolvido"
@@ -330,45 +376,45 @@ msgstr "Uma atualização marcada, problema esta resolvido"
msgid "Anonymous"
msgstr "Anonimo"
-#: templates/web/base/admin/report_edit.html:62
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonimo:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Você é um desenvolvedor <strong> </strong> Gostaria de contribuir para FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Você é um desenvolvedor?"
#: templates/web/base/admin/body-form.html:69
+#: templates/web/base/admin/body.html:16
#: templates/web/zurich/admin/body-form.html:24
msgid "Area covered"
msgstr "Ãrea coberta"
#: templates/web/base/admin/bodies.html:15
-#: templates/web/base/admin/body.html:52
+#: templates/web/base/admin/body.html:60
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Atribuir ao órgão externo:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Atribuir a categoria diferente:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Atribuir ao órgão externo:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Atribuir a subdivisão:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Designado para %s"
@@ -389,12 +435,12 @@ msgstr "Aguardando moderação"
msgid "Back"
msgstr "Voltar"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Ban endereço de e-mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Corpos"
@@ -405,6 +451,7 @@ msgstr "Corpos"
msgid "Body"
msgstr "Corpo"
+#: templates/web/base/admin/report_edit.html:34
#: templates/web/base/admin/user-form.html:32
msgid "Body:"
msgstr "Corpo:"
@@ -413,61 +460,64 @@ msgstr "Corpo:"
msgid "By Date"
msgstr "Por data"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Não pode ver a localizaçao no mapa <em> Salte esta etapa </em>"
-#: templates/web/base/admin/body.html:60
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/body.html:68
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:53
+#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-sdm.html:21
#: templates/web/zurich/admin/reports.html:13
#: templates/web/zurich/admin/stats.html:50
-#: templates/web/zurich/report/new/fill_in_details_form.html:50
msgid "Category"
msgstr "Categoria"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Categoria para cada correção taxa para problemas> 4 semanas, um mes"
-#: templates/web/base/admin/body.html:130
+#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:61
-#: templates/web/base/report/new/fill_in_details_form.html:68
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Categoria:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Categoria: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Mudar password"
-#: templates/web/base/admin/body.html:152
+#: templates/web/base/admin/body.html:160
msgid ""
"Check <strong>confirmed</strong> to indicate that this contact has been confirmed as correct.\n"
" If you are not sure of the origin or validity of the contact, leave this unchecked."
msgstr ""
-#: templates/web/base/admin/body.html:163
+#: templates/web/base/admin/body.html:171
msgid ""
"Check <strong>deleted</strong> to remove the category from use. \n"
" It will not appear as an available category in the drop-down menu on the report-a-problem page."
msgstr ""
-#: templates/web/base/admin/body.html:183
+#: templates/web/base/admin/body.html:191
msgid ""
"Check <strong>private</strong> if reports in this category should <strong>never be displayed on the website</strong>.\n"
" <br>\n"
@@ -478,60 +528,66 @@ msgid ""
" at a specific address."
msgstr ""
-#: templates/web/base/admin/body.html:122
+#: templates/web/base/admin/body.html:130
msgid ""
"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Click no mapa para reportar um porblema "
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:45
-#: templates/web/base/admin/report_edit.html:47
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Fechado"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:791
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Fechado pelo Conselho"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Reports Fechados"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Fechado"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Problemas mais proximos <small> (within&nbsp;%skm) </small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Co-ordenadas:"
@@ -539,30 +595,30 @@ msgstr "Co-ordenadas:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Cobrand data:"
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:47
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Configurar Endpoint"
-#: templates/web/base/admin/body.html:64
+#: templates/web/base/admin/body.html:72
msgid "Confirm"
msgstr "Confirmar"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Confirmar conta"
@@ -579,10 +635,10 @@ msgstr "Confirme por e-mail abaixo, proporcionando uma nova senha nesse ponto. Q
msgid "Confirmation"
msgstr "Confirmação"
-#: templates/web/base/admin/body.html:158
-#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:32
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/body.html:166
+#: templates/web/base/admin/body.html:79
+#: templates/web/base/admin/category_edit.html:37
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Confirmado"
@@ -593,13 +649,18 @@ msgstr "Relatos confirmados entre %s e %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:70
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Confirmado:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Contact FixMyStreetMindelo"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Fale connosco"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -614,8 +675,14 @@ msgstr "Fale connosco"
msgid "Contact the team"
msgstr "Fale com a equipe"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1324
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1352
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Co-ordenadas:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Não foi possível encontrar usuário"
@@ -633,9 +700,9 @@ msgstr "Conselho"
msgid "Council contacts for %s"
msgstr "Contatos do Conselho para %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:690
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
-msgstr "conselho ref:%s"
+msgstr ""
#: templates/web/base/admin/stats.html:84
msgid "Council:"
@@ -648,26 +715,28 @@ msgstr "Conselho:"
msgid "Count"
msgstr "Conta"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Criar um report"
-#: templates/web/base/admin/body.html:200
+#: templates/web/base/admin/body.html:208
#: templates/web/zurich/admin/body.html:59
msgid "Create category"
msgstr "Criar uma categoria"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Criar um report"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Criado"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:69
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Criado:"
@@ -677,10 +746,15 @@ msgid "Current state"
msgstr "Estado actual"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -690,15 +764,20 @@ msgstr "Painel de instrumentos"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Tratadas pelas subdivisões dentro de 5 dias úteis"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
-#: templates/web/base/admin/body.html:169
-#: templates/web/base/admin/body.html:73
-#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:85
+#: templates/web/base/admin/body.html:177
+#: templates/web/base/admin/body.html:81
+#: templates/web/base/admin/category_edit.html:42
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Excluidos"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:43
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:51
#: templates/web/zurich/admin/index-dm.html:22
#: templates/web/zurich/admin/index-sdm.html:20
#: templates/web/zurich/admin/reports.html:12
@@ -712,33 +791,37 @@ msgstr "DEtalhes"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detalhes:"
-#: templates/web/base/admin/body.html:79
+#: templates/web/base/admin/body.html:87
msgid "Devolved"
msgstr "Delegada"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "não usar o mapa"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Diligency prêmio tabela classificativa"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Você tem uma senha FixMyStreetMindelo?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Você tem uma senha FixMyStreetMindelo?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Não sei"
@@ -746,8 +829,8 @@ msgstr "Não sei"
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:47
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -755,7 +838,7 @@ msgstr ""
msgid "Duplicate"
msgstr "Duplicar"
-#: templates/web/base/admin/body.html:98
+#: templates/web/base/admin/body.html:106
msgid ""
"Each contact for the body has a category, which is displayed to the public. \n"
" Different categories <strong>can have the same contact</strong> (email address).\n"
@@ -765,19 +848,20 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
-#: templates/web/base/admin/users.html:31
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/base/admin/users.html:33
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Editar"
-#: templates/web/base/admin/body.html:212
+#: templates/web/base/admin/body.html:220
#: templates/web/zurich/admin/body.html:71
msgid "Edit body details"
msgstr "Editar os detalhes do corpo"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -792,15 +876,15 @@ msgstr "Editando uma actualizaçao %d"
msgid "Editing user %d"
msgstr "Edição de usuário %d"
-#: templates/web/base/admin/category_edit.html:86
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Editar"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:83
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -808,25 +892,23 @@ msgstr "Editar"
msgid "Email"
msgstr "Email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1300
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Email adicionado a lista de abusos"
-#: templates/web/base/admin/body.html:147
+#: templates/web/base/admin/body.html:155
msgid "Email address:"
msgstr ""
#: templates/web/base/tokens/confirm_alert.html:6
-#, fuzzy
msgid "Email alert created"
-msgstr "Relatorio criado"
+msgstr ""
#: templates/web/base/tokens/confirm_alert.html:10
-#, fuzzy
msgid "Email alert deleted"
-msgstr "Envie-me atualizações"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1297
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "E-mail já está na lista abusos"
@@ -838,44 +920,42 @@ msgstr "Enviar novos problemas locais"
msgid "Email me updates"
msgstr "Envie-me atualizações"
-#: templates/web/base/admin/category_edit.html:26
-#: templates/web/base/admin/report_edit.html:67
+#: templates/web/base/admin/category_edit.html:31
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Email: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:620
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Apartamento vazio ou duplex"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:619
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Casa vazia ou bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:622
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Escritório vazio ou outro comercial"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:623
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Pub ou bar vazio"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:624
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Edifício público vazio - escola, hospital, etc"
-#: templates/web/base/admin/body-form.html:158
-#: templates/web/base/admin/body-form.html:159
+#: templates/web/base/admin/body-form.html:162
+#: templates/web/base/admin/body-form.html:163
msgid ""
"Enable <strong>Open311 update-sending</strong> if the endpoint will send and receive\n"
" updates to existing reports. If you're not sure, it probably does not, so leave this unchecked.\n"
@@ -883,8 +963,8 @@ msgid ""
" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
msgstr ""
-#: templates/web/base/admin/body-form.html:215
-#: templates/web/base/admin/body-form.html:216
+#: templates/web/base/admin/body-form.html:222
+#: templates/web/base/admin/body-form.html:223
msgid ""
"Enable this <strong>can be devolved</strong> setting if one or more contacts have a \n"
" different endpoint (and send method) from the body's. For example, if reports for some categories of\n"
@@ -895,11 +975,11 @@ msgstr ""
msgid "End Date:"
msgstr ""
-#: templates/web/base/admin/body-form.html:126
+#: templates/web/base/admin/body-form.html:130
msgid "Endpoint"
msgstr "Endpoint"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Digite um nome de uma rua de Mindelo"
@@ -912,36 +992,31 @@ msgstr "Inserir um código postal de Mindelo nas proximidades da area, zona, rua
msgid "Enter a nearby postcode, or street name and area"
msgstr "Inserir um código postal perto, ou nome da rua, zona ou local"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Digite um nome de rua nas proximidades e área"
#: perllib/FixMyStreet/Cobrand/ZeroTB.pm:7
-#, fuzzy
msgid "Enter a nearby street name and area, postal code or district in Delhi"
-msgstr "Digite um nome de rua nas proximidades e área"
+msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:170
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Digite uma nova senha:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
msgid "Enter a password"
msgstr "Digite uma nova password"
-#: templates/web/base/index-steps.html:33
+#: templates/web/base/index-steps.html:26
msgid "Enter details of the problem"
msgstr "Digite os detalhes do problema"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -951,6 +1026,10 @@ msgstr "Digite os detalhes do problema"
msgid "Error"
msgstr "Erro"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -960,11 +1039,23 @@ msgstr "Exemplo PostCode %s"
msgid "Examples:"
msgstr "Exemplos:"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:47
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
-#: templates/web/base/admin/report_edit.html:76
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:81
+msgid "External URL"
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:27
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Dados adicionais:"
@@ -977,54 +1068,22 @@ msgstr ""
msgid "Filter report list"
msgstr "Filtrar relatorio"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Primeiro Nome"
-#: templates/web/base/admin/body.html:40
+#: templates/web/base/admin/body.html:48
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreetMindelo"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet admin:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreetMindelo tem uma variedade de feeds RSS e alertas para problemas locais, incluindo \n"
-"alertas para todos os problemas dentro de uma determinada zona especial ou conselho, ou todos os problemas \n"
-"dentro de uma certa distância de um local em particular."
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"FixMyStreetMindelo envia diferentes categorias de problema âŽ\n"
-"para o conselho apropriado, assim que os problemas dentro do limite de um conselho especial âŽ\n"
-"pode não coincidir com os problemas enviados para que o conselho. Por exemplo, um relatório de graffiti âŽ\n"
-"será enviado ao conselho distrital, então vai aparecer em ambos do distrito âŽ\n"
-"alertas do Conselho, mas só vai aparecer o \"No limite\" alerta âŽ\n"
-"para o conselho do condado."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:41
-#: templates/web/base/admin/report_edit.html:42
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1035,35 +1094,30 @@ msgstr ""
msgid "Fixed"
msgstr "Corrigido"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:43
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Corrigido - Conselho"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:42
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Corrigido - Usuario"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Reports Corrigidos"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Corrigido:"
-#: templates/web/base/admin/body-form.html:84
+#: templates/web/base/admin/body-form.html:89
#: templates/web/zurich/admin/body-form.html:36
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Bandeira - Usuario"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Marcado"
@@ -1072,7 +1126,7 @@ msgstr "Marcado"
msgid "Flagged reports and users"
msgstr ""
-#: templates/web/base/admin/user-form.html:45
+#: templates/web/base/admin/user-form.html:46
msgid "Flagged users are listed on the <a href='%s'>flagged</a> page."
msgstr ""
@@ -1080,8 +1134,8 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:78
-#: templates/web/base/admin/user-form.html:51
+#: templates/web/base/admin/report_edit.html:76
+#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Marcado:"
@@ -1090,10 +1144,6 @@ msgstr "Marcado:"
msgid "Follow a ward link to view only reports within that ward."
msgstr "Siga um link ala para ver apenas os relatórios dentro do ala."
-#: templates/web/base/admin/report_edit.html:30
-msgid "For council(s):"
-msgstr "Por conselho (s):"
-
#: templates/web/base/admin/body-form.html:65
msgid "For more information, see <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>How FixMyStreet uses Mapit</a>."
msgstr ""
@@ -1103,9 +1153,22 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Esqueceu sua senha?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Atribuir ao órgão externo:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Atribuir ao órgão externo:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Perguntas mais frequentes"
@@ -1128,8 +1191,7 @@ msgstr "Receba as atualizações de problemas fix de %s"
msgid "Get updates of problems in this %s"
msgstr "Receba as atualizações de problemas neste %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Dê-me um feed RSS"
@@ -1138,17 +1200,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr " Ir"
-#: templates/web/base/admin/report_edit.html:77
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Vai enviar questionário?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Status da tabela grafica ao longo do tempo"
@@ -1156,41 +1218,37 @@ msgstr "Status da tabela grafica ao longo do tempo"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Cor Cinzenta sao linhas dos conselhos que não existem mais"
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Este problema já foi fixado, relatado?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Alguma vez voce ja relatou algum problema ao Conselho, ou é a sua primeira vez?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Ajuda"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Aqui estão os tipos de alertas de problemas locais para relatar fixed; %s';."
-#: templates/web/fixmystreet/header.html:52
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Oi %s"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:50
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1204,7 +1262,7 @@ msgstr "Ocultar"
msgid "Hide pins"
msgstr "Ocultar pins"
-#: templates/web/base/admin/category_edit.html:79
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "History pins"
@@ -1220,27 +1278,25 @@ msgstr "Como reportar um problema"
msgid "How to send successful reports"
msgstr "Como enviar relatorios com sucesso"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:739
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Tenho receio de nao puder confirmar os seus relatorios"
#: templates/web/base/tokens/confirm_problem.html:23
#: templates/web/base/tokens/confirm_problem.html:27
-#, fuzzy
msgid "I just reported a problem on @fixmystreet"
-msgstr "Novos problemas locais FixMyStreetMindelo"
+msgstr ""
#: templates/web/base/tokens/confirm_update.html:19
#: templates/web/base/tokens/confirm_update.html:23
-#, fuzzy
msgid "I just updated a problem on @fixmystreet"
-msgstr "Novos problemas locais FixMyStreetMindelo"
+msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:96
msgid "I'm afraid we couldn't locate your problem in the database.\n"
msgstr "Receio que não foi possível localizar o seu problema no banco de dados.\n"
-#: perllib/FixMyStreet/App/Controller/Tokens.pm:300
+#: perllib/FixMyStreet/App/Controller/Tokens.pm:327
msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
msgstr "Receio que não poderia confirmar se token. Se você copiou o URL de um e-mail, verifique se você copiou exatamente.\n"
@@ -1249,8 +1305,8 @@ msgstr "Receio que não poderia confirmar se token. Se você copiou o URL de um
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1262,31 +1318,15 @@ msgid ""
" For basic installations, you don't need to join bodies in this way."
msgstr ""
-#: templates/web/base/admin/body.html:125
+#: templates/web/base/admin/body.html:133
msgid ""
"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Se não o fizer, o seu alerta não será ativado"
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Se você não fizer isso, o problema não será publicado"
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "se você não fizer isso, a sua atualização não será publicada"
-
#: templates/web/base/questionnaire/completed.html:8
-#, fuzzy
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
-"<p> Muito obrigado para preencher o nosso questionário, se você âŽ\n"
-"obter mais algumas informações sobre o status do seu problema, por favor, volte para o âŽ\n"
-"local e deixar uma atualização. </p>"
#: templates/web/base/report/new/councils_text_none.html:2
#: templates/web/base/report/new/councils_text_none.html:8
@@ -1296,52 +1336,52 @@ msgstr ""
"\"Público, mas o problema nao <strong> vai </strong> ser comunicados ao\"\n"
"\"Conselho\"."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
"Se você usar o e-mail baseado na web ou filtros têm\" junk mail \", você pode querer\"\n"
"\"Verifique suas pastas de correio em massa / spam: às vezes, nossas mensagens são marcadas que\"\n"
"\"Caminho\""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"Se você quiser deixar uma atualização pública sobre o problema, por favor insira-o aqui \\ n\"\n"
"(Note que não será enviado para o conselho). Por exemplo, o que era \\ n\"\n"
"A sua experiência de ter o problema resolvido"
-#: templates/web/base/admin/body.html:141
+#: templates/web/base/admin/body.html:149
msgid "If you're using <strong>a send method that is not email</strong>, enter the service ID (Open311) or equivalent identifier here."
msgstr ""
-#: templates/web/base/admin/body-form.html:200
-#: templates/web/base/admin/body-form.html:201
+#: templates/web/base/admin/body-form.html:207
+#: templates/web/base/admin/body-form.html:208
msgid ""
"If you've enabled Open311 update-sending above, Open311 usually only accepts OPEN or CLOSED status in \n"
" its updates. Enable <strong>extended Open311 stauses</strong> if you want to allow extra states to be passed.\n"
" Check that your cobrand supports this feature before switching it on."
msgstr ""
-#: templates/web/base/admin/body-form.html:187
-#: templates/web/base/admin/body-form.html:188
+#: templates/web/base/admin/body-form.html:194
+#: templates/web/base/admin/body-form.html:195
msgid ""
"If you've enabled Open311 update-sending above, enable <strong>suppression of alerts</strong> \n"
" if you do <strong>not</strong> want that user to be notified whenever these updates are created."
msgstr ""
-#: templates/web/base/admin/body-form.html:173
-#: templates/web/base/admin/body-form.html:174
+#: templates/web/base/admin/body-form.html:177
+#: templates/web/base/admin/body-form.html:178
msgid ""
"If you've enabled Open311 update-sending above, you must identify which \n"
" FixMyStreet <strong>user</strong> will be attributed as the creator of those updates\n"
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "ID ilegal"
@@ -1366,14 +1406,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "Além disso, os seguintes atributos que não fazem parte da especificação v2 Open311 são retornados: agency_sent_datetime, título (também retornou como parte da descrição), interface_used, comment_count, requestor_name (presente apenas se solicitante permitido o nome a ser mostrado neste site) ."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:38
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Em andamento"
@@ -1381,7 +1420,7 @@ msgstr "Em andamento"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Incluir reports detalhes perssoais"
@@ -1393,12 +1432,12 @@ msgstr "Incluir dados nao confirmados"
msgid "Incorrect has_photo value \"%s\""
msgstr "Foto_has valor incorreto \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:48
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1406,7 +1445,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr "Agencia_responsavel valor %s inválido"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1111
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Invalido data final"
@@ -1414,12 +1453,12 @@ msgstr "Invalido data final"
msgid "Invalid format %s specified."
msgstr "Formato inválido%s especificado."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1107
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Data de inicio invalida"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:37
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1437,22 +1476,31 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:150
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
msgid "Keep me signed in on this computer"
msgstr "Manter-me logado neste computador"
-#: templates/web/base/admin/body.html:62
+#: templates/web/base/admin/body.html:70
#: templates/web/zurich/admin/body.html:16
msgid "Last editor"
msgstr "Última editor"
-#: templates/web/base/admin/report_edit.html:72
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Última atualização:"
@@ -1460,17 +1508,15 @@ msgstr "Última atualização:"
msgid "Last&nbsp;update:"
msgstr "Última atualização:"
-#: templates/web/base/admin/body-form.html:222
+#: templates/web/base/admin/body-form.html:229
msgid "Leave this blank if all reports to this body should be sent using the same send method (e.g., \"%s\")."
msgstr ""
-#: templates/web/base/admin/body.html:17 templates/web/base/admin/body.html:19
+#: templates/web/base/admin/body.html:27
msgid "List all reported problems"
msgstr "Listar todos os problemas relatados"
-#: templates/web/base/report/new/fill_in_details_form.html:69
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:54
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/base/report/new/category_wrapper.html:4
msgid "Loading..."
msgstr "Carregando ..."
@@ -1489,11 +1535,11 @@ msgstr "RSS feeds e alertas de e-mail locais"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "RSS feeds e alertas de e-mail locais para '%s'"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Alertas locais"
-#: templates/web/base/index-steps.html:31
+#: templates/web/base/index-steps.html:25
msgid "Locate the problem on a map of the area"
msgstr "Localize o problema em um mapa da área ou zona"
@@ -1505,14 +1551,36 @@ msgstr "Mapa"
msgid "Map"
msgstr ""
-#: templates/web/base/admin/user-form.html:43
+#: templates/web/base/admin/report_edit.html:68
+msgid "Mark as sent"
+msgstr ""
+
+#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
msgstr ""
+#: templates/web/base/reports/index.html:24
+msgid "Marked fixed/closed in the past eight weeks"
+msgstr ""
+
+#: templates/web/base/reports/index.html:25
+msgid "Marked fixed/closed more than eight weeks ago"
+msgstr ""
+
#: templates/web/fixmystreet/contact/index.html:106
msgid "Message"
msgstr "Menssagem"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Atribuir ao órgão externo:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Atribuir ao órgão externo:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Menssagem"
@@ -1540,27 +1608,25 @@ msgstr "Mais problemas próximos"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:94
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Nome"
-#: templates/web/base/admin/report_edit.html:66
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Nome:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Nome: %s"
@@ -1573,12 +1639,12 @@ msgstr "Nomeado rodoviário mais próximo ao pino colocado no mapa (gerado autom
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Código postal mais próximo do pino colocado no mapa (gerado automaticamente): %s (%sm distância)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Estrada mais próxima para o pino colocado no mapa (gerado automaticamente por Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:279
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1587,24 +1653,29 @@ msgstr ""
"\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Quase pronto! Agora, verifique seu e-mail ..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Quase pronto! Agora, verifique seu e-mail ..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Novos <br>problemas"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:264
+#: perllib/FixMyStreet/App/Controller/Admin.pm:261
msgid "New body added"
msgstr "Novo corpo adicionado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Novo contato de categoria adicionado"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1612,9 +1683,9 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr "Novos problemas locais FixMyStreetMindelo"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Novos relatórios locais reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
+msgstr ""
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1640,53 +1711,33 @@ msgstr "Novos problemas dentro de {{NAME}} 's fronteira em FixMyStreetMindelo"
msgid "New reports"
msgstr "Novos reports"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Novos relatórios para {{CONSELHO}} {{dentro WARD}} em reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Novos relatórios sobre reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Novos relatórios sobre reportemptyhomes.com perto CÓDIGO POSTAL {{}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Novos Relatorios sobre reportemptyhomes.com Perto CÓDIGO POSTAL {{}}"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Novos relatórios dentro de {{NAME}} 's fronteira em reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Novo estado"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Nova actualizaçao"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Novo estado"
#: templates/web/base/pagination.html:13
msgid "Next"
msgstr "Proximo"
-#: templates/web/base/admin/body.html:72 templates/web/base/admin/body.html:74
-#: templates/web/base/admin/body.html:78 templates/web/base/admin/body.html:80
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
+#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
#: templates/web/base/admin/category_edit.html:4
#: templates/web/base/admin/list_updates.html:32
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:64
-#: templates/web/base/admin/report_edit.html:77
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nao"
@@ -1714,20 +1765,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Sem mais atualizações"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Nenhum problema encontrado"
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Nenhuns problemas foram ianda reportados"
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Nenhum resultado retornado"
@@ -1744,9 +1786,7 @@ msgstr ""
msgid "No supporters"
msgstr "Não apoiantes"
-#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: templates/web/base/admin/report_edit.html:41
msgid "None"
msgstr "Nenhum"
@@ -1759,8 +1799,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:46
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1768,7 +1808,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Nao responsavel"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Nao responsavel"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Nao pertence ao meu sector"
@@ -1780,8 +1828,8 @@ msgstr "Nao reportado antes"
msgid "Not reported to council"
msgstr "Nao reportado ao conselho"
-#: templates/web/base/admin/body.html:63
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/body.html:71
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Nota"
@@ -1790,8 +1838,8 @@ msgstr "Nota"
msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
msgstr "Note que quando incluimos relatos não confirmados usamos a data em que o relatório foi criado, que pode não estar no mesmo mês em que o relatório foi confirmado de modo que os números podem estar alterados."
-#: templates/web/base/admin/body.html:178
-#: templates/web/base/admin/category_edit.html:44
+#: templates/web/base/admin/body.html:186
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Nota"
@@ -1800,22 +1848,20 @@ msgstr "Nota"
msgid "Note: <strong>%s</strong>"
msgstr "Nota: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Agora, para apresentar o seu relatório ..."
-#: templates/web/base/report/new/fill_in_details_form.html:132
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Agora, para apresentar o seu relatório ... você tem de ter uma senha FixMyStreetMindelo?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Agora, para apresentar a sua atualização ..."
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Agora, para apresentar a sua atualização ... você tem de ter uma senha FixMyStreetMindelo?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1841,31 +1887,32 @@ msgstr "Mais antigo <br>fixado"
msgid "Older <br>problems"
msgstr "Mais antigo <br>problemas"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:37
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:45
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:36
-#: templates/web/base/admin/report_edit.html:37
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Aberto"
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Relatorios abertos"
+#: templates/web/base/reports/index.html:22
+msgid "Open for more than four weeks, with an update within the past eight weeks"
+msgstr ""
+
+#: templates/web/base/reports/index.html:23
+msgid "Open, but not had any update in eight weeks"
+msgstr ""
#: templates/web/base/open311/index.html:70
msgid "Open311 API for the mySociety FixMyStreet server"
@@ -1879,32 +1926,26 @@ msgstr "Open311 página web iniciativa"
msgid "Open311 specification"
msgstr "Especificação Open311"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Ou os problemas relatados para:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Ou você pode se inscrever em um alerta baseado no que ala, zona ou conselho você está inserido"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1041
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:651
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:652
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:595
-#: perllib/FixMyStreet/DB/Result/Problem.pm:605
-#: perllib/FixMyStreet/DB/Result/Problem.pm:617
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Outro"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Nosso código é open source e <a href=\"http://github.com/mysociety/fixmystreet\"> disponível no GitHub </a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Proprietário"
@@ -1919,12 +1960,12 @@ msgstr "Pagina nao encontrada"
msgid "Parent"
msgstr "Parente"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:51
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Parcial"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1933,6 +1974,7 @@ msgid "Password (optional)"
msgstr "Password (opcional)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Password:"
@@ -1940,7 +1982,7 @@ msgstr "Password:"
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:100
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1949,29 +1991,36 @@ msgstr ""
msgid "Phone number (optional)"
msgstr "Telefone (opcional)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:68
-#: templates/web/base/report/new/fill_in_details_form.html:216
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefone:"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:72
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
#: templates/web/fixmystreet/report/update-form.html:59
#: templates/web/zurich/admin/index-dm.html:29
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:68
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
-#: templates/web/base/report/new/fill_in_details_form.html:103
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Esta informação é necessária"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Esta informação é necessária"
+
+#: templates/web/base/questionnaire/index.html:80
+#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto"
@@ -1983,22 +2032,18 @@ msgstr "Fotos de relatórios recentes mais proximos"
msgid "Place pin on map"
msgstr "Coloque a fix pin no mapa"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:38
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planejado"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "<a Class=\"tab_link\" href=\"#report\"> dar uma olhada </a> nas atualizações que foram deixadas."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Por favor, seja educado, objectivo, conciso e direto ao ponto."
@@ -2008,41 +2053,39 @@ msgstr "Por favor, seja educado, objectivo, conciso e direto ao ponto."
msgid "Please check the passwords and try again"
msgstr "Por favor verifique as senhas e tente novamente"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Favor verificar seu email"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Favor verificar se seu email esta correcto"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:861
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:905
-#: perllib/FixMyStreet/DB/Result/Problem.pm:420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:343
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
+#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
msgstr "Escolher uma categoria"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:426
+#: perllib/FixMyStreet/DB/Result/Problem.pm:418
msgid "Please choose a property type"
msgstr "Por favor, escolha um tipo de imóvel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:373
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
-msgstr "Por favor, selecione o feed que deseja"
+msgstr ""
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"Por favor, faça <strong> não </strong> relatar problemas através deste formulário; mensagens de ir para âŽ\n"
@@ -2056,8 +2099,8 @@ msgstr ""
"a Equipe POR Trás FixMyStreet, Nao hum Conselho. Pará relatar hum Problema, âŽ\n"
"<a href=\"/\"> ir par a Página Inicial </a> e como SIGA INSTRUÇÕES."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:349
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/App/Controller/Admin.pm:346
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Por favor insira uma mensagem"
@@ -2068,15 +2111,15 @@ msgstr "Por favor insira uma mensagem"
msgid "Please enter a password"
msgstr "Por favor insira uma password"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Por favor insira um assunto"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1047
-#: perllib/FixMyStreet/App/Controller/Admin.pm:348
-#: perllib/FixMyStreet/App/Controller/Admin.pm:994
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2084,7 +2127,7 @@ msgid "Please enter a valid email"
msgstr "Por favor insira um email valido"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Por favor insira um endereço de e-mail válido"
@@ -2093,21 +2136,19 @@ msgstr "Por favor insira um endereço de e-mail válido"
msgid "Please enter some details"
msgstr "Por favor, insira alguns detalhes"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Digite seu e-mail"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:92
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Por favor, insira o seu endereço de email"
@@ -2115,13 +2156,13 @@ msgstr "Por favor, insira o seu endereço de email"
msgid "Please enter your first name"
msgstr "Digite seu primeiro nome"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:413
+#: perllib/FixMyStreet/Cobrand/UK.pm:318
#: templates/web/base/js/translation_strings.html:7
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Por favor, insira o seu nome completo, os conselhos precisam desta informação - se você não quiser que seu nome seja mostrado no site, desmarque a caixa abaixo"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2160,7 +2201,7 @@ msgstr "Por favor, preencha os detalhes do problema."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Por favor, preencha o formulário abaixo com detalhes do problema e descrever a localização mais precisa possível na caixa de detalhes."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Por favor, indique se você gostaria de receber um outro questionário"
@@ -2183,19 +2224,24 @@ msgstr "Por favor, note o relatório ainda não foi enviado <strong> </strong>.
msgid "Please note:"
msgstr "Favor notar:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Favor fornecer uma explicação de por que você está reabrindo este relatório"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Por favor, forneça algum texto, bem como uma foto"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Por favor, diga se você já relatou um problema para o seu conselho antes"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Selecione um corpo"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Por favor, selecione o feed que deseja"
@@ -2204,21 +2250,17 @@ msgstr "Por favor, selecione o feed que deseja"
msgid "Please select the type of alert you want"
msgstr "Selecione o tipo de alerta que deseja"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Por favor, indique se o problema foi corrigido"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Por favor, dê uma olhada nas atualizações que foram deixadas."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Faça upload somente de uma imagem em JPEG "
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Por favor, escreva uma mensagem"
@@ -2227,8 +2269,8 @@ msgid "Please write your update here"
msgstr "Por favor, escreva a sua atualização aqui"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2249,23 +2291,36 @@ msgstr "Postado por %s (<strong>%s</strong>) em %s"
msgid "Posted by %s at %s"
msgstr "Postado por %s aem %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Anterior"
-#: templates/web/fixmystreet/footer.html:32
-#, fuzzy
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
-msgstr "Privado"
+msgstr ""
-#: templates/web/base/admin/body.html:194
-#: templates/web/base/admin/body.html:77
-#: templates/web/base/admin/category_edit.html:40
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
+#: templates/web/base/admin/body.html:202
+#: templates/web/base/admin/body.html:85
+#: templates/web/base/admin/category_edit.html:45
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privado"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problema"
@@ -2281,12 +2336,12 @@ msgstr "Problema %s confirmado"
msgid "Problem %s sent to council %s"
msgstr "Problema %s enviado ao conselho %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Colapso problema por estado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:965
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problema marcado como aberto."
@@ -2302,12 +2357,10 @@ msgstr "Problemas"
msgid "Problems in this area"
msgstr "Problemas nesta área"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemas nas proximidades"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemas no mapa"
@@ -2316,12 +2369,11 @@ msgstr "Problemas no mapa"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problemas relatados recentemente fixados em FixMyStreetMindelo"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemas dentro de %.1fkm deste local"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2333,21 +2385,18 @@ msgstr "Problemas dentro de %s"
msgid "Problems within %s ward"
msgstr "Problemas dentro de %s ala"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemas dentro de %s, FixMyStreetMindelo"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemas dentro de %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemas dentro do limite de:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Propriedades informou recentemente como colocar de volta para uso em reportemptyhomes.com"
-
-#: templates/web/base/admin/report_edit.html:32
+#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Endereço do imóvel:"
@@ -2360,39 +2409,31 @@ msgstr "Tipo de propriedade:"
msgid "Provide an update"
msgstr "Fornecer uma atualização"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:174
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Fornecer uma senha é opcional, mas isso vai permitir que você mais facilmente relate seus problemas, deixe as atualizações e gerencie seus relatórios."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Resposta do público:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publicar foto"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publicar a resposta"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Questionario"
@@ -2408,12 +2449,11 @@ msgstr "Questionário %d enviou para o problema de %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Questionário preenchido por problema repórter"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2439,8 +2479,7 @@ msgstr "RSS feed de %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS feed de %s, %s problemas pendentes"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS feed dos problemas próximos"
@@ -2448,7 +2487,7 @@ msgstr "RSS feed dos problemas próximos"
msgid "RSS feed of problems in this %s"
msgstr "RSS feed dos problemas nesta %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2478,17 +2517,18 @@ msgstr "RSS feed de atualizações para este problema"
msgid "Receive email when updates are left on this problem."
msgstr "RSS feed dos problemas locais recentes"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Recentes problemas locais, FixMyStreetMindelo"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Recentement <br>fixed"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Problemas recentemente reportados"
@@ -2496,24 +2536,27 @@ msgstr "Problemas recentemente reportados"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Lembre-se que FixMyStreetMIndelo é principalmente para relatar problemas físicos que podem ser corrigidos. Se o seu problema não é apropriado para a apresentação através deste site, lembre-se que você pode contactar o seu município diretamente usando seu próprio site."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Remover bandeira"
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Remover foto (não pode ser desfeita!)"
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
-#, fuzzy
msgid "Report"
-msgstr "Relatórios"
+msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Comunicar um problema"
@@ -2522,94 +2565,96 @@ msgstr "Comunicar um problema"
msgid "Report abuse"
msgstr "Denunciar um abuso"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Relatório sobre %s"
#: templates/web/base/report/new/fill_in_details_form.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
-#, fuzzy
msgid "Report your problem"
-msgstr "Comunicar um problema"
+msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Relatório, vista, ou discutir os problemas locais"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Relatado %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Reportados %s, para %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:600
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Relatado anonimamente em %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Relatado antes"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Relatado por %s em %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Relatado %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Relatado na categoria %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:596
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Relatado na categoria %s anonimamente em %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Relatado na categoria %s por %s em %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:592
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Relatado por %s anonimamente em %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:614
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Relatado por %s por%s em %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Relatado por %s na categoria %s anonimamente em %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Relatado por %s na categoria %s por %s em %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/reports/index.html:21
+msgid "Reported within the last four weeks"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Relatado %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Relatando um problema"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Relatórios"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:434
-#: perllib/FixMyStreet/DB/Result/Problem.pm:438
+#: perllib/FixMyStreet/Cobrand/UK.pm:327 perllib/FixMyStreet/Cobrand/UK.pm:331
msgid "Reports are limited to %s characters in length. Please shorten your report"
msgstr ""
@@ -2617,18 +2662,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr "Relatórios aguardando aprovação"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Relatórios sobre e ao redor do mapa"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Os relatórios publicados"
-#: templates/web/base/admin/report_edit.html:71
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Reenviar relatório"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Lugar certo?"
@@ -2643,27 +2691,32 @@ msgstr "Operador de estrada por esta estrada chamada (derivado do número de ref
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Operador de estrada por esta estrada chamada (a partir de OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1391
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1402
-#: templates/web/base/admin/report_edit.html:90
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Girar para a esquerda"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1391
-#: templates/web/base/admin/report_edit.html:91
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Girar para a direita"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
-#: templates/web/base/admin/body.html:200
-#: templates/web/base/admin/category_edit.html:76
+#: templates/web/base/admin/body.html:208
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Salvar alterações"
@@ -2676,7 +2729,7 @@ msgstr "Busca Reports"
msgid "Search Users"
msgstr "Procurar Usuários"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "elatórios de pesquisa"
@@ -2690,7 +2743,7 @@ msgstr "Pesquisar:"
msgid "Searching found no reports."
msgstr ""
-#: templates/web/base/admin/users.html:39
+#: templates/web/base/admin/users.html:41
msgid "Searching found no users."
msgstr ""
@@ -2700,29 +2753,33 @@ msgid "Select a body"
msgstr "Selecione um corpo"
#: templates/web/base/reports/index.html:9
-#, fuzzy
msgid "Select a particular council to see the reports sent there."
-msgstr "Este é um resumo de todos os relatórios sobre este site, selecionar um conselho especial para ver os relatórios enviados para lá."
+msgstr ""
#: templates/web/base/admin/body-form.html:71
#: templates/web/zurich/admin/body-form.html:26
msgid "Select an area"
msgstr "Selecione uma área"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Selecione o tipo de alerta fixstreet que você gostaria de receber e clique no botão para um feed RSS ou introduza o seu endereço de email para assinar um alerta de e-mail."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:705
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Relatorios abertos"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Enviado para %s %s mais tarde"
-#: templates/web/base/admin/report_edit.html:71
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Enviar:"
-#: templates/web/base/admin/report_edit.html:73
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Srerviço:"
@@ -2731,8 +2788,8 @@ msgstr "Srerviço:"
msgid "Share"
msgstr "Acçao"
-#: templates/web/base/report/new/fill_in_details_form.html:211
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2748,40 +2805,29 @@ msgid "Show pins"
msgstr "Mostrar pins"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Entrar"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Entrar por email"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Entar e crear uma conta"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Sair "
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Entrou como %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Algumas categorias podem solicitar informações adicionais."
-#: templates/web/base/admin/body-form.html:145
-#: templates/web/base/admin/body-form.html:146
+#: templates/web/base/admin/body-form.html:149
+#: templates/web/base/admin/body-form.html:150
msgid ""
"Some endpoints require an <strong>API key</strong> to indicate that the reports are being\n"
" sent from your FixMyStreet installation."
@@ -2791,8 +2837,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Fotos de reports recentes"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Algum informaçao para localizar"
@@ -2800,29 +2847,37 @@ msgstr "Algum informaçao para localizar"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Desculpe, codigo postal nao coincide. Area nao comprrendida."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Desculpe, houve um erro ao confirmar o seu problema."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Desculpe, não conseguimos encontrar esse local."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Desculpe, mas não foi possível analisar esse local. Por favor, tente novamente."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Desculpe, mas não foi possível analisar esse local. Por favor, tente novamente."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
-#: templates/web/base/admin/body.html:61
+#: templates/web/base/admin/body.html:69
#: templates/web/base/admin/flagged.html:18
#: templates/web/base/admin/list_updates.html:11
#: templates/web/base/admin/reports.html:15
@@ -2830,19 +2885,20 @@ msgstr ""
msgid "State"
msgstr "Estado"
-#: templates/web/base/admin/report_edit.html:34
+#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Estado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Stats"
@@ -2856,7 +2912,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr "Ainda em aberto, via questionário, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Subcategoria: %s"
@@ -2871,45 +2932,42 @@ msgstr "Assunto:"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Assunto:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:115
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/new/fill_in_details_form.html:177
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
+#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:108
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Submeter"
-#: templates/web/base/admin/report_edit.html:97
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
-#: templates/web/base/admin/user-form.html:55
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/base/admin/user-form.html:56
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Submeter alteraçoes"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Submeter questionario"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Submitido"
@@ -2920,18 +2978,19 @@ msgstr "Submitido"
msgid "Subscribe"
msgstr "Subscrever"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Subcrever um alerta de e-mail"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1190
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Resumo"
@@ -2942,7 +3001,7 @@ msgstr "Resumo"
msgid "Summary reports"
msgstr "Resumo reports"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Teste"
@@ -2950,17 +3009,27 @@ msgstr "Teste"
msgid "Survey Results"
msgstr "Resultados teste"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Actualizaçoes"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Texto"
-#: templates/web/base/admin/body.html:21
+#: templates/web/base/admin/body.html:28
msgid "Text only version"
msgstr "Somente versao texto"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Texto:"
@@ -2982,7 +3051,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Obrigado por upload de sua foto. Precisamos agora de localizar o seu problema, então digite um nome de rua nas proximidades ou código postal na caixa acima:"
@@ -2990,7 +3059,7 @@ msgstr "Obrigado por upload de sua foto. Precisamos agora de localizar o seu pro
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Obrigado, gratos em ouvir que o problema foi corrigido! Podemos apenas perguntar se você já relatou um problema para um conselho antes?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Essa imagem não parece ter sido carregada corretamente (%s), por favor, tente novamente."
@@ -3008,40 +3077,44 @@ msgstr "Esse local não parece estar em Mindelo, por favor tente novamente."
msgid "That postcode was not recognised, sorry."
msgstr "Esse código postal não foi reconhecido, me desculpe.Tente novamente."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:710
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
+msgid "That problem has been marked as sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Esse problema agora será reenviado e reportado ao conselho."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Esse relatório não pode ser visualizado em %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Esse relatório foi removido FixMyStreetMIndelo"
-#: templates/web/base/admin/body.html:136
+#: templates/web/base/admin/body.html:144
msgid ""
"The <strong>email address</strong> is the destination to which reports about this category will be sent. \n"
" Other categories for this body may have the same email address."
msgstr ""
-#: templates/web/base/admin/body-form.html:119
-#: templates/web/base/admin/body-form.html:120
+#: templates/web/base/admin/body-form.html:123
+#: templates/web/base/admin/body-form.html:124
msgid ""
"The <strong>endpoint</strong> is the URL of the service that FixMyStreet will connect to \n"
" when sending reports to this body."
msgstr ""
-#: templates/web/base/admin/body-form.html:132
-#: templates/web/base/admin/body-form.html:133
+#: templates/web/base/admin/body-form.html:136
+#: templates/web/base/admin/body-form.html:137
msgid ""
"The <strong>jurisdiction</strong> is only needed if the endpoint is serving more\n"
" than one. If the body is running its own endpoint, you can usually leave this blank."
msgstr ""
-#: templates/web/base/admin/body-form.html:90
-#: templates/web/base/admin/body-form.html:91
+#: templates/web/base/admin/body-form.html:94
+#: templates/web/base/admin/body-form.html:95
msgid ""
"The <strong>send method</strong> determines how problem reports will be sent to the body.\n"
" If you leave this blank, <strong>send method defaults to email</strong>."
@@ -3058,30 +3131,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "O e-mail de confirmação <strong> Maio </strong> levar alguns minutos para chegar - <em> por favor </em>, seja paciente."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "O conselho não vai ser capaz de ajudar a menos que você deixe o máximo de detalhes possível. Por favor, descreva a localização exata do problema (por exemplo, em uma parede, passeio, pavimento, iluminaçao), o que é, quanto tempo ele tem estado lá, uma descrição (e uma foto do problema se você tiver um), e outras informaçoes uteis."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Os detalhes do seu problema estão disponíveis na outra aba acima."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Os detalhes do seu problema estão disponíveis no lado direito desta página."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "O erro foi: %s"
@@ -3099,10 +3160,6 @@ msgstr "As seguintes informações sobre a estrada mais próxima pode ser imprec
msgid "The latest local problems reported by users"
msgstr "Os últimos problemas locais relatados por usuários"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Os últimos relatórios locais relatados por usuários"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Os últimos problemas para {{}} CONSELHO relatados por usuários"
@@ -3123,21 +3180,9 @@ msgstr "Os últimos problemas relatados fixado por usuários"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "Os últimos problemas dentro de {{NAME}} 's fronteira relatados por usuários"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "As propriedades mais relatadas de usar por usuários"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "Os últimos relatórios para {{}} CONSELHO relatados por usuários"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "Os últimos relatórios para {{CONSELHO}} {{dentro WARD}} ala relatados por usuários"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "Os últimos relatórios dentro de {{NAME}} 's fronteira relatados por usuários"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3153,8 +3198,7 @@ msgstr "As senhas não são iguais"
msgid "The requested URL '%s' was not found on this server"
msgstr " A URL solicitada '%s' não foi encontrada neste servidor"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "O alerta mais simples é o nosso único ponto localizaçao geográfica:"
@@ -3162,11 +3206,10 @@ msgstr "O alerta mais simples é o nosso único ponto localizaçao geográfica:"
#: templates/web/base/report/new/councils_text_some.html:10
#: templates/web/base/report/new/fill_in_details_form.html:18
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:14
-#, fuzzy
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
-msgstr "Suas informações só serão utilizadas de acordo com nossa <a href=\"/privacy\"> política de privacidade </a>"
+msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "O usuário não conseguiu localizar o problema em um mapa, localizar a area mais proxima do local"
@@ -3177,23 +3220,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Houve um problema ao mostrar a página de todos os relatórios. Por favor, tente novamente mais tarde."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Houve um problema mostrada nesta página. Por favor, tente novamente mais tarde."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:747
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Houve um problema com o email / combinação de senha. Se você não lembra da sua senha, ou não tiver um, por favor preencha o \"sinal de colocar e-mail 'seção do formulário."
@@ -3206,7 +3250,7 @@ msgstr "Houve um problema com o email / combinação de senha. Por favor, tente
msgid "There was a problem with your update. Please try again."
msgstr "Houve um problema com a sua atualização. Por favor, tente novamente."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Houve problemas com o seu relatório. Por favor, veja abaixo."
@@ -3214,8 +3258,8 @@ msgstr "Houve problemas com o seu relatório. Por favor, veja abaixo."
msgid "There were problems with your update. Please see below."
msgstr "Houve problemas com a sua atualização. Por favor, veja abaixo."
-#: templates/web/base/admin/body-form.html:108
-#: templates/web/base/admin/body-form.html:109
+#: templates/web/base/admin/body-form.html:112
+#: templates/web/base/admin/body-form.html:113
msgid ""
"These settings are for bodies that use Open311 (or other back-end integration) to receive problem reports.<br>\n"
" <strong>You don't need to set them if the Send Method is email.</strong>.\n"
@@ -3228,14 +3272,14 @@ msgstr ""
msgid "This API implementation is work in progress and not yet stabilized. It will change without warnings in the future."
msgstr "Esta implementação API é um trabalho em andamento e ainda não estabilizou. Ela vai mudar sem avisos no futuro."
-#: templates/web/base/admin/body.html:36
+#: templates/web/base/admin/body.html:44
msgid ""
"This body covers no area. This means that it has no jurisdiction over problems reported <em>at any location</em>.\n"
" Consequently, none of its categories will appear in the drop-down category menu when users report problems.\n"
" Currently, users <strong>cannot report problems to this body</strong>."
msgstr ""
-#: templates/web/base/admin/body.html:46
+#: templates/web/base/admin/body.html:54
msgid "This body has no contacts. This means that currently problems reported to this body <strong>will not be sent</strong>."
msgstr ""
@@ -3246,16 +3290,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Este e-mail foi enviado para ambos os conselhos que cobrem o local do problema, como o usuário não categorizá-lo, por favor, ignorar se você não é o conselho correto para lidar com o problema, ou deixe-nos saber que categoria de problema é para que possamos adicioná-lo ao nosso sistema."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Este e-mail foi enviado para vários conselhos que cobrem o local do problema, como a categoria selecionada é fornecida para todos eles, por favor, ignorar se você não é o conselho correto para lidar com o problema."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:882
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:952
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3266,11 +3310,10 @@ msgid "This is a developer site; things might break at any time, and the databas
msgstr "Este é um site do desenvolvedor, as coisas podem quebrar a qualquer momento, e o banco de dados serão apagados periodicamente."
#: templates/web/base/reports/index.html:7
-#, fuzzy
msgid "This is a summary of all reports on this site."
-msgstr "Este é um resumo de todos os relatórios sobre este site, selecionar um conselho especial para ver os relatórios enviados para lá."
+msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "Isso pode ser porque o link é velho demais ou já foi utilizado, ou o endereço não foi copiado corretamente."
@@ -3297,55 +3340,69 @@ msgstr "Este problema está em progresso"
msgid "This problem is old and of unknown status."
msgstr "Este problema é antigo e de status desconhecido."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Este relatório está aguardando moderação."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Este relatório está marcado como fechado."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Este relatório está marcado como fixo."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Este relatório está marcado como aberto."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Este relatório foi enviado anonimamente"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Esta página também contém uma foto do problema, fornecido pelo usuário."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Timeline"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titulo"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Para <strong> relatar um problema </strong>, clique no mapa no local correto."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titulo"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Para descobrir quais os alertas locais que temos para si, deve inserir o seu código postal ou nome de rua e área ou zona"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Para descobrir quais os alertas locais que temos para si, deve inserir o seu código postal ou nome de rua e área ou zona"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "Para ver no mapa a localização exata desse problema"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3361,8 +3418,8 @@ msgstr "Tente novamente"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:46
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3370,11 +3427,11 @@ msgstr ""
msgid "Unable to fix"
msgstr "Incapaz de ser resolvido"
-#: templates/web/base/admin/report_edit.html:35
-#: templates/web/base/admin/report_edit.html:51
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Não confirmado"
@@ -3391,7 +3448,9 @@ msgstr "Tipo de alerta desconhecido"
msgid "Unknown error"
msgstr "Erro desconhecido"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Desconhecido problema com ID"
@@ -3413,12 +3472,12 @@ msgstr "Atualize abaixo colocado de forma anónima em %s"
msgid "Update below added by %s at %s"
msgstr "Actualizar abaixo adicionado por %s em %s"
-#: templates/web/base/admin/body-form.html:233
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/base/admin/body-form.html:240
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Atualize corpo"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Atualize repartição por Estado"
@@ -3439,7 +3498,7 @@ msgstr "Atualizaçao do problema marcado como fixo"
msgid "Update reopened problem"
msgstr "Reaberto a actualizaçao do problema"
-#: templates/web/base/admin/body.html:93
+#: templates/web/base/admin/body.html:101
msgid "Update statuses"
msgstr "Atualizar status"
@@ -3453,53 +3512,55 @@ msgstr "Actualizar:"
msgid "Updated"
msgstr "Atualizado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1013
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1057
-#: perllib/FixMyStreet/App/Controller/Admin.pm:807
-#: perllib/FixMyStreet/App/Controller/Admin.pm:955
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Actualizado!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Actualizaçoes"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
-#, fuzzy
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
-msgstr "As atualizações são limitadas a 2000 caracteres. Por favor, encurtar a sua atualização"
+msgstr ""
#: db/alert_types.pl:5 db/alert_types.pl:6
msgid "Updates on {{title}}"
msgstr "Atualizações sobre {{título}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Atualizações para este problema, FixMyStreetMindelo"
-#: templates/web/base/admin/body.html:174
+#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "mapa usado"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1356
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Bandeira usuário removida"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1328
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Usuário sinalizado"
@@ -3507,23 +3568,23 @@ msgstr "Usuário sinalizado"
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Usuários"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:377
-#: perllib/FixMyStreet/App/Controller/Admin.pm:407
-#: perllib/FixMyStreet/App/Controller/Admin.pm:427
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Valores atualizados"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Ver relatório no site"
@@ -3547,16 +3608,15 @@ msgid "Wards of this council"
msgstr "Wards deste conselho"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Encontramos mais de uma correspondência para essa localização. Mostramos até dez partidas, por favor tente uma pesquisa diferente se não estiver aqui."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Nós não temos sido capazes de confirmar a sua conta - desculpe."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Nós enviamos um e-mail contendo um link para confirmar sua conta."
@@ -3570,11 +3630,11 @@ msgstr "Nós nunca divulgaremos o seu e-mail"
msgid "We never show your email address or phone number."
msgstr "Nós nunca divulgaremos o seu endereço de e-mail ou número de telefone."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Percebemos este problema pode ser da responsabilidade do %s, no entanto, nós não possuímos nenhuma informação de contato deles. Se você souber de um endereço de contato apropriado, favor fornecer esse contacto. Obrigado."
-#: templates/web/base/index-steps.html:38
+#: templates/web/base/index-steps.html:31
msgid "We send it to the council on your behalf"
msgstr "Nós enviá-lo para o conselho em seu nome"
@@ -3592,15 +3652,18 @@ msgid "We'd love to hear what you think about this site. Just fill in the form,
msgstr "Adoraríamos ouvir o que você pensa sobre este site. Basta preencher o formulário, ou envie um e-mail para <a href='mailto:%s'>%s</a>:"
#: templates/web/base/contact/submit.html:7
-#, fuzzy
msgid "We’ll get back to you as soon as we can."
-msgstr "Obrigado pelo seu feedback. Nós vamos responder o mais rapidamente possível!"
+msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:41
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:82
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Quando editar"
@@ -3609,7 +3672,7 @@ msgstr "Quando editar"
msgid "When sent"
msgstr "Quando enviar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:621
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Bloco inteiro de apartamentos vazios"
@@ -3617,17 +3680,22 @@ msgstr "Bloco inteiro de apartamentos vazios"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Com o pedido de pesquisa, também é possível pesquisar agency_responsavel para limitar as solicitações às enviados para uma única administração. O termo de pesquisa é a identificação de administração fornecidos pela <a href=\"%s\"> MapIt </a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
-#, fuzzy
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
-msgstr "Gostaria de contribuir para FixMyStreet Nosso código é open source e <a href=\"http://github.com/mysociety/fixmystreet\"> disponível no GitHub </a>."
+msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Gostaria de receber um questionário em 4 semanas, lembrando que você verifique o status?"
@@ -3645,23 +3713,21 @@ msgid "Year"
msgstr "Ano"
#: templates/web/base/admin/bodies.html:66
-#: templates/web/base/admin/body.html:72 templates/web/base/admin/body.html:74
-#: templates/web/base/admin/body.html:78 templates/web/base/admin/body.html:80
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
+#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
#: templates/web/base/admin/category_edit.html:5
#: templates/web/base/admin/flagged.html:47
#: templates/web/base/admin/list_updates.html:32
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:77
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
-#: templates/web/base/admin/users.html:29
+#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Sim"
@@ -3690,7 +3756,7 @@ msgstr "Você está reportando a seguinte atualização por ser abusiva, contend
msgid "You can <a href=\"%s%s\">view the problem on this site</a>."
msgstr "Você pode <a href=\"%s%s\"> ver o problema neste site </a>."
-#: templates/web/base/admin/user-form.html:47
+#: templates/web/base/admin/user-form.html:48
msgid "You can add an abusive user's email to the abuse list, which automatically hides (and never sends) reports they create."
msgstr ""
@@ -3712,7 +3778,7 @@ msgstr ""
msgid "You can help us by finding a contact email address for local problems for %s and emailing it to us at <a href='mailto:%s'>%s</a>."
msgstr "Você pode nos ajudar a encontrar um endereço de e-mail de contato para os problemas locais para %s e e-mail para nós em <a href='mailto:%s'>%s</a>."
-#: templates/web/base/admin/body-form.html:81
+#: templates/web/base/admin/body-form.html:85
msgid "You can mark a body as deleted if you do not want it to be active on the site."
msgstr ""
@@ -3724,11 +3790,9 @@ msgstr "Você recusou, por favor preencha o quadro de cima"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Você já respondeu a este questionário. Se você tem uma pergunta, por favor <a href='%s'> entrar em contato </a>, ou <a href='%s'> ver o seu problema </a>. \n"
-#: templates/web/base/questionnaire/index.html:68
-#: templates/web/base/report/new/fill_in_details_form.html:94
-#: templates/web/fixmystreet/questionnaire/index.html:88
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:79
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/base/questionnaire/index.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:75
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Você já anexou uma foto com este relatório, anexando outro irá substituí-lo."
@@ -3737,6 +3801,10 @@ msgstr "Você já anexou uma foto com este relatório, anexando outro irá subst
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Você já anexou uma foto a esta atualização, anexando outra irá substituí-la."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3757,15 +3825,11 @@ msgstr "Você confirmou com sucesso o seu endereço de e-mail."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Você se inscreveu com sucesso nos, por favor, verificar e confirmar os seus dados estão correctos:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Agora você deve clicar no link do e-mail que acabamos de lhe enviar."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3776,18 +3840,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:71
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Você realmente deseja reenviar o email?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Seus relatorios"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3796,23 +3858,18 @@ msgstr "Seus relatorios"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:88
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Seu e-mail"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "O seu endereço de email"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "O seu endereço de email:"
-
-#: templates/web/base/alert/_list.html:92
-#: templates/web/base/report/new/fill_in_details_form.html:125
+#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
msgstr "Seu e-mail:"
@@ -3821,24 +3878,23 @@ msgstr "Seu e-mail:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Suas informações só serão utilizadas de acordo com nossa <a href=\"/privacy\"> política de privacidade </a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:98
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Nome"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:204
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Nome"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3851,19 +3907,15 @@ msgstr "Sua password foi alterada"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:104
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Telefone "
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Seu relatório"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Seus relatórios"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Suas atualizações"
@@ -3871,41 +3923,55 @@ msgstr "Suas atualizações"
msgid "Your&nbsp;email:"
msgstr "Seu e-mail:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Todos os relatórios"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "por %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Reports Fechados"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "conselho"
-#: templates/web/base/admin/report_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
+#: templates/web/base/admin/report_edit.html:32
msgid "didn't use map"
msgstr "não usar o mapa"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "por exemplo '%s' ou '%s'"
+#: templates/web/base/admin/body-form.html:188
#: templates/web/base/admin/flagged.html:51
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Reports Corrigidos"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "e %d usuários diferentes"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "Última atualizada %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "menos de um minuto"
@@ -3950,14 +4016,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n / a"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "ou"
@@ -3965,22 +4030,22 @@ msgstr "ou"
msgid "or locate me automatically"
msgstr "ou localizár-me automaticamente"
-#: templates/web/base/admin/report_edit.html:24
-#: templates/web/base/admin/report_edit.html:26
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/base/admin/report_edit.html:28
+#: templates/web/base/admin/report_edit.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "originalmente introduzido: \"%s\""
-#: templates/web/base/admin/report_edit.html:30
+#: templates/web/base/admin/report_edit.html:43
msgid "other areas:"
msgstr "outras áreas:"
@@ -3989,8 +4054,8 @@ msgstr "outras áreas:"
msgid "reopened"
msgstr "reaberto"
-#: templates/web/fixmystreet/header.html:53
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "sair"
@@ -4006,17 +4071,20 @@ msgstr "o conselho local"
msgid "there is no pin shown as the user did not use the map"
msgstr "não há nenhum fix pin para o usuario usar no mapa"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "este tipo de problema local"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "hoje"
-#: templates/web/base/admin/report_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Reports Corrigidos"
+
+#: templates/web/base/admin/report_edit.html:32
msgid "used map"
msgstr "mapa usado"
@@ -4040,7 +4108,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> Relatorio recentemente"
msgstr[1] "<big>%s</big> Relatorios recentemente"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4054,7 +4122,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d suppoter"
msgstr[1] "%d supporters"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4075,7 +4143,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Nós ainda não temos detalhes para o conselho, que abrange este local."
msgstr[1] "Nós ainda não temos detalhes para o conselho, que abrange este local."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4096,7 +4164,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> fixado no mês passado"
msgstr[1] "<big>%s</big> fixado no mês passado"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4110,341 +4178,144 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Fazemos <strong> não </strong> ainda tem detalhes para os outros conselhos que cobrem este local."
msgstr[1] "Fazemos <strong> não </strong> ainda tem detalhes para os outros conselhos que cobrem este local."
-#~ msgid "All the information you provide here will be sent to <strong>%s</strong> or <strong>Roads Service</strong>."
-#~ msgstr "Todas as informações que você fornecer aqui serão enviados para <strong>%s</strong> ou <strong> Entradas de Serviço </strong>."
-
-#~ msgid "All the information you provide here will be sent to <strong>%s</strong> or a relevant local body such as <strong>TfL</strong>, via the London Report-It system."
-#~ msgstr "Todas as informações que você fornecer aqui serão enviados para <strong>%s</strong> ou um corpo local relevantes, tais como <strong> TfL </strong>, através do Relatório-It sistema Mindelo."
-
-#~ msgid "I'm afraid we couldn't validate that token, as the report was made too long ago."
-#~ msgstr "Receio que não pôde validar esse token, como o relatório foi feito há muito tempo."
-
-#~ msgid "<p style=\"font-size:150%\">Thank you very much for filling in our questionnaire; glad to hear it&rsquo;s been fixed.</p>"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
#~ msgstr ""
-#~ "<p style=\\\"font-size:150%\\\"> Muito obrigado pelo preenchimento de nosso \"\n"
-#~ "\"Questionário;. Gratos por saber que foi corrigido </p>\""
-
-#~ msgid ""
-#~ "<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
-#~ "suggestions: why not try <a href=\"http://www.norge.no/styresmakter/\">writing\n"
-#~ "direct to your councillor(s)</a> or, if it&rsquo;s a problem that could be\n"
-#~ "fixed by local people working together, why not\n"
-#~ "<a href=\"http://www.pledgebank.com/new\">make and publicise a pledge</a>?\n"
-#~ "</p>"
-#~ msgstr ""
-#~ "<p Style=\\\"font-size:150%\\\"> Lamentamos ouvir isso. Temos dois \\ n\"\n"
-#~ "\"Sugestão: por que não tentar <a href=\\\"http://www.norge.no/styresmakter/\\\"> escrita \\ n\"\n"
-#~ "\"Direto para o seu conselheiro (s) </a> ou, se É um problema que pode ser \\ n\"\n"
-#~ "\"Fixado por pessoas locais que trabalham juntos, por que não \\ n\"\n"
-#~ "\"<a Href=\\\"http://www.pledgebank.com/new\\\"> fazer e divulgar um compromisso </a> \\ N\"\n"
-#~ "\"</P>\""
-
-#~ msgid ""
-#~ "<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
-#~ "suggestions: why not try writing to your local representatives or, if\n"
-#~ "it&rsquo;s a problem that could be fixed by local people working together, why\n"
-#~ "not <a href=\"http://www.pledgebank.com/new\">make and publicise a pledge</a>?\n"
-#~ "</p>"
-#~ msgstr ""
-#~ "<p style=\"font-size:150%\"> Lamentamos ouvir isso. Temos duas âŽ\n"
-#~ "sugestão: por que não tentar escrever para seu representante local ou, se for âŽ\n"
-#~ "um problema que pode ser corrigido por pessoas locais que trabalham juntos, por que não âŽ\n"
-#~ "<a href=\"http://www.pledgebank.com/new\"> fazer e divulgar um compromisso </a> âŽ\n"
-#~ "</P>"
-
-#, fuzzy
-#~ msgid "<strong>We will now send it to the council</strong>."
-#~ msgstr " e <strong>agora vamos enviá-lo ao Conselho</strong>"
-
-#~ msgid "Failed to send message. Please try again, or <a href=\"mailto:%s\">email us</a>."
-#~ msgstr "Falha ao enviar a mensagem. Por favor, tente novamente, ou <a href=\"mailto:%s\"> email nós </a>."
-
-#~ msgid "Please upload a JPEG image only\n"
-#~ msgstr "Faça upload de uma imagem JPEG \n"
-
-#~ msgid "Thank you &mdash; you can <a href=\"%s\">view your updated problem</a> on the site."
-#~ msgstr "Obrigado - você pode <a href=\"%s\"> ver o seu problema atualizados </a> no site."
-
-#~ msgid "You have successfully confirmed your alert."
-#~ msgstr "Você confirmou com sucesso o seu alerta."
-
-#~ msgid "You have successfully confirmed your update and you can now <a href=\"%s\">view it on the site</a>."
-#~ msgstr "Você confirmou com êxito a sua atualização e agora você pode <a href=\"%s\"> vê-lo no site </a>."
+#~ "(Não se preocupe - nós vamos ficar com o alerta, enquanto você está verificando o seu\"\n"
+#~ "\"E-mail.)"
-#~ msgid "You have successfully created your alert."
-#~ msgstr "Você criou com sucesso o seu alerta."
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Não se preocupe - nós vamos fixa o seu relatório de problema, enquanto você está verificando seu email)"
-#~ msgid "You have successfully deleted your alert."
-#~ msgstr "Você removeu com sucesso o seu alerta."
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr ""
+#~ "(Não se preocupe - nós vamos ficar com a sua atualização enquanto você está verificando o seu\"\n"
+#~ "\"E-mail.) "
-#, fuzzy
-#~ msgid "Your problem has been confirmed!"
-#~ msgstr "Este problema foi resolvido"
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small> Se você não pode localizar no mapa, <a href='%s' rel='nofollow'> saltar esta etapa </a>. </small>"
-#~ msgid "Your report has been created and will shortly be sent."
-#~ msgstr "Seu relatório foi criado e será enviado em breve."
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong> Não </strong>, eu não, deixe-me entrar por e-mail:"
-#, fuzzy
-#~ msgid "Your update has been confirmed!"
-#~ msgstr "Sua password foi alterada"
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Você é um desenvolvedor <strong> </strong> Gostaria de contribuir para FixMyStreet?"
-#~ msgid "Configuration updated - contacts will be generated automatically later"
-#~ msgstr "Configuração atualizada - contactos gerados automaticamente"
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Problemas mais proximos <small> (within&nbsp;%skm) </small>"
-#~ msgid "The subject and details of the problem will be public, plus your name if you give us permission."
-#~ msgstr "O tema e os detalhes do problema serão públicos, além de seu nome se você nos der permissão."
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Contact FixMyStreetMindelo"
-#~ msgid "%d addresses"
-#~ msgstr "%d endereços"
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Você tem uma senha FixMyStreetMindelo?"
-#~ msgid "<big>%s</big> reports"
-#~ msgstr "<big>%s</big> Relatórios"
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet admin:"
-#~ msgid ""
-#~ "<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
-#~ "suggestions: why not try <a href=\"http://www.writetothem.com/\">writing direct\n"
-#~ "to your councillor(s)</a> or, if it&rsquo;s a problem that could be fixed by\n"
-#~ "local people working together, why not\n"
-#~ "<a href=\"http://www.pledgebank.com/new\">make and publicise a pledge</a>?\n"
-#~ "</p>"
-#~ msgstr ""
-#~ "<p style=\"font-size:150%\"> Lamentamos ouvir isso. Temos duas âŽ\n"
-#~ "sugestões: por que não tentar <a href=\"http://www.writetothem.com/\"> escrita direta âŽ\n"
-#~ "para o seu conselheiro (s) </a>, ou, se o problema pode ser solucionado e corrigido pela âŽ\n"
-#~ "população local, a trabalhar em conjunto, porque não âŽ\n"
-#~ "<a href=\"http://www.pledgebank.com/new\"> fazer e divulgar um compromisso </a> âŽ\n"
-#~ "</P>"
-
-#~ msgid ""
-#~ "<p>Getting empty homes back into use can be difficult, but by now a good council\n"
-#~ "will have made a lot of progress and reported what they have done on the\n"
-#~ "website. Even so properties can remain empty for many months if the owner is\n"
-#~ "unwilling or the property is in very poor repair. If nothing has happened or\n"
-#~ "you are not satisfied with the progress the council is making, now is the right\n"
-#~ "time to say so. We think it&rsquo;s a good idea to contact some other people who\n"
-#~ "may be able to help or put pressure on the council For advice on how to do\n"
-#~ "this and other useful information please go to <a\n"
-#~ "href=\"http://www.emptyhomes.com/getinvolved/campaign.html\">http://www.emptyhomes.com/getinvolved/campaign.html</a>.</p>\n"
-#~ msgstr ""
-#~ "<p> Obtendo casas vazias novamente em uso pode ser difícil, mas agora por um bom conselho âŽ\n"
-#~ "terá feito um grande progresso e relatou o que eles fizeram no âŽ\n"
-#~ "website. Mesmo assim propriedades podem permanecer vazia por muitos meses, se o proprietário é âŽ\n"
-#~ "querem ou o imóvel está em muito mau estado de conservação. Se nada tivesse acontecido ou âŽ\n"
-#~ "você não está satisfeito com o progresso que o conselho está fazendo, agora é seu o direito âŽ\n"
-#~ "de relatar isso. Achamos que é uma boa ideia em contato com outras pessoas que âŽ\n"
-#~ "podem ser capazes de ajudar ou colocar pressão sobre o Conselho para conselhos sobre como fazer âŽ\n"
-#~ "esta e outras informações úteis acesse <a âŽ\n"
-
-#~ msgid ""
-#~ "<p>Getting empty homes back into use can be difficult. You shouldn&rsquo;t expect\n"
-#~ "the property to be back into use yet. But a good council will have started work\n"
-#~ "and should have reported what they have done on the website. If you are not\n"
-#~ "satisfied with progress or information from the council, now is the right time\n"
-#~ "to say. You may also want to try contacting some other people who may be able\n"
-#~ "to help. For advice on how to do this and other useful information please\n"
-#~ "go to <a href=\"http://www.emptyhomes.com/getinvolved/campaign.html\">http://www.emptyhomes.com/getinvolved/campaign.html</a>.</p>\n"
-#~ msgstr ""
-#~ "<p> Obtendo casas vazias novamente em uso pode ser difícil. Você não deve esperar\n"
-#~ "\n"
-#~ "a propriedade de estar de volta em uso ainda. Mas um bom conselho terá começado o trabalho\n"
-#~ "\n"
-#~ "e deveria ter relatado o que eles fizeram no site. Se você não estiver\n"
-#~ "\n"
-#~ "satisfeito com o progresso ou informações do conselho, agora é o momento certo\n"
-#~ "\n"
-#~ "a dizer. Você também pode tentar entrar em contato com outras pessoas que podem ser capazes\n"
-#~ "\n"
-#~ "para ajudar. Para obter conselhos sobre como fazer isso e outras informações úteis, por favor\n"
-#~ "\n"
-#~ "ir para <a\n"
-#~ "href=\"http://www.emptyhomes.com/getinvolved/campaign.html\">http://www.emptyhomes.com/getinvolved/campaign.html</a>.</p>\n"
-#~ "\n"
-
-#~ msgid "Are you from a council?"
-#~ msgstr "Você pertence á ao Conselho?"
-
-#~ msgid "Be sure to choose the right category, because we use that to determine to whom the report is sent."
-#~ msgstr "Tenha certeza de escolher a categoria correta, porque temos de nusar isso para determinar a quem o relatório é enviado."
-
-#~ msgid "Built by <a href=\"http://www.mysociety.org/\">mySociety</a> and maintained by <a href=\"http://www.nuug.no/\">NUUG</a>"
-#~ msgstr "Construído por <a href=\"http://www.mysociety.org/\"> mySociety </a> e mantido por <a href=\"http://www.nuug.no/\"> NUUG </a>"
-
-#~ msgid "Contact"
-#~ msgstr "Contacto"
-
-#~ msgid "Empty property details form"
-#~ msgstr "Propriedade sem detalhes "
-
-#~ msgid "Find latest local and national news"
-#~ msgstr "Encontre as últimas notícias locais e nacionais"
-
-#~ msgid "Fix<span id=\"my\">My</span>Street"
-#~ msgstr "Fix <span id=\"my\"> Minha </span> Rua"
-
-#~ msgid "If you submit a report here it will be left on the site, but not reported to the council &ndash; please still leave your report, so that we can show to the council the activity in their area."
-#~ msgstr ""
-#~ "Se você enviar um relatório no fixmystreet mindelo será deixado no local, mas se não informou ao\"\n"
-#~ "\"O Conselho - por favor, postar seu relatório, para que possamos mostrar aos\"\n"
-#~ "\"O Conselho da atividade em sua área.\""
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Se não o fizer, o seu alerta não será ativado"
-#~ msgid "It is worth noting however that the process can sometimes be slow, especially if the property is in very poor repair or the owner is unwilling to act. In most cases it can take six months or more before you can expect to see anything change and sometimes there may be considerable barries to a property being brought back into use. This doesn&rsquo;t mean the council isn&rsquo;t doing anything. We encourage councils to update the website so you can see what is happening. It may be a long process, but you reporting your concerns about this property to the council is a valuable first step."
-#~ msgstr "É interessante notar, porém, que o processo pode ser lento às vezes, especialmente se o imóvel está em muito mau estado de conservação ou o proprietário não está disposto a agir. Na maioria dos casos pode demorar seis meses ou mais antes que você pode esperar para ver nada mudam e às vezes pode haver barreiras consideráveis ​​para a propriedade que está sendo trazido de volta ao uso. Isso não significa que o município não está fazendo nada. Nós encorajamos conselhos para atualizar o site para que você possa ver o que está acontecendo. Pode ser um processo longo, mas você relatar suas preocupações sobre este imóvel para o município é um primeiro passo importante."
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Se você não fizer isso, o problema não será publicado"
-#~ msgid "Navigation"
-#~ msgstr "Navegaçao"
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "se você não fizer isso, a sua atualização não será publicada"
-#~ msgid "New problems"
-#~ msgstr "Novos problemas"
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Novos relatórios locais reportemptyhomes.com"
-#~ msgid "New!"
-#~ msgstr "Novo?"
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Novos relatórios para {{CONSELHO}} {{dentro WARD}} em reportemptyhomes.com"
-#~ msgid "Non Public"
-#~ msgstr "Nao publico"
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Novos relatórios sobre reportemptyhomes.com"
-#~ msgid "Old problems,<br>state unknown"
-#~ msgstr "VElhos problemas,<br>estado desconhecido"
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Novos relatórios sobre reportemptyhomes.com perto CÓDIGO POSTAL {{}}"
-#~ msgid "Older fixed"
-#~ msgstr "Mais antigo fixed"
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Novos Relatorios sobre reportemptyhomes.com Perto CÓDIGO POSTAL {{}}"
-#~ msgid "Older problems"
-#~ msgstr "Problemas mais antigos"
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Novos relatórios dentro de {{NAME}} 's fronteira em reportemptyhomes.com"
-#~ msgid "Please do not give address or personal information in this section."
-#~ msgstr "Por favor, não fornecer o endereço ou informações pessoais nesta seção."
+#~ msgid "New update:"
+#~ msgstr "Nova actualizaçao"
-#~ msgid ""
-#~ "Please fill in details of the empty property below, saying what type of\n"
-#~ "property it is e.g. an empty home, block of flats, office etc. Tell us\n"
-#~ "something about its condition and any other information you feel is relevant.\n"
-#~ "There is no need for you to give the exact address. Please be polite, concise\n"
-#~ "and to the point; writing your message entirely in block capitals makes it hard\n"
-#~ "to read, as does a lack of punctuation."
-#~ msgstr ""
-#~ "Por favor, preencha a ficha do imóvel vazio abaixo, dizendo que tipo de âŽ\n"
-#~ "propriedade é, por exemplo, uma casa vazia, bloco de apartamentos, escritório etc Diga-nos âŽ\n"
-#~ "algo sobre sua condição e qualquer outra informação que você sente é relevante. âŽ\n"
-#~ "Não há nenhuma necessidade para você dar o endereço exato. Por favor, seja educado, conciso âŽ\n"
-#~ "e direto ao ponto, escrever a mensagem inteiramente em letras maiúsculas torna difícil âŽ"
-
-#~ msgid ""
-#~ "Please fill in details of the problem below. Leave as much detail as you can, \n"
-#~ "and if possible describe the exact location of\n"
-#~ "the problem (e.g. if there is a streetlight number or road name)."
-#~ msgstr ""
-#~ "Por favor, preencha os detalhes do problema abaixo. Deixar o máximo de detalhes possível, âŽ\n"
-#~ "e se possível descrever a localização exata de âŽ\n"
-#~ "o problema (por exemplo, se existe um número de rua ou o nome da rua, zona. lugar, praça, beco, ruela, etc)."
-
-#~ msgid ""
-#~ "Please fill in details of the problem below. The council won't be able\n"
-#~ "to help unless you leave as much detail as you can, so please describe the exact location of\n"
-#~ "the problem (e.g. on a wall), what it is, how long it has been there, a description (and a\n"
-#~ "photo of the problem if you have one), etc."
-#~ msgstr ""
-#~ "Por favor, preencha os detalhes do problema abaixo. O conselho não será capaz âŽ\n"
-#~ "para ajudar a menos que você deixe o máximo de detalhes como você pode, então, por favor descrever a localização exata de âŽ\n"
-#~ "o problema (por exemplo, uma parede, um poste, lixo, entulho), o que é, quanto tempo ele tem estado lá, uma descrição (e um âŽ\n"
-#~ "foto do problema se você tiver um), etc"
-
-#~ msgid "Private information (not shown on site)"
-#~ msgstr "Informações privadas (não mostrado no site)"
-
-#~ msgid "Provide a title"
-#~ msgstr "Dê um título"
-
-#~ msgid "Public information (shown on site)"
-#~ msgstr "A informação pública (mostrado no site)"
+#~ msgid "No problems found."
+#~ msgstr "Nenhum problema encontrado"
-#~ msgid "Recently fixed"
-#~ msgstr "Problemas recentemente fixados"
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Nenhuns problemas foram ianda reportados"
-#~ msgid "Remember that, for the pilot project, FixMyBarangay is only for reporting potholes and streetlights in bgy. Luz or Basak San Nicolas."
-#~ msgstr "Lembre-se que, para o projeto piloto, FixMyStreet é apenas para relatar buracos e postes em bgy. "
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Agora, para apresentar o seu relatório ... você tem de ter uma senha FixMyStreetMindelo?"
-#~ msgid "Report Empty Homes"
-#~ msgstr "Relatório Casas vazias, pardeeiros."
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Agora, para apresentar a sua atualização ... você tem de ter uma senha FixMyStreetMindelo?"
-#~ msgid "Source code"
-#~ msgstr "O código-fonte"
-
-#~ msgid "Subscribe to an alert based upon what baranagay you&rsquo;re in:"
-#~ msgstr "Subcrever um alerta baseado no que baranagay você está em:"
-
-#~ msgid "Thank you for reporting an empty property on ReportEmptyHomes.com. We have emailed the lead officer for empty homes in the council responsible with details, and asked them to do whatever they can to get the empty property back into use as soon as possible."
-#~ msgstr "Obrigado por relatar um imóvel vazio em ReportEmptyHomes.com. Temos enviado o oficial de ligação para as casas vazias no conselho responsável, com detalhes, e pediu-lhes para fazer o que puder para obter a propriedade vazia novamente em uso o mais rápido possível."
-
-#~ msgid ""
-#~ "Thank you for reporting this empty property on ReportEmptyHomes.com.\n"
-#~ "At present the report cannot be sent through to the council for this area. We\n"
-#~ "are working with councils to link them into the system so that as many areas\n"
-#~ "as possible will be covered."
-#~ msgstr ""
-#~ "Obrigado por relatar essa propriedade vazia na ReportEmptyHomes.com. âŽ\n"
-#~ "Actualmente, o relatório não pode ser enviado através do Conselho para esta área. Nós âŽ\n"
-#~ "estão trabalhando com os conselhos de vincular-los no sistema de modo que o maior número de áreas âŽ\n"
-#~ "quanto possível será coberto."
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Nosso código é open source e <a href=\"http://github.com/mysociety/fixmystreet\"> disponível no GitHub </a>."
-#~ msgid "Thank you for using ReportEmptyHomes.com. Your action is already helping to resolve the UK&rsquo;s empty homes crisis."
-#~ msgstr "Obrigado por usar ReportEmptyHomes.com. Sua ação já está ajudando a resolver vazio crise casas em Mindelo."
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "<a Class=\"tab_link\" href=\"#report\"> dar uma olhada </a> nas atualizações que foram deixadas."
-#~ msgid "This is a summary of all reports on this site; select a particular barangay to see the reports sent there."
-#~ msgstr "Este é um resumo de todos os relatórios sobre este site, selecionar um barangay especial para ver os relatórios enviados para lá.."
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Por favor, dê uma olhada nas atualizações que foram deixadas."
-#~ msgid "View your report"
-#~ msgstr "Ver o seu relatório"
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemas dentro de %s, FixMyStreetMindelo"
-#~ msgid "We may contact you periodically to ask if anything has changed with the property you reported."
-#~ msgstr "Podemos contactá-lo periodicamente para perguntar se alguma coisa mudou com a propriedade que você relatou."
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Propriedades informou recentemente como colocar de volta para uso em reportemptyhomes.com"
-#~ msgid "We will only use your personal information in accordance with our <a href=\"/faq#privacy\">privacy policy.</a>"
-#~ msgstr "Nós só usamos as suas informações pessoais de acordo com a nossa <a href=\"/faq#privacy\">política de privacidade.</a>"
+#~ msgid "Publish the response"
+#~ msgstr "Publicar a resposta"
-#~ msgid "We&rsquo;d love to hear what you think about this website. Just fill in the form. Please don&rsquo;t contact us about individual empty homes; use the box accessed from <a href=\"/\">the front page</a>."
-#~ msgstr "Adoraríamos ouvir o que você pensa sobre este website. Basta preencher o formulário.Dê a sua openiao sobre fixmystreetMindelo. Por favor, não entre em contato conosco sobre casas vazias individuais; usar a caixa acessado a partir <a href=\"/\"> primeira página </a>."
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Reportados %s, para %s"
-#~ msgid "Would you like better integration with FixMyStreet? <a href=\"http://www.mysociety.org/for-councils/fixmystreet/\">Find out about FixMyStreet for councils</a>."
-#~ msgstr "Gostaria de uma melhor integração com FixMyStreet <a href=\"http://www.mysociety.org/for-councils/fixmystreet/\"> Descobre FixMyStreet para os conselhos </a>."
+#~ msgid "Reports on and around the map"
+#~ msgstr "Relatórios sobre e ao redor do mapa"
-#~ msgid "You have successfully confirmed your problem"
-#~ msgstr "Você confirmou com sucesso o seu problema"
+#~ msgid "Sign in by email"
+#~ msgstr "Entrar por email"
-#~ msgid "First Name"
-#~ msgstr "Primeiro Nome"
+#~ msgid "Signed in as %s"
+#~ msgstr "Entrou como %s"
-#~ msgid "Incident Category"
-#~ msgstr "Categoria incidente"
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "O e-mail de confirmação <strong> Maio </strong> levar alguns minutos para chegar - <em> por favor </em>, seja paciente."
-#~ msgid "Last Name"
-#~ msgstr "Ultimo Nome"
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Os detalhes do seu problema estão disponíveis na outra aba acima."
-#~ msgid "Name (optional)"
-#~ msgstr "Nome (opcional)"
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Os detalhes do seu problema estão disponíveis no lado direito desta página."
-#~ msgid "Please choose a transport category"
-#~ msgstr "Por favor escolha uma categoria de transporte"
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Os últimos relatórios locais relatados por usuários"
-#~ msgid "Please choose an incident category"
-#~ msgstr "Por favor escolha uma categoria incidente"
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "As propriedades mais relatadas de usar por usuários"
-#~ msgid "Please describe the exact location of the report. Example: “2 dumped mattresses outside Number 19 Stockwell Closeâ€"
-#~ msgstr "Por favor, descreva a localização exata do relatório. Exemplo: \"2 postes iluminaçao partidos na rua lisboa\""
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "Os últimos relatórios para {{}} CONSELHO relatados por usuários"
-#~ msgid "Please note that updates are not sent to the relevant department. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
-#~ msgstr "Por favor, note que as atualizações não são enviadas para o departamento competente. Se você deixar seu nome será público. Suas informações só serão utilizadas de acordo com nossa <a href=\"/faq#privacy\"> política de privacidade </a>"
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "Os últimos relatórios para {{CONSELHO}} {{dentro WARD}} ala relatados por usuários"
-#~ msgid "Providing a password is optional, but doing so will allow you to more easily report future problems, leave updates and manage your reports."
-#~ msgstr "Fornecer uma senha é opcional, mas isso vai permitir que você mais facilmente relatar problemas futuros, deixe as atualizações e gerenciar seus relatórios."
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "Os últimos relatórios dentro de {{NAME}} 's fronteira relatados por usuários"
-#~ msgid "Transport Category"
-#~ msgstr "Categoria Transporte"
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Para <strong> relatar um problema </strong>, clique no mapa no local correto."
-#~ msgid "Your email (optional)"
-#~ msgstr "Seu e-mail (opcional)"
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Agora você deve clicar no link do e-mail que acabamos de lhe enviar."
-#~ msgid "Your first name"
-#~ msgstr "Nome"
+#~ msgid "Your email address:"
+#~ msgstr "O seu endereço de email:"
-#~ msgid "Your last name"
-#~ msgstr "Apelido"
+#~ msgid "Your report"
+#~ msgstr "Seu relatório"
diff --git a/locale/ro_RO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/ro_RO.UTF-8/LC_MESSAGES/FixMyStreet.po
index 439649e68..5af2fbfd0 100644
--- a/locale/ro_RO.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/ro_RO.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -14,18 +14,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/fixmystreet/language/ro_RO/)\n"
+"Language-Team: Romanian (Romania) (http://www.transifex.com/mysociety/fixmystreet/language/ro_RO/)\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "ÅŸi"
@@ -38,11 +38,13 @@ msgstr "ÅŸi"
msgid " or "
msgstr "sau"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d alerte confirmate, %d neconfirmate"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d contacte &ndash; %d confirmate, %d neconfirmate"
@@ -51,11 +53,13 @@ msgstr "%d contacte &ndash; %d confirmate, %d neconfirmate"
msgid "%d edits by %s"
msgstr "%d modificări de %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d actualizări"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d chestionare trimise &ndash; %d completate (%s%%)"
@@ -68,15 +72,47 @@ msgstr "%d - %d din %d"
msgid "%s - Summary reports"
msgstr "%s - rapoarte de sinteză"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, raportat la %s"
@@ -88,59 +124,54 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Nu-ți fă griji &mdash; îți vom păstra alerta până îți verifici email-ul.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Nu-ți fă griji &mdash; îți vom păstra raportarea până îți verifici email-ul.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Nu-ți fă griji &mdash; îți vom păstra actualizarea până îți verifici email-ul.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr ""
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(o distanță implicită ce acoperă în jur de 200 000 de locuitori)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(închis)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(rezolvat)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(cum ar fi graffiti, gunoaie depozitate ilegal, pavaj spart sau iluminat stradal)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(netrimis)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(opțional)"
@@ -148,25 +179,24 @@ msgstr "(opțional)"
msgid "(public)"
msgstr "(public)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(nu afișăm niciodată adresa ta de email sau numărul de telefon)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(nu afișăm niciodată adresa ta de email)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Alege o categorie --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Alege un tip de proprietate --"
@@ -179,12 +209,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr ""
@@ -197,28 +229,22 @@ msgstr ""
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr ""
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -229,8 +255,8 @@ msgstr ""
msgid "About us"
msgstr "Despre noi"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -252,7 +278,7 @@ msgstr ""
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -265,10 +291,14 @@ msgstr "Adaugă o categorie nouă"
msgid "Add user"
msgstr "Adaugă utilizator"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr ""
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr ""
@@ -281,21 +311,24 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr ""
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr ""
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+msgid "All Reports as CSV"
+msgstr ""
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr ""
@@ -318,8 +351,7 @@ msgstr ""
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr ""
@@ -328,16 +360,12 @@ msgstr ""
msgid "Anonymous"
msgstr ""
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr ""
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr ""
@@ -352,22 +380,24 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -388,12 +418,12 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -413,12 +443,16 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -429,27 +463,28 @@ msgstr ""
msgid "Category"
msgstr ""
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr ""
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr ""
@@ -482,54 +517,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr ""
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr ""
@@ -537,22 +578,22 @@ msgstr ""
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -560,7 +601,7 @@ msgstr ""
msgid "Confirm"
msgstr ""
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr ""
@@ -580,7 +621,7 @@ msgstr ""
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr ""
@@ -591,12 +632,16 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr ""
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+msgid "Contact %s"
msgstr ""
#: templates/web/base/contact/index.html:1
@@ -612,8 +657,13 @@ msgstr ""
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr ""
@@ -631,7 +681,7 @@ msgstr ""
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -646,7 +696,7 @@ msgstr ""
msgid "Count"
msgstr ""
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr ""
@@ -655,17 +705,18 @@ msgstr ""
msgid "Create category"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:29
+msgid "Create template"
+msgstr ""
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr ""
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr ""
@@ -675,10 +726,15 @@ msgid "Current state"
msgstr ""
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -688,11 +744,16 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr ""
@@ -710,9 +771,9 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr ""
@@ -720,23 +781,25 @@ msgstr ""
msgid "Devolved"
msgstr ""
-#: templates/web/base/admin/edit-league.html:8
-msgid "Diligency prize league table"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
msgstr ""
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+msgid "Do you have a %s password?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr ""
@@ -744,8 +807,8 @@ msgstr ""
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -764,7 +827,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr ""
@@ -775,7 +839,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -790,15 +854,15 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr ""
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -806,7 +870,7 @@ msgstr ""
msgid "Email"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr ""
@@ -822,7 +886,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr ""
@@ -835,38 +899,36 @@ msgid "Email me updates"
msgstr ""
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -895,7 +957,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -908,10 +970,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr ""
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr ""
@@ -919,13 +979,12 @@ msgstr ""
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -936,7 +995,6 @@ msgstr ""
msgid "Enter details of the problem"
msgstr ""
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -946,6 +1004,10 @@ msgstr ""
msgid "Error"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -959,12 +1021,19 @@ msgstr ""
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr ""
@@ -977,8 +1046,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr ""
@@ -986,36 +1054,14 @@ msgstr ""
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr ""
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr ""
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1026,21 +1072,16 @@ msgstr ""
msgid "Fixed"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr ""
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr ""
@@ -1050,11 +1091,11 @@ msgstr ""
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1071,7 +1112,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr ""
@@ -1090,9 +1131,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr ""
@@ -1115,8 +1167,7 @@ msgstr ""
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
@@ -1125,17 +1176,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr ""
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1143,41 +1194,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr ""
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1191,7 +1238,7 @@ msgstr ""
msgid "Hide pins"
msgstr ""
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr ""
@@ -1207,7 +1254,7 @@ msgstr ""
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -1234,8 +1281,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr ""
@@ -1253,18 +1300,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1274,16 +1309,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1313,7 +1347,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr ""
@@ -1338,14 +1372,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr ""
@@ -1353,7 +1386,7 @@ msgstr ""
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1365,12 +1398,12 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1378,7 +1411,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr ""
@@ -1386,12 +1419,12 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1409,10 +1442,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1424,7 +1466,7 @@ msgstr ""
msgid "Last editor"
msgstr ""
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr ""
@@ -1459,7 +1501,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr ""
@@ -1472,14 +1514,12 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "marcat ca închis"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1497,6 +1537,14 @@ msgstr ""
msgid "Message"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr ""
@@ -1524,27 +1572,25 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr ""
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1557,21 +1603,25 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr ""
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+msgid "Nearly done! Now check your email&hellip;"
+msgstr ""
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1580,12 +1630,12 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1593,8 +1643,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr ""
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1621,32 +1671,13 @@ msgstr ""
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+msgid "New template"
msgstr ""
#: templates/web/base/pagination.html:13
@@ -1660,14 +1691,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr ""
@@ -1695,20 +1724,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr ""
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1726,8 +1746,6 @@ msgid "No supporters"
msgstr ""
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr ""
@@ -1740,8 +1758,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1749,7 +1767,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1762,7 +1787,7 @@ msgid "Not reported to council"
msgstr ""
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr ""
@@ -1772,7 +1797,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr ""
@@ -1781,22 +1806,20 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1826,20 +1849,18 @@ msgstr ""
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr ""
@@ -1847,11 +1868,6 @@ msgstr ""
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr ""
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1868,32 +1884,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr ""
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr ""
@@ -1908,12 +1918,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1922,6 +1932,7 @@ msgid "Password (optional)"
msgstr ""
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr ""
@@ -1929,7 +1940,7 @@ msgstr ""
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1938,11 +1949,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr ""
@@ -1953,14 +1962,21 @@ msgstr ""
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr ""
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr ""
@@ -1972,22 +1988,18 @@ msgstr ""
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr ""
@@ -1997,22 +2009,20 @@ msgstr ""
msgid "Please check the passwords and try again"
msgstr ""
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr ""
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2022,7 +2032,7 @@ msgstr ""
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2030,7 +2040,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2039,7 +2049,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr ""
@@ -2050,15 +2060,15 @@ msgstr ""
msgid "Please enter a password"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2066,7 +2076,7 @@ msgid "Please enter a valid email"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr ""
@@ -2075,21 +2085,19 @@ msgstr ""
msgid "Please enter some details"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr ""
@@ -2102,8 +2110,8 @@ msgstr ""
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2142,7 +2150,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2165,19 +2173,23 @@ msgstr ""
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+msgid "Please select a body."
+msgstr ""
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2186,21 +2198,17 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr ""
@@ -2209,8 +2217,8 @@ msgid "Please write your update here"
msgstr ""
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2231,22 +2239,36 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr ""
@@ -2262,12 +2284,12 @@ msgstr ""
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr ""
@@ -2283,12 +2305,10 @@ msgstr ""
msgid "Problems in this area"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr ""
@@ -2297,12 +2317,11 @@ msgstr ""
msgid "Problems recently reported fixed on FixMyStreet"
msgstr ""
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2314,20 +2333,16 @@ msgstr ""
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
+msgid "Problems within %s, %s"
msgstr ""
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2341,39 +2356,31 @@ msgstr ""
msgid "Provide an update"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr ""
@@ -2389,12 +2396,11 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2420,8 +2426,7 @@ msgstr ""
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -2429,7 +2434,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2459,17 +2464,17 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+msgid "Recent local problems, %s"
msgstr ""
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr ""
@@ -2477,23 +2482,27 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
@@ -2502,7 +2511,7 @@ msgstr ""
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2511,63 +2520,58 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2575,18 +2579,21 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+msgid "Reported:"
+msgstr ""
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2599,18 +2606,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2625,26 +2635,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2657,7 +2673,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2689,20 +2705,23 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+msgid "Sent report back"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2711,8 +2730,8 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2728,34 +2747,23 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr ""
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr ""
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr ""
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2771,8 +2779,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2780,24 +2789,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2813,16 +2829,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2836,7 +2853,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2851,45 +2873,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2900,18 +2919,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2922,7 +2942,7 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2930,9 +2950,17 @@ msgstr ""
msgid "Survey Results"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+msgid "Templates"
+msgstr ""
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -2941,6 +2969,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2962,7 +2991,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2970,7 +2999,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2988,19 +3017,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3042,30 +3071,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -3083,10 +3100,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3107,20 +3120,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3137,8 +3138,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3149,7 +3149,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3160,23 +3160,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3189,7 +3190,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3229,16 +3230,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3252,7 +3253,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3279,55 +3280,67 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3343,8 +3356,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3352,11 +3365,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3373,7 +3386,9 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3396,11 +3411,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3435,24 +3450,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3460,27 +3475,28 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+msgid "Updates to this problem, %s"
msgstr ""
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3488,23 +3504,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3528,16 +3544,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3551,7 +3566,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3576,11 +3591,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3589,7 +3608,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3597,16 +3616,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3632,15 +3657,13 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr ""
@@ -3703,11 +3726,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3716,6 +3737,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3736,15 +3761,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3755,18 +3776,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr "Trebuie să adăugaţi entităţi (cum ar fi consilii sau departamente) astfel încât să puteţi adăuga apoi categoriile de probleme de care acestea se pot ocupa (cum ar fi gropile sau iluminatul sau iluminatul stradal) şi persoanele de contact (cum ar fi o adresă de e-mail) la care se trimit rapoartele."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Chiar doriţi să retrimiteţi?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Rapoartele dvs."
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3775,22 +3794,17 @@ msgstr "Rapoartele dvs."
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr ""
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3800,24 +3814,23 @@ msgstr ""
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3830,19 +3843,15 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr ""
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3850,23 +3859,31 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Rapoartele dvs."
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Rapoartele dvs."
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr ""
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3875,17 +3892,21 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+msgid "fixed reports"
+msgstr ""
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr ""
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "mai puţin de un minut"
@@ -3930,14 +3951,13 @@ msgstr "marcat ca planificat"
msgid "marked as unable to fix"
msgstr "marcat ca imposibil de rezolvat"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "indisponibil"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "sau"
@@ -3947,16 +3967,16 @@ msgstr "sau găseşte-mă în mod automat"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3969,8 +3989,8 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3986,17 +4006,19 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:4
+msgid "unfixed reports"
+msgstr ""
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4021,7 +4043,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4037,7 +4059,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4061,7 +4083,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4085,7 +4107,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4100,3 +4122,12 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Nu-ți fă griji &mdash; îți vom păstra alerta până îți verifici email-ul.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Nu-ți fă griji &mdash; îți vom păstra raportarea până îți verifici email-ul.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Nu-ți fă griji &mdash; îți vom păstra actualizarea până îți verifici email-ul.)"
diff --git a/locale/ru.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/ru.UTF-8/LC_MESSAGES/FixMyStreet.po
index 1436d13b5..0c2ac5f2c 100644
--- a/locale/ru.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/ru.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -4,23 +4,24 @@
# Matthew Somerville <matthew@mysociety.org>, 2011-06-03.
#
# Translators:
+# Bakai <naubktl@gmail.com>, 2015
# Ð˜Ð»ÑŒÑ Ð’Ð»Ð°Ð´Ð¸Ð¼Ð¸Ñ€Ð¾Ð²Ð¸Ñ‡ Кучаев <kuchaev.iv@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
-"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Russian (http://www.transifex.com/projects/p/fixmystreet/language/ru/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-08-08 17:11+0000\n"
+"Last-Translator: Bakai <naubktl@gmail.com>\n"
+"Language-Team: Russian (http://www.transifex.com/mysociety/fixmystreet/language/ru/)\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "и"
@@ -33,11 +34,13 @@ msgstr "и"
msgid " or "
msgstr "или"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d подтвержденных уведомлений, %d неподтвержденных"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
@@ -46,11 +49,13 @@ msgstr ""
msgid "%d edits by %s"
msgstr "%d правок от %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d обновлений"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr ""
@@ -63,17 +68,49 @@ msgstr "%d по %d из %d"
msgid "%s - Summary reports"
msgstr "%s - Итоговые отчеты"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s район, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
-msgstr ""
+msgstr "%s, отправлен в %s"
#: perllib/FixMyStreet/Cobrand/UK.pm:282 perllib/FixMyStreet/Cobrand/UK.pm:294
msgid "%s, within %s ward"
@@ -83,59 +120,54 @@ msgstr ""
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/base/admin/report_blocks.html:41
+#: templates/web/base/admin/users.html:31
+msgid "(Email in abuse table)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+msgid "(No name)"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
-#: templates/web/base/admin/users.html:31
-msgid "(Email in abuse table)"
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+msgid "(No phone number)"
msgstr ""
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr ""
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr ""
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr ""
@@ -143,25 +175,24 @@ msgstr ""
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr ""
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr ""
@@ -174,12 +205,14 @@ msgid ""
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
msgstr ""
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr ""
@@ -192,28 +225,22 @@ msgstr ""
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr ""
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -224,8 +251,8 @@ msgstr ""
msgid "About us"
msgstr "О наÑ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -247,7 +274,7 @@ msgstr "Добавить контакт Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ формы."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -260,10 +287,14 @@ msgstr "Добавить категорию"
msgid "Add user"
msgstr "Добавить пользователÑ"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr ""
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Снова:"
@@ -276,21 +307,25 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr ""
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Ð’Ñе Отчеты"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Ð’Ñе Отчеты"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Ð’Ñе отчеты"
@@ -313,8 +348,7 @@ msgstr ""
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr ""
@@ -323,16 +357,12 @@ msgstr ""
msgid "Anonymous"
msgstr ""
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr ""
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr ""
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr ""
@@ -347,22 +377,24 @@ msgstr ""
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+msgid "Assign to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr ""
@@ -383,12 +415,12 @@ msgstr ""
msgid "Back"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -408,12 +440,16 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr ""
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -424,27 +460,28 @@ msgstr ""
msgid "Category"
msgstr ""
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr ""
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr ""
@@ -477,54 +514,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr ""
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr ""
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr ""
@@ -532,22 +575,22 @@ msgstr ""
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -555,7 +598,7 @@ msgstr ""
msgid "Confirm"
msgstr ""
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr ""
@@ -575,7 +618,7 @@ msgstr ""
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr ""
@@ -586,12 +629,16 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr ""
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+msgid "Contact %s"
msgstr ""
#: templates/web/base/contact/index.html:1
@@ -607,8 +654,13 @@ msgstr ""
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr ""
@@ -626,7 +678,7 @@ msgstr ""
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -641,7 +693,7 @@ msgstr ""
msgid "Count"
msgstr ""
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr ""
@@ -650,17 +702,18 @@ msgstr ""
msgid "Create category"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:29
+msgid "Create template"
+msgstr ""
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr ""
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr ""
@@ -670,10 +723,15 @@ msgid "Current state"
msgstr ""
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -683,11 +741,16 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr ""
@@ -705,9 +768,9 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr ""
@@ -715,23 +778,25 @@ msgstr ""
msgid "Devolved"
msgstr ""
-#: templates/web/base/admin/edit-league.html:8
-msgid "Diligency prize league table"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+msgid "Didn't use map"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
msgstr ""
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+msgid "Do you have a %s password?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr ""
@@ -739,8 +804,8 @@ msgstr ""
msgid "Don't like forms?"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -759,7 +824,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr ""
@@ -770,7 +836,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -785,15 +851,15 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr ""
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -801,7 +867,7 @@ msgstr ""
msgid "Email"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr ""
@@ -817,7 +883,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr ""
@@ -830,38 +896,36 @@ msgid "Email me updates"
msgstr ""
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -890,7 +954,7 @@ msgstr ""
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -903,10 +967,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr ""
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr ""
@@ -914,13 +976,12 @@ msgstr ""
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -931,7 +992,6 @@ msgstr ""
msgid "Enter details of the problem"
msgstr ""
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -941,6 +1001,10 @@ msgstr ""
msgid "Error"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -954,12 +1018,19 @@ msgstr ""
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr ""
@@ -972,8 +1043,7 @@ msgstr ""
msgid "Filter report list"
msgstr ""
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr ""
@@ -981,36 +1051,14 @@ msgstr ""
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr ""
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr ""
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1021,21 +1069,16 @@ msgstr ""
msgid "Fixed"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr ""
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr ""
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr ""
@@ -1045,11 +1088,11 @@ msgstr ""
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1066,7 +1109,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr ""
@@ -1085,9 +1128,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr ""
@@ -1110,8 +1164,7 @@ msgstr ""
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
@@ -1120,17 +1173,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr ""
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1138,41 +1191,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr ""
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr ""
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1186,7 +1235,7 @@ msgstr ""
msgid "Hide pins"
msgstr ""
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr ""
@@ -1202,7 +1251,7 @@ msgstr ""
msgid "How to send successful reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -1229,8 +1278,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr ""
@@ -1248,18 +1297,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1269,16 +1306,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1308,7 +1344,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr ""
@@ -1333,14 +1369,13 @@ msgstr ""
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr ""
@@ -1348,7 +1383,7 @@ msgstr ""
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr ""
@@ -1360,12 +1395,12 @@ msgstr ""
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr ""
@@ -1373,7 +1408,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr ""
@@ -1381,12 +1416,12 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1404,10 +1439,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1419,7 +1463,7 @@ msgstr ""
msgid "Last editor"
msgstr ""
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr ""
@@ -1454,7 +1498,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr ""
@@ -1467,11 +1511,10 @@ msgid "MAP"
msgstr ""
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
msgstr ""
@@ -1491,6 +1534,14 @@ msgstr ""
msgid "Message"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr ""
@@ -1518,27 +1569,25 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr ""
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr ""
@@ -1551,21 +1600,25 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr ""
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+msgid "Nearly done! Now check your email&hellip;"
+msgstr ""
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1574,12 +1627,12 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr ""
@@ -1587,8 +1640,8 @@ msgstr ""
msgid "New local problems on FixMyStreet"
msgstr ""
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
msgstr ""
#: db/alert_types.pl:38
@@ -1615,32 +1668,13 @@ msgstr ""
msgid "New reports"
msgstr ""
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+msgid "New template"
msgstr ""
#: templates/web/base/pagination.html:13
@@ -1654,14 +1688,12 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr ""
@@ -1689,20 +1721,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr ""
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr ""
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr ""
@@ -1720,8 +1743,6 @@ msgid "No supporters"
msgstr ""
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr ""
@@ -1734,8 +1755,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1743,7 +1764,14 @@ msgstr ""
msgid "Not Responsible"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+msgid "Not contactable"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr ""
@@ -1756,7 +1784,7 @@ msgid "Not reported to council"
msgstr ""
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr ""
@@ -1766,7 +1794,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr ""
@@ -1775,22 +1803,20 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr ""
@@ -1820,20 +1846,18 @@ msgstr ""
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr ""
@@ -1841,11 +1865,6 @@ msgstr ""
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr ""
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1862,32 +1881,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr ""
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr ""
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr ""
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr ""
@@ -1902,12 +1915,12 @@ msgstr ""
msgid "Parent"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1916,6 +1929,7 @@ msgid "Password (optional)"
msgstr ""
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr ""
@@ -1923,7 +1937,7 @@ msgstr ""
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr ""
@@ -1932,11 +1946,9 @@ msgstr ""
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr ""
@@ -1947,14 +1959,21 @@ msgstr ""
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr ""
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr ""
@@ -1966,22 +1985,18 @@ msgstr ""
msgid "Place pin on map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr ""
@@ -1991,22 +2006,20 @@ msgstr ""
msgid "Please check the passwords and try again"
msgstr ""
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr ""
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2016,7 +2029,7 @@ msgstr ""
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2024,7 +2037,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2033,7 +2046,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr ""
@@ -2044,15 +2057,15 @@ msgstr ""
msgid "Please enter a password"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2060,7 +2073,7 @@ msgid "Please enter a valid email"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr ""
@@ -2069,21 +2082,19 @@ msgstr ""
msgid "Please enter some details"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr ""
@@ -2096,8 +2107,8 @@ msgstr ""
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2136,7 +2147,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2159,19 +2170,23 @@ msgstr ""
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+msgid "Please select a body."
+msgstr ""
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr ""
@@ -2180,21 +2195,17 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr ""
@@ -2203,8 +2214,8 @@ msgid "Please write your update here"
msgstr ""
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2225,22 +2236,36 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr ""
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr ""
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr ""
@@ -2256,12 +2281,12 @@ msgstr ""
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr ""
@@ -2277,12 +2302,10 @@ msgstr ""
msgid "Problems in this area"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr ""
@@ -2291,12 +2314,11 @@ msgstr ""
msgid "Problems recently reported fixed on FixMyStreet"
msgstr ""
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2308,20 +2330,16 @@ msgstr ""
msgid "Problems within %s ward"
msgstr ""
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
+msgid "Problems within %s, %s"
msgstr ""
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr ""
@@ -2335,39 +2353,31 @@ msgstr ""
msgid "Provide an update"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr ""
@@ -2383,12 +2393,11 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2414,8 +2423,7 @@ msgstr ""
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -2423,7 +2431,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2453,17 +2461,17 @@ msgstr ""
msgid "Receive email when updates are left on this problem."
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+msgid "Recent local problems, %s"
msgstr ""
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr ""
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr ""
@@ -2471,23 +2479,27 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr ""
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr ""
@@ -2496,7 +2508,7 @@ msgstr ""
msgid "Report abuse"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr ""
@@ -2505,63 +2517,58 @@ msgstr ""
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "ГородÑкие проблемы. Сообщайте, проÑматривайте, обÑуждайте."
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr ""
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr ""
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr ""
@@ -2569,18 +2576,22 @@ msgstr ""
msgid "Reported within the last four weeks"
msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Ð’Ñе Отчеты"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr ""
@@ -2593,18 +2604,21 @@ msgstr ""
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr ""
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr ""
@@ -2619,26 +2633,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr ""
@@ -2651,7 +2671,7 @@ msgstr ""
msgid "Search Users"
msgstr ""
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr ""
@@ -2683,20 +2703,23 @@ msgstr ""
msgid "Select an area"
msgstr ""
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+msgid "Sent report back"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr ""
@@ -2705,8 +2728,8 @@ msgstr ""
msgid "Share"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2722,34 +2745,23 @@ msgid "Show pins"
msgstr ""
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr ""
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr ""
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr ""
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr ""
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
@@ -2765,8 +2777,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2774,24 +2787,31 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr ""
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr ""
@@ -2807,16 +2827,17 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr ""
@@ -2830,7 +2851,12 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr ""
@@ -2845,45 +2871,42 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr ""
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr ""
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr ""
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr ""
@@ -2894,18 +2917,19 @@ msgstr ""
msgid "Subscribe"
msgstr ""
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr ""
@@ -2916,7 +2940,7 @@ msgstr ""
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr ""
@@ -2924,9 +2948,17 @@ msgstr ""
msgid "Survey Results"
msgstr ""
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+msgid "Templates"
+msgstr ""
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr ""
@@ -2935,6 +2967,7 @@ msgid "Text only version"
msgstr ""
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr ""
@@ -2956,7 +2989,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2964,7 +2997,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2982,19 +3015,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3036,30 +3069,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr ""
@@ -3077,10 +3098,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr ""
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr ""
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr ""
@@ -3101,20 +3118,8 @@ msgstr ""
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3131,8 +3136,7 @@ msgstr ""
msgid "The requested URL '%s' was not found on this server"
msgstr ""
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3143,7 +3147,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3154,23 +3158,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3183,7 +3188,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3223,16 +3228,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3246,7 +3251,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3273,55 +3278,67 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr ""
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr ""
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#: templates/web/zurich/admin/template_edit.html:20
+msgid "Title:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3337,8 +3354,8 @@ msgstr ""
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3346,11 +3363,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr ""
@@ -3367,7 +3384,9 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3390,11 +3409,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3429,24 +3448,24 @@ msgstr ""
msgid "Updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr ""
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3454,27 +3473,28 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr ""
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+msgid "Updates to this problem, %s"
msgstr ""
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+msgid "Used map"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3482,23 +3502,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr ""
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3522,16 +3542,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr ""
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3545,7 +3564,7 @@ msgstr ""
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3570,11 +3589,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr ""
@@ -3583,7 +3606,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3591,16 +3614,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3626,15 +3655,13 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr ""
@@ -3697,11 +3724,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3710,6 +3735,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3730,15 +3759,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3749,18 +3774,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr ""
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr ""
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3769,22 +3792,17 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr ""
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr ""
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3794,24 +3812,23 @@ msgstr ""
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr ""
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3824,19 +3841,15 @@ msgstr ""
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr ""
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr ""
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr ""
@@ -3844,23 +3857,31 @@ msgstr ""
msgid "Your&nbsp;email:"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Ð’Ñе отчеты"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Ð’Ñе отчеты"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr ""
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3869,17 +3890,22 @@ msgstr ""
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Ð’Ñе отчеты"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr ""
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr ""
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr ""
@@ -3924,14 +3950,13 @@ msgstr ""
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr ""
@@ -3941,16 +3966,16 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3963,8 +3988,8 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr ""
@@ -3980,17 +4005,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr ""
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Ð’Ñе отчеты"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr ""
@@ -4016,7 +4044,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4034,7 +4062,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4061,7 +4089,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4088,7 +4116,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
diff --git a/locale/sq.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/sq.UTF-8/LC_MESSAGES/FixMyStreet.po
index 4c3f3a46c..b9e77fb72 100644
--- a/locale/sq.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/sq.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -9,18 +9,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:29+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Albanian (http://www.transifex.com/projects/p/fixmystreet/language/sq/)\n"
+"Language-Team: Albanian (http://www.transifex.com/mysociety/fixmystreet/language/sq/)\n"
"Language: sq\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "dhe"
@@ -33,11 +33,13 @@ msgstr "dhe"
msgid " or "
msgstr "ose"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d sinjale të konfirmuara, %d te pa konfirmuara"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
@@ -46,11 +48,13 @@ msgstr ""
msgid "%d edits by %s"
msgstr "%d perpunuar nga %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d përditësime ne kohë reale"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d pyetesoret jane derguar&ndash; %d pergjigjur (%s%%)"
@@ -63,15 +67,47 @@ msgstr "%d në%d të%d"
msgid "%s - Summary reports"
msgstr "%s - Raportet përmbledhëse"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s lagje, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, raportuar në %s"
@@ -83,59 +119,57 @@ msgstr "%s, brenda lagjes %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
msgstr ""
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr ""
-
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Email-i në tabelen abuzimi)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Emri juaj"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Numri juaj i telefonit"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(nje distance e paracaktuar e cila mbulon pothuajse 200,000 persona)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(ne menyre alternative RSS feed mund te pershtatet, brenda"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(i mbyllur)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(i rregulluar)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(opsionale)"
@@ -143,25 +177,24 @@ msgstr "(opsionale)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(dërguar te të dy)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(ne asnjëherë nuk do tëshfaqim email adresen ose numrin tuaj të telefonit)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(ne asnjëherë nuk do të shfaqim email-in tuaj)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Zgjedh në kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Zgjedh nje lloj te karakteristikes --"
@@ -177,12 +210,14 @@ msgstr ""
" Kjo eshte ndoshta arsyeja pse \"zona e mbuluar\" eshte e zbrazet (me poshte).<br>\n"
" Ndoshta shtoni disa <code>MAPIT_TYPES</code> ne skedarin tuaj te konfigurimit?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Nëse ju nuk mund ta shihni hartën , <a href='%s' rel='nofollow'>kaloni këtë hap</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> probleme në kohë reale"
@@ -195,28 +230,22 @@ msgstr "<strong>Jo</strong> Më lejo të konfirmoj raportin tim me email"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Jo</strong> Me lejoni te konfirmoj perditesimin me email"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Jo</strong> më lejo të kyqem me email"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Jo</strong>, nuk mund ta bej, me lejo te kyqem me email:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Jo</strong>, me lejoni te konfirmoj raportin tim me email:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Jo</strong>, me lejo te konfirmoj perditesimin tim me email:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -227,8 +256,8 @@ msgstr "<strong>Po</strong> Unë kam një fjalëkalim"
msgid "About us"
msgstr "Rreth nesh"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -250,7 +279,7 @@ msgstr "Shto nje kontakt duke perdorur formularin e meposhtem."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr ""
@@ -263,10 +292,14 @@ msgstr "Shto një kategori të re"
msgid "Add user"
msgstr "Shto përdorues"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Shtoi %s"
+#: templates/web/base/report/new/category_extras.html:9
+msgid "Additional Information"
+msgstr ""
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Perseri:"
@@ -279,21 +312,25 @@ msgstr "Paralajmerimi %d u krijua per %s, lloji %s, parametrat %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Me paralajmero per perditesime ne te ardhmen"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Te gjitha Raportimet"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Te gjitha Raportimet"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Te gjitha raportimet"
@@ -316,8 +353,7 @@ msgstr "Te gjitha informacionet e ofruara nga ju do te dergohen te"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Te gjitha informacionet e ofruara ketu do te dergohen te <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "Nje perditesim e ka perditesuar kete problem si te zgjidhur."
@@ -326,16 +362,12 @@ msgstr "Nje perditesim e ka perditesuar kete problem si te zgjidhur."
msgid "Anonymous"
msgstr "Anonim"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonim:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "A jeni nje <strong>zhvillues</strong>? A deshironi te kontriboni per FixMyStreet?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "A jeni nje zhvillues?"
@@ -350,22 +382,25 @@ msgstr "Hapesire e mbuluar"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Cakto per kategori te ndryshme:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Cakto per kategori te ndryshme:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Cakto per nenndarje:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Caktuar per %s"
@@ -386,12 +421,12 @@ msgstr ""
msgid "Back"
msgstr "Prapa"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "bllokoemail adresen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr ""
@@ -411,12 +446,16 @@ msgstr ""
msgid "By Date"
msgstr "Nga Data"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Nuk mund te shihni harten? <em>Kaloni kete hap</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -427,27 +466,28 @@ msgstr "Nuk mund te shihni harten? <em>Kaloni kete hap</em>"
msgid "Category"
msgstr "Kategoria"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategoria:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategoria: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Nderro fjalekalimin"
@@ -480,54 +520,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Kliko ketu ose shkruaj si dd/mm/yyyy"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Kliko ne harte per te raportuar nje problem"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Mbyllur"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr ""
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Raportime te mbyllura"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Mbyllur:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr ""
@@ -535,22 +581,22 @@ msgstr ""
msgid "Cobrand"
msgstr ""
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr ""
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr ""
@@ -558,7 +604,7 @@ msgstr ""
msgid "Confirm"
msgstr "Konfirmo"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Konfirmo llogarine"
@@ -578,7 +624,7 @@ msgstr "Konfirmimi"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "E konfirmuar"
@@ -589,13 +635,18 @@ msgstr "Raportet e konfirmuara ne mes te %s dhe %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "E konfirmuar:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontakto FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Na Kontaktoni"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -610,8 +661,13 @@ msgstr "Na Kontaktoni"
msgid "Contact the team"
msgstr "Kontakto ekipin"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+msgid "Coordinates:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Nuk mund te gjeni perdoruesin"
@@ -629,7 +685,7 @@ msgstr ""
msgid "Council contacts for %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr ""
@@ -644,7 +700,7 @@ msgstr ""
msgid "Count"
msgstr ""
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Krijo nje raport"
@@ -653,17 +709,19 @@ msgstr "Krijo nje raport"
msgid "Create category"
msgstr "Krijo kategorine"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Krijo nje raport"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "U krijua"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "U krijua:"
@@ -673,10 +731,15 @@ msgid "Current state"
msgstr "Gjendja aktuale"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Aktualisht asnje grup nuk eshte krijuar."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -686,11 +749,16 @@ msgstr ""
msgid "Dealt with by subdivision within 5 working days"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr ""
@@ -708,9 +776,9 @@ msgstr "Detaje"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detaje:"
@@ -718,23 +786,27 @@ msgstr "Detaje:"
msgid "Devolved"
msgstr "Transferuar"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "nuk e perdorni harten"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr ""
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "A keni fjalekalim te FixMyStreet?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Nuk e di"
@@ -742,8 +814,8 @@ msgstr "Nuk e di"
msgid "Don't like forms?"
msgstr "Nuk i'u pelqen kjo forme?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -762,7 +834,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr ""
@@ -773,7 +846,7 @@ msgstr ""
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -788,15 +861,15 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Editor"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -804,7 +877,7 @@ msgstr "Editor"
msgid "Email"
msgstr "Email"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Emaili u shtua te lista e abuzimeve"
@@ -820,7 +893,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr ""
@@ -833,38 +906,36 @@ msgid "Email me updates"
msgstr ""
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Email:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Email: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -893,7 +964,7 @@ msgstr "Data e fundit:"
msgid "Endpoint"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -906,10 +977,8 @@ msgstr ""
msgid "Enter a nearby postcode, or street name and area"
msgstr ""
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr ""
@@ -917,13 +986,12 @@ msgstr ""
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Shkruaj fjalekalimin e ri:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -934,7 +1002,6 @@ msgstr "Shkruaj fjalekalimin"
msgid "Enter details of the problem"
msgstr "Pershkruaje problemin"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -944,6 +1011,10 @@ msgstr "Pershkruaje problemin"
msgid "Error"
msgstr "Gabim"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -957,12 +1028,19 @@ msgstr "Shembuj:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Te dhena shtese:"
@@ -975,8 +1053,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Filtro listen e raporteve"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Emri"
@@ -984,36 +1061,14 @@ msgstr "Emri"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr ""
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet admin:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1024,21 +1079,16 @@ msgstr ""
msgid "Fixed"
msgstr "E rregulluar"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "E rregulluar - Perdoruesi"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Raportet e perfunduara"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "E rregulluar:"
@@ -1048,11 +1098,11 @@ msgstr "E rregulluar:"
msgid "Flag as deleted"
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Flamuri i perdoruesit"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr ""
@@ -1069,7 +1119,7 @@ msgstr ""
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr ""
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr ""
@@ -1088,9 +1138,20 @@ msgstr ""
msgid "Forgotten your password?"
msgstr "Keni harruar fjalekalimin tuaj?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+msgid "Forwarded to external body"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+msgid "Forwarded wish to external body"
+msgstr ""
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Pyetjet me te shpeshta"
@@ -1113,8 +1174,7 @@ msgstr "Merr perditesimet per %s problemet"
msgid "Get updates of problems in this %s"
msgstr "Merr perditesimet e problemeve ne kete %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Me jep mua nje RSS feed"
@@ -1123,17 +1183,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Vazhdo"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr ""
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr ""
@@ -1141,41 +1201,37 @@ msgstr ""
msgid "Greyed-out lines are councils that no longer exist."
msgstr ""
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "A ka qene i rregulluar ky problem?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Ndihme"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Ketu jane llojet e raportimeve te problemeve lokale per &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Pershendetje %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1189,7 +1245,7 @@ msgstr "Fshih te vjetratt"
msgid "Hide pins"
msgstr "Fshih shenjen"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historia"
@@ -1205,7 +1261,7 @@ msgstr "Si te raportoj nje problem"
msgid "How to send successful reports"
msgstr "Si te dergoj nje raport ne menyre te sukseshme"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Une kam frike se ju nuk mund te konfirmoni raportet e pakonfirmuara"
@@ -1232,8 +1288,8 @@ msgstr ""
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1251,18 +1307,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr ""
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr ""
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr ""
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr ""
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1272,16 +1316,15 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr ""
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr ""
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
#: templates/web/base/admin/body.html:149
@@ -1311,7 +1354,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "ID ilegale"
@@ -1336,14 +1379,13 @@ msgstr "Ne tabelen e abuzimeve?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Ne vazhdim"
@@ -1351,7 +1393,7 @@ msgstr "Ne vazhdim"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Perfshire te dhenat personale te raportuesit"
@@ -1363,12 +1405,12 @@ msgstr "Perfshire raportimet e pakonfirmuara"
msgid "Incorrect has_photo value \"%s\""
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Shenim i brendshem"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Rekomandim i brendshem"
@@ -1376,7 +1418,7 @@ msgstr "Rekomandim i brendshem"
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Data e fundit jovalide"
@@ -1384,12 +1426,12 @@ msgstr "Data e fundit jovalide"
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Data e fillimit jovalide"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1407,10 +1449,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1422,7 +1473,7 @@ msgstr "Me mbaj te kyqur ne kete kompjuter"
msgid "Last editor"
msgstr ""
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Perditesimi i fundit:"
@@ -1457,7 +1508,7 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr ""
@@ -1470,14 +1521,12 @@ msgid "MAP"
msgstr "HARTA"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "shenuar si i mbyllur"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1495,6 +1544,14 @@ msgstr ""
msgid "Message"
msgstr "Mesazh"
+#: templates/web/zurich/admin/report_edit.html:284
+msgid "Message to competent body:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:282
+msgid "Message to external body:"
+msgstr ""
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Mesazh:"
@@ -1522,27 +1579,25 @@ msgstr "Me shume probleme ketu afer"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Emri"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Emri:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Emri: %s"
@@ -1555,21 +1610,26 @@ msgstr ""
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
msgstr ""
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr ""
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Ju lutem kontrolloni email-in tuaj"
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr ""
@@ -1578,12 +1638,12 @@ msgstr ""
msgid "New body added"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Shenim i ri i brendshem:"
@@ -1591,9 +1651,10 @@ msgstr "Shenim i ri i brendshem:"
msgid "New local problems on FixMyStreet"
msgstr "Problem i ri lokal ne FixMyStreet"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Shenim i ri i brendshem:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1619,33 +1680,15 @@ msgstr ""
msgid "New reports"
msgstr "Raportime te reja"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Gjendje e re"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Perditesim i ri:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Gjendje e re"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1658,14 +1701,12 @@ msgstr "Tjetra"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Jo"
@@ -1693,20 +1734,11 @@ msgstr ""
msgid "No flagged users found."
msgstr ""
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "nuk ka perditesime tjera"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Asnje problem u u gjet."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Asnje problem nuk eshte raportuar deri me tani."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Nuk u kthye asnje rezultat"
@@ -1724,8 +1756,6 @@ msgid "No supporters"
msgstr "Asnje perkrahes"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Asnje"
@@ -1738,8 +1768,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1747,7 +1777,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Jo Pergjegjes"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Jo Pergjegjes"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Jo per nenndarjet e mia"
@@ -1760,7 +1798,7 @@ msgid "Not reported to council"
msgstr ""
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Shenim"
@@ -1770,7 +1808,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr ""
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Shenim:"
@@ -1779,22 +1817,20 @@ msgstr "Shenim:"
msgid "Note: <strong>%s</strong>"
msgstr "Shenim: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
-msgid "Now to submit your report&hellip;"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
msgstr ""
#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
msgstr ""
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Tani ju mund te paraqitni perditesimin&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr ""
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "Ne rregull"
@@ -1824,20 +1860,18 @@ msgstr "Probleme <br> te vjetra"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Hapur"
@@ -1845,11 +1879,6 @@ msgstr "Hapur"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Raporte te hapura"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1866,32 +1895,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Ose raportoni problemet n:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Tjera"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Kodi jone eshte i hapur dhe <a href=\"http://github.com/mysociety/fixmystreet\">ne dispozicion ne GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Pronar"
@@ -1906,12 +1929,12 @@ msgstr "Faqja nuk u gjet"
msgid "Parent"
msgstr "Burim"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "I pjesshem"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1920,6 +1943,7 @@ msgid "Password (optional)"
msgstr "Fjalekalimi (opsionale)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Fjalekalimi:"
@@ -1927,7 +1951,7 @@ msgstr "Fjalekalimi:"
msgid "Permalink"
msgstr ""
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Numri i telefonit"
@@ -1936,11 +1960,9 @@ msgstr "Numri i telefonit"
msgid "Phone number (optional)"
msgstr "Numri i telefonit (opsionale)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefoni:"
@@ -1951,14 +1973,21 @@ msgstr "Telefoni:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Fotografia"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Fotografia:"
@@ -1970,22 +1999,18 @@ msgstr "Fotografite e raporteve te fundit"
msgid "Place pin on map"
msgstr "Vendose shenjen ne harte"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planifikuar"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr ""
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Ju lutem te jeni te sjellshem, korrekt dhe te sakte. "
@@ -1995,22 +2020,20 @@ msgstr "Ju lutem te jeni te sjellshem, korrekt dhe te sakte. "
msgid "Please check the passwords and try again"
msgstr "Ju lutem kontrolloni fjalekalimin dhe provoni perseri"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Ju lutem kontrolloni email-in tuaj"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Ju lutem kontrolloni email adresen tuaj nese eshte e sakte"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2020,7 +2043,7 @@ msgstr "Ju lutem zgjedhni kategorine"
msgid "Please choose a property type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2028,7 +2051,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2037,7 +2060,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr ""
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Ju lutem shkruaj nje mesazh"
@@ -2048,15 +2071,15 @@ msgstr "Ju lutem shkruaj nje mesazh"
msgid "Please enter a password"
msgstr "Ju lutem shkruaj fjalekalimin"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Ju lutem shkruaj subjektin"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2064,7 +2087,7 @@ msgid "Please enter a valid email"
msgstr "Ju lutem shkruaj nje email valid"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr ""
@@ -2073,21 +2096,19 @@ msgstr ""
msgid "Please enter some details"
msgstr "Ju lutem shkruaj disa te dhena"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Ju lutem shkruani email-in tuaj"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Ju lutem shkruani email adresen tuaj"
@@ -2100,8 +2121,8 @@ msgstr "Ju lutem shkruani emrin tuaj"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2140,7 +2161,7 @@ msgstr ""
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2163,19 +2184,24 @@ msgstr ""
msgid "Please note:"
msgstr "Ju lutem vini re:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Ju lutem ofroni nje pershkrim si dhe nje fotografi"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Ju lutem zgjedhni furnizuesin qe deshironi"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Ju lutem zgjedhni furnizuesin qe deshironi"
@@ -2184,21 +2210,17 @@ msgstr "Ju lutem zgjedhni furnizuesin qe deshironi"
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr ""
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Ju lutem ngarkoni vetem fotografi te formatit JPEG"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Ju lutem shkruani nje mesazh"
@@ -2207,8 +2229,8 @@ msgid "Please write your update here"
msgstr "Ju lutem shkruani perditesimin tuaj ketu"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2229,22 +2251,36 @@ msgstr "Postuar nga %s (<strong>%s</strong>) ne %s"
msgid "Posted by %s at %s"
msgstr "Postuar nga %s ne %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Paraprak"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privat"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Problem"
@@ -2260,12 +2296,12 @@ msgstr "Problemi %s u konfirmua"
msgid "Problem %s sent to council %s"
msgstr ""
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problemi eshte shenuar si i hapur."
@@ -2281,12 +2317,10 @@ msgstr "Problemet"
msgid "Problems in this area"
msgstr "Problemet ne kete zone"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Problemet ne afersi"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problemet ne harte"
@@ -2295,12 +2329,11 @@ msgstr "Problemet ne harte"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problemet e raportuara se fundi ne FixMyStreet"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problemet brenda %.1fkm te ketij lokacioni"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2312,20 +2345,17 @@ msgstr "Problemet brenda %s"
msgid "Problems within %s ward"
msgstr "Problemet brenda lagjes %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problemet brenda %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problemet brenda %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemet brenda kufijve te:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Adresa e prones:"
@@ -2339,39 +2369,31 @@ msgstr "Lloji i prones:"
msgid "Provide an update"
msgstr "Ofro nje perditesim"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Pergjigje publike:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publiko fotografine"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publiko pergjigjen"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Pyetesor"
@@ -2387,12 +2409,11 @@ msgstr ""
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2418,8 +2439,7 @@ msgstr "RSS feed i %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS feed i %s, brenda lagjes %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS feed i problemeve ne afersi"
@@ -2427,7 +2447,7 @@ msgstr "RSS feed i problemeve ne afersi"
msgid "RSS feed of problems in this %s"
msgstr "RSS feed i problemeve ne kete %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2457,17 +2477,18 @@ msgstr "RSS feed per te rejat rreth ketij problemi"
msgid "Receive email when updates are left on this problem."
msgstr "Prano email kur ka perditesime te ketij problemi"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Problemet lokale te fundit, FixMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Rregullimet <br> e fundit"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr ""
@@ -2475,23 +2496,27 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Largo flamurin"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Largo fotografine (nuk mund te kthehet!)"
+#: templates/web/zurich/admin/report_edit.html:243
+msgid "Reply to user:"
+msgstr ""
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Raporto nje problem"
@@ -2500,7 +2525,7 @@ msgstr "Raporto nje problem"
msgid "Report abuse"
msgstr "Raporto abuzimin"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Raporto ne %s"
@@ -2509,83 +2534,82 @@ msgstr "Raporto ne %s"
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Raportuar %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Raportuar %s, te %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Raportuar ne menyre anonime te %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Raportuar nga %s ne %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Raportuar %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Raportuar ne kategorine %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Raportuar ne kategorine %s ne menyre anonime ne %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Raportuar ne kategorine %s nga %s ne %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Raportuar nepermjet %s ne menyre anonime ne %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Raportuar nepermjet %s nga %s ne %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Raportuar nepermjet %s ne kategorine %s ne menyre anonime ne %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Raportuar nepermjet %s ne kategorine %s ne %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Raportuar ne kategorine %s"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Raportuar %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Raportimi i nje problemi"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Raportimet"
@@ -2598,18 +2622,21 @@ msgstr "Raportimet jane te kufizuara ne gjatesine %s karaktere. Ju lutem shkurto
msgid "Reports awaiting approval"
msgstr ""
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Raportimet ne dhe perrreth hartes"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Raporti u publikua"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Ridergo raportin"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Vendi i duhur?"
@@ -2624,26 +2651,32 @@ msgstr ""
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Rrotullo Majtas"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Rrotullo Djathtas"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Ruaj ndryshimet"
@@ -2656,7 +2689,7 @@ msgstr "Kerko Raportet"
msgid "Search Users"
msgstr "Kerko Perdoruesit"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Kerko raportet"
@@ -2688,20 +2721,24 @@ msgstr ""
msgid "Select an area"
msgstr "Zgjedh nje zone"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Raporte te hapura"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr ""
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Dergo:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Sherbim:"
@@ -2710,8 +2747,8 @@ msgstr "Sherbim:"
msgid "Share"
msgstr "Shperndaj"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2727,34 +2764,23 @@ msgid "Show pins"
msgstr "Shfaq shenjat"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Kyqu"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Kyqu me email"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Kyqu ose krijo nje llogari"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Shkyqu"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Kyqur si %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Disa kategori mund te kerkojne informacione shtese."
@@ -2770,8 +2796,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr ""
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr ""
@@ -2779,24 +2806,32 @@ msgstr ""
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Na vjen keq, ne nuk mund te gjejme kete lokacion."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Na vjen keq, ne nuk mund te kuptojme kete lokacion. Ju lutem provoni perseri."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Na vjen keq, ne nuk mund te kuptojme kete lokacion. Ju lutem provoni perseri."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Data e Fillimit:"
@@ -2812,16 +2847,17 @@ msgstr "Gjendje"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Gjendje:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistikat"
@@ -2835,7 +2871,12 @@ msgstr "Statusi"
msgid "Still open, via questionnaire, %s"
msgstr "Akoma hapur, nepermjet pyetesorit, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Nenkategoria: %s"
@@ -2850,45 +2891,42 @@ msgstr "Tema"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Tema:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Paraqit"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Paraqit ndryshimet"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Paraqit pyetesorin"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Paraqitur"
@@ -2899,18 +2937,19 @@ msgstr "Paraqitur"
msgid "Subscribe"
msgstr "Abonohu"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Permbledhje"
@@ -2921,7 +2960,7 @@ msgstr "Permbledhje"
msgid "Summary reports"
msgstr "Raportet përmbledhëse"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Studim"
@@ -2929,9 +2968,18 @@ msgstr "Studim"
msgid "Survey Results"
msgstr "Rezultatet e Studimit"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Perditesime"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Tekst"
@@ -2940,6 +2988,7 @@ msgid "Text only version"
msgstr "Vetem versioni i me tekst"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Tekst:"
@@ -2961,7 +3010,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
@@ -2969,7 +3018,7 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
@@ -2987,20 +3036,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Ky problem ka qene i rregulluar"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Raporti nuk mund te shihet ne %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -3042,30 +3090,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr ""
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr ""
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr ""
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Gabimi ishte: %s"
@@ -3083,10 +3119,6 @@ msgstr ""
msgid "The latest local problems reported by users"
msgstr "Problemet lokale te raportuara se fundi nga perdoruesit"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "Raportimet lokale te bera se fundi nga perdoruesit"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "Problemet e fundit per {{COUNCIL}} te raportuara nga perdoruesit"
@@ -3107,20 +3139,8 @@ msgstr "Problemet e fundit te raportuara si te rregulluara nga perdoruesit"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3137,8 +3157,7 @@ msgstr "Fjalekalimet nuk perputhen"
msgid "The requested URL '%s' was not found on this server"
msgstr "URL e kerkuar '%s' nuk u gjet ne kete server"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr ""
@@ -3149,7 +3168,7 @@ msgstr ""
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
@@ -3160,23 +3179,24 @@ msgid ""
" Names are not necessarily unique."
msgstr ""
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -3189,7 +3209,7 @@ msgstr ""
msgid "There was a problem with your update. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr ""
@@ -3229,16 +3249,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3252,7 +3272,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3279,55 +3299,68 @@ msgstr "Ky problem eshte ne progres"
msgid "This problem is old and of unknown status."
msgstr "Ky problem eshte i vjeter dhe me status te panjohur."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Ky raport eshte shenuar si i mbyllur."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Ky raport eshte shenuar si i rregulluar."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Ky problem eshte i shenuar si i hapur."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Kohezgjatja"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titulli"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Per te <strong>raportuar nje problem</strong>, kliko ne harte ne lokacionin e sakte."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titulli"
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr ""
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr ""
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3343,8 +3376,8 @@ msgstr "Provo perseri"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3352,11 +3385,11 @@ msgstr ""
msgid "Unable to fix"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "E pakonfirmuar"
@@ -3373,7 +3406,9 @@ msgstr ""
msgid "Unknown error"
msgstr "Gabim i panjohur"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr ""
@@ -3396,11 +3431,11 @@ msgid "Update below added by %s at %s"
msgstr ""
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr ""
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr ""
@@ -3435,24 +3470,24 @@ msgstr "Perditesim:"
msgid "Updated"
msgstr "Perditesuar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Perditesuar!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Perditesime"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr ""
@@ -3460,27 +3495,30 @@ msgstr ""
msgid "Updates on {{title}}"
msgstr "Perditesimet ne {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
-msgstr ""
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "Merr perditesimet per %s problemet"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Perdorues"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "perdor harten"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr ""
@@ -3488,23 +3526,23 @@ msgstr ""
msgid "User search finds matches in users' names and email addresses."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Perdoruesit"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Vlerat e perditesuara"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr ""
@@ -3528,16 +3566,15 @@ msgid "Wards of this council"
msgstr ""
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr ""
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Ne nuk jemi ne gjendje te konfirmojme llogarine tuaj - na vjen keq."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr ""
@@ -3551,7 +3588,7 @@ msgstr "ne asnjëherë nuk do të shfaqim email-in tuaj"
msgid "We never show your email address or phone number."
msgstr "Ne asnjëherë nuk do tëshfaqim email adresen ose numrin tuaj të telefonit."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
@@ -3576,11 +3613,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Kur redaktohet"
@@ -3589,7 +3630,7 @@ msgstr "Kur redaktohet"
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr ""
@@ -3597,16 +3638,22 @@ msgstr ""
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
@@ -3632,15 +3679,13 @@ msgstr "Viti"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Po"
@@ -3703,11 +3748,9 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
@@ -3716,6 +3759,10 @@ msgstr ""
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3736,15 +3783,11 @@ msgstr ""
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr ""
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr ""
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr ""
@@ -3755,18 +3798,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr ""
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Ju vertete deshironi ta ridergoni?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Raportet tuaja"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3775,22 +3816,17 @@ msgstr "Raportet tuaja"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Email-i juaj"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Email adresa juaj"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Email adresa juaj:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3800,24 +3836,23 @@ msgstr "Email-i juaj:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Emri juaj"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Emri juaj:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3830,19 +3865,15 @@ msgstr "Fjalekalimi juaj eshte ndryshuar"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Numri juaj i telefonit"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Raporti juaj"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Raportet tuaja"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Perditesimet tuaja"
@@ -3850,23 +3881,31 @@ msgstr "Perditesimet tuaja"
msgid "Your&nbsp;email:"
msgstr "Email-i&nbsp;juaj;"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Te gjitha raportimet"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "nga %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Raportime te mbyllura"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr ""
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "nuk e perdorni harten"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "p.sh. ‘%s’ ose ‘%s’"
@@ -3875,17 +3914,22 @@ msgstr "p.sh. ‘%s’ ose ‘%s’"
msgid "edit user"
msgstr ""
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Raportet e perfunduara"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "nga %d perdorues te ndry"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "Perditesimi i fundit %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "më pak se një minutë"
@@ -3930,14 +3974,13 @@ msgstr "shenuar si i planifikuar"
msgid "marked as unable to fix"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/a"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "ose"
@@ -3947,16 +3990,16 @@ msgstr "ose me gjeje ne menyre automatike"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr ""
@@ -3969,8 +4012,8 @@ msgstr "zona tjera:"
msgid "reopened"
msgstr "rihapur"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "shkyqur"
@@ -3986,17 +4029,20 @@ msgstr ""
msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "ky lloj i problemit lokal"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "sot"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Raportet e perfunduara"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "perdor harten"
@@ -4020,7 +4066,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> raporti i fundit"
msgstr[1] "<big>%s</big> raportet e fundit"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4034,7 +4080,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d perkrahes"
msgstr[1] "%d perkrahes"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4055,7 +4101,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] ""
msgstr[1] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4076,7 +4122,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> e rregulluar ne muajin e kaluar"
msgstr[1] "<big>%s</big> e rregulluar ne muajin e kaluar"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4089,3 +4135,63 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] ""
msgstr[1] ""
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Nëse ju nuk mund ta shihni hartën , <a href='%s' rel='nofollow'>kaloni këtë hap</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Jo</strong>, nuk mund ta bej, me lejo te kyqem me email:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "A jeni nje <strong>zhvillues</strong>? A deshironi te kontriboni per FixMyStreet?"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontakto FixMyStreet"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet admin:"
+
+#~ msgid "New update:"
+#~ msgstr "Perditesim i ri:"
+
+#~ msgid "No problems found."
+#~ msgstr "Asnje problem u u gjet."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Asnje problem nuk eshte raportuar deri me tani."
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Kodi jone eshte i hapur dhe <a href=\"http://github.com/mysociety/fixmystreet\">ne dispozicion ne GitHub</a>."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problemet brenda %s, FixMyStreet"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publiko pergjigjen"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Raportuar %s, te %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Raportimet ne dhe perrreth hartes"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Kyqu me email"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Kyqur si %s"
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "Raportimet lokale te bera se fundi nga perdoruesit"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Per te <strong>raportuar nje problem</strong>, kliko ne harte ne lokacionin e sakte."
+
+#~ msgid "User"
+#~ msgstr "Perdorues"
+
+#~ msgid "Your email address:"
+#~ msgstr "Email adresa juaj:"
+
+#~ msgid "Your report"
+#~ msgstr "Raporti juaj"
diff --git a/locale/sv_SE.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/sv_SE.UTF-8/LC_MESSAGES/FixMyStreet.po
index 6eaee177f..4a89e3298 100644
--- a/locale/sv_SE.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/sv_SE.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -12,18 +12,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-12 13:28+0000\n"
-"Last-Translator: Jon Kristensen <info@jonkri.com>\n"
-"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/fixmystreet/language/sv_SE/)\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
+"Last-Translator: mySociety <transifex@mysociety.org>\n"
+"Language-Team: Swedish (Sweden) (http://www.transifex.com/mysociety/fixmystreet/language/sv_SE/)\n"
"Language: sv_SE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "eller"
@@ -36,11 +36,13 @@ msgstr "eller"
msgid " or "
msgstr "eller"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d bekräftade bevakningar, %d obekräftade"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d kommuner kontaktade &ndash; %d bekräftade, %d obekräftade"
@@ -49,11 +51,13 @@ msgstr "%d kommuner kontaktade &ndash; %d bekräftade, %d obekräftade"
msgid "%d edits by %s"
msgstr "%d ändringar av %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d uppdateringar"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d frågeformulär skickade &ndash; %d besvarade (%s%%)"
@@ -66,15 +70,50 @@ msgstr "%d till %d av %d"
msgid "%s - Summary reports"
msgstr "%s - Sammanställningsrapporter"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr "FixaMinGata har ett flertal RSS-flöden och epostbevakningar för lokala problem, inklusive bevakning för alla problem inom en kommun eller alla problem inom ett visst avstånd från en plats. "
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr "FixaMinGata har ett flertal RSS-flöden och epostbevakningar för lokala problem, inklusive bevakning för alla problem inom en kommun eller alla problem inom ett visst avstånd från en plats. "
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s ref:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr "FixaMinGata skickar olika kategorier av rapporter till olika enheter inom en kommun eller län. Problem som rapporteras inom en viss kommun dyker därför inte nödvändigtvis upp i listan över rapporter till den kommunen. Exempelvis kan en rapport om en väg skickas till Vägverket snarare än kommunen. Rapporten dyker då inte upp i listan över rapporter till kommunen, men dyker upp om man söker alla rapporter inom ett visst avstånd."
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "Administrativa området %s, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, rapporterad %s"
@@ -86,59 +125,57 @@ msgstr "%s inom det administrativa området %s"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Vi behåller din bevakning medan du kontrollerar din e-post)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Vi behåller din rapport medan du kontrollerar din e-post)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Vi behåller din uppdatering medan du kontrollerar din e-post.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(Epost i missbrukstabellen)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Ditt namn och efternamn"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Ditt telefonnummer"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(ett avstånd som täcker ungefär 200,000 invånare)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(alternativt kan RSS-flödet konfigureras inom"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(stängd)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(fixad)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(ex.v. graffiti, skräp, trasiga gatustenar eller belysning)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(ej skickat till kommunen)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(valfritt)"
@@ -146,25 +183,24 @@ msgstr "(valfritt)"
msgid "(public)"
msgstr "(offentlig)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(skickat till båda)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(vi visar aldrig din epostadress eller telefonnummer)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(vi visar aldrig din epostadress)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Välj en katagori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Välj en fastighetstyp --"
@@ -180,12 +216,14 @@ msgstr ""
" Detta är förmodligen anledningen till att \"område som täcks (area covered)\" är tomt nedan.<br>\n"
" Vill du lägga till några <code>MAPIT_TYPES</code> i konfigruationsfilen?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Om du inte kan se kartan kan du <a herf='%s' rel='nofollow'>hoppa över det här steget</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> aktuella problem"
@@ -198,28 +236,22 @@ msgstr "<strong>Nej</strong> Låt mig bekräfta min rapport via epost"
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Nej</strong> Låt mig bekräfta uppdateringen via epost"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Nej</strong> LÃ¥t mig logga in med min epostadress"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>Nej</strong>, det vill jag inte, låt mig logga in med min epostadress:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nej<strong>, låt mig bekräfta min rapport via epost:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nej</strong>, låt mig bekräfta min uppdatering via epost:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -230,8 +262,8 @@ msgstr "<strong>Ja</strong>, jag har ett lösenord"
msgid "About us"
msgstr "Om oss"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -253,7 +285,7 @@ msgstr "Lägg till en kontakt medelst formuläret nedan."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Lägg till förvaltning"
@@ -266,10 +298,15 @@ msgstr "Ny kategori"
msgid "Add user"
msgstr "Lägg till användare"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Lades till %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Väntar på att granskas"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Igen:"
@@ -282,21 +319,25 @@ msgstr "Bevakning %d skapad för %s av typen %s med parametrarna %s/%s"
msgid "Alert %d disabled (created %s)"
msgstr "Bevakning %d avaktiverad (skapad %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "Varsko mig om framtida uppdateringar"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Alla rapporter"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Alla rapporter"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Alla rapporter"
@@ -319,8 +360,7 @@ msgstr "All information du anger här kommer att skickas till"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "All information du anger här kommer att skickas till ansvariga i <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "En uppdatering markerade det här problemet som löst."
@@ -329,16 +369,12 @@ msgstr "En uppdatering markerade det här problemet som löst."
msgid "Anonymous"
msgstr "Anonym"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Anonym:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Är du en <strong>utvecklare</strong>? Skulle du vilja bidra till FixaMinGata?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Är du en utvecklare?"
@@ -353,22 +389,25 @@ msgstr "Område som täcks"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr "Eftersom detta är en testsajt och %s är falskt kommer rapporter gjorda här att rapporteras till problemrapportören istället för kontakten angiven i problemkategorin"
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Tilldela extern förvaltning:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Lägg i en annan kategori:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Tilldela extern förvaltning:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Tilldela underavdelning:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Tilldelad %s"
@@ -389,12 +428,12 @@ msgstr "Väntar på att granskas"
msgid "Back"
msgstr "Tillbaka"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Förbjud epostadress"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Förvaltningar"
@@ -414,12 +453,16 @@ msgstr "Förvaltning:"
msgid "By Date"
msgstr "Efter datum"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Kan du inte se kartan? <em>Hoppa över det här steget</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -430,27 +473,28 @@ msgstr "Kan du inte se kartan? <em>Hoppa över det här steget</em>"
msgid "Category"
msgstr "Kategori"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Kategorins lösningsnivå för problem över 4 veckor gamla"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "Kategori: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Ändra lösenord"
@@ -485,54 +529,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr "Välj ett <strong>kategorinamn</strong> som å ena sidan är förståeligt för allmänheten (som t. ex. \"Väggrop\" eller \"Gatubelysning\") men som också är hjälpsamt för förvaltningen. Dessa kommer att visas i en rullgardinsmeny på problemrapporteringssidan."
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "Klicka här eller ange som dd/mm/yyyy"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klicka på kartan för att rapportera ett problem"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Stängd"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Stängd av kommunen"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Stängda rapporter"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Stängd:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Närmaste närliggande problem <small>(inom&nbsp;%s&nbsp;km)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Koordinater:"
@@ -540,22 +590,22 @@ msgstr "Koordinater:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Cobrand data:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "Konfiguration"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Konfigurera slutpunkt"
@@ -563,7 +613,7 @@ msgstr "Konfigurera slutpunkt"
msgid "Confirm"
msgstr "Bekfräfta"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Bekräfta konto"
@@ -583,7 +633,7 @@ msgstr "Bekräftelse"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Bekräftat"
@@ -594,13 +644,18 @@ msgstr "Bekräftade rapporter mellan %s och %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Bekräftat:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "Kontakta FixaMinGata"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Kontakta oss"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -615,8 +670,14 @@ msgstr "Kontakta oss"
msgid "Contact the team"
msgstr "Kontakta teamet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinater:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Kan inte hitta användaren"
@@ -634,7 +695,7 @@ msgstr "Kommun"
msgid "Council contacts for %s"
msgstr "Kommunkontakter för %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "kommunens referens:&nbsp;%s"
@@ -649,7 +710,7 @@ msgstr "Kommun:"
msgid "Count"
msgstr "Antal"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Skapa en rapport"
@@ -658,17 +719,19 @@ msgstr "Skapa en rapport"
msgid "Create category"
msgstr "Skapa en kategori"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Skapa en rapport"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Skapad"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Skapad:"
@@ -678,10 +741,15 @@ msgid "Current state"
msgstr "Nuvarande status"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Inga förvaltningar har skapats ännu."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -691,11 +759,16 @@ msgstr "Skrivbord"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Hanterat av underavdelning inom 5 arbetsdagar"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Borttagen"
@@ -713,9 +786,9 @@ msgstr "Detaljer"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Detaljer:"
@@ -723,23 +796,27 @@ msgstr "Detaljer:"
msgid "Devolved"
msgstr "Delegerat"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "använde inte kartan"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Flitighetstopplistan"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Har du ett lösenord till FixMyBrangay?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Har du ett lösenord för FixaMinGata?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Vet ej"
@@ -747,8 +824,8 @@ msgstr "Vet ej"
msgid "Don't like forms?"
msgstr "Gillar du inte formulär?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -767,7 +844,8 @@ msgstr "Varje förvaltningskontakt har en kategori, och denna visas för allmän
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Ändra"
@@ -778,7 +856,7 @@ msgstr "Ändra förvaltningsdetaljer"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -793,15 +871,15 @@ msgstr "Ändrar uppdatering %d"
msgid "Editing user %d"
msgstr "Ändrar användare %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Redaktör"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -809,7 +887,7 @@ msgstr "Redaktör"
msgid "Email"
msgstr "Epost"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Epostadressen tillagd till missbrukslistan"
@@ -825,7 +903,7 @@ msgstr "E-postnotifikation skapad"
msgid "Email alert deleted"
msgstr "E-postnotifikation borttagen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "Epostadressen finns redan i missbrukslistan"
@@ -838,38 +916,36 @@ msgid "Email me updates"
msgstr "Eposta mig uppdateringar"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Epost:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "E-post: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "Tom lägenhet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Tomt hus"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Tomt kontor eller annan kommersiell lokal"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Tom pub eller bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "Tom publik byggnad - skola, sjukhus, etc."
@@ -901,7 +977,7 @@ msgstr "Slutdatum:"
msgid "Endpoint"
msgstr "Ändpunkt"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "Skriv in ett Z&uuml;rich-gatunamn"
@@ -914,10 +990,8 @@ msgstr "Ange ett postnummer eller gatunamn och ort"
msgid "Enter a nearby postcode, or street name and area"
msgstr "Ange ett postnummer eller gatunamn och ort"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Ange ett närligande gatunamn och ort"
@@ -925,13 +999,12 @@ msgstr "Ange ett närligande gatunamn och ort"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "Ange ett närligande gatunamn och ort, postnummer och distrikt i Delhi"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Ange ett nytt lösenord:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -942,7 +1015,6 @@ msgstr "Ange ett lösenord"
msgid "Enter details of the problem"
msgstr "Skriv in information om problemet"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -952,6 +1024,10 @@ msgstr "Skriv in information om problemet"
msgid "Error"
msgstr "Fel"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -965,12 +1041,19 @@ msgstr "Exempel:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "Beskriv vad problemet är, exakt var det är, och hur länge det har varit där..."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Extra data:"
@@ -983,8 +1066,7 @@ msgstr "Misslyckades med att skicka meddelande"
msgid "Filter report list"
msgstr "Filtrera rapportlista"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Första gången"
@@ -992,36 +1074,14 @@ msgstr "Första gången"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Lös detta genom att välja ett <strong>lämpligt område</strong> i <em>Ändra förvaltningsdetaljer</em> i formuläret nedan."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixaMinGata"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixaMinGata administratör:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr "FixaMinGata har ett flertal RSS-flöden och epostbevakningar för lokala problem, inklusive bevakning för alla problem inom en kommun eller alla problem inom ett visst avstånd från en plats. "
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr "FixaMinGata skickar olika kategorier av rapporter till olika enheter inom en kommun eller län. Problem som rapporteras inom en viss kommun dyker därför inte nödvändigtvis upp i listan över rapporter till den kommunen. Exempelvis kan en rapport om en väg skickas till Vägverket snarare än kommunen. Rapporten dyker då inte upp i listan över rapporter till kommunen, men dyker upp om man söker alla rapporter inom ett visst avstånd."
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1032,21 +1092,16 @@ msgstr "FixaMinGata skickar olika kategorier av rapporter till olika enheter ino
msgid "Fixed"
msgstr "Löst"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Löst - Kommun"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Löst - Användare"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Lösta rapporer"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Löst:"
@@ -1056,11 +1111,11 @@ msgstr "Löst:"
msgid "Flag as deleted"
msgstr "Flagga som borttagen"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Flagga användare"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Flaggat"
@@ -1077,7 +1132,7 @@ msgstr "Flaggade användare är listade på <a href='%s'>flaggningssidan</a>."
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Flaggade användare är inte begränsade på något sätt. Detta är bara en lista på användare som har markerats för uppmärksamhet."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Flaggat:"
@@ -1096,9 +1151,22 @@ msgstr "För mer information, se <a href='http://fixmystreet.org/customising/fms
msgid "Forgotten your password?"
msgstr "Glömt ditt lösenord?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Tilldela extern förvaltning:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Tilldela extern förvaltning:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "Vanliga frågor"
@@ -1121,8 +1189,7 @@ msgstr "FÃ¥ uppdateringar av %s problem"
msgid "Get updates of problems in this %s"
msgstr "FÃ¥ uppdateringar om problem i denna %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Ge mig ett RSS-flöde"
@@ -1131,17 +1198,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr "Vi är glada att höra att det har blivit löst!"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "GÃ¥"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "Skicka enkät?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Visualisering av rapporter över tid"
@@ -1149,41 +1216,37 @@ msgstr "Visualisering av rapporter över tid"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Utgråade linjer är kommuner som inte längre existerar."
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Har det här problemet blivit löst?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Har du någonsin rapporterat ett problem till en kommun tidigare eller är det här första gången?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Hjälp"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "Här är de olika typerna för lokala problem för &lsquo;%s&rsquo;"
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Hej %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1197,7 +1260,7 @@ msgstr "Göm äldre"
msgid "Hide pins"
msgstr "Göm pinnar"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "Historik"
@@ -1213,7 +1276,7 @@ msgstr "Hur man rapporterar ett problem"
msgid "How to send successful reports"
msgstr "Hur bra rapporter skickas"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Tyvärr kan du inte bekräfta obekräftade rapporter"
@@ -1240,8 +1303,8 @@ msgstr "Tyvärr kan vi inte hitta den rapporten. Om du kopierade en länk från
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "ID"
@@ -1259,18 +1322,6 @@ msgid ""
" the menu. Make sure you use the same category name in the bodies if you want this to happen."
msgstr "Om två eller fler förvaltningar delar på ett geografiskt område, kombinerar FixMyStreet identiska kategorier till ett val i menyn. Se till att du använder samma kategorinamn om du vill att det skall hända."
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Om du inte gör det kommer ditt alarm inte att bli aktiverat."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Om du inte gör det kommer ditt problem inte att skickas."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Om du inte gör det kommer din uppdatering inte att skickas."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr "Om du får mer information om problemets status får du gärna komma tillbaka hit och lämna en uppdatering."
@@ -1280,16 +1331,16 @@ msgstr "Om du får mer information om problemets status får du gärna komma til
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Om du anmäler ett problem i FixaMinGata kommer ärendet och detaljerna att visas här, men rapporten kommer <strong>inte</strong> att skickas till kommunen."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Om du använder webbmail och har spamfilter bör du kolla din spamfolder eftersom våra brev ibland markeras som skräp."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr "Om du vill lämna ytterligare information om problemet, ange det här. Till exempel, hur upplevde du kommunikationen med kommunen? Om du skickar en rapport här kommer den att visas offentligt på FixaMinGata."
#: templates/web/base/admin/body.html:149
@@ -1319,7 +1370,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr "Om du har aktiverat Open311-uppdateringsutskick ovan: Du måste identifiera vilken <strongFixaMinGata-användare</strong> som skall anges som skapare av dessa uppdateringar när de visas på sajten. Ange ID-numret för den här användaren."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Ogiltigt ID"
@@ -1344,14 +1395,13 @@ msgstr "I missbrukstabellen?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "I tillägg, följande attribut som inte är del av Open311 v2-specifikationen returneras: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Pågående"
@@ -1359,7 +1409,7 @@ msgstr "Pågående"
msgid "Inbox zero, here we come!"
msgstr "Inbox zero, här kommer vi!"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Inkludera rapportörens personuppgifter"
@@ -1371,12 +1421,12 @@ msgstr "Inkludera obekräftade rapporter"
msgid "Incorrect has_photo value \"%s\""
msgstr "Inkorrekt värde för has_photo, \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Interna anteckningar"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Interna refereringar"
@@ -1384,7 +1434,7 @@ msgstr "Interna refereringar"
msgid "Invalid agency_responsible value %s"
msgstr "Inkorrekt värde för agency_responsible, \"%s\""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Inkorrekt slutdatum"
@@ -1392,12 +1442,12 @@ msgstr "Inkorrekt slutdatum"
msgid "Invalid format %s specified."
msgstr "Inkorrekt format %s angivet."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Inkorrekt startdatum"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1415,10 +1465,19 @@ msgstr "Det går oftast snabbast att <a href=\"%s\">kolla vår FAQ</a> och se om
msgid "It’s on its way to the council right now."
msgstr "Det är nu på väg till kommunen."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1430,7 +1489,7 @@ msgstr "Behåll mig inloggad på den här datorn"
msgid "Last editor"
msgstr "Senaste redaktör"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "Senaste uppdatering:"
@@ -1465,7 +1524,7 @@ msgstr "Lokala RSS-flöden och epostbevakningar"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Lokala RSS-flöden och epostbevakningar för '%s'"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Lokala rapporter"
@@ -1478,14 +1537,12 @@ msgid "MAP"
msgstr "KARTA"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "Karta"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "markerad som stängd"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1503,6 +1560,16 @@ msgstr ""
msgid "Message"
msgstr "Meddelande"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Tilldela extern förvaltning:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Tilldela extern förvaltning:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "Meddelande:"
@@ -1530,27 +1597,25 @@ msgstr "Fler närliggande problem"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Namn"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Namn:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Namn: %s"
@@ -1563,12 +1628,12 @@ msgstr "Närmaste namngivna gata till placeringen på kartan (genereras automati
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Närmaste postnummer till placeringen på kartan (genereras automatiskt): %s (%s meter bort)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Närmaste gata till placeringen på kartan (genereras automatiskt av Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1576,10 +1641,15 @@ msgstr ""
"Närmaste gata till placeringen på kartan (genereras automatiskt av Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Nästan klar! Kolla nu din epost."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Nästan klar! Kolla nu din epost."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Nya <br>problem"
@@ -1588,12 +1658,12 @@ msgstr "Nya <br>problem"
msgid "New body added"
msgstr "Ny förvaltning tillagd"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Nya kategorikontakter tillagda"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Ny intern anteckning:"
@@ -1601,9 +1671,10 @@ msgstr "Ny intern anteckning:"
msgid "New local problems on FixMyStreet"
msgstr "Nya lokala problem på FixaMinGata"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "Nya lokala rapporter på reportemptyhomes.com"
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Ny intern anteckning:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1629,33 +1700,15 @@ msgstr "Nya problem inom {{NAME}}'s administrativa gräns på FixaMinGata"
msgid "New reports"
msgstr "Nya rapporter"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "Nya rapporter för {{COUNCIL}} inom {{WARD}} område på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "Nya rapporter på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "Nya rapporter på reportemptyhomes.com nära {{POSTCODE}}"
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "Nya rapporter till {{COUNCIL}} på reportemptyhomes.com"
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "Nya rapporter inom {{NAME}}'s administrativa gräns på reportemptyhomes.com"
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Ny status"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "Ny uppdatering:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Ny status"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1668,14 +1721,12 @@ msgstr "Nästa"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "Nej"
@@ -1703,20 +1754,11 @@ msgstr "Inga flaggade problem kunde hittas."
msgid "No flagged users found."
msgstr "Inga flaggade användare kunde hittas."
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Inga fler uppdateringar"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Inga poblem hittade."
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Inga problem har rapporteras än."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "Inget resultat returnerades"
@@ -1734,8 +1776,6 @@ msgid "No supporters"
msgstr "Inga supporters"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Inget"
@@ -1748,8 +1788,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr "Normala (publika) användare skall inte associeras med någon <strong>förvaltning</strong>.<br>Användare för behörig personal skall kunna bli associerade med den förvaltning som de representerar.<br>Beroende på implementationen kan personal ha tillgång till dashboard-sidan (som summerar förvaltningsaktiviteterna), möjligheten att dölja rapporter, eller möjligheten att sätta speciella rapportstatusvärden."
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1757,7 +1797,15 @@ msgstr "Normala (publika) användare skall inte associeras med nÃ¥gon <strong>fÃ
msgid "Not Responsible"
msgstr "Ej ansvarig"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Ej ansvarig"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Inte för min underavdelning"
@@ -1770,7 +1818,7 @@ msgid "Not reported to council"
msgstr "Ej rapporterat till kommunen"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Observera"
@@ -1780,7 +1828,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Observera att när vi listar obegräftade rapporter använder vi datumet när rapporten skapades, vilket inte nödvändigtvis är samma månad som när rapporten bekräftades, så vissa avvikelser kan uppstå."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Observera:"
@@ -1789,22 +1837,20 @@ msgstr "Observera:"
msgid "Note: <strong>%s</strong>"
msgstr "Observera: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "För att skicka din rapport&hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "För att skicka din rapport&hellip; har du ett lösenord för FixaMinGata?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "För att skicka din uppdatering&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "För att skicka din uppdatering&hellip; har du ett lösenord för FixaMinGata?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "OK"
@@ -1834,20 +1880,18 @@ msgstr "Äldre <br>problem"
msgid "One-line summary"
msgstr "Kort sammanfattning"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Öppen"
@@ -1855,11 +1899,6 @@ msgstr "Öppen"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Öppna rapporter"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1876,32 +1915,26 @@ msgstr "Open311"
msgid "Open311 specification"
msgstr "Open311 Specifikation"
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Eller problem rapporterade til:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Du kan också prenumerera på bevakningar baserat på vilken kommun du bor i:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Övrig"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "FixaMinGata är öppen programvara och <a href=\"http://github.com/mysociety/fixmystreet\">tillgänglig på GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "Ägare"
@@ -1916,12 +1949,12 @@ msgstr "Sidan hittas ej"
msgid "Parent"
msgstr "Förälder"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "Partiell"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1930,6 +1963,7 @@ msgid "Password (optional)"
msgstr "Lösenord (valfritt)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Lösenord:"
@@ -1937,7 +1971,7 @@ msgstr "Lösenord:"
msgid "Permalink"
msgstr "Permanent länk"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Telefonnummer"
@@ -1946,11 +1980,9 @@ msgstr "Telefonnummer"
msgid "Phone number (optional)"
msgstr "Telefonnummer (valfritt)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Telefonnummer:"
@@ -1961,14 +1993,23 @@ msgstr "Telefonnummer:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Foto"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Den här informationen krävs"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Den här informationen krävs"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Foto:"
@@ -1980,22 +2021,18 @@ msgstr "Foton från närliggande rapporter"
msgid "Place pin on map"
msgstr "Placera nålen på kartan"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Planerat"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Observera <a class=\"tab_link\" href=\"#report\">uppdateringarna</a> som har lämnats."
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Var vänlig, kortfattad och rakt på sak."
@@ -2005,22 +2042,20 @@ msgstr "Var vänlig, kortfattad och rakt på sak."
msgid "Please check the passwords and try again"
msgstr "Vänligen kontrollera lösenordet och prova igen"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Vänligen kontrollera din epost"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Vänligen kontrollera att din epostadress är korrekt"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2030,15 +2065,16 @@ msgstr "Välj en kategori"
msgid "Please choose a property type"
msgstr "Välj en fastighetstyp"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "Vänligen korrigera felen nedan"
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr "Var snäll och rapportera <strong>inga</strong> problem genom det här formuläret. Meddelanden här går till teamet bakom FixaMinGata, inte till din kommun. för att rapportera ett problem, <a href=\"/\">gå till framsidan</a> och följ instruktionerna."
@@ -2047,7 +2083,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Var snäll och missbruka inte tjänsten, det förstör för alla."
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Skriv in ett meddelande"
@@ -2058,15 +2094,15 @@ msgstr "Skriv in ett meddelande"
msgid "Please enter a password"
msgstr "Skriv in ett lösenord"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Skriv in ett ärende"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2074,7 +2110,7 @@ msgid "Please enter a valid email"
msgstr "Skriv in en giltig epostadress"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Skriv in en giltig epostadress"
@@ -2083,21 +2119,19 @@ msgstr "Skriv in en giltig epostadress"
msgid "Please enter some details"
msgstr "Skriv några detaljer"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Skriv in din epostadress"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Skriv in din epostadress"
@@ -2110,8 +2144,8 @@ msgstr "Skriv in ditt förnamn"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Skriv in ditt namn och efternamn om kommunen behöver den informationen. Om du inte vill att dit namn visas kan du välja det nedanför"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2150,7 +2184,7 @@ msgstr "Fyll i information om problemet nedan."
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Fyll i information om problemet nedan och beskriv den exakta platsen för problemet så noga du kan."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Ange ifall du vill ta emot ett annat frågeformulär"
@@ -2173,19 +2207,24 @@ msgstr "Observera att din rapport <strong>inte har skickats än</strong>. Välj
msgid "Please note:"
msgstr "Observera:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Skriv en förklaring till varför du öppna de här rapporten igen"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Skriv lite förklarande text tillsammans med ett foto"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Ange om du har anmält ett problem till kommunen tidigare eller ej"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Välj en förvaltning"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Välj det RSS-flöde du vill ha"
@@ -2194,21 +2233,17 @@ msgstr "Välj det RSS-flöde du vill ha"
msgid "Please select the type of alert you want"
msgstr "Välj den kategori av rapporter du vill ha"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Ange om problemet har lösts eller ej"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Titta på de uppdateringar som har lämnats."
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Ladda upp en JPEG-bild"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Skriv ett meddelande"
@@ -2217,8 +2252,8 @@ msgid "Please write your update here"
msgstr "Skriv din uppdatering här"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2239,22 +2274,36 @@ msgstr "Postat av %s (<strong>%s</strong>) %s"
msgid "Posted by %s at %s"
msgstr "Postat av %s %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Föregående"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "Personlig integritet"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Privat"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Rapport"
@@ -2270,12 +2319,12 @@ msgstr "Rapport %s bekräftad"
msgid "Problem %s sent to council %s"
msgstr "Rapport %s skickad till %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Rapporter per status"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Problemet markerat som öppet."
@@ -2291,12 +2340,10 @@ msgstr "Problem"
msgid "Problems in this area"
msgstr "Problem i detta område"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Närliggande problem"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Problem på kartan"
@@ -2305,12 +2352,11 @@ msgstr "Problem på kartan"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Problem nyligen rapporterade som lösta på FixaMinGata"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Problem inom %.1f km från denna position"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2322,20 +2368,17 @@ msgstr "Problem inom %s"
msgid "Problems within %s ward"
msgstr "Problem inom området %s"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Problem inom %s, FixaMinGata"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Problem inom %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problem inom gränsen för:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "Fastigheter nyligen rapporterade som åtgärdade på reportemptyhomes.com"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "Fastighetsadress:"
@@ -2349,39 +2392,31 @@ msgstr "Fastighetstyp:"
msgid "Provide an update"
msgstr "Ge en uppdatering"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Du måste inte ange namn och ett lösenord men om du gör det är det lättare att rapportera problem, lämna uppdateringar och hantera dina rapporter."
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Att ange ett lösenord är valfritt, men om du gör det kommer du lättare att kunna rapportera problem, lämna uppdateringar och hantera dina anmälningar."
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Offentligt svar:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Publicera foto"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Publicera svaret"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "Frågeformulär"
@@ -2397,12 +2432,11 @@ msgstr "Frågeformulär %d skickat för problem %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Frågeformulär ifyllt av rapportören"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2428,8 +2462,7 @@ msgstr "RSS-flöde för %s"
msgid "RSS feed of %s, within %s ward"
msgstr "RSS-flöde för %s, inom område %s"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr "RSS-flöde av närliggande problem"
@@ -2437,7 +2470,7 @@ msgstr "RSS-flöde av närliggande problem"
msgid "RSS feed of problems in this %s"
msgstr "RSS-flöde för problem i denna %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2467,17 +2500,18 @@ msgstr "RSS-flöde för uppdateringar till denna rapport"
msgid "Receive email when updates are left on this problem."
msgstr "Erhåll epost när uppdateringar ges till denna rapport"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Senaste lokala rapporterna, FixaMinGata"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Nyligen <br>åtgärdat"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Senaste rapporterade problemen"
@@ -2485,23 +2519,28 @@ msgstr "Senaste rapporterade problemen"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "Kom ihåg att FixaMinGata primärt är avsett för att rapportera fysiska problem som kan åtgärdas. Om ditt problem inte lämpar sig för att rapportera via den här webbsidan kan du kontakta din kommun direkt via deras webbsida."
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "Ta bort flagga"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Ta bort foto (kan inte ångras!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "ändra användare"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr "Rapportera"
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "Rapportera ett problem"
@@ -2510,7 +2549,7 @@ msgstr "Rapportera ett problem"
msgid "Report abuse"
msgstr "Rapportera missbruk"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Rappoort på %s"
@@ -2519,83 +2558,82 @@ msgstr "Rappoort på %s"
msgid "Report your problem"
msgstr "Rapportera ditt problem"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Rapportera, visa, eller diskutera lokala problem"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Rapporterade %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Rapporterat %s till %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Rapporterat anonymt %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Rapporterat tidigare"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Rapporterat av %s den %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Rapporterade %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Rapporterat i kategori %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Anonym rapport i kategori %s, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Rapporterat i kategori %s av %s den %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Rapporterat av %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Rapporterat av %s av %s den %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Rapporterat av %s i kategorin %s, anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Rapporterat av %s i kategorin %s av %s den %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Rapporterat i kategori %s"
+msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Rapporterade %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Rapportera ett problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "Rapporter"
@@ -2608,18 +2646,21 @@ msgstr "Rapporter kan bara innehålla %s tecken. Var vänlig korta ned din rappo
msgid "Reports awaiting approval"
msgstr "Rapporter som väntar på att godkännas"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Rapporter på och runt kartbilden"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Publicerade rapporter"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "Skicka om rapporten"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Rätt plats?"
@@ -2634,26 +2675,32 @@ msgstr "Vägoperatör för den här namngivna vägen (hämtat från vägens numm
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Vägoperatör för den här namngivna vägen (från OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Rotera åt vänster"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Rotera åt höger"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "Satellit"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Spara ändringar"
@@ -2666,7 +2713,7 @@ msgstr "Sök rapporter"
msgid "Search Users"
msgstr "Sök användare"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Sök bland rapporter"
@@ -2698,20 +2745,25 @@ msgstr "Du kan välja en enskild kommun för att se rapporterna skickade dit."
msgid "Select an area"
msgstr "Välj ett område"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Välj vilken kategori av rapporter du vill få och klicka knappen för ett RSS-flöde eller ange din epostadress för att prenumerera via epost."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Öppna rapporter"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Skickades till %s, %s senare"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "Skickades:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "Tjänst:"
@@ -2720,8 +2772,8 @@ msgstr "Tjänst:"
msgid "Share"
msgstr "Dela"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2737,34 +2789,23 @@ msgid "Show pins"
msgstr "Visa pinnar"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Logga in"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Logga in via epost"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Logga in eller skapa nytt konto"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Logga ut"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Inloggad som %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Vissa kategorier kan kräva ytterligare information."
@@ -2782,8 +2823,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "Foton från de senaste rapporterna"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Lite text att lokalisera"
@@ -2791,24 +2833,32 @@ msgstr "Lite text att lokalisera"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "Tyvärr, det verkar vara ett postnummer som vi inte täcker."
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Tyvärr har det uppstått ett fel med att bekräfta ditt problem."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Tyvärr kan vi inte hitta den adressen."
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Tyvärr kan vi inte förstå den adressen. Försök gärna igen."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Tyvärr kan vi inte förstå den adressen. Försök gärna igen."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Startdatum:"
@@ -2824,16 +2874,17 @@ msgstr "Status"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Status:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "Statistik"
@@ -2847,7 +2898,12 @@ msgstr "Status"
msgid "Still open, via questionnaire, %s"
msgstr "Fortfarande öppen, via frågeformulär, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "Underkategori: %s"
@@ -2862,45 +2918,42 @@ msgstr "Ärende"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Ärende:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Skicka"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Skicka förändringar"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Skicka frågeformulär"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Skickad"
@@ -2911,18 +2964,19 @@ msgstr "Skickad"
msgid "Subscribe"
msgstr "Prenumerera"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Prenumerera med epost"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Sammanfattning"
@@ -2933,7 +2987,7 @@ msgstr "Sammanfattning"
msgid "Summary reports"
msgstr "Sammanställningsrapporter"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "Enkät"
@@ -2941,9 +2995,18 @@ msgstr "Enkät"
msgid "Survey Results"
msgstr "Frågeresultat"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Uppdateringar"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "Text"
@@ -2952,6 +3015,7 @@ msgid "Text only version"
msgstr "Version med endast text"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "Text:"
@@ -2973,7 +3037,7 @@ msgstr "Tack för att du uppdaterade detta ärende!"
msgid "Thank you for your feedback"
msgstr "Tack för dina synpunkter"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "Tack för att du bifogade ett foto. Vi måste nu lokalisera ditt problem så var vänlig ange närliggande gatunamn och ort eller postnummer i rutan ovan&nbsp;:"
@@ -2981,7 +3045,7 @@ msgstr "Tack för att du bifogade ett foto. Vi måste nu lokalisera ditt problem
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "Tack, vi är glada över att det har blivit åtgärdat. Har du rapporterat ett problem till en kommun tidigare?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Bilden verkar inte ha laddats upp korrekt (%s), var vänlig försök igen."
@@ -2999,20 +3063,19 @@ msgstr "Den positionen verkar inte vara i Sverige: försök gärna igen."
msgid "That postcode was not recognised, sorry."
msgstr "Det postnummret finns tyvärr inte."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Rapportern kommer nu att skickas om."
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Rapportern kommer nu att skickas om."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Rapporten kan inte visas på %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Rapporten har tagits bort från FixaMinGata."
@@ -3054,30 +3117,18 @@ msgid ""
" and may be displayed publically."
msgstr "Förvaltningens namn identifierar förvaltningen (till exempel, <em>Sandvikens kommun</em>) och kan komma att visas offentligt."
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "Bekräftelsebrevet <strong>kan</strong> ta ett par minuter att komma fram &mdash; var tålmodig."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "Fyll i information om problemet nedan. Kommunen kommer inte att kunna hjälpa till om du inte lämnar tillräckligt med detaljer. Beskriv så noga du kan den exakta platsen för problemet (exempelvis \"på väggen\"), vad problemet är, hur länge det har funntis och en beskrivning. Om du har ett foto får du gärna bifoga detta också."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Information om ditt problem kan du se i fliken \"Din rapport\" ovan."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Detaljerna för ditt problem kan nu ses på höger sida av den här sidan."
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "Flitighetstabellen visar redigerares aktiviteter (vem som har ändrat flest handlingar)."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "Felet var: %s"
@@ -3095,10 +3146,6 @@ msgstr "Följande information om den närmaste vägen kan vara inexakt eller ogi
msgid "The latest local problems reported by users"
msgstr "De senaste lokala problemen rapporterat av användare"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "De senaste lokala rapporterna från användare"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "De senaste problemen för {{COUNCIL}} från användare"
@@ -3119,21 +3166,9 @@ msgstr "De senaste problemen rapporterade som lösta av användare"
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "De senaste problemen inom {{NAME}}'s gräns rapporterade av användare"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "De senaste fastigheterna rapporterade som åter tagna i användning av användare"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "De senaste rapporterna för {{COUNCIL}} rapporterade från användare"
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "De senaste rapporterna för {{COUNCIL}} inom {{WARD}} rapporterade från användare"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "De senaste rapporterna inom {{NAME}}'s gräns rapporterade från användare"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3149,8 +3184,7 @@ msgstr "Lösenorden stämmer inte överens"
msgid "The requested URL '%s' was not found on this server"
msgstr "Den sökta adressen '%s' hittades inte på denna server"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "Vår enklaste bevakning är för rapporter inom ett geografiskt område:"
@@ -3161,7 +3195,7 @@ msgstr "Vår enklaste bevakning är för rapporter inom ett geografiskt område:
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "Sammanfattningen och beskrivningen kommer också att visas offentligt (se vår <a href=\"/privacy\">integritetsskyddspolicy</a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "Användaren kunde inte lokalisera problemet på kartan men angav en area inom vilket problemet finns"
@@ -3172,23 +3206,24 @@ msgid ""
" Names are not necessarily unique."
msgstr "Användarens <strong>namn</strong> visas offentligt i rapporter som inte har markerats som <strong>anonyma</strong>. Namn är inte nödvändigtvis unika."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr "Det finns inga rapporter att visa."
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "Det uppstod ett problem med att visa sidan med alla rapporter. Försök gärna igen senare."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "Det uppstod ett problem med att visa denna sida. Försök gärna igen senare."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "Felaktigt lösenord eller epostadress. Om du har glömt bort ditt lösenord, eller om du inte har ett lösenord, kan du fylla i &lsquo;logga in via epost&rsquo;."
@@ -3201,7 +3236,7 @@ msgstr "Felaktigt lösenord eller epostadress. Försök igen."
msgid "There was a problem with your update. Please try again."
msgstr "Det uppstod ett problem med din uppdatering. Försök igen."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Det uppstod ett problem med din rapport. Se nedan."
@@ -3241,16 +3276,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr "Den här förvaltningen kommer endast att skickas rapporter för problem inom dess <strong>geografiska område</strong>. En förvaltning kommer inte att få några rapporter om den inte täcker åtminstone ett område."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "Det här brevet har skickats till flera adresser eftersom rapportören inte angav någon kategori, eller den kategori som angavs hör till flera olika enheter. Du kan ignorera det här brevet om du inte är rätt person att hantera det, men det vore också mycket hjälpsamt om du kan ta reda på vem som är rätt person och anmäla detta till oss så att vi kan ändra databasen för framtida brev."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "Det här brevet har skickats till flera adresser eftersom rapportören inte angav någon kategori, eller den kategori som angavs hör till flera olika enheter. Du kan ignorera det här brevet om du inte är rätt person att hantera det, men det vore också mycket hjälpsamt om du kan ta reda på vem som är rätt person och anmäla detta till oss så att vi kan ändra databasen för framtida brev."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3264,7 +3299,7 @@ msgstr "Det här är en utvecklingsplats: olika saker kan komma att gå sönder
msgid "This is a summary of all reports on this site."
msgstr "Det här är en sammanställning av alla rapporter."
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "Detta kan bero på att länken är för gammal, att den redan har använts, eller att adressen inte kopierades korrekt."
@@ -3291,55 +3326,69 @@ msgstr "Arbete pågår med att lösa problemet"
msgid "This problem is old and of unknown status."
msgstr "Problemet är gammalt och har okänt status"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Den här rapporten väntar på att granskas."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Den här rapporten är markerad som stängd"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Det här problemet är markerat som löst"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Den här rapportern är öppen"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Den här rapporten skickades anonymt."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Den här sidan innehåller också ett foto av problemet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "Tidslinje"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Titel"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Klicka på kartan för att <strong>rapportera ett problem</strong>."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Skriv in postnummer eller gatunamn och ort för att se rapporter kring den platsen."
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Skriv in postnummer eller gatunamn och ort för att se rapporter kring den platsen."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "För att visa en karta med den exakta positionen för problemet"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3355,8 +3404,8 @@ msgstr "Försök igen"
msgid "Try emailing us directly:"
msgstr "Prova att skicka ett e-brev till oss direkt:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3364,11 +3413,11 @@ msgstr "Prova att skicka ett e-brev till oss direkt:"
msgid "Unable to fix"
msgstr "Kunde inte åtgärda"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Obekräftat"
@@ -3385,7 +3434,9 @@ msgstr "Okänd feltyp"
msgid "Unknown error"
msgstr "Okänt fel"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Okänt problemnummer"
@@ -3408,11 +3459,11 @@ msgid "Update below added by %s at %s"
msgstr "Uppdateringen nedan tillagd av %s den %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Uppdatera förvaltning"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Uppdatering per status"
@@ -3447,24 +3498,24 @@ msgstr "Uppdatering:"
msgid "Updated"
msgstr "Uppdaterad"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Uppdaterad!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "Uppdateringar"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "Uppdateringar kan inte innehålla mer än %s tecken. Var vänlig korta ned din uppdatering."
@@ -3472,27 +3523,30 @@ msgstr "Uppdateringar kan inte innehålla mer än %s tecken. Var vänlig korta n
msgid "Updates on {{title}}"
msgstr "Uppdateringar för {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "Uppdateringar för det här problemet, FixaMinGata"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "Använd <strong>anteckningen</strong> för att dokumentera information som bara visas för administratörer. Anteckningar visas inte offentligt och skickas inte till förvaltningen."
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "Användare"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "använde kartan"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "Användarflaggan borttagen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "Användaren flaggad"
@@ -3500,23 +3554,23 @@ msgstr "Användaren flaggad"
msgid "User search finds matches in users' names and email addresses."
msgstr "Användarsökningen matchar mot användares namn och e-postadresser."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "Användare"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Värden uppdaterade"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "Visa rapporter på sidan"
@@ -3540,16 +3594,15 @@ msgid "Wards of this council"
msgstr "Delområden i denna kommun"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Vi hittade fler än en träff. Vi visar upp till tio träffar nedan. Om ingen av dem överenstämmer med vald adress kan du söka igen. Om du söker efter en gata, lägg till stad efteråt: \"Vasagatan, Göteborg\" för att förfina sökningen."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Vi beklagar att vi inte har kunnat bekräfta ditt konto."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Vi har skickat dig epost med en länk för att bekräfta ditt konto."
@@ -3563,7 +3616,7 @@ msgstr "Vi visar aldrig din epostadress publikt"
msgid "We never show your email address or phone number."
msgstr "Vi visar aldrig din epostadress eller telefonnummer publikt."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Det här problemet kan höra till %s. Dessvärre har vi ingen kontaktinformation till dem. Om du vet om en lämplig kontaktadress hör vi gärna från dig."
@@ -3588,11 +3641,15 @@ msgstr "Vi vill gärna höra vad du tycker om FixaMinGata. Fyll i formuläret ne
msgid "We’ll get back to you as soon as we can."
msgstr "Vi återkommer så snart vi kan!"
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr "Vad och var är problemet?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Vid förändringar"
@@ -3601,7 +3658,7 @@ msgstr "Vid förändringar"
msgid "When sent"
msgstr "Vid avsändning"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Hela block med tomma lägenheter"
@@ -3609,16 +3666,22 @@ msgstr "Hela block med tomma lägenheter"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr "Varför sluta där? <a href=\"/alert\">Sätt upp fler notifikationer</a> gratis."
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "Vid sökningar är det också möjligt att söka efter agency_responsible för att begränsa svaren till de som skickats till en enstaka kommun. Söktermen för administrations-IDt erhålls av <a href=\"%s\">MapIt</a>."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "Vill du bidra till FixaMinGata? Vår kod är öppen programvara och <a href=\"http://fixmystreet.org\">tillgänglig på fixmystreet.org</a>."
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Vill du bli påmind om att kolla statusen med ett annat frågeformulär om fyra veckor?"
@@ -3644,15 +3707,13 @@ msgstr "Ã…r"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Ja"
@@ -3715,11 +3776,9 @@ msgstr "Du nekade; vänligan fyll i rutan ovan"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "Du har redan svarat på det här frågeformuläret. Om du har en fråga, <a href=\"%s\">kontakta oss</a> eller <a href=\"%s\">visa problemet</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Du har redan bifogat ett foto till rapporten. Om du bifogar ett nytt foto kommer det att ersätta det tidigare."
@@ -3728,6 +3787,10 @@ msgstr "Du har redan bifogat ett foto till rapporten. Om du bifogar ett nytt fot
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Du har redan bifogat ett foto till uppdateringen. Om du bifogar ett nytt foto kommer det att ersätta det tidigare."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3748,15 +3811,11 @@ msgstr "Du har bekräftat din e-postadress."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Du har loggats in. Verifiera att dina uppgifter stämmer:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Du har inte skapat några rapporter än. <a href=\"%s\">Rapportera ett problem nu.</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Du måste nu klicka på länken i det brev vi just skickat till dig."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Du behöver <a href=\"%s\">lägga till förvaltningar</a> (som kommuner) innan rapporter kan skickas."
@@ -3767,18 +3826,16 @@ msgid ""
" contacts (such as an email address) to which reports are sent."
msgstr "Du behöver lägga till förvaltningar (som kommuner) så att du sedan kan lägga till problemkategorier som de kan hantera (som Väggrop eller Gatubelysning) och kontakter (som e-postadresser) till vilka rapporter skickas."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "Vill du verkligen skicka om?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Dina rapporter"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3787,22 +3844,17 @@ msgstr "Dina rapporter"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Din epostadress"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Din epostadress"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Din epostadress:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3812,24 +3864,23 @@ msgstr "Din epostadress:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Din information kommer endast att användas i enlighet med vår <a href=\"/privacy\">sekretesspolicy</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Ditt namn och efternamn"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Ditt namn:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3842,19 +3893,15 @@ msgstr "Ditt lösenord har ändrats"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Ditt telefonnummer"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Din rapport"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Dina rapporter"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Dina uppdateringar"
@@ -3862,23 +3909,31 @@ msgstr "Dina uppdateringar"
msgid "Your&nbsp;email:"
msgstr "Din&nbsp;epostadress:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Alla rapporter"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "av %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Stängda rapporter"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "kommun"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "använde inte kartan"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "ex.v. '%s' eller '%s'"
@@ -3887,17 +3942,22 @@ msgstr "ex.v. '%s' eller '%s'"
msgid "edit user"
msgstr "ändra användare"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Lösta rapporer"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "från %d olika användare"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "senast uppdaterad %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "mindre än en minut"
@@ -3942,14 +4002,13 @@ msgstr "markerad som planerad"
msgid "marked as unable to fix"
msgstr "markerad som kunde inte åtgärda"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "Ej tillgängligt"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "eller"
@@ -3959,16 +4018,16 @@ msgstr "eller <strong>hitta min position automatiskt</strong>."
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "ursprungligen inmatat: &ldquo;%s&rdquo;"
@@ -3981,8 +4040,8 @@ msgstr "andra områden:"
msgid "reopened"
msgstr "öppnat på nytt"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "logga ut"
@@ -3998,17 +4057,20 @@ msgstr "kommunen"
msgid "there is no pin shown as the user did not use the map"
msgstr "det finns ingen kartmarkering eftersom användaren inte använde kartan"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "den här typen av problem"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "idag"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Lösta rapporer"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "använde kartan"
@@ -4032,7 +4094,7 @@ msgid_plural "<big>%s</big> reports recently"
msgstr[0] "<big>%s</big> rapport nyligen"
msgstr[1] "<big>%s</big> rapporter nyligen"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4046,7 +4108,7 @@ msgid_plural "%d supporters"
msgstr[0] "%d supporter"
msgstr[1] "%d supportrar"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4067,7 +4129,7 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] "Vi har ännu ingen information om kommunen på den platsen"
msgstr[1] "Kommunen på platsen har valt att inte ta emot rapporter från FixaMinGata."
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4088,7 +4150,7 @@ msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "<big>%s</big> löst problem senaste månaden"
msgstr[1] "<big>%s</big> lösta problem senaste månaden"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4102,5 +4164,143 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] "Vi har ännu <strong>ingen</strong> information om kommunen på den platsen"
msgstr[1] "Kommunen på platsen har valt att inte ta emot rapporter från FixaMinGata."
-#~ msgid "For council(s):"
-#~ msgstr "För kommuner:"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Vi behåller din bevakning medan du kontrollerar din e-post)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Vi behåller din rapport medan du kontrollerar din e-post)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Vi behåller din uppdatering medan du kontrollerar din e-post.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Om du inte kan se kartan kan du <a herf='%s' rel='nofollow'>hoppa över det här steget</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Nej</strong>, det vill jag inte, låt mig logga in med min epostadress:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Är du en <strong>utvecklare</strong>? Skulle du vilja bidra till FixaMinGata?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Närmaste närliggande problem <small>(inom&nbsp;%s&nbsp;km)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "Kontakta FixaMinGata"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Har du ett lösenord till FixMyBrangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixaMinGata administratör:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Om du inte gör det kommer ditt alarm inte att bli aktiverat."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Om du inte gör det kommer ditt problem inte att skickas."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Om du inte gör det kommer din uppdatering inte att skickas."
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "Nya lokala rapporter på reportemptyhomes.com"
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "Nya rapporter för {{COUNCIL}} inom {{WARD}} område på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "Nya rapporter på reportemptyhomes.com"
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "Nya rapporter på reportemptyhomes.com nära {{POSTCODE}}"
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "Nya rapporter till {{COUNCIL}} på reportemptyhomes.com"
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "Nya rapporter inom {{NAME}}'s administrativa gräns på reportemptyhomes.com"
+
+#~ msgid "New update:"
+#~ msgstr "Ny uppdatering:"
+
+#~ msgid "No problems found."
+#~ msgstr "Inga poblem hittade."
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Inga problem har rapporteras än."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "För att skicka din rapport&hellip; har du ett lösenord för FixaMinGata?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "För att skicka din uppdatering&hellip; har du ett lösenord för FixaMinGata?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "FixaMinGata är öppen programvara och <a href=\"http://github.com/mysociety/fixmystreet\">tillgänglig på GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Observera <a class=\"tab_link\" href=\"#report\">uppdateringarna</a> som har lämnats."
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Titta på de uppdateringar som har lämnats."
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Problem inom %s, FixaMinGata"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "Fastigheter nyligen rapporterade som åtgärdade på reportemptyhomes.com"
+
+#~ msgid "Publish the response"
+#~ msgstr "Publicera svaret"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Rapporterat %s till %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Rapporter på och runt kartbilden"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Logga in via epost"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Inloggad som %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "Bekräftelsebrevet <strong>kan</strong> ta ett par minuter att komma fram &mdash; var tålmodig."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Information om ditt problem kan du se i fliken \"Din rapport\" ovan."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Detaljerna för ditt problem kan nu ses på höger sida av den här sidan."
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "De senaste lokala rapporterna från användare"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "De senaste fastigheterna rapporterade som åter tagna i användning av användare"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "De senaste rapporterna för {{COUNCIL}} rapporterade från användare"
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "De senaste rapporterna för {{COUNCIL}} inom {{WARD}} rapporterade från användare"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "De senaste rapporterna inom {{NAME}}'s gräns rapporterade från användare"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Klicka på kartan för att <strong>rapportera ett problem</strong>."
+
+#~ msgid "User"
+#~ msgstr "Användare"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Du måste nu klicka på länken i det brev vi just skickat till dig."
+
+#~ msgid "Your email address:"
+#~ msgstr "Din epostadress:"
+
+#~ msgid "Your report"
+#~ msgstr "Din rapport"
diff --git a/locale/tr_TR.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/tr_TR.UTF-8/LC_MESSAGES/FixMyStreet.po
new file mode 100644
index 000000000..9df12fde1
--- /dev/null
+++ b/locale/tr_TR.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -0,0 +1,4210 @@
+# FixMyStreet original .po file, autogenerated by gettext-extract.
+# Copyright (C) 2011 UK Citizens Online Democracy
+# This file is distributed under the same license as the main FixMyStreet code.
+# Matthew Somerville <matthew@mysociety.org>, 2011-06-03.
+#
+# Translators:
+# Eda Karaman <edakaraman_92@hotmail.de>, 2015
+# Muradiye <Muradiye.ates@gmail.com>, 2015
+# Seyithan Ates <seyithan.ahmet@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: fixmystreet\n"
+"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-10-13 09:45+0000\n"
+"Last-Translator: Muradiye <Muradiye.ates@gmail.com>\n"
+"Language-Team: Turkish (Turkey) (http://www.transifex.com/mysociety/fixmystreet/language/tr_TR/)\n"
+"Language: tr_TR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
+msgid " and "
+msgstr "ve"
+
+#: templates/web/base/report/new/councils_text_all.html:2
+#: templates/web/base/report/new/councils_text_none.html:11
+#: templates/web/base/report/new/councils_text_none.html:2
+#: templates/web/base/report/new/councils_text_some.html:19
+#: templates/web/base/report/new/councils_text_some.html:22
+#: templates/web/base/report/new/councils_text_some.html:5
+msgid " or "
+msgstr "veya"
+
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
+msgid "%d confirmed alerts, %d unconfirmed"
+msgstr "%d onaylanmış uyarı, %d onaylanmamış"
+
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
+#: templates/web/zurich/admin/index.html:6
+msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
+msgstr "%d kurul irtibatları &ndash; %d onaylanmış, %d onaylanmamış"
+
+#: templates/web/base/admin/edit-league.html:12
+msgid "%d edits by %s"
+msgstr " %s tarafından %d yayına hazırlanır"
+
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
+msgid "%d live updates"
+msgstr "%d güncellemeler"
+
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
+msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
+msgstr "%d bildirim &ndash; %d cevaplandı (%s%%)"
+
+#: templates/web/base/pagination.html:10
+msgid "%d to %d of %d"
+msgstr "%d'in %d'den %d'ye"
+
+#: templates/web/base/reports/body.html:0
+#: templates/web/base/reports/body.html:23
+msgid "%s - Summary reports"
+msgstr "%s - Özet raporlar"
+
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
+msgid "%s ref:&nbsp;%s"
+msgstr "%s ref:&nbsp;%s"
+
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
+msgid "%s ward, %s"
+msgstr "%s bölüm, %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
+msgid "%s, reported at %s"
+msgstr "%s, rapor edilmiÅŸ %s"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:282 perllib/FixMyStreet/Cobrand/UK.pm:294
+msgid "%s, within %s ward"
+msgstr "%s, içinde %s bölüm"
+
+#: perllib/FixMyStreet/Map/OSM.pm:42
+msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
+msgstr "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>katkıda bulunanlar"
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:41
+#: templates/web/base/admin/users.html:31
+msgid "(Email in abuse table)"
+msgstr "(E-posta kara listede)"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Adınız"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Telefon numaran"
+
+#: templates/web/base/alert/_list.html:24
+msgid "(a default distance which covers roughly 200,000 people)"
+msgstr "(yaklaşık 200,000 kişiyi kapsayan bir mesafe)"
+
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
+msgstr "(RSS içinde özelleştirilebilir "
+
+#: templates/web/base/report/_item.html:27
+#: templates/web/zurich/report/_item.html:21
+msgid "(closed)"
+msgstr "(kapalı)"
+
+#: templates/web/base/report/_item.html:25
+#: templates/web/zurich/report/_item.html:19
+msgid "(fixed)"
+msgstr "(onarıldı)"
+
+#: templates/web/base/around/intro.html:2
+msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
+msgstr "(duvar yazısı (grafiti), moloz atma, kırık kaldırım döşeme, ya da sokak aydınlatma gibi)"
+
+#: templates/web/base/report/_item.html:21
+msgid "(not sent to council)"
+msgstr "(kurula gönderilmemiş)"
+
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
+msgid "(optional)"
+msgstr "(isteğe bağlı)"
+
+#: templates/web/fixmystreet/report/public_label.html:1
+msgid "(public)"
+msgstr "(kamu)"
+
+#: templates/web/base/report/_item.html:20
+msgid "(sent to both)"
+msgstr "(her ikisine de gönderildi)"
+
+#: templates/web/base/report/new/fill_in_details_form.html:194
+msgid "(we never show your email address or phone number)"
+msgstr "(e-posta adresiniz veya telefon numaranız gizli tutulacaktır)"
+
+#: templates/web/base/report/update-form.html:159
+msgid "(we never show your email)"
+msgstr "(e-posta adresiniz gizli tutulacaktır)"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/DB/Result/Problem.pm:410
+msgid "-- Pick a category --"
+msgstr "-- Kategori seçiniz--"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
+#: perllib/FixMyStreet/DB/Result/Problem.pm:416
+msgid "-- Pick a property type --"
+msgstr "-- Bir özellik seçiniz --"
+
+#: templates/web/base/admin/body-form.html:42
+#: templates/web/base/admin/body-form.html:43
+msgid ""
+"<code>MAPIT_URL</code> is set (<code>%s</code>) but no <code>MAPIT_TYPES</code>.<br>\n"
+" This is probably why \"area covered\" is empty (below).<br>\n"
+" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
+msgstr ""
+"<code>MAPIT_URL</code> kuruldu (<code>%s</code>) ama hayır<code>MAPIT_TYPES</code>.<br>\n"
+"Bu muhtemelen \"kapalı alanın\" neden boş olduğunu(aşağıda)<br>\n"
+"Belkide yapılandırma dosyanıza bazı <code>MAPIT_TYPES</code> eklemelisiniz?"
+
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
+
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
+#: templates/web/zurich/admin/index.html:4
+msgid "<strong>%d</strong> live problems"
+msgstr "<strong>%d</strong> güncel problemler"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:39
+msgid "<strong>No</strong> Let me confirm my report by email"
+msgstr "<strong>Hayır</strong> E mail yoluyla raporumu onaylamama izin ver"
+
+#: templates/web/fixmystreet/report/update-form.html:112
+msgid "<strong>No</strong> Let me confirm my update by email"
+msgstr "<strong>Hayır</strong> Güncellemelerimi e-posta yoluyla onaylamama izin ver"
+
+#: templates/web/base/auth/general.html:48
+#: templates/web/zurich/auth/general.html:51
+msgid "<strong>No</strong> let me sign in by email"
+msgstr "<strong>Hayır</strong> e-posta yoluyla giriş yapmama izin ver"
+
+#: templates/web/base/report/new/fill_in_details_form.html:145
+msgid "<strong>No</strong>, let me confirm my report by email:"
+msgstr "<strong>Hayır</strong>, bildirimleri e-posta yoluyla onaylamaya izin ver"
+
+#: templates/web/base/report/update-form.html:118
+msgid "<strong>No</strong>, let me confirm my update by email:"
+msgstr "<strong>Hayır</strong>, güncellemelerimi e-posta yoluyla onaylamama izin ver"
+
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
+#: templates/web/fixmystreet/report/update-form.html:89
+msgid "<strong>Yes</strong> I have a password"
+msgstr "<strong>Evet</strong> ÅŸifrem var"
+
+#: templates/web/base/static/about-en-gb.html:1
+#: templates/web/base/static/about-en-gb.html:3
+msgid "About us"
+msgstr "Hakkımızda"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
+msgid "Action Scheduled"
+msgstr "Planlı Eylem"
+
+#: templates/web/base/admin/body-form.html:3
+#: templates/web/base/admin/body-form.html:4
+msgid ""
+"Add a <strong>body</strong> for each administrative body, such as a council or department\n"
+" to which problem reports can be sent. You can add one or more contacts (for different\n"
+" categories of problem) to each body."
+msgstr ""
+"Ekle <strong>gövde</strong>her idari kurul için, kurul ya da ilgili bir birim gibi\n"
+"\n"
+"gönderilebilir hangi sorun bildirimleri. Her bir birim için bir ya da birden fazla iletişim bilgisi ekleyebilirsiniz (farklı sorun \n"
+"kategorileri için) "
+
+#: templates/web/base/admin/body.html:56
+msgid "Add a contact using the form below."
+msgstr "Aşağıdaki formu kullanarak iletişim bilgisi ekleyin"
+
+#: templates/web/base/admin/bodies.html:74
+#: templates/web/base/admin/body-form.html:240
+#: templates/web/zurich/admin/body-form.html:52
+msgid "Add body"
+msgstr "Bölüm ekle"
+
+#: templates/web/base/admin/body.html:116
+#: templates/web/zurich/admin/body.html:31
+msgid "Add new category"
+msgstr "Yeni kategori ekle"
+
+#: templates/web/base/admin/users.html:47
+msgid "Add user"
+msgstr "Kullanıcı ekle"
+
+#: templates/web/base/my/my.html:52
+msgid "Added %s"
+msgstr "EklenmiÅŸ %s"
+
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Denetleme bekliyor"
+
+#: templates/web/base/auth/change_password.html:29
+msgid "Again:"
+msgstr "Tekrar:"
+
+#: templates/web/base/admin/timeline.html:35
+msgid "Alert %d created for %s, type %s, parameters %s / %s"
+msgstr "Uyarı %d için oluşturulmuş %s, tür %s, değişkenler %s / %s"
+
+#: templates/web/base/admin/timeline.html:37
+msgid "Alert %d disabled (created %s)"
+msgstr "Uyarı %d engellendi (oluşturuldu %s)"
+
+#: templates/web/base/report/update-form.html:164
+#: templates/web/fixmystreet/report/update-form.html:150
+msgid "Alert me to future updates"
+msgstr "Güncellemeleri bildir"
+
+#: templates/web/base/reports/index.html:3
+#: templates/web/zurich/reports/index.html:12
+msgid "All Reports"
+msgstr "Tüm Bildirimler"
+
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Tüm Bildirimler"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
+#: templates/web/zurich/admin/index-dm.html:12
+#: templates/web/zurich/admin/stats.html:13
+#: templates/web/zurich/footer.html:20
+#: templates/web/zurich/nav_over_content.html:6
+msgid "All reports"
+msgstr "Tüm bildirimler"
+
+#: templates/web/base/admin/stats.html:5
+#: templates/web/zurich/admin/stats.html:8
+msgid "All reports between %s and %s"
+msgstr "%s ve %s arasındaki tüm bildirimler"
+
+#: templates/web/base/report/new/councils_text_some.html:2
+msgid "All the information you provide here will be sent to"
+msgstr "Buraya bildirdiğiniz tüm bilgiler gönderilecektir"
+
+#: templates/web/base/report/new/councils_text_all.html:2
+#: templates/web/base/report/new/councils_text_all.html:4
+#: templates/web/base/report/new/fill_in_details_form.html:12
+#: templates/web/base/report/new/fill_in_details_form.html:14
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:11
+msgid "All the information you provide here will be sent to <strong>%s</strong>."
+msgstr "Buraya bildirdiğiniz tüm bilgiler gönderilecektir"
+
+#: templates/web/base/questionnaire/index.html:45
+msgid "An update marked this problem as fixed."
+msgstr "Bir güncelleştirme sorun giderildi olarak işaretlenmiş. "
+
+#: templates/web/base/admin/list_updates.html:32
+#: templates/web/base/admin/problem_row.html:20
+msgid "Anonymous"
+msgstr "Anonim"
+
+#: templates/web/base/admin/report_edit.html:57
+#: templates/web/base/admin/update_edit.html:23
+msgid "Anonymous:"
+msgstr "Anonim:"
+
+#: templates/web/base/front/footer-marketing.html:16
+msgid "Are you a developer?"
+msgstr "GeliÅŸtirici misiniz?"
+
+#: templates/web/base/admin/body-form.html:69
+#: templates/web/base/admin/body.html:16
+#: templates/web/zurich/admin/body-form.html:24
+msgid "Area covered"
+msgstr "Kapsadığı alan"
+
+#: templates/web/base/admin/bodies.html:15
+#: templates/web/base/admin/body.html:60
+msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Dışarıdan bir organ atamak:"
+
+#: templates/web/zurich/admin/report_edit.html:173
+#: templates/web/zurich/admin/stats.html:36
+msgid "Assign to different category:"
+msgstr "Farklı bir kategori atamak:"
+
+#: templates/web/zurich/admin/report_edit.html:211
+msgid "Assign to external body:"
+msgstr "Dışarıdan bir organ atamak:"
+
+#: templates/web/zurich/admin/report_edit.html:190
+msgid "Assign to subdivision:"
+msgstr "Alt bölüm atamak:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
+msgid "Assigned to %s"
+msgstr "%s atamak"
+
+#: templates/web/base/open311/index.html:84
+msgid "At most %d requests are returned in each query. The returned requests are ordered by requested_datetime, so to get all requests, do several searches with rolling start_date and end_date."
+msgstr ""
+
+#: templates/web/base/open311/index.html:76
+msgid "At the moment only searching for and looking at reports work."
+msgstr "Şu an sadece arama ve raporlara göz atma kısımları çalışıyor."
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:373
+#: templates/web/zurich/report/_item.html:11
+msgid "Awaiting moderation"
+msgstr "Denetleme bekliyor"
+
+#: templates/web/base/js/translation_strings.html:32
+msgid "Back"
+msgstr "Geri"
+
+#: templates/web/base/admin/report_blocks.html:41
+msgid "Ban email address"
+msgstr "Email adresini engelle"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
+#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
+msgid "Bodies"
+msgstr "Bölümler"
+
+#: templates/web/base/admin/flagged.html:17
+#: templates/web/base/admin/reports.html:14
+#: templates/web/base/admin/users.html:17
+msgid "Body"
+msgstr "Bölüm"
+
+#: templates/web/base/admin/report_edit.html:34
+#: templates/web/base/admin/user-form.html:32
+msgid "Body:"
+msgstr "Bölüm:"
+
+#: templates/web/base/admin/stats.html:80
+msgid "By Date"
+msgstr "Tarihe Göre"
+
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
+msgid "Can't see the map? <em>Skip this step</em>"
+msgstr "Haritayı göremiyor musunuz? <em>Bu adımı atlayın</em>"
+
+#: templates/web/base/admin/body.html:68
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/report/new/category.html:10
+#: templates/web/base/report/new/category_wrapper.html:3
+#: templates/web/zurich/admin/body.html:14
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+#: templates/web/zurich/admin/stats.html:50
+msgid "Category"
+msgstr "Kategori"
+
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
+msgid "Category fix rate for problems > 4 weeks old"
+msgstr "Bu kategori için problemlerin onarılma süresi > 4 hafta"
+
+#: templates/web/base/admin/body.html:138
+#: templates/web/base/admin/category_edit.html:23
+#: templates/web/base/admin/report_edit.html:56
+#: templates/web/zurich/admin/body.html:43
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
+msgid "Category:"
+msgstr "Kategori:"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
+msgid "Category: %s"
+msgstr "Kategori: %s"
+
+#: templates/web/base/auth/change_password.html:1
+#: templates/web/base/auth/change_password.html:3
+#: templates/web/base/auth/change_password.html:33
+#: templates/web/base/my/my.html:17
+msgid "Change password"
+msgstr "Åžifreyi deÄŸiÅŸtir"
+
+#: templates/web/base/admin/body.html:160
+msgid ""
+"Check <strong>confirmed</strong> to indicate that this contact has been confirmed as correct.\n"
+" If you are not sure of the origin or validity of the contact, leave this unchecked."
+msgstr ""
+"Bu kişinin doğru olarak teyit edildiğini belirtmek için<strong>doğrulandı</strong> kontrol edin.\n"
+"Eğer kişinin kaynağından veya doğruluğundan emin değilseniz, onu kontrol edilmemiş olarak bırakın."
+
+#: templates/web/base/admin/body.html:171
+msgid ""
+"Check <strong>deleted</strong> to remove the category from use. \n"
+" It will not appear as an available category in the drop-down menu on the report-a-problem page."
+msgstr ""
+" Kullanım kategorisinden kaldırmak için <strong>silindi</strong> kontrol edin.\n"
+"Problem bildirim sayfasındaki açılır menüden mevcut bir kategori olarak görünmez. "
+
+#: templates/web/base/admin/body.html:191
+msgid ""
+"Check <strong>private</strong> if reports in this category should <strong>never be displayed on the website</strong>.\n"
+" <br>\n"
+" Normally, categories are not private.\n"
+" <br>\n"
+" This is suitable for issues that you want to allow users to report to the body, but for which there is no public\n"
+" interest in displaying the report. In the UK, we've used this for services like requesting an extra rubbish bin\n"
+" at a specific address."
+msgstr ""
+
+#: templates/web/base/admin/body.html:130
+msgid ""
+"Choose a <strong>category</strong> name that makes sense to the public (e.g., \"Pothole\", \"Street lighting\") but is helpful\n"
+" to the body too. These will appear in the drop-down menu on the report-a-problem page."
+msgstr ""
+
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:65
+#: templates/web/base/admin/stats.html:71
+msgid "Click here or enter as dd/mm/yyyy"
+msgstr "dd/mm/yyyy olarak girin ya da buraya tıklayın"
+
+#: templates/web/base/around/_report_banner.html:2
+#: templates/web/base/js/translation_strings.html:50
+msgid "Click map to report a problem"
+msgstr "Haritayı tıklayarak problemi bildirin"
+
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:144
+#: templates/web/fixmystreet/report/banner.html:15
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:10
+#: templates/web/zurich/admin/header.html:16
+#: templates/web/zurich/admin/stats.html:31
+msgid "Closed"
+msgstr "Kapalı"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
+msgid "Closed by council"
+msgstr "Kurul tarafından kapatıldı"
+
+#: templates/web/base/admin/problem_row.html:38
+msgid "Closed:"
+msgstr "Kapalı:"
+
+#: templates/web/base/admin/report_edit.html:23
+msgid "Co-ordinates:"
+msgstr "Koordinatlar:"
+
+#: templates/web/base/admin/list_updates.html:10
+msgid "Cobrand"
+msgstr "Cobrand "
+
+#: templates/web/base/admin/report_edit.html:73
+#: templates/web/base/admin/update_edit.html:50
+msgid "Cobrand data:"
+msgstr "Cobrand data:"
+
+#: templates/web/base/admin/report_edit.html:72
+#: templates/web/base/admin/update_edit.html:49
+msgid "Cobrand:"
+msgstr "Cobrand:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
+#: templates/web/base/admin/config_page.html:1
+msgid "Configuration"
+msgstr "Yapılandırma"
+
+#: templates/web/base/admin/category_edit.html:55
+msgid "Configure Endpoint"
+msgstr "Yapılandırma Son Nokta"
+
+#: templates/web/base/admin/body.html:72
+msgid "Confirm"
+msgstr "Onayla"
+
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
+msgid "Confirm account"
+msgstr "Hesabı onayla"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:33
+#: templates/web/fixmystreet/report/update-form.html:107
+msgid "Confirm by email below, providing a new password at that point. When you confirm, your password will be updated."
+msgstr "Bu noktada yeni bir şifre sağlayarak, aşağıdaki e-posta ile onaylayın. Onayladıktan sonra şifreniz güncellenecektir."
+
+#: templates/web/base/questionnaire/creator_fixed.html:1
+#: templates/web/base/tokens/confirm_problem.html:1
+#: templates/web/base/tokens/confirm_update.html:1
+#: templates/web/zurich/tokens/confirm_problem.html:1
+#: templates/web/zurich/tokens/confirm_problem.html:3
+msgid "Confirmation"
+msgstr "Onay"
+
+#: templates/web/base/admin/body.html:166
+#: templates/web/base/admin/body.html:79
+#: templates/web/base/admin/category_edit.html:37
+#: templates/web/base/admin/category_edit.html:92
+#: templates/web/zurich/admin/stats.html:40
+msgid "Confirmed"
+msgstr "Onaylandı"
+
+#: templates/web/base/admin/stats.html:5
+msgid "Confirmed reports between %s and %s"
+msgstr "%s ve %s arası onaylanmış raporlar"
+
+#: templates/web/base/admin/list_updates.html:39
+#: templates/web/base/admin/problem_row.html:36
+#: templates/web/base/admin/report_edit.html:65
+msgid "Confirmed:"
+msgstr "Onaylanmış:"
+
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Bize Ulaşın"
+
+#: templates/web/base/contact/index.html:1
+#: templates/web/base/contact/index.html:2
+#: templates/web/base/contact/submit.html:1
+#: templates/web/fixmystreet/contact/index.html:1
+#: templates/web/fixmystreet/contact/index.html:2
+msgid "Contact Us"
+msgstr "Bize Ulaşın"
+
+#: templates/web/base/contact/index.html:6
+#: templates/web/fixmystreet/contact/index.html:20
+msgid "Contact the team"
+msgstr "Grupla bağlantı kur"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Koordinatlar:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
+msgid "Could not find user"
+msgstr "Kullanıcı bulunamadı"
+
+#: templates/web/base/js/translation_strings.html:37
+msgid "Could not look up location"
+msgstr "Konuma bakılamadı"
+
+#: templates/web/base/admin/list_updates.html:9
+msgid "Council"
+msgstr "Kurul"
+
+#: templates/web/base/admin/body.html:1
+#: templates/web/base/admin/category_edit.html:1
+#: templates/web/zurich/admin/body.html:1
+msgid "Council contacts for %s"
+msgstr "Kurula ulaşmak için %s"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
+msgid "Council ref:&nbsp;%s"
+msgstr "Kurul ref:&nbsp;%s"
+
+#: templates/web/base/admin/stats.html:84
+msgid "Council:"
+msgstr "Kurul:"
+
+#: templates/web/base/admin/stats.html:12
+#: templates/web/base/admin/stats.html:32
+#: templates/web/zurich/admin/stats.html:45
+#: templates/web/zurich/admin/stats.html:50
+msgid "Count"
+msgstr "Sayma"
+
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
+msgid "Create a report"
+msgstr "Bildiri oluÅŸtur"
+
+#: templates/web/base/admin/body.html:208
+#: templates/web/zurich/admin/body.html:59
+msgid "Create category"
+msgstr "Kategori oluÅŸtur"
+
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Bildiri oluÅŸtur"
+
+#: templates/web/base/admin/problem_row.html:34
+#: templates/web/zurich/admin/templates.html:10
+msgid "Created"
+msgstr "OluÅŸturuldu"
+
+#: templates/web/base/admin/list_updates.html:38
+#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/update_edit.html:51
+#: templates/web/zurich/admin/update_edit.html:29
+msgid "Created:"
+msgstr "OluÅŸturuldu:"
+
+#: templates/web/base/admin/stats.html:31
+msgid "Current state"
+msgstr "Güncel durum"
+
+#: templates/web/base/admin/bodies.html:5
+#: templates/web/base/admin/index.html:17
+msgid "Currently no bodies have been created."
+msgstr "Şu anda hiçbir organları oluşturulmamıştır."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
+#: templates/web/base/dashboard/index.html:5
+#: templates/web/base/dashboard/index.html:7
+msgid "Dashboard"
+msgstr "Kontrol Paneli "
+
+#: templates/web/zurich/admin/stats.html:35
+msgid "Dealt with by subdivision within 5 working days"
+msgstr "Alt komisyon tarafından 5 iş günü içinde üstesinden gelinilecek"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
+#: templates/web/base/admin/bodies.html:27
+#: templates/web/base/admin/body.html:177
+#: templates/web/base/admin/body.html:81
+#: templates/web/base/admin/category_edit.html:42
+#: templates/web/base/admin/category_edit.html:93
+msgid "Deleted"
+msgstr "Silindi"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/admin/index-dm.html:22
+#: templates/web/zurich/admin/index-sdm.html:20
+#: templates/web/zurich/admin/reports.html:12
+msgid "Description"
+msgstr "Tanım"
+
+#: templates/web/base/js/translation_strings.html:34
+#: templates/web/zurich/report/new/fill_in_details_form.html:42
+msgid "Details"
+msgstr "Detaylar"
+
+#: templates/web/base/admin/report_edit.html:20
+#: templates/web/base/report/new/fill_in_details_form.html:62
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
+msgid "Details:"
+msgstr "Detaylar:"
+
+#: templates/web/base/admin/body.html:87
+msgid "Devolved"
+msgstr "Devredildi"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "harita kullanılmamış"
+
+#: templates/web/base/admin/edit-league.html:8
+msgid "Diligency prize league table"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
+#: templates/web/fixmystreet/report/update-form.html:86
+#, fuzzy
+msgid "Do you have a %s password?"
+msgstr "FixMyStreet şifreniz var mıdır?"
+
+#: templates/web/base/questionnaire/index.html:55
+msgid "Don&rsquo;t know"
+msgstr "Don&rsquo;t know"
+
+#: templates/web/fixmystreet/contact/index.html:118
+msgid "Don't like forms?"
+msgstr "Åžekilleri beÄŸenmediniz mi?"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
+msgid "Duplicate"
+msgstr "Çoğaltmak"
+
+#: templates/web/base/admin/body.html:106
+msgid ""
+"Each contact for the body has a category, which is displayed to the public. \n"
+" Different categories <strong>can have the same contact</strong> (email address).\n"
+" This means you can add many categories even if you only have one contact for the body.\n"
+" "
+msgstr ""
+
+#: templates/web/base/admin/list_updates.html:42
+#: templates/web/base/admin/problem_row.html:41
+#: templates/web/base/admin/users.html:33
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
+msgid "Edit"
+msgstr "Ekle"
+
+#: templates/web/base/admin/body.html:220
+#: templates/web/zurich/admin/body.html:71
+msgid "Edit body details"
+msgstr "Bölümün detaylarını düzenle"
+
+#: templates/web/base/admin/report_edit.html:1
+#: templates/web/zurich/admin/report_edit-sdm.html:1
+#: templates/web/zurich/admin/report_edit-sdm.html:5
+#: templates/web/zurich/admin/report_edit.html:1
+#: templates/web/zurich/admin/report_edit.html:5
+msgid "Editing problem %d"
+msgstr "Sorunu düzenleme %d"
+
+#: templates/web/base/admin/update_edit.html:1
+#: templates/web/zurich/admin/update_edit.html:1
+msgid "Editing update %d"
+msgstr "Güncellemeleri düzenleme %d"
+
+#: templates/web/base/admin/user_edit.html:1
+msgid "Editing user %d"
+msgstr "Eklenen kullanıcı %d"
+
+#: templates/web/base/admin/category_edit.html:94
+msgid "Editor"
+msgstr "Editör"
+
+#: templates/web/base/admin/bodies.html:23
+#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/flagged.html:38
+#: templates/web/base/admin/users.html:16
+#: templates/web/base/auth/general.html:22
+#: templates/web/zurich/admin/body-form.html:9
+#: templates/web/zurich/admin/body.html:15
+#: templates/web/zurich/auth/general.html:24
+#: templates/web/zurich/auth/general.html:54
+msgid "Email"
+msgstr "E-posta"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
+msgid "Email added to abuse list"
+msgstr "E-posta kara listeye eklendi"
+
+#: templates/web/base/admin/body.html:155
+msgid "Email address:"
+msgstr "E-posta adresi:"
+
+#: templates/web/base/tokens/confirm_alert.html:6
+msgid "Email alert created"
+msgstr "E-posta uyarısı oluşturuldu"
+
+#: templates/web/base/tokens/confirm_alert.html:10
+msgid "Email alert deleted"
+msgstr "E-posta uyarısı silindi"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
+msgid "Email already in abuse list"
+msgstr "E-posta kara listede"
+
+#: templates/web/base/around/_updates.html:5
+msgid "Email me new local problems"
+msgstr "Yeni yerel problemleri e posta olarak gönder"
+
+#: templates/web/base/report/display.html:38
+msgid "Email me updates"
+msgstr "Güncellemeleri bana e-posta yolu ile bildir"
+
+#: templates/web/base/admin/category_edit.html:31
+#: templates/web/base/admin/report_edit.html:62
+#: templates/web/base/admin/update_edit.html:33
+#: templates/web/base/admin/user-form.html:20
+#: templates/web/base/alert/updates.html:13
+#: templates/web/base/report/display.html:42
+#: templates/web/zurich/admin/body.html:47
+msgid "Email:"
+msgstr "E-posta:"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
+msgid "Email: %s"
+msgstr "E-posta: %s"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
+msgid "Empty flat or maisonette"
+msgstr "Boş daire veye müstakil ev"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
+msgid "Empty house or bungalow"
+msgstr "BoÅŸ ev veya bungalov"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
+msgid "Empty office or other commercial"
+msgstr "Boş büro veya diğer ticari yerler"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
+msgid "Empty pub or bar"
+msgstr "BoÅŸ pub veya bar"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
+msgid "Empty public building - school, hospital, etc."
+msgstr "Boş kamu binası- okul, hastane, vb."
+
+#: templates/web/base/admin/body-form.html:162
+#: templates/web/base/admin/body-form.html:163
+msgid ""
+"Enable <strong>Open311 update-sending</strong> if the endpoint will send and receive\n"
+" updates to existing reports. If you're not sure, it probably does not, so leave this unchecked.\n"
+" For more information, see \n"
+" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
+msgstr ""
+" Son durum gönderildiğinde ve karşı tarafa ulaştığında \n"
+" <strong>Open311 update-sending</strong> halihazırdaki bildirimlerin güncellemesi imkanını sağlyacaktırr. Eğer emin değilseniz, muhtemelen öyle değildir, işaretlemeyin\n"
+"Daha fazla bilgi için bakınız\n"
+" <a href='https://www.mysociety.org/2013/02/20/open311-extended/' class='admin-offsite-link'>this article</a>."
+
+#: templates/web/base/admin/body-form.html:222
+#: templates/web/base/admin/body-form.html:223
+msgid ""
+"Enable this <strong>can be devolved</strong> setting if one or more contacts have a \n"
+" different endpoint (and send method) from the body's. For example, if reports for some categories of\n"
+" problem must be emailed, while others can be sent over Open311."
+msgstr ""
+
+#: templates/web/base/admin/stats.html:70
+msgid "End Date:"
+msgstr "BitiÅŸ Tarihi:"
+
+#: templates/web/base/admin/body-form.html:130
+msgid "Endpoint"
+msgstr "Varılan nokta"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
+msgid "Enter a Z&uuml;rich street name"
+msgstr "Bir Z&uuml;rich sokak ismi giriniz"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:13
+msgid "Enter a nearby UK postcode, or street name and area"
+msgstr "Yakınlardaki bir posta kodu, cadde veya bölge ismi giriniz"
+
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:20
+#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:21
+msgid "Enter a nearby postcode, or street name and area"
+msgstr "Yakınlardaki bir posta kodu, cadde veya bölge ismi giriniz"
+
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
+msgid "Enter a nearby street name and area"
+msgstr "Yakınlardaki bir cadde ve bölge ismi giriniz"
+
+#: perllib/FixMyStreet/Cobrand/ZeroTB.pm:7
+msgid "Enter a nearby street name and area, postal code or district in Delhi"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
+msgid "Enter a new password:"
+msgstr "Yeni bir ÅŸifre gir:"
+
+#: templates/web/base/auth/general.html:60
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
+#: templates/web/fixmystreet/report/update-form.html:123
+#: templates/web/zurich/auth/general.html:65
+msgid "Enter a password"
+msgstr "Åžifre gir"
+
+#: templates/web/base/index-steps.html:26
+msgid "Enter details of the problem"
+msgstr "Problem hakkında detaylı bilgi giriniz"
+
+#: templates/web/base/errors/generic.html:1
+#: templates/web/base/errors/generic.html:3
+#: templates/web/base/tokens/abuse.html:1
+#: templates/web/base/tokens/abuse.html:3
+#: templates/web/base/tokens/error.html:1
+#: templates/web/base/tokens/error.html:3
+msgid "Error"
+msgstr "Hata"
+
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
+#: templates/web/base/admin/body.html:14
+#: templates/web/base/admin/category_edit.html:18
+msgid "Example postcode %s"
+msgstr "Örnek postakodu "
+
+#: templates/web/base/open311/index.html:94
+msgid "Examples:"
+msgstr "Örnekler:"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:55
+msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
+msgstr "Sorunun ne olduğunu, nerede ve nezamandan beri orada olduğunu açıklayın..."
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+#, fuzzy
+msgid "Extern"
+msgstr "Harici URL "
+
+#: templates/web/base/admin/body-form.html:81
+msgid "External URL"
+msgstr "Harici URL "
+
+#: templates/web/base/admin/category_edit.html:27
+#: templates/web/base/admin/report_edit.html:74
+msgid "Extra data:"
+msgstr "İlave veriler:"
+
+#: templates/web/base/contact/submit.html:13
+msgid "Failed to send message"
+msgstr "Mesajınız iletilemedi"
+
+#: templates/web/zurich/admin/index-dm.html:33
+#: templates/web/zurich/admin/index-sdm.html:30
+msgid "Filter report list"
+msgstr "Bildiri listesini filtrele"
+
+#: templates/web/base/questionnaire/index.html:64
+msgid "First time"
+msgstr "İlk kez"
+
+#: templates/web/base/admin/body.html:48
+msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
+msgstr ""
+
+#: templates/web/base/header.html:26
+msgid "FixMyStreet"
+msgstr "FixMyStreet"
+
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:144
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:34
+#: templates/web/fixmystreet/report/banner.html:12
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:32
+msgid "Fixed"
+msgstr "Sorun çözüldü"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
+msgid "Fixed - Council"
+msgstr "Sorun çözüldü- Kurul"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
+msgid "Fixed - User"
+msgstr "Sorun çözüldü- Kullanıcı"
+
+#: templates/web/base/admin/problem_row.html:37
+msgid "Fixed:"
+msgstr "Sorun çözüldü:"
+
+#: templates/web/base/admin/body-form.html:89
+#: templates/web/zurich/admin/body-form.html:36
+msgid "Flag as deleted"
+msgstr "Silindi olarak seçildi"
+
+#: templates/web/base/admin/report_blocks.html:46
+msgid "Flag user"
+msgstr "Kullanıcıyı seç"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
+#: templates/web/base/admin/users.html:19
+msgid "Flagged"
+msgstr "Seçildi"
+
+#: templates/web/base/admin/flagged.html:1
+msgid "Flagged reports and users"
+msgstr "Seçilen bildirimler ve kullanıcılar"
+
+#: templates/web/base/admin/user-form.html:46
+msgid "Flagged users are listed on the <a href='%s'>flagged</a> page."
+msgstr "Seçilen kullanıcılar <a href='%s'>etiketliler</a>sayfasında listelendi."
+
+#: templates/web/base/admin/flagged.html:31
+msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
+msgstr "Seçilen kullanıcılar hiç bir şekilde kısıtlanmamıştır. Bu sadece dikkate alınmak üzere işaretlenen kullanıcıların listesidir."
+
+#: templates/web/base/admin/report_edit.html:76
+#: templates/web/base/admin/user-form.html:52
+msgid "Flagged:"
+msgstr "Seçilenler:"
+
+#: templates/web/base/reports/_ward-list.html:3
+#: templates/web/fixmystreet/reports/_ward-list.html:4
+msgid "Follow a ward link to view only reports within that ward."
+msgstr "Sadece o bölge içinde yer alan raporları görüntülemek için bölge linkini takip ediniz."
+
+#: templates/web/base/admin/body-form.html:65
+msgid "For more information, see <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'>How FixMyStreet uses Mapit</a>."
+msgstr "Daha fazla bilgi için, bakınız <a href='http://fixmystreet.org/customising/fms_and_mapit' class='admin-offsite-link'> FixMyStreet'in Mapit'i nasıl kullandığını</a>."
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:32
+#: templates/web/fixmystreet/report/update-form.html:106
+msgid "Forgotten your password?"
+msgstr "Åžifrenizi mi unuttunuz?"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Dışarıdan bir organ atamak:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Dışarıdan bir organ atamak:"
+
+#: templates/web/base/faq/faq-en-gb.html:1
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
+msgid "Frequently Asked Questions"
+msgstr "Sıkça Sorulan Sorular"
+
+#: templates/web/base/open311/index.html:136
+msgid "GeoRSS on Google Maps"
+msgstr " Google Haritadaki GeoRSS "
+
+#: templates/web/fixmystreet/around/_updates.html:3
+#: templates/web/fixmystreet/report/display.html:35
+msgid "Get updates"
+msgstr "Güncellemeleri yap"
+
+#: templates/web/fixmystreet/reports/_rss.html:3
+#: templates/web/fixmystreet/reports/_rss.html:9
+msgid "Get updates of %s problems"
+msgstr "%s Problemlerin güncellemelerini yap"
+
+#: templates/web/fixmystreet/reports/_rss.html:11
+#: templates/web/fixmystreet/reports/_rss.html:3
+msgid "Get updates of problems in this %s"
+msgstr " Bu %s'te problemlerin güncellemelerini yap"
+
+#: templates/web/base/alert/_list.html:82
+msgid "Give me an RSS feed"
+msgstr "Bana RSS hakkında geri dönüş yapın"
+
+#: templates/web/base/questionnaire/completed.html:14
+msgid "Glad to hear it’s been fixed!"
+msgstr "Problemin çözüldüğünü duymak güzel"
+
+#: templates/web/base/alert/index.html:34
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
+#: templates/web/zurich/admin/stats.html:26
+msgid "Go"
+msgstr "Git"
+
+#: templates/web/base/admin/report_edit.html:75
+msgid "Going to send questionnaire?"
+msgstr ""
+
+#: templates/web/base/admin/index.html:42
+msgid "Graph of problem creation by status over time"
+msgstr ""
+
+#: templates/web/base/reports/index.html:12
+msgid "Greyed-out lines are councils that no longer exist."
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:46
+msgid "Has this problem been fixed?"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:59
+msgid "Have you ever reported a problem to a council before, or is this your first time?"
+msgstr ""
+
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
+#: templates/web/zurich/faq/faq-de-ch.html:1
+#: templates/web/zurich/footer.html:22
+#: templates/web/zurich/nav_over_content.html:8
+msgid "Help"
+msgstr "Yardım"
+
+#: templates/web/base/alert/_list.html:8
+msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
+msgstr ""
+
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
+msgid "Hi %s"
+msgstr "Merhaba %s"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
+#: templates/web/base/admin/update_edit.html:28
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:11
+#: templates/web/zurich/admin/stats.html:32
+#: templates/web/zurich/admin/update_edit.html:18
+msgid "Hidden"
+msgstr "Gizli"
+
+#: templates/web/base/around/display_location.html:65
+msgid "Hide old"
+msgstr ""
+
+#: templates/web/base/around/display_location.html:60
+msgid "Hide pins"
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:87
+msgid "History"
+msgstr "Tarihçe"
+
+#: templates/web/base/js/translation_strings.html:31
+msgid "Home"
+msgstr "Anasayfa"
+
+#: templates/web/base/index-steps.html:1
+msgid "How to report a problem"
+msgstr "Bir problem nasıl bildirilir"
+
+#: templates/web/base/js/translation_strings.html:33
+msgid "How to send successful reports"
+msgstr "Başarılı bildirim nasıl gönderilir"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
+msgid "I am afraid you cannot confirm unconfirmed reports."
+msgstr "Maalesef onaylanmamış bildirimleri onaylayamıyorsunuz."
+
+#: templates/web/base/tokens/confirm_problem.html:23
+#: templates/web/base/tokens/confirm_problem.html:27
+msgid "I just reported a problem on @fixmystreet"
+msgstr "@fixmystreet'e bir problemi henüz bildirdim."
+
+#: templates/web/base/tokens/confirm_update.html:19
+#: templates/web/base/tokens/confirm_update.html:23
+msgid "I just updated a problem on @fixmystreet"
+msgstr "@fixmystreet'teki problemi yeni güncelledim"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:96
+msgid "I'm afraid we couldn't locate your problem in the database.\n"
+msgstr "Maalesef veri tabanında sorunun yerini bulamadık.\n"
+
+#: perllib/FixMyStreet/App/Controller/Tokens.pm:327
+msgid "I'm afraid we couldn't validate that token. If you've copied the URL from an email, please check that you copied it exactly.\n"
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:14
+#: templates/web/base/admin/list_updates.html:6
+#: templates/web/base/admin/reports.html:11
+#: templates/web/zurich/admin/index-dm.html:21
+#: templates/web/zurich/admin/index-sdm.html:19
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
+#: templates/web/zurich/admin/reports.html:11
+msgid "ID"
+msgstr "Kimlik"
+
+#: templates/web/base/admin/body-form.html:24
+#: templates/web/base/admin/body-form.html:25
+msgid ""
+"Identify a <strong>parent</strong> if this body is itself part of another body.\n"
+" For basic installations, you don't need to join bodies in this way."
+msgstr ""
+
+#: templates/web/base/admin/body.html:133
+msgid ""
+"If two or more bodies serve the same location, FixMyStreet combines identical categories into a single entry in\n"
+" the menu. Make sure you use the same category name in the bodies if you want this to happen."
+msgstr ""
+
+#: templates/web/base/questionnaire/completed.html:8
+msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
+msgstr "Sorununuzun durumu ile ilgili daha fazla bilgi almak istiyorsanız, lütfen ana sayfaya geri dönün ve bir güncelleme bırakın."
+
+#: templates/web/base/report/new/councils_text_none.html:2
+#: templates/web/base/report/new/councils_text_none.html:8
+msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
+msgstr ""
+
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
+msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:68
+msgid ""
+"If you wish to leave a public update on the problem, please enter it here\n"
+"(please note it will not be sent to the council)."
+msgstr ""
+
+#: templates/web/base/admin/body.html:149
+msgid "If you're using <strong>a send method that is not email</strong>, enter the service ID (Open311) or equivalent identifier here."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:207
+#: templates/web/base/admin/body-form.html:208
+msgid ""
+"If you've enabled Open311 update-sending above, Open311 usually only accepts OPEN or CLOSED status in \n"
+" its updates. Enable <strong>extended Open311 stauses</strong> if you want to allow extra states to be passed.\n"
+" Check that your cobrand supports this feature before switching it on."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:194
+#: templates/web/base/admin/body-form.html:195
+msgid ""
+"If you've enabled Open311 update-sending above, enable <strong>suppression of alerts</strong> \n"
+" if you do <strong>not</strong> want that user to be notified whenever these updates are created."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:177
+#: templates/web/base/admin/body-form.html:178
+msgid ""
+"If you've enabled Open311 update-sending above, you must identify which \n"
+" FixMyStreet <strong>user</strong> will be attributed as the creator of those updates\n"
+" when they are shown on the site. Enter the ID (number) of that user."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
+msgid "Illegal ID"
+msgstr "Kanunsuz kimlik "
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:100
+msgid "Illegal feed selection"
+msgstr ""
+
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:144
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
+msgid "In Progress"
+msgstr "Devam Etmekte"
+
+#: templates/web/base/admin/flagged.html:39
+msgid "In abuse table?"
+msgstr ""
+
+#: templates/web/base/open311/index.html:88
+msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
+#: templates/web/fixmystreet/report/banner.html:19
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:8
+msgid "In progress"
+msgstr "Devam etmekte"
+
+#: templates/web/base/tokens/confirm_alert.html:11
+msgid "Inbox zero, here we come!"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:227
+msgid "Include reporter personal details"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:76
+msgid "Include unconfirmed reports"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:359
+msgid "Incorrect has_photo value \"%s\""
+msgstr ""
+
+#: templates/web/zurich/admin/list_updates.html:35
+msgid "Internal notes"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
+msgid "Internal referral"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:344
+msgid "Invalid agency_responsible value %s"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
+msgid "Invalid end date"
+msgstr "Geçersiz bitiş tarihi"
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:437
+msgid "Invalid format %s specified."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+msgid "Invalid start date"
+msgstr "Geçersiz başlangıç tarihi"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:143
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
+msgid "Investigating"
+msgstr "İncelenmekte"
+
+#: templates/web/fixmystreet/contact/blurb.html:8
+msgid "It's often quickest to <a href=\"%s\">check our FAQs</a> and see if the answer is there."
+msgstr ""
+
+#: templates/web/base/tokens/confirm_problem.html:14
+msgid "It’s on its way to the council right now."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
+#: templates/web/base/auth/general.html:44
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
+#: templates/web/fixmystreet/report/update-form.html:102
+#: templates/web/zurich/auth/general.html:40
+msgid "Keep me signed in on this computer"
+msgstr ""
+
+#: templates/web/base/admin/body.html:70
+#: templates/web/zurich/admin/body.html:16
+msgid "Last editor"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:70
+msgid "Last update:"
+msgstr "Son güncelleme:"
+
+#: templates/web/base/admin/problem_row.html:39
+msgid "Last&nbsp;update:"
+msgstr "Son&nbsp;güncelleme:"
+
+#: templates/web/base/admin/body-form.html:229
+msgid "Leave this blank if all reports to this body should be sent using the same send method (e.g., \"%s\")."
+msgstr ""
+
+#: templates/web/base/admin/body.html:27
+msgid "List all reported problems"
+msgstr "Bildirilmiş problemleri güncelle"
+
+#: templates/web/base/report/new/category_wrapper.html:4
+msgid "Loading..."
+msgstr "Yükleniyor..."
+
+#: templates/web/base/alert/choose.html:1
+#: templates/web/base/alert/choose.html:3
+#: templates/web/base/alert/index.html:1 templates/web/base/alert/index.html:3
+#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:5
+#: templates/web/base/alert/updates.html:1
+#: templates/web/base/tokens/confirm_alert.html:1
+#: templates/web/fixmystreet/alert/updates.html:1
+msgid "Local RSS feeds and email alerts"
+msgstr ""
+
+#: templates/web/base/alert/list.html:1 templates/web/base/alert/list.html:12
+#: templates/web/base/alert/list.html:14 templates/web/base/alert/list.html:3
+msgid "Local RSS feeds and email alerts for ‘%s’"
+msgstr ""
+
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
+msgid "Local alerts"
+msgstr ""
+
+#: templates/web/base/index-steps.html:25
+msgid "Locate the problem on a map of the area"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:43
+msgid "MAP"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:45
+msgid "Map"
+msgstr "Harita"
+
+#: templates/web/base/admin/report_edit.html:68
+msgid "Mark as sent"
+msgstr "Gönderildi olarak işaretle"
+
+#: templates/web/base/admin/user-form.html:44
+msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
+msgstr ""
+
+#: templates/web/base/reports/index.html:24
+msgid "Marked fixed/closed in the past eight weeks"
+msgstr ""
+
+#: templates/web/base/reports/index.html:25
+msgid "Marked fixed/closed more than eight weeks ago"
+msgstr ""
+
+#: templates/web/fixmystreet/contact/index.html:106
+msgid "Message"
+msgstr "İleti"
+
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Dışarıdan bir organ atamak:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Dışarıdan bir organ atamak:"
+
+#: templates/web/base/contact/index.html:97
+msgid "Message:"
+msgstr "İleti:"
+
+#: perllib/FixMyStreet/App/Controller/Open311.pm:445
+msgid "Missing jurisdiction_id"
+msgstr ""
+
+#: templates/web/zurich/admin/stats.html:34
+msgid "Moderated by division within one working day"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:11
+msgid "Month"
+msgstr "Ay"
+
+#: templates/web/base/report/display.html:34
+msgid "More problems nearby"
+msgstr "Yakındaki diğer problemler"
+
+#: templates/web/base/admin/bodies.html:21
+#: templates/web/base/admin/body-form.html:18
+#: templates/web/base/admin/flagged.html:16
+#: templates/web/base/admin/flagged.html:37
+#: templates/web/base/admin/list_updates.html:7
+#: templates/web/base/admin/reports.html:13
+#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
+#: templates/web/base/reports/index.html:20
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
+#: templates/web/fixmystreet/report/update-form.html:138
+#: templates/web/zurich/admin/body-form.html:4
+#: templates/web/zurich/auth/general.html:60
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
+msgid "Name"
+msgstr "İsim"
+
+#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/update_edit.html:32
+#: templates/web/base/admin/user-form.html:18
+#: templates/web/zurich/admin/stats.html:41
+msgid "Name:"
+msgstr "İsim:"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
+msgid "Name: %s"
+msgstr "İsim: %s"
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:160
+#: perllib/FixMyStreet/Geocode/OSM.pm:145
+msgid "Nearest named road to the pin placed on the map (automatically generated using OpenStreetMap): %s%s"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:127
+msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
+msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
+msgid ""
+"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
+"\n"
+msgstr ""
+
+#: templates/web/zurich/email_sent.html:5
+msgid "Nearly Done! Now check your email..."
+msgstr ""
+
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "E-posta adresinizi kontrol ediniz"
+
+#: templates/web/base/reports/index.html:21
+msgid "New <br>problems"
+msgstr "Yeni <br>sorunlar"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:261
+msgid "New body added"
+msgstr "Yeni bölüm eklendi"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
+msgid "New category contact added"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
+msgid "New internal note:"
+msgstr ""
+
+#: db/alert_types.pl:18 db/alert_types.pl:22
+msgid "New local problems on FixMyStreet"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+msgid "New note to DM:"
+msgstr ""
+
+#: db/alert_types.pl:38
+msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
+msgstr ""
+
+#: db/alert_types.pl:26 db/alert_types.pl:30
+msgid "New problems near {{POSTCODE}} on FixMyStreet"
+msgstr ""
+
+#: db/alert_types.pl:10
+msgid "New problems on FixMyStreet"
+msgstr "FixMyStreet'teki yeni problemler"
+
+#: db/alert_types.pl:34
+msgid "New problems to {{COUNCIL}} on FixMyStreet"
+msgstr ""
+
+#: db/alert_types.pl:42
+msgid "New problems within {{NAME}}'s boundary on FixMyStreet"
+msgstr ""
+
+#: templates/web/zurich/admin/index-sdm.html:4
+msgid "New reports"
+msgstr "Yeni bildiriler"
+
+#: templates/web/base/admin/questionnaire.html:24
+msgid "New state"
+msgstr "Yeni durum"
+
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Yeni durum"
+
+#: templates/web/base/pagination.html:13
+msgid "Next"
+msgstr "Sonraki"
+
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
+#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
+#: templates/web/base/admin/category_edit.html:4
+#: templates/web/base/admin/list_updates.html:32
+#: templates/web/base/admin/list_updates.html:34
+#: templates/web/base/admin/list_updates.html:35
+#: templates/web/base/admin/problem_row.html:20
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/update_edit.html:25
+#: templates/web/base/questionnaire/creator_fixed.html:16
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
+msgid "No"
+msgstr "Hayır"
+
+#: templates/web/base/admin/user-form.html:33
+msgid "No body"
+msgstr ""
+
+#: templates/web/base/admin/stats.html:85
+msgid "No council"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:401
+msgid "No council selected"
+msgstr ""
+
+#: templates/web/base/admin/edit-league.html:17
+msgid "No edits have yet been made."
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:25
+msgid "No flagged problems found."
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:58
+msgid "No flagged users found."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
+msgid "No further updates"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:38
+msgid "No result returned"
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:60
+#: templates/web/base/admin/body-form.html:61
+msgid ""
+"No specific areas are currently available, because the <code>MAPIT_URL</code> in\n"
+" your config file is not pointing to a live MapIt service."
+msgstr ""
+
+#: templates/web/base/report/_support.html:2
+#: templates/web/base/report/_support.html:4
+msgid "No supporters"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:41
+msgid "None"
+msgstr "Hiçbiri"
+
+#: templates/web/base/admin/user-form.html:24
+#: templates/web/base/admin/user-form.html:25
+msgid ""
+"Normal (public) users should not be associated with any <strong>body</strong>.<br>\n"
+" Authorised staff users can be associated with the body they represent.<br>\n"
+" Depending on the implementation, staff users may have access to the dashboard (summary of\n"
+" activity across their body), the ability to hide reports or set special report statuses."
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:33
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:31
+msgid "Not Responsible"
+msgstr "Sorumlu deÄŸildir"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Sorumlu deÄŸildir"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
+msgid "Not for my subdivision"
+msgstr ""
+
+#: templates/web/base/admin/questionnaire.html:6
+msgid "Not reported before"
+msgstr "Daha önce bildirilmedi"
+
+#: templates/web/base/report/_main.html:62
+msgid "Not reported to council"
+msgstr ""
+
+#: templates/web/base/admin/body.html:71
+#: templates/web/base/admin/category_edit.html:95
+#: templates/web/zurich/admin/body.html:17
+msgid "Note"
+msgstr "Not"
+
+#: templates/web/base/admin/stats.html:51
+msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
+msgstr ""
+
+#: templates/web/base/admin/body.html:186
+#: templates/web/base/admin/category_edit.html:52
+#: templates/web/zurich/admin/body.html:53
+msgid "Note:"
+msgstr "Not:"
+
+#: templates/web/base/open311/index.html:73
+msgid "Note: <strong>%s</strong>"
+msgstr "Not:<strong>%s</strong>"
+
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
+msgid "Now to submit your report&hellip;"
+msgstr ""
+
+#: templates/web/base/report/update-form.html:86
+#: templates/web/fixmystreet/report/update-form.html:85
+msgid "Now to submit your update&hellip;"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:42
+msgid "OK"
+msgstr "Tamam"
+
+#: templates/web/base/report/display.html:28
+#: templates/web/base/report/update.html:17
+msgid "Offensive? Unsuitable? Tell us"
+msgstr ""
+
+#: templates/web/base/reports/index.html:23
+msgid "Old / unknown <br>problems"
+msgstr "Eski/ bilinmeyen <br>problemler"
+
+#: templates/web/base/admin/questionnaire.html:24
+msgid "Old state"
+msgstr "Eski durum"
+
+#: templates/web/base/reports/index.html:25
+msgid "Older <br>fixed"
+msgstr ""
+
+#: templates/web/base/reports/index.html:22
+msgid "Older <br>problems"
+msgstr "Eski <br>sorunlar"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:45
+msgid "One-line summary"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
+#: templates/web/base/admin/update_edit.html:28
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/report/update-form.html:30
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:7
+#: templates/web/zurich/admin/update_edit.html:18
+msgid "Open"
+msgstr "Aç"
+
+#: templates/web/base/reports/index.html:22
+msgid "Open for more than four weeks, with an update within the past eight weeks"
+msgstr ""
+
+#: templates/web/base/reports/index.html:23
+msgid "Open, but not had any update in eight weeks"
+msgstr ""
+
+#: templates/web/base/open311/index.html:70
+msgid "Open311 API for the mySociety FixMyStreet server"
+msgstr ""
+
+#: templates/web/base/open311/index.html:80
+msgid "Open311 initiative web page"
+msgstr ""
+
+#: templates/web/base/open311/index.html:81
+msgid "Open311 specification"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:60
+msgid "Or problems reported to:"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:36
+msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
+msgid "Other"
+msgstr "DiÄŸer"
+
+#: templates/web/base/admin/list_updates.html:8
+msgid "Owner"
+msgstr "Sahibi"
+
+#: templates/web/base/errors/page_error_404_not_found.html:1
+#: templates/web/base/errors/page_error_404_not_found.html:3
+msgid "Page Not Found"
+msgstr "Sayfa bulunamadı"
+
+#: templates/web/base/admin/body-form.html:31
+#: templates/web/zurich/admin/body-form.html:14
+msgid "Parent"
+msgstr "Ebeveyn"
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
+msgid "Partial"
+msgstr "Kısmi"
+
+#: templates/web/base/auth/general.html:53
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
+#: templates/web/fixmystreet/report/update-form.html:116
+#: templates/web/zurich/auth/general.html:32
+#: templates/web/zurich/auth/general.html:63
+msgid "Password (optional)"
+msgstr "Şifre (isteğe bağlı)"
+
+#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
+msgid "Password:"
+msgstr "Åžifre:"
+
+#: templates/web/base/js/translation_strings.html:48
+msgid "Permalink"
+msgstr ""
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
+msgid "Phone number"
+msgstr "Telefon numarası"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:26
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:62
+msgid "Phone number (optional)"
+msgstr "Telefon numarası (isteğe bağlı)"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
+#: templates/web/zurich/admin/stats.html:39
+msgid "Phone:"
+msgstr "Telefon:"
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/fixmystreet/report/update-form.html:59
+#: templates/web/zurich/admin/index-dm.html:29
+#: templates/web/zurich/admin/index-sdm.html:24
+#: templates/web/zurich/admin/reports.html:16
+#: templates/web/zurich/admin/stats.html:37
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
+msgid "Photo"
+msgstr "FotoÄŸraf"
+
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+msgid "Photo is required."
+msgstr ""
+
+#: templates/web/base/admin/category_edit.html:48
+msgid "Photo required"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:80
+#: templates/web/base/report/new/fill_in_details_form.html:84
+#: templates/web/base/report/update-form.html:62
+msgid "Photo:"
+msgstr "FotoÄŸraf:"
+
+#: templates/web/base/alert/list.html:26
+msgid "Photos of recent nearby reports"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:30
+msgid "Place pin on map"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
+#: templates/web/base/dashboard/index.html:142
+#: templates/web/base/dashboard/index.html:143
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:9
+#: templates/web/zurich/admin/index-dm.html:9
+msgid "Planned"
+msgstr "Planlanmış"
+
+#: templates/web/base/report/new/notes.html:5
+msgid "Please be polite, concise and to the point."
+msgstr ""
+
+#: templates/web/base/auth/change_password.html:12
+#: templates/web/base/auth/change_password.html:17
+msgid "Please check the passwords and try again"
+msgstr "Åžifreyi kontrol ediniz ve tekrar deneyiniz"
+
+#: templates/web/zurich/auth/token.html:16
+msgid "Please check your email"
+msgstr "E-posta adresinizi kontrol ediniz"
+
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
+#: templates/web/zurich/auth/general.html:3
+#: templates/web/zurich/auth/general.html:9
+msgid "Please check your email address is correct"
+msgstr "E-posta adresinizin doÄŸruluÄŸunu kontrol ediniz"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:343
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
+#: perllib/FixMyStreet/DB/Result/Problem.pm:412
+#: templates/web/base/js/translation_strings.html:9
+msgid "Please choose a category"
+msgstr "Kategori seçiniz"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:418
+msgid "Please choose a property type"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
+msgid "Please correct the errors below"
+msgstr "Lütfen aşağıdaki hataları düzeltiniz"
+
+#: templates/web/base/contact/blurb.html:2
+#: templates/web/fixmystreet/contact/blurb.html:12
+msgid ""
+"Please do <strong>not</strong> report problems through this form; messages go to\n"
+"the team behind this site, not a council. To report a problem,\n"
+"please <a href=\"/\">go to the front page</a> and follow the instructions."
+msgstr ""
+
+#: templates/web/base/report/new/notes.html:6
+msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:346
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
+#: templates/web/base/js/translation_strings.html:2
+msgid "Please enter a message"
+msgstr "Mesaj giriniz"
+
+#: templates/web/base/auth/change_password.html:12
+#: templates/web/base/auth/change_password.html:15
+#: templates/web/base/js/translation_strings.html:19
+msgid "Please enter a password"
+msgstr "Åžifre giriniz"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/DB/Result/Problem.pm:395
+#: templates/web/base/js/translation_strings.html:3
+msgid "Please enter a subject"
+msgstr "Konu giriniz"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
+#: perllib/FixMyStreet/DB/Result/User.pm:127
+#: templates/web/base/js/translation_strings.html:12
+#: templates/web/base/js/translation_strings.html:16
+msgid "Please enter a valid email"
+msgstr "Geçerli e-posta giriniz"
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:346
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
+msgid "Please enter a valid email address"
+msgstr "Geçerli e-posta adresi giriniz"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:398
+#: templates/web/base/js/translation_strings.html:4
+msgid "Please enter some details"
+msgstr "Lütfen bir kaç ayrıntı giriniz"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/DB/Result/User.pm:124
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
+#: templates/web/base/js/translation_strings.html:11
+#: templates/web/base/js/translation_strings.html:15
+#: templates/web/zurich/auth/general.html:3
+#: templates/web/zurich/auth/general.html:8
+msgid "Please enter your email"
+msgstr "E-posta giriniz"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
+msgid "Please enter your email address"
+msgstr "Lütfen mail adresinizi giriniz"
+
+#: templates/web/base/js/translation_strings.html:25
+msgid "Please enter your first name"
+msgstr "Ad giriniz"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:318
+#: templates/web/base/js/translation_strings.html:7
+msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
+#: perllib/FixMyStreet/DB/Result/Problem.pm:406
+#: perllib/FixMyStreet/DB/Result/User.pm:120
+#: templates/web/base/js/translation_strings.html:6
+msgid "Please enter your name"
+msgstr "Lütfen isminizi giriniz"
+
+#: templates/web/base/js/translation_strings.html:22
+msgid "Please enter your phone number"
+msgstr "Lütfen telefon numaranızı gririniz"
+
+#: templates/web/base/js/translation_strings.html:26
+msgid "Please enter your second name"
+msgstr "Soyad giriniz"
+
+#: templates/web/base/js/translation_strings.html:24
+msgid "Please enter your title"
+msgstr "Konu başlığı giriniz"
+
+#: templates/web/base/auth/sign_out.html:5
+#: templates/web/zurich/auth/sign_out.html:5
+msgid "Please feel free to <a href=\"%s\">sign in again</a>, or go back to the <a href=\"/\">front page</a>."
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_text.html:1
+#: templates/web/base/report/new/fill_in_details_text.html:8
+msgid "Please fill in details of the problem below."
+msgstr "Lütfen aşağıdaki probleme ait ayrıntıları giriniz."
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:46
+msgid "Please fill in details of the problem."
+msgstr "Lütfen probleme ait ayrıntıları giriniz."
+
+#: templates/web/base/report/new/fill_in_details_form.html:28
+#: templates/web/fixmystreet/report/new/sidebar.html:7
+#: templates/web/zurich/report/new/fill_in_details_form.html:20
+msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
+msgid "Please indicate whether you'd like to receive another questionnaire"
+msgstr ""
+
+#: templates/web/fixmystreet/report/updates-sidebar-notes.html:4
+msgid "Please note that updates are not sent to the council."
+msgstr ""
+
+#: templates/web/base/report/update-form.html:7
+msgid "Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:8
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:21
+#: templates/web/zurich/report/new/fill_in_details_form.html:11
+msgid "Please note your report has <strong>not yet been sent</strong>. Choose a category and add further information below, then submit."
+msgstr ""
+
+#: templates/web/base/report/new/notes.html:1
+#: templates/web/zurich/report/new/notes.html:1
+msgid "Please note:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
+msgid "Please provide some explanation as to why you're reopening this report"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
+msgid "Please provide some text as well as a photo"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
+msgid "Please say whether you've ever reported a problem to your council before"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Åžifre giriniz"
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:80
+msgid "Please select the feed you want"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:118
+msgid "Please select the type of alert you want"
+msgstr "İstediğiniz bir bildiri şekli secin"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
+msgid "Please state whether or not the problem has been fixed"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
+msgid "Please upload a JPEG image only"
+msgstr "Sadece JPEG formatı yükleyin"
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
+msgid "Please write a message"
+msgstr "Mesaj gönderin"
+
+#: templates/web/fixmystreet/report/update-form.html:23
+msgid "Please write your update here"
+msgstr "Güncellemeleri buraya yazınız"
+
+#: templates/web/base/contact/index.html:100
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
+#: templates/web/base/report/update-form.html:72
+#: templates/web/fixmystreet/contact/index.html:113
+#: templates/web/fixmystreet/report/update-form.html:124
+#: templates/web/fixmystreet/report/update-form.html:71
+#: templates/web/fixmystreet/report/update-form.html:97
+msgid "Post"
+msgstr "PaylaÅŸ"
+
+#: templates/web/base/report/updates.html:15
+msgid "Posted anonymously at %s"
+msgstr "%s Anonim olarak gönderildi"
+
+#: templates/web/base/report/updates.html:22
+msgid "Posted by %s (<strong>%s</strong>) at %s"
+msgstr ""
+
+#: templates/web/base/report/updates.html:24
+msgid "Posted by %s at %s"
+msgstr "Tarafından paylaşıldı %s saat %s"
+
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
+#: templates/web/base/pagination.html:7
+msgid "Previous"
+msgstr "Önceki"
+
+#: templates/web/fixmystreet/footer.html:41
+msgid "Privacy"
+msgstr "Gizlilik"
+
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
+#: templates/web/base/admin/body.html:202
+#: templates/web/base/admin/body.html:85
+#: templates/web/base/admin/category_edit.html:45
+#: templates/web/base/admin/report_edit.html:77
+msgid "Private"
+msgstr "Özel"
+
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
+msgid "Problem"
+msgstr "Sorun"
+
+#: templates/web/base/admin/timeline.html:22
+msgid "Problem %d created"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:24
+msgid "Problem %s confirmed"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:26
+msgid "Problem %s sent to council %s"
+msgstr ""
+
+#: templates/web/base/admin/index.html:46
+#: templates/web/zurich/admin/index.html:9
+msgid "Problem breakdown by state"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
+msgid "Problem marked as open."
+msgstr ""
+
+#: templates/web/base/admin/questionnaire.html:21
+msgid "Problem state change based on survey results"
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:10
+msgid "Problems"
+msgstr "Sorunlar"
+
+#: templates/web/base/around/_updates.html:1
+msgid "Problems in this area"
+msgstr ""
+
+#: templates/web/fixmystreet/report/display.html:43
+msgid "Problems nearby"
+msgstr ""
+
+#: templates/web/fixmystreet/report/display.html:41
+msgid "Problems on the map"
+msgstr ""
+
+#: db/alert_types.pl:14
+msgid "Problems recently reported fixed on FixMyStreet"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:21
+msgid "Problems within %.1fkm of this location"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
+#: perllib/FixMyStreet/Cobrand/UK.pm:207
+msgid "Problems within %s"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:128
+#: perllib/FixMyStreet/Cobrand/UK.pm:221
+msgid "Problems within %s ward"
+msgstr ""
+
+#. ("First %s is the body name, second %s the site name")
+#: templates/web/base/reports/body.html:0
+#: templates/web/base/reports/body.html:24
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "%s içerisindeki problemlerle alakalı RSS besleme"
+
+#: templates/web/base/alert/_list.html:42
+msgid "Problems within the boundary of:"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:45
+msgid "Property address:"
+msgstr ""
+
+#: templates/web/base/report/new/category.html:8
+msgid "Property type:"
+msgstr ""
+
+#: templates/web/base/report/update-form.html:3
+#: templates/web/fixmystreet/report/update-form.html:4
+msgid "Provide an update"
+msgstr ""
+
+#: templates/web/base/auth/general.html:56
+msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
+#: templates/web/fixmystreet/report/update-form.html:119
+msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
+msgid "Public response:"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:121
+#: templates/web/zurich/admin/stats.html:38
+msgid "Publish photo"
+msgstr "Fotoğraf yayınla"
+
+#: templates/web/base/questionnaire/completed.html:1
+#: templates/web/base/questionnaire/index.html:0
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
+msgid "Questionnaire"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:30
+msgid "Questionnaire %d answered for problem %d, %s to %s"
+msgstr ""
+
+#: templates/web/base/admin/timeline.html:28
+msgid "Questionnaire %d sent for problem %d"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:200
+msgid "Questionnaire filled in by problem reporter"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:22
+#: templates/web/base/around/display_location.html:1
+#: templates/web/base/around/display_location.html:3
+#: templates/web/base/report/display.html:50
+#: templates/web/base/reports/_rss.html:1
+#: templates/web/fixmystreet/alert/updates.html:9
+#: templates/web/fixmystreet/report/display.html:58
+msgid "RSS feed"
+msgstr "RSS besleme"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:250 perllib/FixMyStreet/Cobrand/UK.pm:262
+msgid "RSS feed for %s"
+msgstr "%s için RSS Besleme"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:256 perllib/FixMyStreet/Cobrand/UK.pm:268
+msgid "RSS feed for %s ward, %s"
+msgstr "%s için %s gözetiminde RSS besleme"
+
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:155
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:163
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:173
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:181
+#: perllib/FixMyStreet/Cobrand/UK.pm:276 perllib/FixMyStreet/Cobrand/UK.pm:288
+msgid "RSS feed of %s"
+msgstr "%s için RSS besleme"
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:281 perllib/FixMyStreet/Cobrand/UK.pm:293
+msgid "RSS feed of %s, within %s ward"
+msgstr "%s içinde %s gözetimiyle RSS besleme"
+
+#: templates/web/base/alert/_list.html:22
+msgid "RSS feed of nearby problems"
+msgstr "Civardaki problemlerle alakalı RSS besleme"
+
+#: templates/web/base/reports/_rss.html:1
+msgid "RSS feed of problems in this %s"
+msgstr "%s ile ilgili problemeleri RSS besleme"
+
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
+#: perllib/FixMyStreet/Cobrand/UK.pm:214
+msgid "RSS feed of problems within %s"
+msgstr "%s içerisindeki problemlerle alakalı RSS besleme"
+
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:127
+#: perllib/FixMyStreet/Cobrand/UK.pm:220
+msgid "RSS feed of problems within %s ward"
+msgstr "%s bölgesi içerisindeki problemlerle alakalı RSS besleme"
+
+#: templates/web/base/around/display_location.html:1
+#: templates/web/base/around/display_location.html:4
+msgid "RSS feed of recent local problems"
+msgstr "Son günlerdeki yerel problemlerle alakalı RSS besleme"
+
+#: templates/web/base/report/display.html:50
+#: templates/web/fixmystreet/alert/updates.html:9
+#: templates/web/fixmystreet/report/display.html:58
+msgid "RSS feed of updates to this problem"
+msgstr "Bu problemin güncellemelerini RSS olarak besle"
+
+#: templates/web/base/alert/updates.html:9
+#: templates/web/base/report/display.html:41
+#: templates/web/fixmystreet/alert/updates.html:14
+#: templates/web/fixmystreet/report/display.html:60
+msgid "Receive email when updates are left on this problem."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/around/display_location.html:0
+#: templates/web/base/around/display_location.html:33
+#, fuzzy
+msgid "Recent local problems, %s"
+msgstr "Son günlerdeki yerel problemlerle alakalı RSS besleme"
+
+#: templates/web/base/reports/index.html:24
+msgid "Recently <br>fixed"
+msgstr ""
+
+#: templates/web/base/front/recent.html:11
+msgid "Recently reported problems"
+msgstr ""
+
+#: templates/web/zurich/report/new/notes.html:5
+msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:46
+msgid "Remove flag"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/update_edit.html:62
+#: templates/web/zurich/admin/update_edit.html:35
+msgid "Remove photo (can't be undone!)"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "kullanıcı düzenle"
+
+#: templates/web/fixmystreet/header_logo.html:2
+msgid "Report"
+msgstr ""
+
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
+#: templates/web/fixmystreet/header_logo.html:2
+#: templates/web/zurich/footer.html:18
+#: templates/web/zurich/nav_over_content.html:4
+msgid "Report a problem"
+msgstr ""
+
+#: templates/web/fixmystreet/report/display.html:32
+msgid "Report abuse"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
+msgid "Report on %s"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:1
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+msgid "Report your problem"
+msgstr ""
+
+#: templates/web/base/around/intro.html:1
+#: templates/web/zurich/around/intro.html:1
+msgid "Report, view, or discuss local problems"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
+#: templates/web/base/contact/index.html:50
+#: templates/web/fixmystreet/contact/index.html:65
+msgid "Reported anonymously at %s"
+msgstr ""
+
+#: templates/web/base/admin/questionnaire.html:5
+#: templates/web/base/questionnaire/index.html:62
+msgid "Reported before"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+#: templates/web/base/contact/index.html:52
+#: templates/web/fixmystreet/contact/index.html:67
+msgid "Reported by %s at %s"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+msgid "Reported by:"
+msgstr ""
+
+#: templates/web/zurich/report/_main.html:2
+msgid "Reported in the %s category"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
+msgid "Reported in the %s category anonymously at %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+msgid "Reported in the %s category by %s at %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
+msgid "Reported via %s anonymously at %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
+msgid "Reported via %s by %s at %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
+msgid "Reported via %s in the %s category anonymously at %s"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
+msgid "Reported via %s in the %s category by %s at %s"
+msgstr ""
+
+#: templates/web/base/reports/index.html:21
+msgid "Reported within the last four weeks"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Tüm Bildirimler"
+
+#: templates/web/base/around/index.html:2
+#: templates/web/base/js/translation_strings.html:41
+#: templates/web/base/report/new/fill_in_details.html:0
+#: templates/web/base/report/new/fill_in_details.html:5
+#: templates/web/zurich/report/new/fill_in_details_form.html:2
+msgid "Reporting a problem"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
+#: templates/web/zurich/header.html:60
+msgid "Reports"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:327 perllib/FixMyStreet/Cobrand/UK.pm:331
+msgid "Reports are limited to %s characters in length. Please shorten your report"
+msgstr ""
+
+#: templates/web/zurich/admin/index-sdm.html:7
+msgid "Reports awaiting approval"
+msgstr ""
+
+#: templates/web/zurich/admin/index-sdm.html:10
+msgid "Reports published"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:67
+msgid "Resend report"
+msgstr ""
+
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:28
+msgid "Right place?"
+msgstr ""
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:167
+#: perllib/FixMyStreet/Geocode/OSM.pm:152
+msgid "Road operator for this named road (derived from road reference number and type): %s"
+msgstr ""
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:164
+#: perllib/FixMyStreet/Geocode/OSM.pm:149
+msgid "Road operator for this named road (from OpenStreetMap): %s"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
+msgid "Rotate Left"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
+msgid "Rotate Right"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
+msgid "Satellite"
+msgstr ""
+
+#: templates/web/base/admin/body.html:208
+#: templates/web/base/admin/category_edit.html:84
+#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
+msgid "Save changes"
+msgstr "DeÄŸiÅŸiklikleri kaydet"
+
+#: templates/web/base/admin/reports.html:1
+#: templates/web/zurich/admin/reports.html:1
+msgid "Search Reports"
+msgstr ""
+
+#: templates/web/base/admin/users.html:1
+msgid "Search Users"
+msgstr "Kullanıcı Ara"
+
+#: templates/web/zurich/header.html:82
+msgid "Search reports"
+msgstr ""
+
+#: templates/web/base/admin/reports.html:5
+#: templates/web/base/admin/users.html:8
+#: templates/web/zurich/admin/reports.html:5
+msgid "Search:"
+msgstr "Ara:"
+
+#: templates/web/base/admin/reports.html:26
+msgid "Searching found no reports."
+msgstr ""
+
+#: templates/web/base/admin/users.html:41
+msgid "Searching found no users."
+msgstr "Arama sonucu kullanıcı bulunamadı"
+
+#: templates/web/base/admin/body-form.html:33
+#: templates/web/zurich/admin/body-form.html:16
+msgid "Select a body"
+msgstr ""
+
+#: templates/web/base/reports/index.html:9
+msgid "Select a particular council to see the reports sent there."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:71
+#: templates/web/zurich/admin/body-form.html:26
+msgid "Select an area"
+msgstr "Bölge seç"
+
+#: templates/web/base/alert/_list.html:10
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Bildirileri aç"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
+msgid "Sent to %s %s later"
+msgstr "%s %s sonra gönder"
+
+#: templates/web/base/admin/report_edit.html:66
+msgid "Sent:"
+msgstr "gönderildi:"
+
+#: templates/web/base/admin/report_edit.html:71
+#: templates/web/zurich/admin/stats.html:45
+msgid "Service:"
+msgstr ""
+
+#: templates/web/fixmystreet/report/display.html:38
+msgid "Share"
+msgstr "PaylaÅŸ"
+
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
+#: templates/web/fixmystreet/report/update-form.html:146
+msgid "Show my name publicly"
+msgstr "İsmimi açıkça göster "
+
+#: templates/web/base/around/display_location.html:67
+msgid "Show old"
+msgstr "Eskileri göster"
+
+#: templates/web/base/around/display_location.html:58
+msgid "Show pins"
+msgstr ""
+
+#: templates/web/base/auth/general.html:3
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
+#: templates/web/zurich/auth/general.html:18
+#: templates/web/zurich/auth/general.html:35
+msgid "Sign in"
+msgstr "GiriÅŸ yap"
+
+#: templates/web/base/auth/general.html:1
+#: templates/web/zurich/auth/general.html:1
+msgid "Sign in or create an account"
+msgstr "Giriş yapın ve bir hesap oluşturun "
+
+#: templates/web/base/auth/sign_out.html:1
+#: templates/web/zurich/auth/sign_out.html:1
+msgid "Sign out"
+msgstr "Çıkış"
+
+#: templates/web/base/report/new/fill_in_details_text.html:1
+msgid "Some categories may require additional information."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:149
+#: templates/web/base/admin/body-form.html:150
+msgid ""
+"Some endpoints require an <strong>API key</strong> to indicate that the reports are being\n"
+" sent from your FixMyStreet installation."
+msgstr ""
+
+#: templates/web/base/alert/index.html:42
+msgid "Some photos of recent reports"
+msgstr "Son bildirimlerden bazı fotograflar"
+
+#. ('Optional comment for translator')
+#: perllib/FixMyStreet/App/View/Email.pm:32
+#: perllib/FixMyStreet/App/View/Web.pm:52
+msgid "Some text to localize"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/UK.pm:78
+msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
+msgstr ""
+
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
+#: templates/web/base/tokens/abuse.html:5
+msgid "Sorry, there has been an error confirming your problem."
+msgstr "Üzgünüz, sorununuzu onaylarken bir hata oluştu."
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
+#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
+#: perllib/FixMyStreet/Geocode/OSM.pm:48
+msgid "Sorry, we could not find that location."
+msgstr ""
+
+#: perllib/FixMyStreet/Geocode/Bing.pm:34
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
+msgid "Sorry, we could not parse that location. Please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr ""
+
+#: templates/web/base/admin/stats.html:64
+msgid "Start Date:"
+msgstr "Başlangıç Tarihi:"
+
+#: templates/web/base/admin/body.html:69
+#: templates/web/base/admin/flagged.html:18
+#: templates/web/base/admin/list_updates.html:11
+#: templates/web/base/admin/reports.html:15
+#: templates/web/fixmystreet/report/update-form.html:26
+msgid "State"
+msgstr "Devlet"
+
+#: templates/web/base/admin/report_edit.html:47
+#: templates/web/base/admin/update_edit.html:27
+#: templates/web/base/report/update-form.html:28
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
+#: templates/web/zurich/admin/update_edit.html:17
+msgid "State:"
+msgstr "Devlet:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
+#: templates/web/base/admin/stats.html:1
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
+msgid "Stats"
+msgstr ""
+
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+msgid "Status"
+msgstr "Durum"
+
+#: templates/web/base/report/updates.html:10
+msgid "Still open, via questionnaire, %s"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
+msgid "Subcategory: %s"
+msgstr ""
+
+#: templates/web/zurich/admin/index-dm.html:27
+msgid "Subdivision/Body"
+msgstr ""
+
+#: templates/web/fixmystreet/contact/index.html:98
+msgid "Subject"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:19
+#: templates/web/base/contact/index.html:88
+#: templates/web/base/report/new/fill_in_details_form.html:53
+#: templates/web/zurich/admin/report_edit.html:39
+msgid "Subject:"
+msgstr ""
+
+#: templates/web/base/questionnaire/creator_fixed.html:19
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
+#: templates/web/base/report/new/fill_in_details_form.html:96
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
+msgid "Submit"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/update_edit.html:65
+#: templates/web/base/admin/user-form.html:56
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
+#: templates/web/zurich/admin/update_edit.html:38
+msgid "Submit changes"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:97
+msgid "Submit questionnaire"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:6
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-dm.html:6
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+msgid "Submitted"
+msgstr ""
+
+#: templates/web/base/alert/updates.html:17
+#: templates/web/base/report/display.html:46
+#: templates/web/fixmystreet/alert/updates.html:23
+#: templates/web/fixmystreet/report/display.html:65
+msgid "Subscribe"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:92
+msgid "Subscribe me to an email alert"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
+#: templates/web/base/admin/bodies.html:25
+#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
+#: templates/web/zurich/admin/index-dm.html:1
+#: templates/web/zurich/admin/index-sdm.html:1
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
+#: templates/web/zurich/header.html:57
+msgid "Summary"
+msgstr "Özet"
+
+#: templates/web/base/reports/index.html:1
+#: templates/web/zurich/reports/index.html:0
+#: templates/web/zurich/reports/index.html:4
+msgid "Summary reports"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
+msgid "Survey"
+msgstr ""
+
+#: templates/web/base/admin/questionnaire.html:1
+msgid "Survey Results"
+msgstr ""
+
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "Güncellemeler"
+
+#: templates/web/base/admin/list_updates.html:12
+#: templates/web/zurich/admin/templates.html:9
+msgid "Text"
+msgstr ""
+
+#: templates/web/base/admin/body.html:28
+msgid "Text only version"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
+#: templates/web/zurich/admin/update_edit.html:12
+msgid "Text:"
+msgstr ""
+
+#: templates/web/base/tokens/confirm_problem.html:12
+msgid "Thank you for reporting this issue!"
+msgstr "Bu konuyu bildirdiğiniz için teşekkür ederiz!"
+
+#: templates/web/base/tokens/error.html:7
+msgid "Thank you for trying to confirm your update or problem. We seem to have an error ourselves though, so <a href=\"%s\">please let us know what went on</a> and we'll look into it."
+msgstr ""
+
+#: templates/web/base/tokens/confirm_update.html:15
+msgid "Thank you for updating this issue!"
+msgstr "Bu konuyu güncellediğiniz için teşekkür ederiz!"
+
+#: templates/web/base/contact/submit.html:6
+#: templates/web/base/questionnaire/completed.html:5
+msgid "Thank you for your feedback"
+msgstr ""
+
+#: templates/web/base/around/_error_multiple.html:17
+msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
+msgstr ""
+
+#: templates/web/base/questionnaire/creator_fixed.html:9
+msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
+msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Council.pm:97
+msgid "That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Location.pm:126
+msgid "That location does not appear to be in the UK; please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:47
+#: perllib/FixMyStreet/Cobrand/FixaMinGata.pm:63
+#: perllib/FixMyStreet/Cobrand/UK.pm:71
+msgid "That postcode was not recognised, sorry."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
+msgid "That problem has been marked as sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
+msgid "That problem will now be resent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
+msgid "That report cannot be viewed on %s."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
+msgid "That report has been removed from FixMyStreet."
+msgstr ""
+
+#: templates/web/base/admin/body.html:144
+msgid ""
+"The <strong>email address</strong> is the destination to which reports about this category will be sent. \n"
+" Other categories for this body may have the same email address."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:123
+#: templates/web/base/admin/body-form.html:124
+msgid ""
+"The <strong>endpoint</strong> is the URL of the service that FixMyStreet will connect to \n"
+" when sending reports to this body."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:136
+#: templates/web/base/admin/body-form.html:137
+msgid ""
+"The <strong>jurisdiction</strong> is only needed if the endpoint is serving more\n"
+" than one. If the body is running its own endpoint, you can usually leave this blank."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:94
+#: templates/web/base/admin/body-form.html:95
+msgid ""
+"The <strong>send method</strong> determines how problem reports will be sent to the body.\n"
+" If you leave this blank, <strong>send method defaults to email</strong>."
+msgstr ""
+
+#: templates/web/base/open311/index.html:90
+msgid "The Open311 v2 attribute agency_responsible is used to list the administrations that received the problem report, which is not quite the way the attribute is defined in the Open311 v2 specification."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:11
+#: templates/web/base/admin/body-form.html:12
+msgid ""
+"The body's <strong>name</strong> identifies the body (for example, <em>Borsetshire District Council</em>)\n"
+" and may be displayed publically."
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_text.html:1
+#: templates/web/base/report/new/fill_in_details_text.html:3
+msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
+msgstr ""
+
+#: templates/web/base/admin/edit-league.html:3
+#: templates/web/base/admin/edit-league.html:4
+msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
+msgid "The error was: %s"
+msgstr ""
+
+#: templates/web/base/open311/index.html:86
+msgid "The following Open311 v2 attributes are returned for each request: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code and service_name."
+msgstr ""
+
+#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:144
+msgid "The following information about the nearest road might be inaccurate or irrelevant, if the problem is close to several roads or close to a road without a name registered in OpenStreetMap."
+msgstr ""
+
+#: db/alert_types.pl:19 db/alert_types.pl:23 db/alert_types.pl:27
+#: db/alert_types.pl:31
+msgid "The latest local problems reported by users"
+msgstr ""
+
+#: db/alert_types.pl:35
+msgid "The latest problems for {{COUNCIL}} reported by users"
+msgstr ""
+
+#: db/alert_types.pl:39
+msgid "The latest problems for {{COUNCIL}} within {{WARD}} ward reported by users"
+msgstr ""
+
+#: db/alert_types.pl:11
+msgid "The latest problems reported by users"
+msgstr ""
+
+#: db/alert_types.pl:15
+msgid "The latest problems reported fixed by users"
+msgstr ""
+
+#: db/alert_types.pl:43
+msgid "The latest problems within {{NAME}}'s boundary reported by users"
+msgstr ""
+
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:58
+msgid "The list of available areas is being provided by the MapIt service at %s."
+msgstr ""
+
+#: templates/web/base/auth/change_password.html:12
+#: templates/web/base/auth/change_password.html:16
+msgid "The passwords do not match"
+msgstr ""
+
+#: templates/web/base/errors/page_error_404_not_found.html:10
+#: templates/web/base/errors/page_error_404_not_found.html:12
+msgid "The requested URL '%s' was not found on this server"
+msgstr ""
+
+#: templates/web/base/alert/_list.html:16
+msgid "The simplest alert is our geographic one:"
+msgstr ""
+
+#: templates/web/base/report/new/councils_extra_text.html:1
+#: templates/web/base/report/new/councils_text_some.html:10
+#: templates/web/base/report/new/fill_in_details_form.html:18
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:14
+msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
+msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
+msgstr ""
+
+#: templates/web/base/admin/user-form.html:12
+#: templates/web/base/admin/user-form.html:13
+msgid ""
+"The user's <strong>name</strong> is displayed publicly on reports that have not been marked <em>anonymous</em>.\n"
+" Names are not necessarily unique."
+msgstr ""
+
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
+#: templates/web/base/reports/_problem-list.html:15
+msgid "There are no reports to show."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
+msgid "There was a problem showing the All Reports page. Please try again later."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
+#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
+msgid "There was a problem showing this page. Please try again later."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
+#: templates/web/base/auth/general.html:26
+#: templates/web/zurich/auth/general.html:28
+msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Alert.pm:355
+msgid "There was a problem with your email/password combination. Please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:272
+msgid "There was a problem with your update. Please try again."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
+msgid "There were problems with your report. Please see below."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:300
+msgid "There were problems with your update. Please see below."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:112
+#: templates/web/base/admin/body-form.html:113
+msgid ""
+"These settings are for bodies that use Open311 (or other back-end integration) to receive problem reports.<br>\n"
+" <strong>You don't need to set them if the Send Method is email.</strong>.\n"
+" For more information on Open311, see \n"
+" <a href='https://www.mysociety.org/2013/01/17/open311-explained/' class='admin-offsite-link'>this article</a>.\n"
+" "
+msgstr ""
+
+#: templates/web/base/open311/index.html:77
+msgid "This API implementation is work in progress and not yet stabilized. It will change without warnings in the future."
+msgstr ""
+
+#: templates/web/base/admin/body.html:44
+msgid ""
+"This body covers no area. This means that it has no jurisdiction over problems reported <em>at any location</em>.\n"
+" Consequently, none of its categories will appear in the drop-down category menu when users report problems.\n"
+" Currently, users <strong>cannot report problems to this body</strong>."
+msgstr ""
+
+#: templates/web/base/admin/body.html:54
+msgid "This body has no contacts. This means that currently problems reported to this body <strong>will not be sent</strong>."
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:52
+#: templates/web/base/admin/body-form.html:53
+msgid ""
+"This body will only be sent reports for problems that are located in the <strong>area covered</strong>.\n"
+" A body will not receive any reports unless it covers at least one area."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
+msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
+msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
+#: perllib/FixMyStreet/Cobrand/UK.pm:43
+msgid "This information is required"
+msgstr ""
+
+#: templates/web/base/debug_header.html:3
+msgid "This is a developer site; things might break at any time, and the database will be periodically deleted."
+msgstr ""
+
+#: templates/web/base/reports/index.html:7
+msgid "This is a summary of all reports on this site."
+msgstr ""
+
+#: templates/web/zurich/auth/token.html:8
+msgid "This may be because the link is too old or already used, or the address was not copied correctly."
+msgstr ""
+
+#: templates/web/base/report/banner.html:15
+msgid "This problem has been closed"
+msgstr ""
+
+#: templates/web/base/report/banner.html:12
+#: templates/web/base/report/update-form.html:48
+#: templates/web/fixmystreet/report/update-form.html:46
+msgid "This problem has been fixed"
+msgstr "Bu problem çözüldü"
+
+#: templates/web/base/report/update-form.html:43
+#: templates/web/fixmystreet/report/update-form.html:40
+msgid "This problem has not been fixed"
+msgstr ""
+
+#: templates/web/base/report/banner.html:19
+msgid "This problem is in progress"
+msgstr ""
+
+#: templates/web/base/report/banner.html:9
+msgid "This problem is old and of unknown status."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
+#: templates/web/zurich/report/_main.html:14
+msgid "This report is awaiting moderation."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
+msgid "This report is currently marked as closed."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
+msgid "This report is currently marked as fixed."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
+msgid "This report is currently marked as open."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
+msgid "This report was submitted anonymously"
+msgstr "Bu bildirim anonim olarak "
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
+msgid "This web page also contains a photo of the problem, provided by the user."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
+#: templates/web/base/admin/timeline.html:1
+msgid "Timeline"
+msgstr ""
+
+#: templates/web/base/admin/flagged.html:15
+#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
+msgid "Title"
+msgstr "Başlık"
+
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Başlık"
+
+#: templates/web/base/alert/index.html:25
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr ""
+
+#: templates/web/base/alert/index.html:27
+msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+msgid "To view a map of the precise location of this issue"
+msgstr ""
+
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/questionnaire.html:24
+#: templates/web/base/admin/stats.html:24
+#: templates/web/base/admin/stats.html:43
+#: templates/web/zurich/admin/stats.html:30
+msgid "Total"
+msgstr "Toplam"
+
+#: templates/web/base/js/translation_strings.html:29
+msgid "Try again"
+msgstr "Tekrar dene"
+
+#: templates/web/base/contact/submit.html:14
+msgid "Try emailing us directly:"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
+#: templates/web/base/report/update-form.html:30
+#: templates/web/base/report/update-form.html:33
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:31
+msgid "Unable to fix"
+msgstr ""
+
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
+#: templates/web/base/admin/update_edit.html:28
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
+#: templates/web/zurich/admin/update_edit.html:18
+msgid "Unconfirmed"
+msgstr ""
+
+#: templates/web/fixmystreet/report/banner.html:9
+msgid "Unknown"
+msgstr "Bilinmeyen"
+
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
+msgid "Unknown alert type"
+msgstr ""
+
+#: templates/web/base/js/translation_strings.html:39
+msgid "Unknown error"
+msgstr "Bilinmeyen hata"
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
+msgid "Unknown problem ID"
+msgstr ""
+
+#: templates/web/fixmystreet/report/update-form.html:19
+msgid "Update"
+msgstr "Güncelleme"
+
+#: templates/web/base/admin/timeline.html:33
+msgid "Update %s created for problem %d; by %s"
+msgstr ""
+
+#: templates/web/base/contact/index.html:21
+#: templates/web/fixmystreet/contact/index.html:36
+msgid "Update below added anonymously at %s"
+msgstr ""
+
+#: templates/web/base/contact/index.html:23
+#: templates/web/fixmystreet/contact/index.html:38
+msgid "Update below added by %s at %s"
+msgstr ""
+
+#: templates/web/base/admin/body-form.html:240
+#: templates/web/zurich/admin/body-form.html:52
+msgid "Update body"
+msgstr ""
+
+#: templates/web/base/admin/index.html:55
+msgid "Update breakdown by state"
+msgstr ""
+
+#: db/alert_types.pl:7
+msgid "Update by {{name}}"
+msgstr "{{name}} göre güncelleme"
+
+#: templates/web/base/admin/update_edit.html:42
+#: templates/web/zurich/admin/update_edit.html:25
+msgid "Update changed problem state to %s"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:44
+msgid "Update marked problem as fixed"
+msgstr ""
+
+#: templates/web/base/admin/update_edit.html:46
+msgid "Update reopened problem"
+msgstr ""
+
+#: templates/web/base/admin/body.html:101
+msgid "Update statuses"
+msgstr ""
+
+#: templates/web/base/report/update-form.html:22
+msgid "Update:"
+msgstr "Güncelleme:"
+
+#: templates/web/zurich/admin/index-dm.html:23
+#: templates/web/zurich/admin/index-sdm.html:21
+#: templates/web/zurich/admin/reports.html:13
+msgid "Updated"
+msgstr "Güncellendi"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
+msgid "Updated!"
+msgstr "Güncellendi!"
+
+#: templates/web/base/admin/list_updates.html:2
+#: templates/web/base/report/update.html:3
+#: templates/web/fixmystreet/report/update.html:5
+#: templates/web/zurich/report/updates.html:2
+msgid "Updates"
+msgstr "Güncellemeler"
+
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
+msgid "Updates are limited to %s characters in length. Please shorten your update"
+msgstr ""
+
+#: db/alert_types.pl:5 db/alert_types.pl:6
+msgid "Updates on {{title}}"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/report/display.html:0
+#: templates/web/base/report/display.html:5
+#: templates/web/fixmystreet/report/display.html:0
+#: templates/web/fixmystreet/report/display.html:9
+#, fuzzy
+msgid "Updates to this problem, %s"
+msgstr "%s Problemlerin güncellemelerini yap"
+
+#: templates/web/base/admin/body.html:182
+msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "kullanılan harita"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
+msgid "User flag removed"
+msgstr "Kullanıcı etiketi kaldırıldı"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
+msgid "User flagged"
+msgstr "Kullanıcı etiketlendi"
+
+#: templates/web/base/admin/users.html:5
+msgid "User search finds matches in users' names and email addresses."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
+#: templates/web/base/admin/flagged.html:29
+#: templates/web/zurich/header.html:69
+msgid "Users"
+msgstr "Kullanıcılar"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
+msgid "Values updated"
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:18
+#: templates/web/base/admin/update_edit.html:18
+#: templates/web/zurich/admin/report_edit-sdm.html:21
+#: templates/web/zurich/admin/report_edit.html:22
+#: templates/web/zurich/admin/update_edit.html:10
+msgid "View report on site"
+msgstr ""
+
+#: templates/web/base/reports/body.html:14
+msgid "View reports by ward"
+msgstr ""
+
+#: templates/web/base/around/display_location.html:0
+#: templates/web/base/around/display_location.html:35
+msgid "Viewing a location"
+msgstr ""
+
+#: templates/web/base/report/display.html:0
+#: templates/web/fixmystreet/report/display.html:0
+msgid "Viewing a problem"
+msgstr ""
+
+#: templates/web/base/reports/body.html:16
+msgid "Wards of this council"
+msgstr ""
+
+#: templates/web/base/alert/choose.html:6
+#: templates/web/base/around/_error_multiple.html:6
+msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
+msgstr ""
+
+#: templates/web/zurich/auth/token.html:7
+msgid "We have not been able to confirm your account - sorry."
+msgstr ""
+
+#: templates/web/zurich/auth/token.html:17
+msgid "We have sent you an email containing a link to confirm your account."
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:2
+#: templates/web/fixmystreet/report/update-form.html:77
+msgid "We never show your email"
+msgstr "E-posta adresiniz gizli tutulacaktır"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:31
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:65
+msgid "We never show your email address or phone number."
+msgstr "Telefon numaranızı ve e-posta adresinizi gizli tutulacaktır"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
+msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
+msgstr ""
+
+#: templates/web/base/index-steps.html:31
+msgid "We send it to the council on your behalf"
+msgstr "Sizin adınıza kurula gönderiyoruz"
+
+#: templates/web/base/report/new/notes.html:4
+#: templates/web/zurich/report/new/notes.html:4
+msgid "We will only use your personal information in accordance with our <a href=\"/privacy\">privacy policy.</a>"
+msgstr "Kişisel bilgileriniz sadece bizim <a href=\"/privacy\">gizlilik politikası</a> uyumluluğu çerçevesinde kullanılacaktır"
+
+#: templates/web/base/questionnaire/completed-open.html:2
+msgid "We&rsquo;re sorry to hear the problem’s not fixed. Why not try writing to your local representatives?"
+msgstr ""
+
+#: templates/web/base/contact/blurb.html:8
+msgid "We'd love to hear what you think about this site. Just fill in the form, or send an email to <a href='mailto:%s'>%s</a>:"
+msgstr ""
+
+#: templates/web/base/contact/submit.html:7
+msgid "We’ll get back to you as soon as we can."
+msgstr "Mümkün olan en kısa sürede size dönüş yapacağız."
+
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
+msgid "What’s the issue, and where is it?"
+msgstr "Konu ne ve nerede?"
+
+#: templates/web/base/admin/category_edit.html:90
+#: templates/web/zurich/admin/body.html:18
+msgid "When edited"
+msgstr "Yayınlandığında"
+
+#: templates/web/base/admin/problem_row.html:35
+msgid "When sent"
+msgstr "Gönderildiğinde"
+
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
+msgid "Whole block of empty flats"
+msgstr "Bütün boş daireler"
+
+#: templates/web/base/tokens/confirm_alert.html:7
+msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
+#: templates/web/base/open311/index.html:92
+msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
+msgstr ""
+
+#: templates/web/base/front/footer-marketing.html:17
+msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:87
+msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
+msgstr "Durumunu kontrol etmek için 4 hafta sonra bir anket yolu ile hatırlatma ister misiniz?"
+
+#: templates/web/base/report/new/notes.html:7
+msgid "Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation."
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:4
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:5
+msgid "Wrong location? Just click again on the map."
+msgstr "Yanlış konum mu? Harita üzerine tekrardan tıklayın."
+
+#: templates/web/base/admin/stats.html:10
+msgid "Year"
+msgstr "Yıl"
+
+#: templates/web/base/admin/bodies.html:66
+#: templates/web/base/admin/body.html:80 templates/web/base/admin/body.html:82
+#: templates/web/base/admin/body.html:86 templates/web/base/admin/body.html:88
+#: templates/web/base/admin/category_edit.html:5
+#: templates/web/base/admin/flagged.html:47
+#: templates/web/base/admin/list_updates.html:32
+#: templates/web/base/admin/list_updates.html:34
+#: templates/web/base/admin/list_updates.html:35
+#: templates/web/base/admin/problem_row.html:20
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/update_edit.html:24
+#: templates/web/base/admin/users.html:31
+#: templates/web/base/questionnaire/creator_fixed.html:14
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
+msgid "Yes"
+msgstr "Evet"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:17
+#: templates/web/fixmystreet/report/update-form.html:91
+msgid "Yes I have a password"
+msgstr "Evet ÅŸifrem var"
+
+#: templates/web/base/contact/index.html:39
+#: templates/web/fixmystreet/contact/index.html:54
+msgid "You are complaining that this problem report was unnecessarily moderated:"
+msgstr ""
+
+#: templates/web/base/contact/index.html:41
+#: templates/web/fixmystreet/contact/index.html:56
+msgid "You are reporting the following problem report for being abusive, containing personal information, or similar:"
+msgstr ""
+
+#: templates/web/base/contact/index.html:15
+#: templates/web/fixmystreet/contact/index.html:30
+msgid "You are reporting the following update for being abusive, containing personal information, or similar:"
+msgstr ""
+
+#: templates/web/zurich/tokens/confirm_problem.html:5
+#: templates/web/zurich/tokens/confirm_problem.html:8
+msgid "You can <a href=\"%s%s\">view the problem on this site</a>."
+msgstr "Problemi <a href=\"%s%s\">bu site üzerinde görüntüleyebilir siniz</a>."
+
+#: templates/web/base/admin/user-form.html:48
+msgid "You can add an abusive user's email to the abuse list, which automatically hides (and never sends) reports they create."
+msgstr "Kötü niyetli bir kullanıcının e-postasını otomatik olarak gizlenen (ve asla gönderilmeyen) raporların bulunduğu kara listeye ekleyebilirsiniz."
+
+#: templates/web/fixmystreet/contact/index.html:121
+msgid "You can contact technical support on <a href='mailto:%s'>%s</a>"
+msgstr "Teknik destek için <a href='mailto:%s'>%s</a> iletişime geçebilirsiniz."
+
+#: templates/web/base/admin/flagged.html:5
+msgid ""
+"You can flag any report or user by editing them, and they will be listed on this page.\n"
+" For example, this can useful if you want to keep an eye on a user who has posted inappropriate\n"
+" reports in the past."
+msgstr ""
+
+#: templates/web/base/report/new/councils_text_none.html:10
+#: templates/web/base/report/new/councils_text_none.html:2
+#: templates/web/base/report/new/councils_text_some.html:19
+#: templates/web/base/report/new/councils_text_some.html:21
+msgid "You can help us by finding a contact email address for local problems for %s and emailing it to us at <a href='mailto:%s'>%s</a>."
+msgstr "Lokal problemler için bize iletişim kurabileceğimiz e-posta adresi bularak bize yardımcı olabilirsiniz %s için ve bize <a href='mailto:%s'>%s</a>postalayarak."
+
+#: templates/web/base/admin/body-form.html:85
+msgid "You can mark a body as deleted if you do not want it to be active on the site."
+msgstr "Eğer bir bölümü sitede aktif olarak bulunsun istemiyorsanız, silindi olarak işaretleyebilir siniz."
+
+#: templates/web/base/js/translation_strings.html:36
+msgid "You declined; please fill in the box above"
+msgstr "Kabul etmediniz; lütfen yukardaki kutuyu doldurun"
+
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:38
+msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
+msgstr ""
+
+#: templates/web/base/questionnaire/index.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:75
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+msgid "You have already attached a photo to this report, attaching another one will replace it."
+msgstr "Bu rapor için daha önce bir fotoğraf eklediniz, eklediğiniz diğer fotoğraf onun yerine geçecektir."
+
+#: templates/web/base/report/update-form.html:59
+#: templates/web/fixmystreet/report/update-form.html:56
+msgid "You have already attached a photo to this update, attaching another one will replace it."
+msgstr "Bu güncelleme için daha önce bir fotoğraf eklediniz, eklediğiniz diğer fotoğraf onun yerine geçecektir."
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
+#: templates/web/base/auth/sign_out.html:4
+#: templates/web/zurich/auth/sign_out.html:3
+msgid "You have been signed out"
+msgstr "Çıkış yaptınız"
+
+#: templates/web/zurich/report/new/fill_in_details_form.html:13
+msgid "You have located the problem at the point marked with a green pin on the map. If this is not the correct location, simply click on the map again. "
+msgstr "Sorunun olduğu yeri harita üzerinde yeşil bir imge ile işaretlediniz. Eğer doğru yer değilse tekrar haritanın üzerine tıklayın."
+
+#: templates/web/zurich/tokens/confirm_problem.html:5
+#: templates/web/zurich/tokens/confirm_problem.html:6
+msgid "You have successfully confirmed your email address."
+msgstr "E-posta adresiniz başarıyla onaylandı."
+
+#: templates/web/base/report/display.html:20
+#: templates/web/base/report/new/fill_in_details.html:37
+#: templates/web/fixmystreet/report/display.html:17
+msgid "You have successfully signed in; please check and confirm your details are accurate:"
+msgstr "Başarılı bir şekilde giriş yaptınız; lütfen bilgilerinizi kontrol edin ve onaylayın"
+
+#: templates/web/base/my/my.html:20
+msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
+msgstr "Henüz herhangi bir bildirim oluşturmadınız. <a href=\"%s\">Şimdi sorun olarak bir bildiri .</a>"
+
+#: templates/web/base/admin/index.html:19
+msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
+msgstr "Rapor gönderilmeden önce<a href=\"%s\">bazı bölümler</a> (örneğin kurullar veya bölge müdürlüğü) eklenmeli. "
+
+#: templates/web/base/admin/bodies.html:7
+msgid ""
+"You need to add bodies (such as councils or departments) so that you can then add\n"
+" the categories of problems they can handle (such as potholes or streetlights) and the\n"
+" contacts (such as an email address) to which reports are sent."
+msgstr ""
+
+#: templates/web/base/admin/report_edit.html:67
+msgid "You really want to resend?"
+msgstr "Tekrardan göndermek istiyor musun?"
+
+#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
+#: templates/web/base/my/my.html:4
+msgid "Your Reports"
+msgstr "Bildirimlerin"
+
+#: templates/web/base/alert/_list.html:89
+#: templates/web/fixmystreet/alert/updates.html:19
+#: templates/web/fixmystreet/alert/updates.html:22
+#: templates/web/fixmystreet/contact/index.html:91
+#: templates/web/fixmystreet/report/display.html:62
+#: templates/web/fixmystreet/report/display.html:64
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
+#: templates/web/fixmystreet/report/update-form.html:76
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
+msgid "Your email"
+msgstr "E-posta adresiniz"
+
+#: templates/web/base/auth/general.html:28
+#: templates/web/fixmystreet/report/update-form.html:82
+#: templates/web/zurich/auth/general.html:30
+#: templates/web/zurich/auth/general.html:58
+msgid "Your email address"
+msgstr "E-posta adresin"
+
+#: templates/web/base/report/new/fill_in_details_form.html:106
+#: templates/web/base/report/update-form.html:81
+msgid "Your email:"
+msgstr "E-posta adresiniz:"
+
+#: templates/web/fixmystreet/report/updates-sidebar-notes.html:7
+msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
+msgstr "Bilgileriniz sadece bizim <a href=\"/privacy\">gizlilik politikası</a> uyumluluğu çerçevesinde kullanılacaktır"
+
+#: templates/web/base/auth/general.html:51
+#: templates/web/fixmystreet/contact/index.html:84
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
+#: templates/web/fixmystreet/report/update-form.html:142
+#: templates/web/zurich/auth/general.html:61
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
+msgid "Your name"
+msgstr "Adınız"
+
+#: templates/web/base/contact/index.html:73
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
+msgid "Your name:"
+msgstr "Adınız:"
+
+#: templates/web/base/auth/general.html:39
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
+#: templates/web/fixmystreet/report/update-form.html:96
+#: templates/web/zurich/auth/general.html:34
+msgid "Your password"
+msgstr "Åžifreniz"
+
+#: templates/web/base/auth/change_password.html:6
+msgid "Your password has been changed"
+msgstr "Åžifren deÄŸiÅŸtirildi"
+
+#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
+#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
+msgid "Your phone number"
+msgstr "Telefon numaran"
+
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
+msgid "Your reports"
+msgstr "Bildirimlerin"
+
+#: templates/web/base/my/my.html:41
+msgid "Your updates"
+msgstr "Güncellemelerin"
+
+#: templates/web/base/contact/index.html:81
+msgid "Your&nbsp;email:"
+msgstr "Sizin&nbsp;e-posta:"
+
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Tüm bildirimler"
+
+#: templates/web/base/admin/timeline.html:4
+msgid "by %s"
+msgstr "%s tarafından"
+
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Tamamlanmış raporlar"
+
+#: templates/web/base/reports/body.html:6
+#: templates/web/base/reports/body.html:7
+msgid "council"
+msgstr "Kurul"
+
+#: templates/web/base/admin/report_edit.html:32
+msgid "didn't use map"
+msgstr "harita kullanılmamış"
+
+#: templates/web/base/alert/index.html:33
+#: templates/web/base/around/postcode_form.html:15
+msgid "e.g. ‘%s’ or ‘%s’"
+msgstr "ör. ‘%s’ veya ‘%s’"
+
+#: templates/web/base/admin/body-form.html:188
+#: templates/web/base/admin/flagged.html:51
+msgid "edit user"
+msgstr "kullanıcı düzenle"
+
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Çözülmüş bildirimler"
+
+#: templates/web/base/admin/index.html:33
+#: templates/web/zurich/admin/index.html:5
+msgid "from %d different users"
+msgstr " %d farklı kullanıcılardan"
+
+#: templates/web/base/report/_item.html:17
+#: templates/web/zurich/report/_item.html:16
+msgid "last updated %s"
+msgstr "son güncelleme %s"
+
+#: perllib/Utils.pm:204
+msgid "less than a minute"
+msgstr "bir dakikadan az"
+
+#: templates/web/base/report/updates.html:57
+msgid "marked as a duplicate report"
+msgstr "tekrarlanmış bildirim olarak işaretle"
+
+#: templates/web/base/report/updates.html:47
+msgid "marked as action scheduled"
+msgstr "planlanan eylem olarak iÅŸaretle"
+
+#: templates/web/base/report/updates.html:59
+msgid "marked as an internal referral"
+msgstr "bir iç yönlendirme olarak işaretle"
+
+#: templates/web/base/report/updates.html:49
+msgid "marked as closed"
+msgstr "kapandı olarak işaretle"
+
+#: templates/web/base/report/updates.html:28
+#: templates/web/base/report/updates.html:51
+msgid "marked as fixed"
+msgstr "Onarıldı olarak işaretle"
+
+#: templates/web/base/report/updates.html:45
+msgid "marked as in progress"
+msgstr "Devam etmekte olarak iÅŸaretle"
+
+#: templates/web/base/report/updates.html:41
+msgid "marked as investigating"
+msgstr "araştırılıyor olarak işaretle"
+
+#: templates/web/base/report/updates.html:55
+msgid "marked as not the council's responsibility"
+msgstr "Kurulun sorumluluğu dışında olarak işaretle"
+
+#: templates/web/base/report/updates.html:43
+msgid "marked as planned"
+msgstr "Planlandı olarak işaretle"
+
+#: templates/web/base/report/updates.html:53
+msgid "marked as unable to fix"
+msgstr "onarılamaz olarak işaretle"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
+#: templates/web/base/admin/questionnaire.html:15
+#: templates/web/base/admin/questionnaire.html:16
+msgid "n/a"
+msgstr "n/a"
+
+#: templates/web/base/alert/_list.html:85
+msgid "or"
+msgstr "veya"
+
+#: templates/web/base/js/translation_strings.html:27
+msgid "or locate me automatically"
+msgstr "veya beni otomatik olarak bul"
+
+#: templates/web/base/admin/report_edit.html:28
+#: templates/web/base/admin/report_edit.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
+#: templates/web/zurich/admin/report_edit.html:50
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
+msgid "originally entered: &ldquo;%s&rdquo;"
+msgstr "özgün giriş: &ldquo;%s&rdquo;"
+
+#: templates/web/base/admin/report_edit.html:43
+msgid "other areas:"
+msgstr "diğer bölgeler:"
+
+#: templates/web/base/report/updates.html:29
+#: templates/web/base/report/updates.html:39
+msgid "reopened"
+msgstr "yeniden açıldı"
+
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
+msgid "sign out"
+msgstr "çıkış yap"
+
+#: templates/web/base/report/new/fill_in_details_form.html:12
+#: templates/web/base/report/new/fill_in_details_form.html:15
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:10
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+msgid "the local council"
+msgstr "ilgili yerel kurul "
+
+#: templates/web/base/report/_main.html:57
+#: templates/web/zurich/report/_main.html:5
+msgid "there is no pin shown as the user did not use the map"
+msgstr "Kullanıcı haritayı kullanmadığından herhangi bir işaret görünmüyor"
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
+msgid "this type of local problem"
+msgstr "bu tip lokal problem"
+
+#: perllib/Utils.pm:176
+msgid "today"
+msgstr "bugün"
+
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Çözülmüş bildirimler"
+
+#: templates/web/base/admin/report_edit.html:32
+msgid "used map"
+msgstr "kullanılan harita"
+
+#: templates/web/base/admin/update_edit.html:35
+msgid "user is from same council as problem - %d"
+msgstr "kullanıcının problemi - %d kuruldaki problemle aynı"
+
+#: templates/web/base/admin/update_edit.html:38
+msgid "user is problem owner"
+msgstr "kullanıcı problemin sahibi"
+
+#: templates/web/base/reports/body.html:0
+#: templates/web/base/reports/body.html:3
+msgid "ward"
+msgstr "bölge"
+
+#: templates/web/base/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] "<big>%s</big> son bildirimler"
+
+#: perllib/Utils.pm:223
+#, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d saat"
+
+#: templates/web/base/report/_support.html:6
+#, perl-format
+msgid "%d supporter"
+msgid_plural "%d supporters"
+msgstr[0] "%d destekçiler"
+
+#: perllib/Utils.pm:225
+#, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d dakika"
+
+#: templates/web/base/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] "<big>%s</big> bildirimlerin güncellemeleri"
+
+#: templates/web/emptyhomes/report/new/councils_text_none.html:3
+#, perl-format
+msgid "We do not yet have details for the council that covers this location."
+msgid_plural "We do not yet have details for the councils that cover this location."
+msgstr[0] " Bahsettiğiniz alanı kapsayan ilgili kurul hakkında detaylı bilgimiz yok."
+
+#: perllib/Utils.pm:219
+#, perl-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d hafta"
+
+#: templates/web/base/front/stats.html:12
+#, perl-format
+msgid "<big>%s</big> report in past week"
+msgid_plural "<big>%s</big> reports in past week"
+msgstr[0] "<big>%s</big> geçen haftaki bildirimler"
+
+#: templates/web/base/front/stats.html:23
+#, perl-format
+msgid "<big>%s</big> fixed in past month"
+msgid_plural "<big>%s</big> fixed in past month"
+msgstr[0] "<big>%s</big> geçen ay onarıldı"
+
+#: perllib/Utils.pm:221
+#, perl-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d gün"
+
+#: templates/web/base/report/new/councils_text_some.html:13
+#, perl-format
+msgid "We do <strong>not</strong> yet have details for the other council that covers this location."
+msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
+msgstr[0] "Bahsettiğiniz alanı kapsayan ilgili diğer kurullar hakkında henüz detaylı bilgimiz <strong>yok</strong>"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr ""
+#~ "(Merak etmeyin &mdash; e-postalarınızı kontrol ederken \n"
+#~ "sizin bildirinizi askıda tutacagız."
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Merak etmeyin &mdash; e-postalarınızı kontrol ederken sizin sorun raporunuzu askıda tutacağız) "
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Merak etmeyin &mdash; e-postalarınızı kontrol ederken sizin güncellemelerinizi askıda tutacagız)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Haritayı göremiyosanız, <a href='%s' rel='nofollow'>bu adımı atlayın</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>Hayır</strong>, yok, e-posta yoluyla giriş yapmama izin ver:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Sen bir<strong>geliştirici misin</strong>? FixMyStreet'e katkıda bulunmak ister misiniz? "
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Çevredeki en yakın sorunlar <small>(within&nbsp;%skm)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "FixMyStreet'e ulaşın"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "FixMyBarangay şifreniz var mıdır?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet yönetimi:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Bunu yapmazsanız, alarm aktif olmayacaktır."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Bunu yapmazsanız, sorun iletilmeyecektir."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Bunu yapmazsanız, güncellemeleriniz iletilmeyecektir."
+
+#~ msgid "New update:"
+#~ msgstr "Yeni güncelleme:"
+
+#~ msgid "No problems found."
+#~ msgstr "Sorun bulunamadı."
+
+#~ msgid "Sign in by email"
+#~ msgstr "Email ile giriÅŸ yap"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "%s olarak giriş yapın"
+
+#~ msgid "User"
+#~ msgstr "Kullanıcı"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "E-posta yoluyla size gönderdiğimiz linki tıklamalısınız"
+
+#~ msgid "Your email address:"
+#~ msgstr "E-posta adresin:"
+
+#~ msgid "Your report"
+#~ msgstr "Bildirimin"
diff --git a/locale/uk_UA.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/uk_UA.UTF-8/LC_MESSAGES/FixMyStreet.po
index 3e9a381c9..64dbabe17 100644
--- a/locale/uk_UA.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/uk_UA.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -10,18 +10,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/fixmystreet/language/uk_UA/)\n"
+"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/mysociety/fixmystreet/language/uk_UA/)\n"
"Language: uk_UA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "Ñ–"
@@ -34,11 +34,13 @@ msgstr "Ñ–"
msgid " or "
msgstr "або"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d підтверджених Ñповіщень, %d непідтверджених"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d контактів рад &ndash; %d підтверджених, %d непідтверджених"
@@ -47,11 +49,13 @@ msgstr "%d контактів рад &ndash; %d підтверджених, %d Ð
msgid "%d edits by %s"
msgstr "%d редагувань від %s"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d оперативних Ñповіщень"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d опитувань надіÑлано &ndash; на %d відповіли (%s%%)"
@@ -64,15 +68,47 @@ msgstr "%d до %d з %d"
msgid "%s - Summary reports"
msgstr "%s - підÑумкових звітів"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s поÑиланнÑ:&nbsp;%s"
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s район, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s, Ñповіщено о %s"
@@ -84,59 +120,57 @@ msgstr "%s, в межах %s району"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr ""
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "(поштова Ñкринька в чорному ÑпиÑку)"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "Ваше ім'Ñ"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "Ваш телефон"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "(відÑтань по-замовчуванню, що покриває близько 200.000 людей)"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "(alternatively the RSS feed can be customised, within"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(закрито)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(полагоджено)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(графіті, ÑміттÑ, крива бруківка, проблеми з вуличним оÑвітленнÑм тощо)"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "(не відправлено муніципалітету)"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(вибірково)"
@@ -144,25 +178,24 @@ msgstr "(вибірково)"
msgid "(public)"
msgstr ""
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "(відправлено обидвом)"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(ми не публікуєм вашу електронну адреÑу Ñ– номер телефону)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(ми не публікуєм вашу поштову адреÑу)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "-- Оберіть категорію --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "-- Оберіть тип майна --"
@@ -178,12 +211,14 @@ msgstr ""
" This is probably why \"area covered\" is empty (below).<br>\n"
" Maybe add some <code>MAPIT_TYPES</code> to your config file?"
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>Якщо ви не бачите мапу, <a href='%s' rel='nofollow'>пропуÑтіть цей крок</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> актуальні проблеми"
@@ -196,28 +231,22 @@ msgstr "<strong>ÐÑ–</strong> Я підтверджу ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ðµ-п
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>ÐÑ–</strong> Я підтверджу Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ðµ-поштою"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>ÐÑ–</strong> Ñ Ð·Ð°Ð»Ð¾Ð³Ñ–Ð½ÑŽÑÑŒ через е-пошту"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>ÐÑ–</strong>, Ñ Ð·Ð°Ð»Ð¾Ð³Ñ–Ð½ÑŽÑÑŒ через е-пошту"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>ÐÑ–</strong>, Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñƒ ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ðµ-поштою"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>ÐÑ–</strong>, Я підтверджу Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ðµ-поштою:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -228,8 +257,8 @@ msgstr "<strong>Так</strong> В мене є пароль"
msgid "About us"
msgstr "Про наÑ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -251,7 +280,7 @@ msgstr "Додати контакт через форму нижче."
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "Додати запиÑ"
@@ -264,10 +293,15 @@ msgstr "Додати нову категорію"
msgid "Add user"
msgstr "Додати кориÑтувача"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "Додано %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "Очікує перевірки модератором"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "Ще раз:"
@@ -280,21 +314,25 @@ msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ %d Ñтворено Ð´Ð»Ñ %s, type %s, парамÐ
msgid "Alert %d disabled (created %s)"
msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ %d відключено (Ñтворено %s)"
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "ПовідомлÑти мене про оновленнÑ"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "Ð’ÑÑ– звіти"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "Ð’ÑÑ– звіти"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "Ð’ÑÑ– звіти"
@@ -317,8 +355,7 @@ msgstr "Ð’ÑÑŽ надану інформацію буде надіÑлано дÐ
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "Ð’ÑÑŽ надану інформацію буде надіÑлано до <strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¼Ñ–Ñ‚Ð¸Ð»Ð¾ цю проблему Ñк вирішену."
@@ -327,16 +364,12 @@ msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¼Ñ–Ñ‚Ð¸Ð»Ð¾ цю проблему Ñк вирÑ
msgid "Anonymous"
msgstr "Ðнонім"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "Ðнонім:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "Ви <strong>розробник</strong>? Хочете долучитиÑÑŒ до проекту?"
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "Ви розробник?"
@@ -351,22 +384,25 @@ msgstr "Зона покрита"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "Ðазначити зовнішньому відділу:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "Ðазначити іншу категорію:"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "Ðазначити зовнішньому відділу:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "Ðазначити підрозділу:"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "Ðазначити %s"
@@ -387,12 +423,12 @@ msgstr "Очікує перевірки модератором"
msgid "Back"
msgstr "Ðазад"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "Забанити адреÑу"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "Органи"
@@ -412,12 +448,16 @@ msgstr "Орган:"
msgid "By Date"
msgstr "По даті"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "Ðе бачите мапу? <em>ПропуÑтіть цей крок</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -428,27 +468,28 @@ msgstr "Ðе бачите мапу? <em>ПропуÑтіть цей крок</em
msgid "Category"
msgstr "КатегоріÑ"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Ð’ цій категорії проблеми не вирішуютьÑÑ > 4 тижнів"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "КатегоріÑ:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "КатегоріÑ: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "Змінити пароль"
@@ -483,54 +524,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr ""
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "ÐатиÑніть тут або введіть в форматі дд/мм/рррр"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "ÐатиÑніть на точку на мапі щоб прозвітувати проблему"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "Закрито"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "Закрито муніципалітетом"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "Закриті звіти"
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "Закрито:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "Ðайближчі проблеми <small>(в межах&nbsp;%sкм)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "Погоджувачы:"
@@ -538,22 +585,22 @@ msgstr "Погоджувачы:"
msgid "Cobrand"
msgstr "Cobrand"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "Cobrand data:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "Cobrand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "КонфігураціÑ"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "Ðалаштувати ендпойнт"
@@ -561,7 +608,7 @@ msgstr "Ðалаштувати ендпойнт"
msgid "Confirm"
msgstr "Підтвердити"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "Підтвердити запиÑ"
@@ -581,7 +628,7 @@ msgstr "ПідтвердженнÑ"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "Підтверджено"
@@ -592,13 +639,18 @@ msgstr "Підтверджені звіти з %s по %s"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "Підтверджені:"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "ЗвернутиÑÑŒ до FixMyStreet"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "Зворотній звÑзок"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -613,8 +665,14 @@ msgstr "Зворотній звÑзок"
msgid "Contact the team"
msgstr "ЗвернутиÑÑŒ до команди"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "Погоджувачы:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "Ðе вдалоÑÑŒ знайти кориÑтувача"
@@ -632,7 +690,7 @@ msgstr "Рада"
msgid "Council contacts for %s"
msgstr "Контакти ради Ð´Ð»Ñ %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "рада ref:&nbsp;%s"
@@ -647,7 +705,7 @@ msgstr "Рада:"
msgid "Count"
msgstr "ЧиÑло"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "Створити ÑповіщеннÑ"
@@ -656,17 +714,19 @@ msgstr "Створити ÑповіщеннÑ"
msgid "Create category"
msgstr "Створити категорію"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "Створити ÑповіщеннÑ"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "Створено"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "Створено:"
@@ -676,10 +736,15 @@ msgid "Current state"
msgstr "Поточний Ñтан"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "Ðаразі жодних органів не було Ñтворено"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -689,11 +754,16 @@ msgstr "Дашборд"
msgid "Dealt with by subdivision within 5 working days"
msgstr "Dealt with by subdivision within 5 working days"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "Видалено"
@@ -711,9 +781,9 @@ msgstr "Подробиці"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "Подробиці:"
@@ -721,23 +791,27 @@ msgstr "Подробиці:"
msgid "Devolved"
msgstr "Передано"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "не викориÑтовував карту"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð½Ð°Ð¹Ñтаранніших призерів"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "Ви маєте пароль до FixMyBarangay?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "Ви маєте пароль до FixMyStreet?"
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "Ðе знаю"
@@ -745,8 +819,8 @@ msgstr "Ðе знаю"
msgid "Don't like forms?"
msgstr "Ðе любите форми?"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -765,7 +839,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "Редагувати"
@@ -776,7 +851,7 @@ msgstr "Редагувати дані про орган"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -791,15 +866,15 @@ msgstr "Редагуємо Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %d"
msgid "Editing user %d"
msgstr "Редагуємо кориÑтувача %d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "Редактор"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -807,7 +882,7 @@ msgstr "Редактор"
msgid "Email"
msgstr "Е-пошта"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "Пошта занеÑена в чорний ÑпиÑок"
@@ -823,7 +898,7 @@ msgstr ""
msgid "Email alert deleted"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "ÐдреÑа вже в чорному ÑпиÑку"
@@ -836,38 +911,36 @@ msgid "Email me updates"
msgstr "ÐадÑилайте мені новини"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "Е-пошта:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "Е-пошта: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ ÐºÐ²Ð°Ñ€Ñ‚Ð¸Ñ€Ð° або дворівнева"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "Порожній будинок або бунгало"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "Порожній Ð¾Ñ„Ñ–Ñ Ð°Ð±Ð¾ інше комерційне приміщеннÑ"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "Порожній паб або бар"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ Ð³Ñ€Ð¾Ð¼Ð°Ð´Ñька Ð±ÑƒÐ´Ñ–Ð²Ð»Ñ - школа, Ð»Ñ–ÐºÐ°Ñ€Ð½Ñ Ñ‚Ð° ін."
@@ -896,7 +969,7 @@ msgstr "Кінцева дата:"
msgid "Endpoint"
msgstr "Кінцева точка"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr ""
@@ -909,10 +982,8 @@ msgstr "Вкажіть поштовий код UK або назву вулиці
msgid "Enter a nearby postcode, or street name and area"
msgstr "Введіть найближчу поштову адреÑу, або назву вулиці чи району"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "Введіть назву вулиці чи району поблизу"
@@ -920,13 +991,12 @@ msgstr "Введіть назву вулиці чи району поблизу"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr ""
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "Введіть новий пароль:"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -937,7 +1007,6 @@ msgstr "Введіть пароль"
msgid "Enter details of the problem"
msgstr "Введіть подробиці проблеми"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -947,6 +1016,10 @@ msgstr "Введіть подробиці проблеми"
msgid "Error"
msgstr "Помилка"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -960,12 +1033,19 @@ msgstr "Приклади:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "Додаткові дані:"
@@ -978,8 +1058,7 @@ msgstr ""
msgid "Filter report list"
msgstr "Фільтрувати ÑпиÑок звітів"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "Ім&rsquo;Ñ"
@@ -987,36 +1066,14 @@ msgstr "Ім&rsquo;Ñ"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "Полагодіть це вибравши <strong>зону покриттÑ</strong> в <em>формі Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ€Ð³Ð°Ð½Ñƒ </em> нижче."
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet admin:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1027,21 +1084,16 @@ msgstr ""
msgid "Fixed"
msgstr "Вирішено"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "Вирішено - Рада"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "Вирішено - КориÑтувач"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "Звіти про вирішені проблеми"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "Вирішено:"
@@ -1051,11 +1103,11 @@ msgstr "Вирішено:"
msgid "Flag as deleted"
msgstr "Відмітьте Ñк видалене"
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "Відмітьте кориÑтувача"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "Відмічено"
@@ -1072,7 +1124,7 @@ msgstr "Відмічені кориÑтувачі випиÑані на <a href=
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "Відмічені кориÑтувачі не заборонені. Це проÑто ÑпиÑок кориÑтувачів, Ñкі потребують уваги."
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "Відмічено:"
@@ -1091,9 +1143,22 @@ msgstr "For more information, see <a href='http://fixmystreet.org/customising/fm
msgid "Forgotten your password?"
msgstr "Забули пароль?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "Ðазначити зовнішньому відділу:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "Ðазначити зовнішньому відділу:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "ЧаÑто задавані питаннÑ"
@@ -1116,8 +1181,7 @@ msgstr "Отримувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ %s проблем"
msgid "Get updates of problems in this %s"
msgstr "Отримувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ проблеми в %s"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Дайте RSS фід"
@@ -1126,17 +1190,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr ""
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "Вперед"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "ЗбираєтеÑÑŒ відправити опитувальник?"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "Графік ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ з чаÑом"
@@ -1144,41 +1208,37 @@ msgstr "Графік ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ з чаÑом"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "Сірі лінії - органи, що більше не Ñ–Ñнують"
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "Проблему було вирішено?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "Ви вже Ñповіщали про проблеми раніше, чи це вперше?"
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "Допомога"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "От типи локальних Ñповіщень про проблеми Ð´Ð»Ñ &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "Вітаємо, %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1192,7 +1252,7 @@ msgstr "Приховати заÑтарілі"
msgid "Hide pins"
msgstr "Приховати привÑзки"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "ІÑторіÑ"
@@ -1208,7 +1268,7 @@ msgstr "Як ÑповіÑтити про проблему"
msgid "How to send successful reports"
msgstr "Як надіÑлати ÑкіÑне ÑповіщеннÑ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Ðажаль ви не можете підтвердити непідтверджені ÑповіщеннÑ"
@@ -1235,8 +1295,8 @@ msgstr "Ðажаль ми не можем валідувати цей токен
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "Ідентифікатор"
@@ -1258,18 +1318,6 @@ msgstr ""
"Якщо два чи більше органи обÑлуговують певний регіон, ÑÐµÑ€Ð²Ñ–Ñ Ñполучає ідентичні категорії в один запиÑ\n"
" в меню. ПереконайтеÑÑŒ, що ви викориÑтовуєте однакові назви категорій Ñкщо хочете, щоб це ÑталоÑÑŒ."
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "Якщо ні, ваше ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ðµ буде активовано."
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "Якщо ні, ваша проблема не буде прозвітована."
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "Якщо ні, ваше Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ буде опубліковано."
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr ""
@@ -1279,16 +1327,16 @@ msgstr ""
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "Якщо ви відправите проблему тут, то тема і подробиці проблеми будуть публічними, але проблема <strong>не буде</strong> відправлена департаментам."
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "Якщо ви кориÑтуєтеÑÑŒ онлайн-поштовиком або маєте Ñпам-фільтр, перевірте папку Ñпам: інколи наші Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ð°Ð¿Ð»Ñють в цю категорію."
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr "Якщо ви хочете додати ÑкуÑÑŒ публічну інформацію про проблему, введіть Ñ—Ñ— тут (зауважте, що Ñ†Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð½Ðµ буде надіÑлана департаментам). Ðаприклад, розкажіть Ñки кроками була вирішена проблема."
#: templates/web/base/admin/body.html:149
@@ -1318,7 +1366,7 @@ msgid ""
" when they are shown on the site. Enter the ID (number) of that user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "Ðевірний ідентифікатор"
@@ -1343,14 +1391,13 @@ msgstr "Ð’ чорний ÑпиÑок?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "Ð’ процеÑÑ–"
@@ -1358,7 +1405,7 @@ msgstr "Ð’ процеÑÑ–"
msgid "Inbox zero, here we come!"
msgstr ""
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "Додати оÑобиÑті дані автора ÑповіщеннÑ"
@@ -1370,12 +1417,12 @@ msgstr "Включити непідтверджені ÑповіщеннÑ"
msgid "Incorrect has_photo value \"%s\""
msgstr "Ðевірне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ has_photo \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "Внутрішні нотатки"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "Внутрішнє поÑиланнÑ"
@@ -1383,7 +1430,7 @@ msgstr "Внутрішнє поÑиланнÑ"
msgid "Invalid agency_responsible value %s"
msgstr "Ðевірне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ agency_responsible %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "Ðевірна кінцева дата"
@@ -1391,12 +1438,12 @@ msgstr "Ðевірна кінцева дата"
msgid "Invalid format %s specified."
msgstr "Ðевірний формат %s ."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "Ðевірна початкова дата"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1414,10 +1461,19 @@ msgstr ""
msgid "It’s on its way to the council right now."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1429,7 +1485,7 @@ msgstr "Запам'Ñтати мене на цьому комп'ютері"
msgid "Last editor"
msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²ÐºÐ°"
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "ОÑтаннє поновленнÑ:"
@@ -1464,7 +1520,7 @@ msgstr "Локальний RSS потік та поштові Ñповіщенн
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "Локальний RSS потік та поштові ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ â€˜%s’"
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "Локальні ÑповіщеннÑ"
@@ -1477,14 +1533,12 @@ msgid "MAP"
msgstr "Мапа"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr ""
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "позначено закритим"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1502,6 +1556,16 @@ msgstr ""
msgid "Message"
msgstr "ПовідомленнÑ"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "Ðазначити зовнішньому відділу:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "Ðазначити зовнішньому відділу:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "ПовідомленнÑ:"
@@ -1529,27 +1593,25 @@ msgstr "Ще проблеми поблизу"
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "Ім'Ñ"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "Ім'Ñ:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "Ім'Ñ: %s"
@@ -1562,12 +1624,12 @@ msgstr "Ðайближча дорога до шпильки на карті (аÐ
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "Ðайближчий поштовий Ñ–Ð½Ð´ÐµÐºÑ Ð´Ð¾ шпильки на карті (автоматично згенеровано): %s (відÑтань: %sм)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "Ðайближча дорога до шпильки на карті (автоматично згенеровано через Bing карти): %s%s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1575,10 +1637,15 @@ msgstr ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "Майже закінчили! Тепер перевірте вашу е-пошту..."
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "Майже закінчили! Тепер перевірте вашу е-пошту..."
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "Ðові <br>проблеми"
@@ -1587,12 +1654,12 @@ msgstr "Ðові <br>проблеми"
msgid "New body added"
msgstr "Ðовий орган додано"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "Ðовий контакт категорії додано"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "Ðовий внутрішній нотаток:"
@@ -1600,9 +1667,10 @@ msgstr "Ðовий внутрішній нотаток:"
msgid "New local problems on FixMyStreet"
msgstr "Ðові міÑцеві проблеми"
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr ""
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "Ðовий внутрішній нотаток:"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1628,33 +1696,15 @@ msgstr "Ðові проблеми в межах {{NAME}}"
msgid "New reports"
msgstr "Ðові ÑповіщеннÑ"
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr ""
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr ""
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "Ðовий Ñтан"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "ПоновленнÑ:"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "Ðовий Ñтан"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1667,14 +1717,12 @@ msgstr "Далі"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "ÐÑ–"
@@ -1702,20 +1750,11 @@ msgstr "Ðе знайдено маркованих проблем"
msgid "No flagged users found."
msgstr "Ðе знайдено маркованих кориÑтувачів"
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "Подальші Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñутні"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "Проблем не знайдено"
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "Про проблеми ще не ÑповіÑтили."
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "ÐÑ–Ñкого результату не повернено"
@@ -1733,8 +1772,6 @@ msgid "No supporters"
msgstr "Ðіхто не підтримав"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "Ðічого"
@@ -1747,8 +1784,8 @@ msgid ""
" activity across their body), the ability to hide reports or set special report statuses."
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1756,7 +1793,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "Ðе відповідальний"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "Ðе відповідальний"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "Ðе мій підрозділ"
@@ -1769,7 +1814,7 @@ msgid "Not reported to council"
msgstr "Ðе прозвітовано департаменту"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "Ðотатка"
@@ -1779,7 +1824,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "Зауважте, коли включаєм непідтвердженне ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¼Ð¸ викориÑтовуєм дату ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑповіщеннÑ. Вона може відрізнÑтиÑÑŒ від дати Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÑповіщеннÑ, тому цифри в датах можуть трошки Ñтрибати."
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "Ðотатка:"
@@ -1788,22 +1833,20 @@ msgstr "Ðотатка:"
msgid "Note: <strong>%s</strong>"
msgstr "Ðотатка: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "Тепер відправити ваше ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ &hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "Тепер щоб відправити ваше ÑповіщеннÑ&hellip; у Ð²Ð°Ñ Ñ” пароль?"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "Тепер щоб відправити ваше поновленнÑ&hellip;"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "Тепер щоб відправити ваше поновленнÑ&hellip; у Ð²Ð°Ñ Ñ” пароль?"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "Гаразд"
@@ -1833,20 +1876,18 @@ msgstr "Старіші <br>проблеми"
msgid "One-line summary"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "Відкрити"
@@ -1854,11 +1895,6 @@ msgstr "Відкрити"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "Відкрити ÑповіщеннÑ"
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1875,32 +1911,26 @@ msgstr ""
msgid "Open311 specification"
msgstr ""
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "Ðбо проблеми прозвітовані до:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "Ðбо ви можете підпиÑатиÑÑŒ на алÑрми відноÑно вашого району чи департаменту:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "Інше"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "ВлаÑник"
@@ -1915,12 +1945,12 @@ msgstr "Сторінку не знайдено"
msgid "Parent"
msgstr "Предок"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "ЧаÑтково"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1929,6 +1959,7 @@ msgid "Password (optional)"
msgstr "Пароль (опціонально)"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "Пароль:"
@@ -1936,7 +1967,7 @@ msgstr "Пароль:"
msgid "Permalink"
msgstr "ПоÑтійне поÑиланнÑ"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "Ðомер телефону"
@@ -1945,11 +1976,9 @@ msgstr "Ðомер телефону"
msgid "Phone number (optional)"
msgstr "Ðомер телефону (опціонально)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "Телефон:"
@@ -1960,14 +1989,23 @@ msgstr "Телефон:"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "Фото"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð¾Ð²'Ñзкова"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð¾Ð²'Ñзкова"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "Фото:"
@@ -1979,22 +2017,18 @@ msgstr "Фотографії найближчих Ñповіщень"
msgid "Place pin on map"
msgstr "РозміÑтіть шпильку на карті"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "Заплановано"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "Будь лаÑка <a class=\"tab_link\" href=\"#report\">переглÑньте</a> поновленнÑ, Ñкі залишилиÑÑŒ"
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "Будь лаÑка будьте ввічливим, виразним Ñ– виÑловлюйтеÑÑŒ по Ñправі."
@@ -2004,22 +2038,20 @@ msgstr "Будь лаÑка будьте ввічливим, виразним Ñ–
msgid "Please check the passwords and try again"
msgstr "Будь лаÑка перевірте пароль Ñ– Ñпробуйте ще раз"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "Будь лаÑка перевірте вашу пошту"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "Будь лаÑка перевірте чи ваша адреÑа е-пошти вірна"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2029,7 +2061,7 @@ msgstr "Будь лаÑка оберіть категорію"
msgid "Please choose a property type"
msgstr "Будь лаÑка оберіть тип майна"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr ""
@@ -2037,7 +2069,7 @@ msgstr ""
#: templates/web/fixmystreet/contact/blurb.html:12
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
@@ -2046,7 +2078,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "Будь лаÑка не викориÑтовуйте образи&nbsp;&mdash; ображаючи департамент ві підриваєте цінніÑть ÑервіÑу Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів"
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "Будь лаÑка введіть повідомленнÑ"
@@ -2057,15 +2089,15 @@ msgstr "Будь лаÑка введіть повідомленнÑ"
msgid "Please enter a password"
msgstr "Будь лаÑка введіть пароль"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "Будь лаÑка вкажіть тему"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2073,7 +2105,7 @@ msgid "Please enter a valid email"
msgstr "Будь лаÑка введіть правильну адреÑу е-пошти"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "Будь лаÑка введіть правильну адреÑу е-пошти"
@@ -2082,21 +2114,19 @@ msgstr "Будь лаÑка введіть правильну адреÑу е-п
msgid "Please enter some details"
msgstr "Будь лаÑка додайте трохи подробиць"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "Будь лаÑка вкажіть е-пошту"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "Будь лаÑка вкажіть адреÑу е-пошти"
@@ -2109,8 +2139,8 @@ msgstr "Будь лаÑка введіть ім'Ñ"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "Будь лаÑка введіть ім'Ñ Ñ‚Ð° прізвище - департаментам потрібні ці дані. Якщо не хочете Ñ—Ñ… показувати - не Ñтавте галочку внизу."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2149,7 +2179,7 @@ msgstr "Будь лаÑка опишіть проблему детально"
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "Будь лаÑка заповніть форму нижче подробицÑми проблеми, Ñ– опишіть міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñкомога точніше в полі подробиць."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Будь лаÑка вкажіть чи ви хочете отримати інші опитуваннÑ."
@@ -2172,19 +2202,24 @@ msgstr "Будь лаÑка заауважте, що ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ <stron
msgid "Please note:"
msgstr "Будь лаÑка зауважте:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Будь лаÑка додайте трохи поÑÑнень ÑтоÑовно Ð¿ÐµÑ€ÐµÐ²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÑповіщеннÑ"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "Будь лаÑка додайте текÑÑ‚ Ñ– фото"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "Будь лаÑка розкажіть чи ви відправлÑли ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´ÐµÐ¿Ð°Ñ€Ñ‚Ð°Ð¼ÐµÐ½Ñ‚Ñƒ раніше"
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "Оберіть орган"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "Оберіть бажаний потік інформації"
@@ -2193,21 +2228,17 @@ msgstr "Оберіть бажаний потік інформації"
msgid "Please select the type of alert you want"
msgstr "Будь лаÑка оберіть тип бажаних алÑрмів"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "Будь лаÑка вкажіть чи була вирішена проблема"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "Будь лаÑка переглÑньте Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñкі залишилиÑÑŒ"
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "Будь лаÑка завантажуйте тільки JPEG зображеннÑ"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "Будь лаÑка напишіть повідомленнÑ"
@@ -2216,8 +2247,8 @@ msgid "Please write your update here"
msgstr "Будь лаÑка напишіть поновленнÑ"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2238,22 +2269,36 @@ msgstr "Опубліковано %s (<strong>%s</strong>) в %s"
msgid "Posted by %s at %s"
msgstr "Опубліковано %s в %s"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "Попередній"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr ""
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "Приватний"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "Проблема"
@@ -2269,12 +2314,12 @@ msgstr "Проблема %s підтверджена"
msgid "Problem %s sent to council %s"
msgstr "Проблему %s надіÑлано департаменту %s"
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "Розбивка проблем по Ñтану"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "Проблема маркована відкритою."
@@ -2290,12 +2335,10 @@ msgstr "Проблеми"
msgid "Problems in this area"
msgstr "Проблеми в цьому районі"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "Проблеми поблизу"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "Проблеми на мапі"
@@ -2304,12 +2347,11 @@ msgstr "Проблеми на мапі"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "Ðещодавно вирішені проблеми"
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "Проблеми в радіуÑÑ– %.1fkm від цієї точки"
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2321,20 +2363,17 @@ msgstr "Проблеми в межах %s"
msgid "Problems within %s ward"
msgstr "Проблеми в межах %s району"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "Проблеми в межах %s, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "Проблеми в межах %s"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Проблеми в межах:"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr ""
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "ÐдреÑа майна:"
@@ -2348,39 +2387,31 @@ msgstr "Тип майна:"
msgid "Provide an update"
msgstr "Ðадішліть оновленнÑ"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Ð’ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– Ñ– паролю не обов'Ñзкове, проте це дозволить вам більш легко Ñповіщати про проблеми, залишати Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° керувати вашими ÑповіщеннÑми"
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "Ð’ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ не обов'Ñзкове, проте це дозволить вам більш легко Ñповіщати про проблеми, залишати Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° керувати вашими ÑповіщеннÑми"
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "Публічна відповідь:"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "Публічне фото"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "Опублікувати відповідь"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "ОпитуваннÑ"
@@ -2396,12 +2427,11 @@ msgstr "Ðнкета %d відправлена по проблемі %d"
msgid "Questionnaire filled in by problem reporter"
msgstr "Ðнкета заповнена автором ÑповіщеннÑ"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2427,8 +2457,7 @@ msgstr "RSS потік з %s"
msgid "RSS feed of %s, within %s ward"
msgstr ""
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr ""
@@ -2436,7 +2465,7 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2466,17 +2495,18 @@ msgstr "RSS Ñтрічка з оновленнÑми по цій проблемÑ
msgid "Receive email when updates are left on this problem."
msgstr "Отримувати лиÑта коли Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ проблемі буде оновлена"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "Ðещодавні міÑцеві проблеми, FixMyStreet"
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "Ðещодавно <br>вирішені"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "Ðещодавно перевідкриті проблеми"
@@ -2484,23 +2514,28 @@ msgstr "Ðещодавно перевідкриті проблеми"
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "ЗнÑти прапорець"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "Видалити фото (це Ð½ÐµÐ·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ!)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "редагувати кориÑтувача"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "СповіÑтити про проблему"
@@ -2509,7 +2544,7 @@ msgstr "СповіÑтити про проблему"
msgid "Report abuse"
msgstr "ПоÑкаржитиÑÑŒ"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "Звіт по %s"
@@ -2518,83 +2553,82 @@ msgstr "Звіт по %s"
msgid "Report your problem"
msgstr ""
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Сповіщайте, переглÑдайте, або обговорюйте міÑцеві проблеми"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "Сповіщено %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "Сповіщено %s, до %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "Сповіщено анонімно по %s"
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "Сповіщено раніше"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "Перевідкрито %s о %s"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "Сповіщено %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "Сповіщено в категорії %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "Сповіщено в категорії %s анонімно о %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "Сповіщено в категорію %s %s о %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "Сповіщено %s анонімно о %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "Сповіщено через %s %s о %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "Сповіщено через %s в категорію %s анонімно о %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "Сповіщено через %s в категорію %s %s о %s"
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "Сповіщено в категорії %s "
+msgstr ""
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "Сповіщено %s"
+
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "СповіÑтити про проблему"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "СповіщеннÑ"
@@ -2607,18 +2641,21 @@ msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ñ– %s Ñимволами. Буль л
msgid "Reports awaiting approval"
msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑŽÑ‚ÑŒ підтвердженнÑ"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð° мапі"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ¾Ð²Ð°Ð½Ð¾"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "ПеревідіÑлати ÑповіщеннÑ"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "Те міÑце?"
@@ -2633,26 +2670,32 @@ msgstr "ОбÑлуговувач цієї дороги (отримано з до
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "ОбÑлуговувач цієї дороги (з OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "Повернули вліво"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "Повернути вправо"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr ""
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "Зберети зміни"
@@ -2665,7 +2708,7 @@ msgstr "Пошук Ñповіщень"
msgid "Search Users"
msgstr "Пошук кориÑтувачів"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "Пошук Ñповіщень"
@@ -2697,20 +2740,25 @@ msgstr ""
msgid "Select an area"
msgstr "Оберіть район"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "Оберіть вподобаний тип алÑрму Ñ– натиÑніть кнопку Ð´Ð»Ñ RSS фіду, або введіть поштову адреÑу щоб підпиÑатиÑÑŒ на алÑрми поштою."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "Відкрити ÑповіщеннÑ"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "Відправити %s %s пізніше"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "ÐадіÑлано:"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "СервіÑ:"
@@ -2719,8 +2767,8 @@ msgstr "СервіÑ:"
msgid "Share"
msgstr "Поширити"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2736,34 +2784,23 @@ msgid "Show pins"
msgstr "Показувати шпильки"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "Увійти"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "Увійти через е-пошту"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "Увійти або Ñтворити обліковий запиÑ"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "Вийти"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "Увійшли Ñк %s"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "ДеÑкі категорії потребуватимуть додаткової інформації"
@@ -2779,8 +2816,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "ДеÑкі фото нещодавніх проблем"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "Певний текÑÑ‚ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—"
@@ -2788,24 +2826,32 @@ msgstr "Певний текÑÑ‚ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "Вибачте, ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "Вибачте, ми не знайшли це міÑце"
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Вибачте, ми не можем розпізнати це міÑце. Спробуйте пізніше."
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "Вибачте, ми не можем розпізнати це міÑце. Спробуйте пізніше."
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "Початкова дата:"
@@ -2821,16 +2867,17 @@ msgstr "Стан"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "Стан:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "СтатиÑтика"
@@ -2844,7 +2891,12 @@ msgstr "СтатуÑ"
msgid "Still open, via questionnaire, %s"
msgstr "Ð’Ñе ще відкрито, через анкету, %s"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "ПідкатегоріÑ: %s"
@@ -2859,45 +2911,42 @@ msgstr "Тема"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "Тема:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "Підтвердити"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "Підтвердити зміни"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "Підтвердити анкету"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "Підтверджено"
@@ -2908,18 +2957,19 @@ msgstr "Підтверджено"
msgid "Subscribe"
msgstr "ПідпиÑатиÑÑŒ"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Підпишіть мене на поштові алÑрми"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "Резюме"
@@ -2930,7 +2980,7 @@ msgstr "Резюме"
msgid "Summary reports"
msgstr "Сумарні ÑповіщеннÑ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "ОпитуваннÑ"
@@ -2938,9 +2988,18 @@ msgstr "ОпитуваннÑ"
msgid "Survey Results"
msgstr "Результати опитуваннÑ"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "ПоновленнÑ"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "ТекÑÑ‚"
@@ -2949,6 +3008,7 @@ msgid "Text only version"
msgstr "Лише текÑтова верÑÑ–Ñ"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "ТекÑÑ‚:"
@@ -2970,7 +3030,7 @@ msgstr ""
msgid "Thank you for your feedback"
msgstr ""
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "ДÑкуємо за надіÑлане фото. Тепер нам потрібно визначити міÑце проблеми, тому будь лаÑка введіть назву вулиці поблизу чи поштовий код в полі вище &nbsp;:"
@@ -2978,7 +3038,7 @@ msgstr "ДÑкуємо за надіÑлане фото. Тепер нам поÑ
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "ДÑкуєм, раді чути, що проблему вирішено! Можемо ми поцікавитиÑÑŒ чи Ñповіщали ви органи про будь-Ñку проблему раніше?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ‚Ð¾ трапилаÑÑŒ помилка(%s), будь лаÑка повторіть"
@@ -2996,20 +3056,19 @@ msgstr ""
msgid "That postcode was not recognised, sorry."
msgstr "Поштовий код не розпізнано, вибачте."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "Цю проблему зараз перезвітують."
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "Цю проблему зараз перезвітують."
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "Цей ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ показати на %s."
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "Це ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ видалено."
@@ -3055,30 +3114,18 @@ msgid ""
" and may be displayed publically."
msgstr ""
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "ЛиÑÑ‚ з підтвердженнÑм <strong>може</strong> надійти через кілька хвилин &mdash; <em>будь лаÑка</em> будьте терплÑчими."
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "Департамент не зможе допомгти доки Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð½Ðµ буде доÑтатьою, тому будь лаÑка опишіть точне міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ (наприклад на Ñтіні), що це за проблема, Ñк довго вона Ñ–Ñнує, Ð¾Ð¿Ð¸Ñ (Ñ– фото проблеми, Ñкщо Ñ”), Ñ– Ñ‚.д."
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "Подробиці вашої проблеми доÑтупні в іншій вкладці вище."
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "Подробиці вашої проблеми доÑтупні в правій чаÑтині Ñторінки"
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "ТрапилаÑÑŒ помилка: %s"
@@ -3096,10 +3143,6 @@ msgstr "The following information about the nearest road might be inaccurate or
msgid "The latest local problems reported by users"
msgstr "ОÑтанні локальні проблеми, про Ñки ÑповіÑтили кориÑтувачі"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "ОÑтанні локальні ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ кориÑтувачів"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "ОÑтанні проблеми Ð´Ð»Ñ {{COUNCIL}} Ñповіщені кориÑтувачами"
@@ -3120,20 +3163,8 @@ msgstr "ОÑтанні локальні проблеми, Ñкі кориÑтуÐ
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr ""
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr ""
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
msgstr ""
#: templates/web/base/admin/body-form.html:58
@@ -3150,8 +3181,7 @@ msgstr "Паролі не Ñпівпадають"
msgid "The requested URL '%s' was not found on this server"
msgstr "ÐдреÑа '%s' не знайдена на Ñервері"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "ÐайпроÑтіший алÑрм - географічний:"
@@ -3162,7 +3192,7 @@ msgstr "ÐайпроÑтіший алÑрм - географічний:"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "КориÑтувач не зміг позначити проблему на карті, тільки введену зону"
@@ -3175,23 +3205,24 @@ msgstr ""
"КориÑтувацьке <strong>ім'Ñ</strong> відображаютьÑÑ Ð¿ÑƒÐ±Ð»Ñ–Ñ‡Ð½Ð¾ на ÑповіщеннÑÑ…, Ñкі не відмічені <em>анонімними</em>.\n"
" Імена не обов'Ñзково мають бути унікальними."
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "СталаÑÑŒ проблема з відображеннÑм Ñторінки вÑÑ–Ñ… Ñповіщень. Спробуйте пізніше."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "СталаÑÑŒ помилка при Ñпробі показати Ñторінку. Будь лаÑка Ñпробуйте пізніше."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "З комбінацією поштової адреÑи Ñ– паролю щоÑÑŒ не так. Якщо ви не в змозі пригадати пароль або у Ð²Ð°Ñ Ð¹Ð¾Ð³Ð¾ немає, заповніть Ñекцію &lsquo;увійти поштою&rsquo;"
@@ -3204,7 +3235,7 @@ msgstr "СталаÑÑŒ проблема з вашою комбінацією аÐ
msgid "There was a problem with your update. Please try again."
msgstr "СталаÑÑŒ проблема з поновленнÑм. Будь лаÑка Ñпробуйте ще раз."
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "Зі ÑповіщеннÑм Ñ” негаразди. ГлÑньте нижче."
@@ -3244,16 +3275,16 @@ msgid ""
" A body will not receive any reports unless it covers at least one area."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3267,7 +3298,7 @@ msgstr ""
msgid "This is a summary of all reports on this site."
msgstr ""
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr ""
@@ -3294,55 +3325,69 @@ msgstr "Ð¦Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° в процеÑÑ–"
msgid "This problem is old and of unknown status."
msgstr "Ð¦Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° заÑтаріла Ñ– Ñ—Ñ— ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð¸Ð¹."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "Це ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑ” модерації."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Це ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– відмічено закритим."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Це ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– відмічено вирішеним."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Це ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¼Ñ–Ñ‡ÐµÐ½Ð¾ відкритим."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "Це ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлано анонімно"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "Ð¦Ñ Ð²ÐµÐ±-Ñторінка також міÑтить фото проблеми, Ñкі надав кориÑтувач."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "ХронологіÑ"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "Заголовок"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "Щоб <strong>ÑповіÑтити про проблему</strong>, натиÑніть на мапу у відповідній локації."
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "Заголовок"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "Щоб дізнатиÑÑŒ Ñкі локальні алÑрми ми маєм Ð´Ð»Ñ Ð²Ð°Ñ, введіть ваш поштовий код, назву вулиці та район"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "Щоб дізнатиÑÑŒ Ñкі локальні алÑрми ми маєм Ð´Ð»Ñ Ð²Ð°Ñ, введіть ваш поштовий код, назву вулиці та район"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "До переглÑду точного міÑÑ†ÐµÐ·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ на карті"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3358,8 +3403,8 @@ msgstr "Спробуйте ще раз"
msgid "Try emailing us directly:"
msgstr ""
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3367,11 +3412,11 @@ msgstr ""
msgid "Unable to fix"
msgstr "Ðеможливо виправити"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "Ðе підтверджено"
@@ -3388,7 +3433,9 @@ msgstr "Ðевідомий тип алÑрму"
msgid "Unknown error"
msgstr "Ðевідома помилка"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "Ðевідомий ідентифікатор проблеми"
@@ -3411,11 +3458,11 @@ msgid "Update below added by %s at %s"
msgstr "ÐŸÐ¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ додано %s о %s"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "Поновити орган"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "Оновити розбивку за Ñтаном"
@@ -3450,24 +3497,24 @@ msgstr "ПоновленнÑ:"
msgid "Updated"
msgstr "Поновлено"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "Поновлено!"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "ПоновленнÑ"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "ÐŸÐ¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ñ– кількіÑтю в %s Ñимволів. Будь лаÑка Ñкоротіть текÑÑ‚."
@@ -3475,27 +3522,30 @@ msgstr "ÐŸÐ¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ñ– кількіÑтю в %s ÑимвÐ
msgid "Updates on {{title}}"
msgstr "ÐŸÐ¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑтоÑовно {{title}}"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ цій проблемі, FixMyStreet"
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr ""
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "КориÑтувач"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "викроиÑтана мапа"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "КориÑтувацький прапорець видалено"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "КориÑтувач відмічений"
@@ -3503,23 +3553,23 @@ msgstr "КориÑтувач відмічений"
msgid "User search finds matches in users' names and email addresses."
msgstr "Пошук кориÑтувачів знайшов ÑÐ¿Ñ–Ð²Ð¿Ð°Ð´Ñ–Ð½Ð½Ñ Ð² іменах та поштових адреÑах"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "КориÑтувачі"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "ПереглÑнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð° Ñайті"
@@ -3543,16 +3593,15 @@ msgid "Wards of this council"
msgstr "Райони рад"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "Ми знайшли більше одного ÑÐ¿Ñ–Ð²Ð¿Ð°Ð´Ñ–Ð½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— локації. Ми показуєм до деÑÑти Ñпівпадінь, будь лаÑка Ñпробуйте задати пошук інакше, Ñкщо вашого міÑÑ†Ñ Ñ‚ÑƒÑ‚ немає."
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "Ðам не вдалоÑÑŒ підтвердити ваш обліковий запиÑ. Вибачте."
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "Ми відправили вам лиÑта з поÑиланнÑм на Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу."
@@ -3566,7 +3615,7 @@ msgstr "Ми ніколи не публікуєм вашу поштову адр
msgid "We never show your email address or phone number."
msgstr "Ми ніколи не публікуємо вашу поштову адреÑу чи номер телефону."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "Ми розумієм, що проблема може лежати у відповідальноÑті %s; нажаль, наразі у Ð½Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” Ñ—Ñ… контактних даних. Якщо ви знаєте точну адреÑу, будь лаÑка залишайтеÑÑŒ на зв'Ñзку."
@@ -3591,11 +3640,15 @@ msgstr ""
msgid "We’ll get back to you as soon as we can."
msgstr ""
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr ""
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "Коли відредаговано"
@@ -3604,7 +3657,7 @@ msgstr "Коли відредаговано"
msgid "When sent"
msgstr "Коли відправлено"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "Whole block of empty flats"
@@ -3612,16 +3665,22 @@ msgstr "Whole block of empty flats"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr ""
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "Хочете отримати ще іншу анкету за 4 тижні, нагадуючу вам про перевірку ÑтатуÑу?"
@@ -3647,15 +3706,13 @@ msgstr "Рік"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "Так"
@@ -3718,11 +3775,9 @@ msgstr "Ви відхилили. Будь лаÑка заповніть форм
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "Ви вже додали фото до цього ÑповіщеннÑ, Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ фото видалить попереднє."
@@ -3731,6 +3786,10 @@ msgstr "Ви вже додали фото до цього ÑповіщеннÑ,
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "Ви вже додали фото до цього поновленнÑ, Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ фото видалить попереднє."
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3751,15 +3810,11 @@ msgstr "Ви уÑпішно підтвердили поштову адреÑу."
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "Ви уÑпішно увійшли; будь лаÑка перевірте чи деталі вірні:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "Ви не ÑповіÑтили про жодну проблему. <a href=\"%s\">СповіÑтіть про проблему</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "Тепер вам необіхдно натиÑнути на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² лиÑті, Ñкий ми щойно надіÑлали."
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "Вам потрібно <a href=\"%s\">додати певні органи</a> (ради чи департаменти) перед тим Ñк відправлÑти ÑповіщеннÑ."
@@ -3773,18 +3828,16 @@ msgstr ""
" the categories of problems they can handle (such as potholes or streetlights) and the\n"
" contacts (such as an email address) to which reports are sent."
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "ДійÑно бажаєте перевідправити?"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "Ваші ÑповіщеннÑ"
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3793,22 +3846,17 @@ msgstr "Ваші ÑповіщеннÑ"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "Ваша пошта"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "Ваша адреÑа е-пошти"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "Ваша адреÑа е-пошти:"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3818,24 +3866,23 @@ msgstr "Ваша е-пошта:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "Ваша Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ викориÑтана згідно <a href=\"/privacy\">політики конфіденційноÑті</a>"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "Ваше ім'Ñ"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "Ваше ім'Ñ:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3848,19 +3895,15 @@ msgstr "Ваш пароль було змінено"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "Ваш телефон"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "Ваше ÑповіщеннÑ"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "Ваші ÑповіщеннÑ"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "Ваші поновленнÑ"
@@ -3868,23 +3911,31 @@ msgstr "Ваші поновленнÑ"
msgid "Your&nbsp;email:"
msgstr "Ваша&nbsp;е-пошта:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "Ð’ÑÑ– звіти"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "від %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "Закриті звіти"
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "рада"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "не викориÑтовував карту"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "наприклад ‘%s’ чи ‘%s’"
@@ -3893,17 +3944,22 @@ msgstr "наприклад ‘%s’ чи ‘%s’"
msgid "edit user"
msgstr "редагувати кориÑтувача"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "Звіти про вирішені проблеми"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "від %d різних кориÑтувачів"
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "оÑтаннє Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %s"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "менше хвилини"
@@ -3948,14 +4004,13 @@ msgstr "позначено запланованим"
msgid "marked as unable to fix"
msgstr "позначено Ñк неможливо полагодити"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "недоÑтупно"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "або"
@@ -3965,16 +4020,16 @@ msgstr "або знайти мене автоматично"
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "в оригіналі вказано: &ldquo;%s&rdquo;"
@@ -3987,8 +4042,8 @@ msgstr "інші зони:"
msgid "reopened"
msgstr "перевідкрито"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "вийти"
@@ -4004,17 +4059,20 @@ msgstr "міÑцевий орган"
msgid "there is no pin shown as the user did not use the map"
msgstr "шпильки немає так Ñк кориÑтувач не викориÑтав мапу"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "цей тип локальної проблеми"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "Ñьогодні"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "Звіти про вирішені проблеми"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "викроиÑтана мапа"
@@ -4039,7 +4097,7 @@ msgstr[0] "<big>%s</big> звіт недавно"
msgstr[1] "<big>%s</big> звітів недавно"
msgstr[2] "<big>%s</big> звітів недавно"
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4055,7 +4113,7 @@ msgstr[0] "%d прибічник"
msgstr[1] "%d прибічників"
msgstr[2] "%d прибічників"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4079,7 +4137,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4103,7 +4161,7 @@ msgstr[0] "<big>%s</big> полагоджено минувшого міÑÑцÑ"
msgstr[1] "<big>%s</big> полагоджено минувшого міÑÑцÑ"
msgstr[2] "<big>%s</big> полагоджено минувшого міÑÑцÑ"
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4119,5 +4177,110 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#~ msgid "For council(s):"
-#~ msgstr "Ð”Ð»Ñ Ñ€Ð°Ð´(и):"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>Якщо ви не бачите мапу, <a href='%s' rel='nofollow'>пропуÑтіть цей крок</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>ÐÑ–</strong>, Ñ Ð·Ð°Ð»Ð¾Ð³Ñ–Ð½ÑŽÑÑŒ через е-пошту"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "Ви <strong>розробник</strong>? Хочете долучитиÑÑŒ до проекту?"
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "Ðайближчі проблеми <small>(в межах&nbsp;%sкм)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "ЗвернутиÑÑŒ до FixMyStreet"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "Ви маєте пароль до FixMyBarangay?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet admin:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "Якщо ні, ваше ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ðµ буде активовано."
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "Якщо ні, ваша проблема не буде прозвітована."
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "Якщо ні, ваше Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ буде опубліковано."
+
+#~ msgid "New update:"
+#~ msgstr "ПоновленнÑ:"
+
+#~ msgid "No problems found."
+#~ msgstr "Проблем не знайдено"
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "Про проблеми ще не ÑповіÑтили."
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Тепер щоб відправити ваше ÑповіщеннÑ&hellip; у Ð²Ð°Ñ Ñ” пароль?"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "Тепер щоб відправити ваше поновленнÑ&hellip; у Ð²Ð°Ñ Ñ” пароль?"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "Будь лаÑка <a class=\"tab_link\" href=\"#report\">переглÑньте</a> поновленнÑ, Ñкі залишилиÑÑŒ"
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "Будь лаÑка переглÑньте Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñкі залишилиÑÑŒ"
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "Проблеми в межах %s, FixMyStreet"
+
+#~ msgid "Publish the response"
+#~ msgstr "Опублікувати відповідь"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "Сповіщено %s, до %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð° мапі"
+
+#~ msgid "Sign in by email"
+#~ msgstr "Увійти через е-пошту"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "Увійшли Ñк %s"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "ЛиÑÑ‚ з підтвердженнÑм <strong>може</strong> надійти через кілька хвилин &mdash; <em>будь лаÑка</em> будьте терплÑчими."
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "Подробиці вашої проблеми доÑтупні в іншій вкладці вище."
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "Подробиці вашої проблеми доÑтупні в правій чаÑтині Ñторінки"
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "ОÑтанні локальні ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ кориÑтувачів"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "Щоб <strong>ÑповіÑтити про проблему</strong>, натиÑніть на мапу у відповідній локації."
+
+#~ msgid "User"
+#~ msgstr "КориÑтувач"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "Тепер вам необіхдно натиÑнути на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² лиÑті, Ñкий ми щойно надіÑлали."
+
+#~ msgid "Your email address:"
+#~ msgstr "Ваша адреÑа е-пошти:"
+
+#~ msgid "Your report"
+#~ msgstr "Ваше ÑповіщеннÑ"
diff --git a/locale/zh.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/zh.UTF-8/LC_MESSAGES/FixMyStreet.po
index 2e967fdc1..9942d88f3 100644
--- a/locale/zh.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/zh.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -9,18 +9,18 @@ msgid ""
msgstr ""
"Project-Id-Version: fixmystreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2015-07-31 14:28+0100\n"
-"PO-Revision-Date: 2015-07-10 13:31+0000\n"
+"POT-Creation-Date: 2015-10-23 16:51+0100\n"
+"PO-Revision-Date: 2015-07-31 16:31+0000\n"
"Last-Translator: mySociety <transifex@mysociety.org>\n"
-"Language-Team: Chinese (http://www.transifex.com/projects/p/fixmystreet/language/zh/)\n"
+"Language-Team: Chinese (http://www.transifex.com/mysociety/fixmystreet/language/zh/)\n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:623
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:392
+#: perllib/FixMyStreet/DB/Result/Problem.pm:628
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:411
msgid " and "
msgstr "與"
@@ -33,11 +33,13 @@ msgstr "與"
msgid " or "
msgstr "或"
-#: templates/web/base/admin/index.html:36
+#: templates/web/base/admin/index.html:35
+#: templates/web/base/status/index.html:13
msgid "%d confirmed alerts, %d unconfirmed"
msgstr "%d 已確èªé€šçŸ¥, %d 未確èªã€€"
-#: templates/web/base/admin/index.html:38
+#: templates/web/base/admin/index.html:37
+#: templates/web/base/status/index.html:16
#: templates/web/zurich/admin/index.html:6
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d 地方政府承辦人員 &ndash; %d ç¢ºèª %d 尚未確èª"
@@ -46,11 +48,13 @@ msgstr "%d 地方政府承辦人員 &ndash; %d ç¢ºèª %d 尚未確èª"
msgid "%d edits by %s"
msgstr " 由 %d 編輯 %d"
-#: templates/web/base/admin/index.html:35
+#: templates/web/base/admin/index.html:34
+#: templates/web/base/status/index.html:12
msgid "%d live updates"
msgstr "%d ç¾å ´æ›´æ–°"
-#: templates/web/base/admin/index.html:37
+#: templates/web/base/admin/index.html:36
+#: templates/web/base/status/index.html:14
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d å•å·é€å‡º &ndash; % 回覆(%s%%)"
@@ -63,15 +67,61 @@ msgstr "%d 到 %d 的 %d "
msgid "%s - Summary reports"
msgstr "%s -申報總çµ"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:672
+#. ("%s here is the site name")
+#: templates/web/base/admin/header.html:10
+msgid "%s admin:"
+msgstr ""
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:7
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local\n"
+"problems, including alerts for all problems within a particular ward, or all\n"
+"problems within a certain distance of a particular location."
+msgstr ""
+"FixMyStreeé‡å°åœ¨åœ°å•題,æä¾›å„種 RSS 訂閱與電å­éƒµä»¶é€šçŸ¥ä¿¡ï¼ŒåŒ…括\n"
+"æŸæŒ‡å®šå€åŸŸæˆ–政府部門內å„類å•題的通知\n"
+"或是æŸä¸€ç¯„åœå…§å„類å•題的通知"
+
+#. ("%s is the site name")
+#: templates/web/base/alert/index.html:11
+#, fuzzy
+msgid ""
+"%s has a variety of RSS feeds and email alerts for local problems, including\n"
+"alerts for all problems within a particular ward or council, or all problems\n"
+"within a certain distance of a particular location."
+msgstr ""
+"FixMyStreeé‡å°åœ¨åœ°å•題,æä¾›å„種 RSS 訂閱與電å­éƒµä»¶é€šçŸ¥ä¿¡ï¼ŒåŒ…括\n"
+"æŸæŒ‡å®šå€åŸŸæˆ–政府部門內å„類å•題的通知\n"
+"或是æŸä¸€ç¯„åœå…§å„類å•題的通知"
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "%s ref:&nbsp;%s"
msgstr "%s æµæ°´è™Ÿ:&nbsp;%s "
+#. ("%s is the site name")
+#: templates/web/base/alert/_list.html:73
+#, fuzzy
+msgid ""
+"%s sends different categories of problem\n"
+"to the appropriate council, so problems within the boundary of a particular council\n"
+"might not match the problems sent to that council. For example, a graffiti report\n"
+"will be sent to the district council, so will appear in both of the district\n"
+"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
+"for the county council."
+msgstr ""
+"FixMyStreet é€å‡ºä¸åŒé¡žåˆ¥çš„å•題申報給\n"
+"é©å®œçš„地方政府機關,如果å•é¡Œç™¼ç”Ÿåœ¨æŸæ”¿åºœçš„轄å€å…§\n"
+"é€™æ¨£è™•ç†æˆ–許的確é©ç•¶ã€‚例如,塗鴉å•題將\n"
+"申報給里/倿©Ÿæ§‹ï¼Œæ‰€ä»¥æœƒåœ¨é‡Œ/倿©Ÿé—œçš„通告上\n"
+"è€Œåœ¨åœ°æ–¹æ”¿åºœçš„å…¬å‘Šç‰ˆä¸Šåªæœƒå‡ºç¾åœ¨è½„內通知上"
+
#: perllib/FixMyStreet/Cobrand/UK.pm:255 perllib/FixMyStreet/Cobrand/UK.pm:267
msgid "%s ward, %s"
msgstr "%s 里/å€, %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:559
+#: perllib/FixMyStreet/DB/Result/Problem.pm:564
msgid "%s, reported at %s"
msgstr "%s 在 %s 處之申報 "
@@ -83,59 +133,57 @@ msgstr "%s, 在%s 里/å€"
msgid "&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
msgstr "版本; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap開放街é“地圖</a> è²¢ç»è€…"
-#: templates/web/base/email_sent.html:29
-msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
-msgstr "(別擔心 &mdash; 在您檢查email這段時間,我們會ä¿ç•™ä½ çš„通知。)"
-
-#: templates/web/base/email_sent.html:25
-msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
-msgstr "(別擔心 &mdash; 在您檢查email這段時間,我們會ä¿ç•™ä½ çš„申報。)"
-
-#: templates/web/base/email_sent.html:27
-msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
-msgstr "(別擔心 &mdash; 在您檢查email這段時間,我們會ä¿ç•™ä½ çš„æ›´æ–°ã€‚)"
+#: templates/web/zurich/report/new/fill_in_details_form.html:53
+msgid "(Defect &amp; location of defect)"
+msgstr ""
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
#: templates/web/base/admin/users.html:31
msgid "(Email in abuse table)"
msgstr "電郵為濫發信件"
-#: templates/web/base/alert/_list.html:20
-#: templates/web/fixmystreet/alert/_list.html:24
+#: templates/web/zurich/admin/report_edit-sdm.html:60
+#: templates/web/zurich/admin/report_edit.html:88
+#, fuzzy
+msgid "(No name)"
+msgstr "å§“å"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:67
+#: templates/web/zurich/admin/report_edit.html:95
+#, fuzzy
+msgid "(No phone number)"
+msgstr "電話號碼"
+
+#: templates/web/base/alert/_list.html:24
msgid "(a default distance which covers roughly 200,000 people)"
msgstr "é è¨­è·é›¢ç´„涵蓋20è¬äººå£"
-#: templates/web/base/alert/_list.html:25
-#: templates/web/fixmystreet/alert/_list.html:28
-msgid "(alternatively the RSS feed can be customised, within"
+#. ("%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]")
+#: templates/web/base/alert/_list.html:29
+#, fuzzy
+msgid "(alternatively the RSS feed can be customised, within %s)"
msgstr "或å¯ä¿®æ”¹RSS訂閱"
-#: templates/web/base/around/around_map_list_items.html:12
-#: templates/web/base/around/on_map_list_items.html:9
-#: templates/web/fixmystreet/report/_item.html:27
+#: templates/web/base/report/_item.html:27
#: templates/web/zurich/report/_item.html:21
msgid "(closed)"
msgstr "(çµæŸ)"
-#: templates/web/base/around/around_map_list_items.html:10
-#: templates/web/base/around/on_map_list_items.html:7
-#: templates/web/fixmystreet/report/_item.html:25
+#: templates/web/base/report/_item.html:25
#: templates/web/zurich/report/_item.html:19
msgid "(fixed)"
msgstr "(己處ç†)"
-#: templates/web/base/index.html:8 templates/web/base/index.html:9
-#: templates/web/fixmystreet/around/intro.html:2
+#: templates/web/base/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(例如塗鴉, 文宣張貼, 人行é“é‹ªæ¿æˆ–街燈æå£¤, )"
-#: templates/web/base/reports/_list-entry.html:4
-#: templates/web/fixmystreet/report/_item.html:21
+#: templates/web/base/report/_item.html:21
msgid "(not sent to council)"
msgstr "ä¸è¦å‘地方政府é€å‡º"
-#: templates/web/base/report/new/fill_in_details_form.html:199
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/base/report/new/fill_in_details_form.html:200
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "(optional)"
msgstr "(ä»»é¸)"
@@ -143,25 +191,24 @@ msgstr "(ä»»é¸)"
msgid "(public)"
msgstr "(公開)"
-#: templates/web/base/reports/_list-entry.html:2
-#: templates/web/fixmystreet/report/_item.html:20
+#: templates/web/base/report/_item.html:20
msgid "(sent to both)"
msgstr "兩個都é€å‡º"
-#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/new/fill_in_details_form.html:194
msgid "(we never show your email address or phone number)"
msgstr "(æˆ‘å€‘ä¸æœƒé€éœ²æ‚¨çš„電話或電郵)"
-#: templates/web/base/report/update-form.html:158
+#: templates/web/base/report/update-form.html:159
msgid "(we never show your email)"
msgstr "(æˆ‘å€‘ä¸æœƒå…¬é–‹æ‚¨çš„é›»å­éƒµä»¶)"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
#: perllib/FixMyStreet/DB/Result/Problem.pm:410
msgid "-- Pick a category --"
msgstr "鏿“‡åˆ†é¡ž"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:630
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:637
#: perllib/FixMyStreet/DB/Result/Problem.pm:416
msgid "-- Pick a property type --"
msgstr "鏿“‡å…¬ç‰©ç¨®é¡ž"
@@ -179,12 +226,14 @@ msgstr ""
"\n"
"å¯ä»¥åœ¨ä½ çš„設定檔加入一些 <code>地圖連çµåˆ¥</code> "
-#: templates/web/base/around/_report_banner.html:3
-#: templates/web/base/around/_report_banner.html:5
-msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
-msgstr "<small>如果無法檢視此地圖, <a href='%s' rel='nofollow'>ç•¥éŽæ­¤æ­¥é©Ÿ</a>.</small>"
+#. ('The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories')
+#. ("The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories")
+#: templates/web/base/reports/_list-filters.html:27
+msgid "<label>Show %s</label> <label>about %s</label>"
+msgstr ""
-#: templates/web/base/admin/index.html:33
+#: templates/web/base/admin/index.html:32
+#: templates/web/base/status/index.html:11
#: templates/web/zurich/admin/index.html:4
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> ç¾å ´å•題"
@@ -197,28 +246,22 @@ msgstr "<strong>ä¸</strong> 我è¦åˆ©ç”¨é›»å­éƒµä»¶ç¢ºèªæˆ‘的申報 "
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>ä¸</strong> 我è¦ç”¨é›»å­éƒµä»¶æ”¶åˆ°æ›´æ–°é€šçŸ¥"
-#: templates/web/fixmystreet/auth/general.html:51
+#: templates/web/base/auth/general.html:48
#: templates/web/zurich/auth/general.html:51
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>ä¸</strong> 我è¦ç”¨é›»å­éƒµä»¶ç™»å…¥"
-#: templates/web/base/auth/general.html:55
-msgid "<strong>No</strong>, I do not, let me sign in by email:"
-msgstr "<strong>ä¸</strong>, ä¸ç”¨, 我è¦ç”¨é›»å­éƒµä»¶ç™»å…¥:"
-
-#: templates/web/base/report/new/fill_in_details_form.html:144
+#: templates/web/base/report/new/fill_in_details_form.html:145
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>ä¸</strong>, 我想用電å­éƒµä»¶ç¢ºèªæˆ‘的申報l:"
-#: templates/web/base/report/update-form.html:117
+#: templates/web/base/report/update-form.html:118
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>ä¸</strong>, 我è¦åˆ©ç”¨é›»å­éƒµä»¶æ”¶å–更新通知:"
-#: templates/web/base/auth/general.html:37
-#: templates/web/base/report/new/fill_in_details_form.html:122
-#: templates/web/base/report/update-form.html:95
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/auth/general.html:39
+#: templates/web/base/auth/general.html:34
+#: templates/web/base/report/new/fill_in_details_form.html:123
+#: templates/web/base/report/update-form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:15
#: templates/web/fixmystreet/report/update-form.html:89
msgid "<strong>Yes</strong> I have a password"
@@ -229,8 +272,8 @@ msgstr "<strong>是</strong> 我有密碼"
msgid "About us"
msgstr "關於我們"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:52
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:8
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:31
#: templates/web/fixmystreet/report/update-form.html:28
@@ -256,7 +299,7 @@ msgstr "增加è¯çµ¡äººè«‹ä½¿ç”¨ä¸‹æ–¹è¡¨å–®"
#: templates/web/base/admin/bodies.html:74
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Add body"
msgstr "新增有關單ä½"
@@ -269,10 +312,15 @@ msgstr "新增種類"
msgid "Add user"
msgstr "新增使用者"
-#: templates/web/base/my/my.html:64 templates/web/fixmystreet/my/my.html:52
+#: templates/web/base/my/my.html:52
msgid "Added %s"
msgstr "新增 %s"
+#: templates/web/base/report/new/category_extras.html:9
+#, fuzzy
+msgid "Additional Information"
+msgstr "å¾…æ ¸å¯"
+
#: templates/web/base/auth/change_password.html:29
msgid "Again:"
msgstr "å†ä¸€æ¬¡"
@@ -285,21 +333,25 @@ msgstr "%s創建之 %d通知, 種類 %s, åƒæ•¸ %s / %s"
msgid "Alert %d disabled (created %s)"
msgstr "%d 關閉通知 "
-#: templates/web/base/report/update-form.html:163
+#: templates/web/base/report/update-form.html:164
#: templates/web/fixmystreet/report/update-form.html:150
msgid "Alert me to future updates"
msgstr "通知我此事後續"
#: templates/web/base/reports/index.html:3
-#: templates/web/zurich/admin/stats.html:5
#: templates/web/zurich/reports/index.html:12
msgid "All Reports"
msgstr "所有事件申報"
-#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:26
+#: templates/web/zurich/admin/stats.html:5
+#, fuzzy
+msgid "All Reports as CSV"
+msgstr "所有事件申報"
+
+#: templates/web/base/footer.html:11 templates/web/fixmystreet/footer.html:32
#: templates/web/zurich/admin/index-dm.html:12
#: templates/web/zurich/admin/stats.html:13
-#: templates/web/zurich/footer.html:19
+#: templates/web/zurich/footer.html:20
#: templates/web/zurich/nav_over_content.html:6
msgid "All reports"
msgstr "所有事件申報"
@@ -322,8 +374,7 @@ msgstr "你所æä¾›çš„資訊å³å°‡é€å‡º"
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr "所有您æä¾›çš„资訊將é€å‡ºçµ¦<strong>%s</strong>."
-#: templates/web/base/questionnaire/index.html:36
-#: templates/web/fixmystreet/questionnaire/index.html:55
+#: templates/web/base/questionnaire/index.html:45
msgid "An update marked this problem as fixed."
msgstr "本å•題已解決之更新標註"
@@ -332,16 +383,12 @@ msgstr "本å•題已解決之更新標註"
msgid "Anonymous"
msgstr "匿å"
-#: templates/web/base/admin/report_edit.html:75
+#: templates/web/base/admin/report_edit.html:57
#: templates/web/base/admin/update_edit.html:23
msgid "Anonymous:"
msgstr "匿å:"
-#: templates/web/base/footer.html:26
-msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
-msgstr "您是å¦ç‚º<strong>程å¼é–‹ç™¼å“¡</strong>?您願æ„為一起本軟體開發作貢ç»å—Žã€€ "
-
-#: templates/web/fixmystreet/front/footer-marketing.html:16
+#: templates/web/base/front/footer-marketing.html:16
msgid "Are you a developer?"
msgstr "你是程å¼é–‹ç™¼è€…å—Ž?"
@@ -356,22 +403,25 @@ msgstr "涵蓋å€åŸŸ"
msgid "As this is a staging site and %s is false, reports made on this site will be sent to the problem reporter, not the contact given for the report’s category."
msgstr "作為一個支æ´å¹³å°ã€€%s出錯,本站所作的申報將é€é”çµ¦ç”³å ±è€…ï¼Œè€Œä¸æ˜¯ç”³å ±é¡žåˆ¥ä¸‹æä¾›çš„æ‰¿è¾¦äººå“¡ã€‚  "
-#: templates/web/zurich/admin/report_edit.html:141
+#: templates/web/zurich/admin/report_edit.html:213
+#, fuzzy
+msgid "Assign to competent body:"
+msgstr "分派給外部機:"
+
+#: templates/web/zurich/admin/report_edit.html:173
#: templates/web/zurich/admin/stats.html:36
msgid "Assign to different category:"
msgstr "歸至其它種類"
-#: templates/web/zurich/admin/report_edit.html:150
+#: templates/web/zurich/admin/report_edit.html:211
msgid "Assign to external body:"
msgstr "分派給外部機:"
-#: templates/web/zurich/admin/report_edit.html:130
-#: templates/web/zurich/admin/report_edit.html:187
+#: templates/web/zurich/admin/report_edit.html:190
msgid "Assign to subdivision:"
msgstr "交派給下級單ä½ï¼š"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:165
-#: templates/web/zurich/report/updates.html:11
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:221
msgid "Assigned to %s"
msgstr "派給 %s"
@@ -392,12 +442,12 @@ msgstr "å¾…æ ¸å¯"
msgid "Back"
msgstr "回上層"
-#: templates/web/base/admin/report_blocks.html:11
+#: templates/web/base/admin/report_blocks.html:41
msgid "Ban email address"
msgstr "ç¦æ­¢ä¹‹é›»å­éƒµä»¶"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1192
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1276
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:392
#: templates/web/base/admin/bodies.html:1 templates/web/zurich/header.html:64
msgid "Bodies"
msgstr "有關單ä½"
@@ -417,12 +467,16 @@ msgstr "有關單ä½:"
msgid "By Date"
msgstr "日期"
-#: templates/web/fixmystreet/around/_report_banner.html:8
+#: templates/web/base/auth/token.html:21 templates/web/base/email_sent.html:18
+msgid "Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time."
+msgstr ""
+
+#: templates/web/base/around/_report_banner.html:5
msgid "Can't see the map? <em>Skip this step</em>"
msgstr "無法顯示地圖? <em>ç•¥éŽæœ¬æ­¥é©Ÿ</em>"
#: templates/web/base/admin/body.html:68
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/report/new/category.html:10
#: templates/web/base/report/new/category_wrapper.html:3
#: templates/web/zurich/admin/body.html:14
@@ -433,27 +487,28 @@ msgstr "無法顯示地圖? <em>ç•¥éŽæœ¬æ­¥é©Ÿ</em>"
msgid "Category"
msgstr "類別"
-#: templates/web/base/admin/index.html:53
+#: templates/web/base/admin/index.html:59
+#: templates/web/base/admin/index.html:67
msgid "Category fix rate for problems > 4 weeks old"
msgstr "4週å‰å·±ä¿®å¾©å•題之類別"
#: templates/web/base/admin/body.html:138
#: templates/web/base/admin/category_edit.html:23
-#: templates/web/base/admin/report_edit.html:74
+#: templates/web/base/admin/report_edit.html:56
#: templates/web/zurich/admin/body.html:43
-#: templates/web/zurich/admin/report_edit-sdm.html:42
-#: templates/web/zurich/admin/report_edit.html:140
+#: templates/web/zurich/admin/report_edit-sdm.html:70
+#: templates/web/zurich/admin/report_edit.html:98
msgid "Category:"
msgstr "類別:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:383
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:402
msgid "Category: %s"
msgstr "類別: %s"
#: templates/web/base/auth/change_password.html:1
#: templates/web/base/auth/change_password.html:3
#: templates/web/base/auth/change_password.html:33
-#: templates/web/base/my/my.html:17 templates/web/fixmystreet/my/my.html:17
+#: templates/web/base/my/my.html:17
msgid "Change password"
msgstr "æ›´æ›å¯†ç¢¼"
@@ -496,54 +551,60 @@ msgid ""
" to the body too. These will appear in the drop-down menu on the report-a-problem page."
msgstr "鏿“‡æ°‘眾å¯ç†è§£çš„<strong>類別</strong> (例如., \"è·¯é¢å‘æ´ž\", \"街燈故障\") ä¹ŸåŠ©æ–¼è®“æœ‰é—œå–®ä½æŽŒæ¡. 此類別將會顯示在申報å•題é çš„下拉å¼é¸é …上。"
+#: templates/web/zurich/admin/response_templates_select.html:6
+msgid "Choose a template"
+msgstr ""
+
#: templates/web/base/admin/stats.html:65
#: templates/web/base/admin/stats.html:71
msgid "Click here or enter as dd/mm/yyyy"
msgstr "é»žé¸æ­¤è™•或輸入日期/月份/年份"
+#: templates/web/base/around/_report_banner.html:2
#: templates/web/base/js/translation_strings.html:50
-#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "點擊地圖以申報å•題 "
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:141
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:58
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/email_sent.html:13
+msgid "Click the link in our confirmation email to activate your alert."
+msgstr ""
+
+#: templates/web/base/email_sent.html:9
+msgid "Click the link in our confirmation email to publish your problem."
+msgstr ""
+
+#: templates/web/base/email_sent.html:11
+msgid "Click the link in our confirmation email to publish your update."
+msgstr ""
+
+#: templates/web/base/auth/token.html:18
+msgid "Click the link in our confirmation email to sign in."
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:196
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:969
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:15
+#: templates/web/base/admin/report_blocks.html:25
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/fixmystreet/report/banner.html:15
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:10
-#: templates/web/zurich/admin/header.html:12
-#: templates/web/zurich/admin/report_edit.html:95
-#: templates/web/zurich/admin/report_edit.html:97
+#: templates/web/zurich/admin/header.html:16
#: templates/web/zurich/admin/stats.html:31
-#: templates/web/zurich/report/banner.html:13
msgid "Closed"
msgstr "關閉"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:771
+#: perllib/FixMyStreet/DB/Result/Problem.pm:794
msgid "Closed by council"
msgstr "由地方政府關閉"
-#: templates/web/base/my/my.html:40
-#: templates/web/fixmystreet/my/_problem-list.html:12
-msgid "Closed reports"
-msgstr "完çµä¹‹ç”³å ± "
-
#: templates/web/base/admin/problem_row.html:38
msgid "Closed:"
msgstr "關閉:"
-#: templates/web/base/around/tabbed_lists.html:10
-#: templates/web/base/around/tabbed_lists.html:12
-msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
-msgstr "最鄰近å•題<small>(&nbsp;%s公里之內)</small>"
-
#: templates/web/base/admin/report_edit.html:23
-#: templates/web/zurich/admin/report_edit-sdm.html:33
-#: templates/web/zurich/admin/report_edit.html:46
msgid "Co-ordinates:"
msgstr "å”åŒå–®ä½:"
@@ -551,22 +612,22 @@ msgstr "å”åŒå–®ä½:"
msgid "Cobrand"
msgstr "è¯åˆå“牌"
-#: templates/web/base/admin/report_edit.html:91
+#: templates/web/base/admin/report_edit.html:73
#: templates/web/base/admin/update_edit.html:50
msgid "Cobrand data:"
msgstr "è¯åˆå“牌資料:"
-#: templates/web/base/admin/report_edit.html:90
+#: templates/web/base/admin/report_edit.html:72
#: templates/web/base/admin/update_edit.html:49
msgid "Cobrand:"
msgstr "è¯åˆå“牌:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1199
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1283
#: templates/web/base/admin/config_page.html:1
msgid "Configuration"
msgstr "設定"
-#: templates/web/base/admin/category_edit.html:52
+#: templates/web/base/admin/category_edit.html:55
msgid "Configure Endpoint"
msgstr "組態端 點"
@@ -574,7 +635,7 @@ msgstr "組態端 點"
msgid "Confirm"
msgstr "確èª"
-#: templates/web/base/auth/token.html:1
+#: templates/web/base/auth/token.html:1 templates/web/zurich/auth/token.html:1
msgid "Confirm account"
msgstr "確èªå¸³æˆ¶"
@@ -594,7 +655,7 @@ msgstr "確èª"
#: templates/web/base/admin/body.html:166
#: templates/web/base/admin/body.html:79
#: templates/web/base/admin/category_edit.html:37
-#: templates/web/base/admin/category_edit.html:89
+#: templates/web/base/admin/category_edit.html:92
#: templates/web/zurich/admin/stats.html:40
msgid "Confirmed"
msgstr "已確èª"
@@ -605,13 +666,18 @@ msgstr "%s 與 %s 之間已確èªçš„申報"
#: templates/web/base/admin/list_updates.html:39
#: templates/web/base/admin/problem_row.html:36
-#: templates/web/base/admin/report_edit.html:83
+#: templates/web/base/admin/report_edit.html:65
msgid "Confirmed:"
msgstr "已確èªï¼š"
-#: templates/web/base/footer.html:24
-msgid "Contact FixMyStreet"
-msgstr "連絡「FixMyStreetã€"
+#. ("%s is the site name")
+#: templates/web/base/faq/faq-en-gb.html:8 templates/web/base/footer.html:24
+#: templates/web/base/open311/index.html:8
+#: templates/web/base/static/privacy.html:10
+#: templates/web/fixmystreet/contact/index.html:12
+#, fuzzy
+msgid "Contact %s"
+msgstr "連絡我們"
#: templates/web/base/contact/index.html:1
#: templates/web/base/contact/index.html:2
@@ -626,8 +692,14 @@ msgstr "連絡我們"
msgid "Contact the team"
msgstr "é€£çµæœ¬åœ˜éšŠ"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1325
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1353
+#: templates/web/zurich/admin/report_edit-sdm.html:40
+#: templates/web/zurich/admin/report_edit.html:59
+#, fuzzy
+msgid "Coordinates:"
+msgstr "å”åŒå–®ä½:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1420
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1448
msgid "Could not find user"
msgstr "找ä¸åˆ°è©²æˆ¶ç”¨"
@@ -645,7 +717,7 @@ msgstr "地方政府"
msgid "Council contacts for %s"
msgstr "è¯ç¹‹åœ°æ–¹æ”¿åºœ %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:670
+#: perllib/FixMyStreet/DB/Result/Problem.pm:693
msgid "Council ref:&nbsp;%s"
msgstr "åœ°æ–¹æ”¿åºœæµæ°´è™Ÿã€€ref:&nbsp;%s"
@@ -660,7 +732,7 @@ msgstr "地方政府"
msgid "Count"
msgstr "數é‡"
-#: templates/web/base/email_sent.html:1
+#: templates/web/base/email_sent.html:1 templates/web/zurich/email_sent.html:1
msgid "Create a report"
msgstr "創建申報"
@@ -669,17 +741,19 @@ msgstr "創建申報"
msgid "Create category"
msgstr "創建類別"
+#: templates/web/zurich/admin/template_edit.html:29
+#, fuzzy
+msgid "Create template"
+msgstr "創建申報"
+
#: templates/web/base/admin/problem_row.html:34
-#: templates/web/zurich/admin/list_updates.html:29
-#: templates/web/zurich/admin/list_updates.html:8
+#: templates/web/zurich/admin/templates.html:10
msgid "Created"
msgstr "建立"
#: templates/web/base/admin/list_updates.html:38
-#: templates/web/base/admin/report_edit.html:82
+#: templates/web/base/admin/report_edit.html:64
#: templates/web/base/admin/update_edit.html:51
-#: templates/web/zurich/admin/report_edit-sdm.html:47
-#: templates/web/zurich/admin/report_edit.html:61
#: templates/web/zurich/admin/update_edit.html:29
msgid "Created:"
msgstr "建立:"
@@ -689,10 +763,15 @@ msgid "Current state"
msgstr "ç›®å‰ç‹€æ³"
#: templates/web/base/admin/bodies.html:5
-#: templates/web/base/admin/index.html:16
+#: templates/web/base/admin/index.html:17
msgid "Currently no bodies have been created."
msgstr "ç›®å‰æœªå‰µå»ºå…§æ–‡"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:834
+#: templates/web/zurich/admin/report_edit-sdm.html:109
+msgid "Customer not contactable"
+msgstr ""
+
#: templates/web/base/dashboard/index.html:5
#: templates/web/base/dashboard/index.html:7
msgid "Dashboard"
@@ -702,11 +781,16 @@ msgstr "控制å°"
msgid "Dealt with by subdivision within 5 working days"
msgstr "下屬單ä½5個工作天內處ç†ã€‚"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:878
+#: templates/web/zurich/admin/template_edit.html:33
+msgid "Delete template"
+msgstr ""
+
#: templates/web/base/admin/bodies.html:27
#: templates/web/base/admin/body.html:177
#: templates/web/base/admin/body.html:81
#: templates/web/base/admin/category_edit.html:42
-#: templates/web/base/admin/category_edit.html:90
+#: templates/web/base/admin/category_edit.html:93
msgid "Deleted"
msgstr "刪除"
@@ -724,9 +808,9 @@ msgstr "細節"
#: templates/web/base/admin/report_edit.html:20
#: templates/web/base/report/new/fill_in_details_form.html:62
-#: templates/web/zurich/admin/report_edit-sdm.html:25
-#: templates/web/zurich/admin/report_edit.html:25
-#: templates/web/zurich/admin/report_edit.html:35
+#: templates/web/zurich/admin/report_edit-sdm.html:27
+#: templates/web/zurich/admin/report_edit.html:29
+#: templates/web/zurich/admin/report_edit.html:43
msgid "Details:"
msgstr "細節:"
@@ -734,23 +818,27 @@ msgstr "細節:"
msgid "Devolved"
msgstr "下放"
+#: templates/web/zurich/admin/report_edit-sdm.html:50
+#: templates/web/zurich/admin/report_edit.html:69
+#, fuzzy
+msgid "Didn't use map"
+msgstr "ä¸ä½¿ç”¨åœ°åœ–"
+
#: templates/web/base/admin/edit-league.html:8
msgid "Diligency prize league table"
msgstr "勤奮表ç¾åå–®"
-#: templates/web/fixmystreet/auth/general.html:31
-msgid "Do you have a FixMyBarangay password?"
-msgstr "æ‚¨æ˜¯å¦æœ‰FixMyBarangay 之密碼?"
-
-#: templates/web/base/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:33
+#. ("%s is the site name")
+#: templates/web/base/auth/general.html:31
+#: templates/web/base/report/new/fill_in_details_form.html:114
+#: templates/web/base/report/update-form.html:87
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:11
#: templates/web/fixmystreet/report/update-form.html:86
-msgid "Do you have a FixMyStreet password?"
+#, fuzzy
+msgid "Do you have a %s password?"
msgstr "æ‚¨æ˜¯å¦æœ‰ FixMyStreet 密碼? "
-#: templates/web/base/questionnaire/index.html:46
-#: templates/web/fixmystreet/questionnaire/index.html:65
+#: templates/web/base/questionnaire/index.html:55
msgid "Don&rsquo;t know"
msgstr "ä¸çŸ¥é“"
@@ -758,8 +846,8 @@ msgstr "ä¸çŸ¥é“"
msgid "Don't like forms?"
msgstr "ä¸å–œæ­¡æ­¤è¡¨å–®ï¼Ÿ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:60
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:14
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:32
#: templates/web/fixmystreet/report/update-form.html:28
@@ -781,7 +869,8 @@ msgstr ""
#: templates/web/base/admin/list_updates.html:42
#: templates/web/base/admin/problem_row.html:41
#: templates/web/base/admin/users.html:33
-#: templates/web/zurich/admin/problem_row.html:42
+#: templates/web/zurich/admin/problem_row.html:48
+#: templates/web/zurich/admin/templates.html:20
msgid "Edit"
msgstr "編輯"
@@ -792,7 +881,7 @@ msgstr "編輯有關單ä½ç´°ç¯€"
#: templates/web/base/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit-sdm.html:1
-#: templates/web/zurich/admin/report_edit-sdm.html:4
+#: templates/web/zurich/admin/report_edit-sdm.html:5
#: templates/web/zurich/admin/report_edit.html:1
#: templates/web/zurich/admin/report_edit.html:5
msgid "Editing problem %d"
@@ -807,15 +896,15 @@ msgstr "編輯更新 %d"
msgid "Editing user %d"
msgstr "編輯用戶帳號 $d"
-#: templates/web/base/admin/category_edit.html:91
+#: templates/web/base/admin/category_edit.html:94
msgid "Editor"
msgstr "編輯器"
#: templates/web/base/admin/bodies.html:23
-#: templates/web/base/admin/category_edit.html:88
+#: templates/web/base/admin/category_edit.html:91
#: templates/web/base/admin/flagged.html:38
#: templates/web/base/admin/users.html:16
-#: templates/web/fixmystreet/auth/general.html:21
+#: templates/web/base/auth/general.html:22
#: templates/web/zurich/admin/body-form.html:9
#: templates/web/zurich/admin/body.html:15
#: templates/web/zurich/auth/general.html:24
@@ -823,7 +912,7 @@ msgstr "編輯器"
msgid "Email"
msgstr "é›»å­éƒµä»¶"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1301
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1396
msgid "Email added to abuse list"
msgstr "é›»å­éƒµä»¶åˆ—入濫發åå–®"
@@ -839,7 +928,7 @@ msgstr "建立電郵通知"
msgid "Email alert deleted"
msgstr "å–æ¶ˆé›»éƒµé€šçŸ¥"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1298
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1393
msgid "Email already in abuse list"
msgstr "é›»å­éƒµä»¶å·±åœ¨æ¿«ç™¼åå–®"
@@ -852,38 +941,36 @@ msgid "Email me updates"
msgstr "以電郵通知更新"
#: templates/web/base/admin/category_edit.html:31
-#: templates/web/base/admin/report_edit.html:80
+#: templates/web/base/admin/report_edit.html:62
#: templates/web/base/admin/update_edit.html:33
#: templates/web/base/admin/user-form.html:20
#: templates/web/base/alert/updates.html:13
#: templates/web/base/report/display.html:42
#: templates/web/zurich/admin/body.html:47
-#: templates/web/zurich/admin/report_edit-sdm.html:44
-#: templates/web/zurich/admin/report_edit.html:57
msgid "Email:"
msgstr "é›»å­éƒµä»¶:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
msgid "Email: %s"
msgstr "é›»å­éƒµä»¶: %s"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:639
msgid "Empty flat or maisonette"
msgstr "閒置的公寓或大樓"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:638
msgid "Empty house or bungalow"
msgstr "閒置的房èˆ"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:634
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:641
msgid "Empty office or other commercial"
msgstr "閒置的辦公室或其它商業空間"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:635
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:642
msgid "Empty pub or bar"
msgstr "閒置的酒館或咖啡廳"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:636
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:643
msgid "Empty public building - school, hospital, etc."
msgstr "閒置的公共建築物,如學校,醫院等"
@@ -917,7 +1004,7 @@ msgstr "çµæŸæ—¥æœŸ:"
msgid "Endpoint"
msgstr "çµæŸé»ž"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:73
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:76
msgid "Enter a Z&uuml;rich street name"
msgstr "輸入街é“å稱 "
@@ -930,10 +1017,8 @@ msgstr "輸入本å€çš„éƒµç·¨ï¼Œè¡—åæˆ–å€åŸŸã€‚"
msgid "Enter a nearby postcode, or street name and area"
msgstr "輸入本å€çš„éƒµç·¨ï¼Œè¡—åæˆ–å€åŸŸã€‚"
-#: templates/web/base/around/postcode_form.html:1
-#: templates/web/base/around/postcode_form.html:2
-#: templates/web/fixmystreet/around/postcode_form.html:10
-#: templates/web/fixmystreet/around/postcode_form.html:11
+#: templates/web/base/around/postcode_form.html:5
+#: templates/web/base/around/postcode_form.html:6
msgid "Enter a nearby street name and area"
msgstr "è¼¸å…¥æœ€è¿‘çš„è¡—åæˆ–地å€"
@@ -941,13 +1026,12 @@ msgstr "è¼¸å…¥æœ€è¿‘çš„è¡—åæˆ–地å€"
msgid "Enter a nearby street name and area, postal code or district in Delhi"
msgstr "輸入最近的街åï¼Œåœ°å€æˆ–郵編號碼"
-#: templates/web/base/auth/general.html:64
-#: templates/web/base/report/new/fill_in_details_form.html:151
-#: templates/web/base/report/update-form.html:124
+#: templates/web/base/report/new/fill_in_details_form.html:152
+#: templates/web/base/report/update-form.html:125
msgid "Enter a new password:"
msgstr "請輸入新密碼"
-#: templates/web/fixmystreet/auth/general.html:63
+#: templates/web/base/auth/general.html:60
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:75
#: templates/web/fixmystreet/report/update-form.html:123
#: templates/web/zurich/auth/general.html:65
@@ -958,7 +1042,6 @@ msgstr "請輸入密碼"
msgid "Enter details of the problem"
msgstr "請在此填寫å•題的細節"
-#: templates/web/base/auth/token.html:5
#: templates/web/base/errors/generic.html:1
#: templates/web/base/errors/generic.html:3
#: templates/web/base/tokens/abuse.html:1
@@ -968,6 +1051,10 @@ msgstr "請在此填寫å•題的細節"
msgid "Error"
msgstr "錯誤"
+#: templates/web/base/reports/_list-filters.html:12
+msgid "Everything"
+msgstr ""
+
#: templates/web/base/admin/body.html:14
#: templates/web/base/admin/category_edit.html:18
msgid "Example postcode %s"
@@ -981,12 +1068,19 @@ msgstr "範例:"
msgid "Explain what’s wrong, exactly where it is, and how long it’s been there…"
msgstr "說明什麼壞掉故障了,確切的地點以åŠå®ƒç½®æ–¼æ­¤è™•有多久了"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:181
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:922
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:12
+msgid "Extern"
+msgstr ""
+
#: templates/web/base/admin/body-form.html:81
msgid "External URL"
msgstr ""
#: templates/web/base/admin/category_edit.html:27
-#: templates/web/base/admin/report_edit.html:92
+#: templates/web/base/admin/report_edit.html:74
msgid "Extra data:"
msgstr "其它資料:"
@@ -999,8 +1093,7 @@ msgstr "無法é€å‡ºç•™è¨€"
msgid "Filter report list"
msgstr "éŽæ¿¾åˆæ¬¡ç”³å ±ã€€"
-#: templates/web/base/questionnaire/index.html:55
-#: templates/web/fixmystreet/questionnaire/index.html:74
+#: templates/web/base/questionnaire/index.html:64
msgid "First time"
msgstr "首次"
@@ -1008,44 +1101,14 @@ msgstr "首次"
msgid "Fix this by choosing an <strong>area covered</strong> in the <em>Edit body details</em> form below."
msgstr "鏿“‡<strong>涵蓋的å€åŸŸ</strong> <em>編輯有關單ä½</em> 表單。"
-#: templates/web/base/header.html:24
+#: templates/web/base/header.html:26
msgid "FixMyStreet"
msgstr "FixMyStreet"
-#: templates/web/base/admin/header.html:10
-msgid "FixMyStreet admin:"
-msgstr "FixMyStreet 管ç†å“¡:"
-
-#: templates/web/base/alert/index.html:11
-msgid ""
-"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
-"alerts for all problems within a particular ward or council, or all problems\n"
-"within a certain distance of a particular location."
-msgstr ""
-"FixMyStreeé‡å°åœ¨åœ°å•題,æä¾›å„種 RSS 訂閱與電å­éƒµä»¶é€šçŸ¥ä¿¡ï¼ŒåŒ…括\n"
-"æŸæŒ‡å®šå€åŸŸæˆ–政府部門內å„類å•題的通知\n"
-"或是æŸä¸€ç¯„åœå…§å„類å•題的通知"
-
-#: templates/web/base/alert/_list.html:71
-#: templates/web/fixmystreet/alert/_list.html:73
-msgid ""
-"FixMyStreet sends different categories of problem\n"
-"to the appropriate council, so problems within the boundary of a particular council\n"
-"might not match the problems sent to that council. For example, a graffiti report\n"
-"will be sent to the district council, so will appear in both of the district\n"
-"council&rsquo;s alerts, but will only appear in the \"Within the boundary\" alert\n"
-"for the county council."
-msgstr ""
-"FixMyStreet é€å‡ºä¸åŒé¡žåˆ¥çš„å•題申報給\n"
-"é©å®œçš„地方政府機關,如果å•é¡Œç™¼ç”Ÿåœ¨æŸæ”¿åºœçš„轄å€å…§\n"
-"é€™æ¨£è™•ç†æˆ–許的確é©ç•¶ã€‚例如,塗鴉å•題將\n"
-"申報給里/倿©Ÿæ§‹ï¼Œæ‰€ä»¥æœƒåœ¨é‡Œ/倿©Ÿé—œçš„通告上\n"
-"è€Œåœ¨åœ°æ–¹æ”¿åºœçš„å…¬å‘Šç‰ˆä¸Šåªæœƒå‡ºç¾åœ¨è½„內通知上"
-
-#: templates/web/base/admin/index.html:55
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:54
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/index.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:24
+#: templates/web/base/admin/report_blocks.html:9
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:144
#: templates/web/base/report/update-form.html:30
@@ -1056,21 +1119,16 @@ msgstr ""
msgid "Fixed"
msgstr "已處ç†"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:56
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:11
msgid "Fixed - Council"
msgstr "已處ç†ï¼åœ°æ–¹æ”¿åºœ"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:55
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:10
msgid "Fixed - User"
msgstr "已處ç†ï¼ç”¨æˆ¶"
-#: templates/web/base/my/my.html:35
-#: templates/web/fixmystreet/my/_problem-list.html:7
-msgid "Fixed reports"
-msgstr "已處ç†ä¹‹ç”³å ±ã€€"
-
#: templates/web/base/admin/problem_row.html:37
msgid "Fixed:"
msgstr "已處ç†:"
@@ -1080,11 +1138,11 @@ msgstr "已處ç†:"
msgid "Flag as deleted"
msgstr "標記警告為刪除 "
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Flag user"
msgstr "標記警告用戶"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1281
#: templates/web/base/admin/users.html:19
msgid "Flagged"
msgstr "標記警告"
@@ -1101,7 +1159,7 @@ msgstr "標記警告用戶其已被列入 <a href='%s'>警告é </a>"
msgid "Flagged users are not restricted in any way. This is just a list of users that have been marked for attention."
msgstr "被標記警告的用戶其權é™ä¸å—å½±éŸ¿ï¼Œåªæ˜¯åˆ—入特別關注åå–®"
-#: templates/web/base/admin/report_edit.html:94
+#: templates/web/base/admin/report_edit.html:76
#: templates/web/base/admin/user-form.html:52
msgid "Flagged:"
msgstr "警告:"
@@ -1120,9 +1178,22 @@ msgstr "更多資訊,請詳見<a href='http://fixmystreet.org/customising/fms_
msgid "Forgotten your password?"
msgstr "忘記您的密碼?"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:752
+#, fuzzy
+msgid "Forwarded to external body"
+msgstr "分派給外部機:"
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:753
+#, fuzzy
+msgid "Forwarded wish to external body"
+msgstr "分派給外部機:"
+
#: templates/web/base/faq/faq-en-gb.html:1
-#: templates/web/base/static/privacy.html:1
-#: templates/web/base/static/privacy.html:2
+#: templates/web/base/faq/faq-en-gb.html:13
+#: templates/web/base/faq/faq-en-gb.html:6
+#: templates/web/base/open311/index.html:6
+#: templates/web/base/static/privacy.html:8
+#: templates/web/fixmystreet/contact/index.html:10
msgid "Frequently Asked Questions"
msgstr "常見å•題回覆 "
@@ -1145,8 +1216,7 @@ msgstr "å–å¾— %så•題之更新"
msgid "Get updates of problems in this %s"
msgstr "å–å¾— %så€åŸŸå…§çš„å•題更新"
-#: templates/web/base/alert/_list.html:83
-#: templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/base/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "我è¦è¨‚é–±RSS"
@@ -1155,17 +1225,17 @@ msgid "Glad to hear it’s been fixed!"
msgstr "很高興è½åˆ°å•題已處ç†äº†ã€‚"
#: templates/web/base/alert/index.html:34
-#: templates/web/base/around/postcode_form.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:21
+#: templates/web/base/around/postcode_form.html:16
+#: templates/web/base/reports/_list-filters.html:28
#: templates/web/zurich/admin/stats.html:26
msgid "Go"
msgstr "èµ°"
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:75
msgid "Going to send questionnaire?"
msgstr "å³å°‡é€å‡ºå•å·ï¼Ÿ"
-#: templates/web/base/admin/index.html:43
+#: templates/web/base/admin/index.html:42
msgid "Graph of problem creation by status over time"
msgstr "隨時間産生的å•題圖片"
@@ -1173,41 +1243,37 @@ msgstr "隨時間産生的å•題圖片"
msgid "Greyed-out lines are councils that no longer exist."
msgstr "ç°è‰²çš„地方政府機關表示為已ä¸å†å­˜åœ¨"
-#: templates/web/base/questionnaire/index.html:37
-#: templates/web/fixmystreet/questionnaire/index.html:56
+#: templates/web/base/questionnaire/index.html:46
msgid "Has this problem been fixed?"
msgstr "å•題已處ç†äº†å—Ž?"
-#: templates/web/base/questionnaire/index.html:50
-#: templates/web/fixmystreet/questionnaire/index.html:69
+#: templates/web/base/questionnaire/index.html:59
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr "æ‚¨ä¹‹å‰æ˜¯å¦æ›¾å‘地方政府申報éŽå•題?或者此為您的首次申報? "
-#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:30
+#: templates/web/base/footer.html:15 templates/web/fixmystreet/footer.html:38
#: templates/web/zurich/faq/faq-de-ch.html:1
-#: templates/web/zurich/footer.html:21
+#: templates/web/zurich/footer.html:22
#: templates/web/zurich/nav_over_content.html:8
msgid "Help"
msgstr "å”助"
-#: templates/web/base/alert/_list.html:6
-#: templates/web/fixmystreet/alert/_list.html:8
+#: templates/web/base/alert/_list.html:8
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr "此為在地å•題的種類 &lsquo;%s&rsquo;."
-#: templates/web/fixmystreet/header.html:58
-#: templates/web/zurich/footer.html:11
+#: templates/web/base/header.html:32 templates/web/fixmystreet/header.html:63
+#: templates/web/zurich/footer.html:12
msgid "Hi %s"
msgstr "您好 %s"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:63
-#: templates/web/base/admin/report_edit.html:64
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:915
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:17
+#: templates/web/base/admin/report_blocks.html:26
#: templates/web/base/admin/update_edit.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:11
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:90
#: templates/web/zurich/admin/stats.html:32
#: templates/web/zurich/admin/update_edit.html:18
msgid "Hidden"
@@ -1221,7 +1287,7 @@ msgstr "éš±è—舊文"
msgid "Hide pins"
msgstr "éš±è—地圖標示"
-#: templates/web/base/admin/category_edit.html:84
+#: templates/web/base/admin/category_edit.html:87
msgid "History"
msgstr "歷程 "
@@ -1237,7 +1303,7 @@ msgstr "如何申報å•題 "
msgid "How to send successful reports"
msgstr "如何æˆåŠŸåœ°é€å‡ºç”³å ±"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:740
+#: perllib/FixMyStreet/App/Controller/Admin.pm:754
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "您ä¸èƒ½ç¢ºèªæ­¤å°šæœªç¢ºèªä¹‹ç”³å ±ã€€"
@@ -1264,8 +1330,8 @@ msgstr "們無法驗證此代號,如果您從電å­éƒµä»¶ä¸­è¤‡è£½äº†è¶…連çµ
#: templates/web/base/admin/reports.html:11
#: templates/web/zurich/admin/index-dm.html:21
#: templates/web/zurich/admin/index-sdm.html:19
-#: templates/web/zurich/admin/list_updates.html:28
-#: templates/web/zurich/admin/list_updates.html:7
+#: templates/web/zurich/admin/list_updates.html:24
+#: templates/web/zurich/admin/list_updates.html:38
#: templates/web/zurich/admin/reports.html:11
msgid "ID"
msgstr "帳戶"
@@ -1288,18 +1354,6 @@ msgstr ""
"\n"
"如果你想這樣,請確ä¿ä½ åœ¨æœ‰é—œå–®ä½ä¸­ä½¿ç”¨åŒä¸€é¡žåˆ¥ã€‚"
-#: templates/web/base/email_sent.html:19
-msgid "If you do not, your alert will not be activated."
-msgstr "如果您é¸ä¸ï¼Œæ‚¨çš„é€šçŸ¥å°‡ä¸æœƒç”Ÿæ•ˆ"
-
-#: templates/web/base/email_sent.html:15
-msgid "If you do not, your problem will not be posted."
-msgstr "å¦‚æžœæ‚¨é¸æ“‡ä¸ï¼Œæ‚¨çš„å•é¡Œå°‡ä¸æœƒè¢«è²¼å‡º"
-
-#: templates/web/base/email_sent.html:17
-msgid "If you do not, your update will not be posted."
-msgstr "å¦‚æžœæ‚¨é¸æ“‡ä¸ï¼Œæ‚¨çš„æ›´æ–°å°‡ä¸æœƒé¡¯ç¤º"
-
#: templates/web/base/questionnaire/completed.html:8
msgid "If you get some more information about the status of your problem, please come back to the site and leave an update."
msgstr "如果你å°ç”³å ±ä¹‹å•題有進一步狀æ³ï¼Œæ­¡è¿Žå›žåˆ°æœ¬ç«™ç•™è¨€æ›´æ–°"
@@ -1309,16 +1363,16 @@ msgstr "如果你å°ç”³å ±ä¹‹å•題有進一步狀æ³ï¼Œæ­¡è¿Žå›žåˆ°æœ¬ç«™ç•™è¨€
msgid "If you submit a problem here the subject and details of the problem will be public, but the problem will <strong>not</strong> be reported to the council."
msgstr "您在此交付投訴å•題的主旨與細節都將在此公開, 但此å•題 <strong>n䏦䏿œƒ</strong> 被呈éžçµ¦åœ°æ–¹æ”¿åºœã€‚"
-#: templates/web/base/auth/token.html:22 templates/web/base/email_sent.html:9
+#: templates/web/zurich/auth/token.html:19
+#: templates/web/zurich/email_sent.html:7
msgid "If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way."
msgstr "如果您使用網é é›»å­éƒµä»¶æˆ–é–‹å•Ÿåžƒåœ¾ä¿¡ä»¶éŽæ¿¾ï¼Œæ‚¨æœ€å¥½æª¢æŸ¥ä¸€ä¸‹æ‚¨çš„垃圾信匧,本站郵件å¯èƒ½è¢«æ­¸åˆ°è©²åˆ†é¡žä¸‹ã€‚"
-#: templates/web/base/questionnaire/index.html:59
-#: templates/web/fixmystreet/questionnaire/index.html:78
+#: templates/web/base/questionnaire/index.html:68
+#, fuzzy
msgid ""
"If you wish to leave a public update on the problem, please enter it here\n"
-"(please note it will not be sent to the council). For example, what was\n"
-"your experience of getting the problem fixed?"
+"(please note it will not be sent to the council)."
msgstr ""
"如果您希望公開留言該å•題之更新,請在此輸入\n"
"(請注æ„å®ƒä¸æœƒè‡ªå‹•é€åˆ°åœ°æ–¹æ”¿åºœ)例如\n"
@@ -1362,7 +1416,7 @@ msgstr ""
"<strong>FixMyStreet</strong> 用戶å¯ä»¥æ˜¯é€™äº›å•題更新的發言者\n"
"一旦他們上線時。請輸入其帳戶ID(編號) "
-#: perllib/FixMyStreet/App/Controller/Contact.pm:132
+#: perllib/FixMyStreet/App/Controller/Contact.pm:133
msgid "Illegal ID"
msgstr "無效帳戶"
@@ -1387,14 +1441,13 @@ msgstr "濫用表格?"
msgid "In addition, the following attributes that are not part of the Open311 v2 specification are returned: agency_sent_datetime, title (also returned as part of description), interface_used, comment_count, requestor_name (only present if requestor allowed the name to be shown on this site)."
msgstr "此外,下列ç†ç”±ä¸¦éžç‚ºOpen311 v2更新特定部份回覆傳é€: agency_sent_datetime, 主旨(部份回覆之æ•è¿°), interface_used, comment_count, requestor_name (åªæœ‰åœ¨åŒæ„å§“åå…¬é–‹ä¸‹æ‰æœƒå‘ˆç¾)."
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:144
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:199
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:963
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:7
#: templates/web/fixmystreet/report/banner.html:19
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:8
-#: templates/web/zurich/admin/report_edit.html:99
-#: templates/web/zurich/report/banner.html:15
msgid "In progress"
msgstr "處ç†ä¸­"
@@ -1402,7 +1455,7 @@ msgstr "處ç†ä¸­"
msgid "Inbox zero, here we come!"
msgstr "信箱已閱畢ï¼"
-#: templates/web/zurich/admin/report_edit.html:160
+#: templates/web/zurich/admin/report_edit.html:227
msgid "Include reporter personal details"
msgstr "包括申報人的個人細節"
@@ -1414,12 +1467,12 @@ msgstr "包括未確èªçš„申報 "
msgid "Incorrect has_photo value \"%s\""
msgstr "䏿­£ç¢ºçš„照片值數 \"%s\""
-#: templates/web/zurich/admin/list_updates.html:3
+#: templates/web/zurich/admin/list_updates.html:35
msgid "Internal notes"
msgstr "內部筆記"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:61
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:16
msgid "Internal referral"
msgstr "內部推薦"
@@ -1427,7 +1480,7 @@ msgstr "內部推薦"
msgid "Invalid agency_responsible value %s"
msgstr "ç„¡æ•ˆçš„æ¬Šè²¬å–®ä½æ•¸å€¼ %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1201
msgid "Invalid end date"
msgstr "ç„¡æ•ˆçš„çµæŸæ—¥æœŸ"
@@ -1435,12 +1488,12 @@ msgstr "ç„¡æ•ˆçš„çµæŸæ—¥æœŸ"
msgid "Invalid format %s specified."
msgstr "無效的%s 特定格å¼"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1108
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1197
msgid "Invalid start date"
msgstr "無效的開始日期"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:50
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:5
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/base/report/update-form.html:30
@@ -1458,10 +1511,19 @@ msgstr "æœ€å¿«æ–¹å¼æ˜¯ <a href=\"%s\">先查看å•答集</a> ,看看答案是
msgid "It’s on its way to the council right now."
msgstr "正呈é€çµ¦åœ°æ–¹æ”¿åºœä¸­"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:184
+msgid "Jurisdiction Unknown"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:927
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:15
+msgid "Jurisdiction unknown"
+msgstr ""
+
#: templates/web/base/auth/general.html:44
-#: templates/web/base/report/new/fill_in_details_form.html:131
-#: templates/web/base/report/update-form.html:104
-#: templates/web/fixmystreet/auth/general.html:47
+#: templates/web/base/report/new/fill_in_details_form.html:132
+#: templates/web/base/report/update-form.html:105
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:28
#: templates/web/fixmystreet/report/update-form.html:102
#: templates/web/zurich/auth/general.html:40
@@ -1473,7 +1535,7 @@ msgstr "新增類別承辦人"
msgid "Last editor"
msgstr "最後編輯 "
-#: templates/web/base/admin/report_edit.html:88
+#: templates/web/base/admin/report_edit.html:70
msgid "Last update:"
msgstr "上回更新:"
@@ -1508,7 +1570,7 @@ msgstr "當地å•題訂閱與電郵通知"
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr "當地å•題訂閱與電郵通知 %s "
-#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:28
+#: templates/web/base/footer.html:13 templates/web/fixmystreet/footer.html:35
msgid "Local alerts"
msgstr "當地å•題 "
@@ -1521,14 +1583,12 @@ msgid "MAP"
msgstr "地圖"
#: templates/web/base/js/translation_strings.html:45
-#: templates/web/base/maps/google-ol.html:13
msgid "Map"
msgstr "地圖"
-#: templates/web/base/admin/report_edit.html:86
-#, fuzzy
+#: templates/web/base/admin/report_edit.html:68
msgid "Mark as sent"
-msgstr "標註為關閉"
+msgstr ""
#: templates/web/base/admin/user-form.html:44
msgid "Mark users whose behaviour you want to keep a check on as <strong>flagged</strong>."
@@ -1546,6 +1606,16 @@ msgstr ""
msgid "Message"
msgstr "留言"
+#: templates/web/zurich/admin/report_edit.html:284
+#, fuzzy
+msgid "Message to competent body:"
+msgstr "分派給外部機:"
+
+#: templates/web/zurich/admin/report_edit.html:282
+#, fuzzy
+msgid "Message to external body:"
+msgstr "分派給外部機:"
+
#: templates/web/base/contact/index.html:97
msgid "Message:"
msgstr "留言"
@@ -1573,27 +1643,25 @@ msgstr "更多鄰近的å•題 "
#: templates/web/base/admin/list_updates.html:7
#: templates/web/base/admin/reports.html:13
#: templates/web/base/admin/users.html:15
+#: templates/web/base/auth/general.html:50
#: templates/web/base/reports/index.html:20
-#: templates/web/fixmystreet/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:9
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:44
#: templates/web/fixmystreet/report/update-form.html:138
#: templates/web/zurich/admin/body-form.html:4
#: templates/web/zurich/auth/general.html:60
-#: templates/web/zurich/report/new/fill_in_details_form.html:77
+#: templates/web/zurich/report/new/fill_in_details_form.html:82
msgid "Name"
msgstr "åå­—"
-#: templates/web/base/admin/report_edit.html:79
+#: templates/web/base/admin/report_edit.html:61
#: templates/web/base/admin/update_edit.html:32
#: templates/web/base/admin/user-form.html:18
-#: templates/web/zurich/admin/report_edit-sdm.html:43
-#: templates/web/zurich/admin/report_edit.html:56
#: templates/web/zurich/admin/stats.html:41
msgid "Name:"
msgstr "å字:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:313
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:328
msgid "Name: %s"
msgstr "å字: %s"
@@ -1606,12 +1674,12 @@ msgstr "找出地圖標記上最近的街é“å稱(利用 OpenStreetMap自動産
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr "找出地圖標記上最近的郵éžå€è™Ÿ(自動産生): %s(%sm away)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:442
-#: perllib/FixMyStreet/Cobrand/Default.pm:482
+#: perllib/FixMyStreet/Cobrand/Default.pm:434
+#: perllib/FixMyStreet/Cobrand/Default.pm:474
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr "找出地圖標記上最近的街é“(利用 Bing Maps自動産生): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:277
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:267
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1619,10 +1687,15 @@ msgstr ""
"找出地圖標記上最近的街é“(利用 Bing Maps自動産生): %s\n"
"\n"
-#: templates/web/base/email_sent.html:3
+#: templates/web/zurich/email_sent.html:5
msgid "Nearly Done! Now check your email..."
msgstr "å·®ä¸å¤šå¿«å®Œæˆäº†ï¼Œç¾åœ¨æª¢æŸ¥æ‚¨çš„é›»å­ä¿¡ç®±"
+#: templates/web/base/auth/token.html:17 templates/web/base/email_sent.html:5
+#, fuzzy
+msgid "Nearly done! Now check your email&hellip;"
+msgstr "å·®ä¸å¤šå¿«å®Œæˆäº†ï¼Œç¾åœ¨æª¢æŸ¥æ‚¨çš„é›»å­ä¿¡ç®±"
+
#: templates/web/base/reports/index.html:21
msgid "New <br>problems"
msgstr "æ–° <br>å•題 "
@@ -1631,12 +1704,12 @@ msgstr "æ–° <br>å•題 "
msgid "New body added"
msgstr "新增內文"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:379
+#: perllib/FixMyStreet/App/Controller/Admin.pm:387
msgid "New category contact added"
msgstr "新增類別承辦 人"
-#: templates/web/zurich/admin/report_edit-sdm.html:55
-#: templates/web/zurich/admin/report_edit.html:81
+#: templates/web/zurich/admin/report_edit-sdm.html:113
+#: templates/web/zurich/admin/report_edit.html:141
msgid "New internal note:"
msgstr "新內部筆記"
@@ -1644,9 +1717,10 @@ msgstr "新內部筆記"
msgid "New local problems on FixMyStreet"
msgstr "FixMyStreet之新近當地å•題 "
-#: db/alert_types_eha.pl:12
-msgid "New local reports on reportemptyhomes.com"
-msgstr "reportemptyhomes.com 上之新近申報 "
+#: templates/web/zurich/admin/report_edit-sdm.html:117
+#, fuzzy
+msgid "New note to DM:"
+msgstr "新內部筆記"
#: db/alert_types.pl:38
msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet"
@@ -1672,33 +1746,15 @@ msgstr " FixMyStree{{Name}} ç¯„åœ ä¹‹æ–°è¿‘å•題 "
msgid "New reports"
msgstr "新的申報 "
-#: db/alert_types_eha.pl:23
-msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
-msgstr "reportemptyhomes.com{{里/å€}}{{地方政府}} 之新近å•題"
-
-#: db/alert_types_eha.pl:5
-msgid "New reports on reportemptyhomes.com"
-msgstr "reportemptyhomes.comæ–°è¿‘å•題 "
-
-#: db/alert_types_eha.pl:16
-msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
-msgstr "reportemptyhomes.com上{{郵éžå€è™Ÿ}} 之新近å•題 "
-
-#: db/alert_types_eha.pl:19
-msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
-msgstr "reportemptyhomes.com上給{{地方政府}} 之新近å•題 "
-
-#: db/alert_types_eha.pl:27
-msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
-msgstr "reportemptyhomes.com{{Name}} ç¯„åœ ä¹‹æ–°è¿‘å•題 "
-
#: templates/web/base/admin/questionnaire.html:24
msgid "New state"
msgstr "新陳述"
-#: templates/web/zurich/admin/report_edit-sdm.html:58
-msgid "New update:"
-msgstr "好"
+#: templates/web/zurich/admin/template_edit.html:9
+#: templates/web/zurich/admin/templates.html:26
+#, fuzzy
+msgid "New template"
+msgstr "新陳述"
#: templates/web/base/pagination.html:13
msgid "Next"
@@ -1711,14 +1767,12 @@ msgstr "下一步"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:77
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:25
#: templates/web/base/questionnaire/creator_fixed.html:16
-#: templates/web/base/questionnaire/index.html:44
-#: templates/web/base/questionnaire/index.html:83
-#: templates/web/fixmystreet/questionnaire/index.html:102
-#: templates/web/fixmystreet/questionnaire/index.html:63
+#: templates/web/base/questionnaire/index.html:53
+#: templates/web/base/questionnaire/index.html:92
msgid "No"
msgstr "ç„¡"
@@ -1746,20 +1800,11 @@ msgstr "æœªç™¼ç¾æ¨™è¨˜è­¦å‘Šå•題 "
msgid "No flagged users found."
msgstr "æœªç™¼ç¾æ¨™è¨˜è­¦å‘Šç”¨æˆ¶"
-#: templates/web/zurich/admin/report_edit-sdm.html:65
+#: templates/web/zurich/admin/report_edit-sdm.html:138
+#: templates/web/zurich/admin/report_edit.html:263
msgid "No further updates"
msgstr "å°šç„¡æ›´æ–°"
-#: templates/web/base/around/around_map_list_items.html:17
-#: templates/web/fixmystreet/around/around_map_list_items.html:8
-msgid "No problems found."
-msgstr "找無å•題"
-
-#: templates/web/base/around/on_map_list_items.html:14
-#: templates/web/fixmystreet/around/on_map_list_items.html:6
-msgid "No problems have been reported yet."
-msgstr "å°šç„¡å•題申報"
-
#: templates/web/base/js/translation_strings.html:38
msgid "No result returned"
msgstr "æŸ¥ç„¡çµæžœ"
@@ -1779,8 +1824,6 @@ msgid "No supporters"
msgstr "無支æ´"
#: templates/web/base/admin/report_edit.html:41
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
msgid "None"
msgstr "沒有"
@@ -1797,8 +1840,8 @@ msgstr ""
"這è¦çœ‹å…·é«”è½å¯¦åŸ·è¡Œç‹€æ³ï¼Œå·¥ä½œäººå“¡å¯èƒ½æœ‰æ¬Šä½¿ç”¨æŽ§åˆ¶å°(其關構下的\n"
"所有活動總覧)。也有能力隱暪æŸäº›ç”³å ±æˆ–更改æŸäº›ç”³å ±çš„ç‹€æ³ã€‚"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:13
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -1806,7 +1849,15 @@ msgstr ""
msgid "Not Responsible"
msgstr "無責任歸屬"
-#: templates/web/zurich/admin/report_edit-sdm.html:18
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:188
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:937
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:13
+#, fuzzy
+msgid "Not contactable"
+msgstr "無責任歸屬"
+
+#: templates/web/zurich/admin/report_edit-sdm.html:108
msgid "Not for my subdivision"
msgstr "éžä¸‹å±¬å–®ä½"
@@ -1819,7 +1870,7 @@ msgid "Not reported to council"
msgstr "未呈報給地方政府"
#: templates/web/base/admin/body.html:71
-#: templates/web/base/admin/category_edit.html:92
+#: templates/web/base/admin/category_edit.html:95
#: templates/web/zurich/admin/body.html:17
msgid "Note"
msgstr "註記"
@@ -1829,7 +1880,7 @@ msgid "Note that when including unconfirmed reports we use the date the report w
msgstr "請注æ„這è£åŒ…æ‹¬äº†æœ¬æœˆä»½ç¸½çµæ’°å¯«å‰ï¼Œå°šæœªç¢ºèªçš„申報,所以數目å¯èƒ½ç¨æœ‰é™ä½Žã€‚"
#: templates/web/base/admin/body.html:186
-#: templates/web/base/admin/category_edit.html:49
+#: templates/web/base/admin/category_edit.html:52
#: templates/web/zurich/admin/body.html:53
msgid "Note:"
msgstr "註記:"
@@ -1838,22 +1889,20 @@ msgstr "註記:"
msgid "Note: <strong>%s</strong>"
msgstr "筆記: <strong>%s</strong>"
+#: templates/web/zurich/admin/list_updates.html:21
+msgid "Notes from SDM to DM"
+msgstr ""
+
+#: templates/web/base/report/new/fill_in_details_form.html:113
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:10
msgid "Now to submit your report&hellip;"
msgstr "ç¾åœ¨é€å‡ºæ‚¨çš„申報 &hellip;"
-#: templates/web/base/report/new/fill_in_details_form.html:113
-msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
-msgstr "ç¾åœ¨é€å‡ºæ‚¨çš„申報 &hellip; æ‚¨æ˜¯å¦æœ‰æœ¬ç«™å¸³å¯†ï¼Ÿ"
-
+#: templates/web/base/report/update-form.html:86
#: templates/web/fixmystreet/report/update-form.html:85
msgid "Now to submit your update&hellip;"
msgstr "ç¾åœ¨é€å‡ºæ‚¨æ›´æ–°çš„申報 &hellip; æ‚¨æ˜¯å¦æœ‰æœ¬ç«™å¸³å¯†ï¼Ÿ"
-#: templates/web/base/report/update-form.html:86
-msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
-msgstr "ç¾åœ¨é€å‡ºæ‚¨æ›´æ–°çš„申報 &hellip;"
-
#: templates/web/base/js/translation_strings.html:42
msgid "OK"
msgstr "好了"
@@ -1883,20 +1932,18 @@ msgstr "舊å•題 "
msgid "One-line summary"
msgstr "一å¥ç¸½çµ"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:138
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:49
-#: templates/web/base/admin/report_edit.html:50
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:176
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:909
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:23
+#: templates/web/base/admin/report_blocks.html:4
#: templates/web/base/admin/update_edit.html:28
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/report/update-form.html:30
#: templates/web/fixmystreet/report/update-form.html:28
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:7
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:88
#: templates/web/zurich/admin/update_edit.html:18
-#: templates/web/zurich/report/banner.html:11
msgid "Open"
msgstr "開放"
@@ -1904,11 +1951,6 @@ msgstr "開放"
msgid "Open for more than four weeks, with an update within the past eight weeks"
msgstr ""
-#: templates/web/base/my/my.html:30
-#: templates/web/fixmystreet/my/_problem-list.html:2
-msgid "Open reports"
-msgstr "開啟申報 "
-
#: templates/web/base/reports/index.html:23
msgid "Open, but not had any update in eight weeks"
msgstr ""
@@ -1925,32 +1967,26 @@ msgstr "Open311 啟動網é "
msgid "Open311 specification"
msgstr "Open311 è¦ç¯„ "
-#: templates/web/base/alert/_list.html:58
-#: templates/web/fixmystreet/alert/_list.html:60
+#: templates/web/base/alert/_list.html:60
msgid "Or problems reported to:"
msgstr "或將此å•題 申報給:"
-#: templates/web/base/alert/_list.html:33
-#: templates/web/fixmystreet/alert/_list.html:36
+#: templates/web/base/alert/_list.html:36
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr "您å¯ä»¥è¨‚閱 里/å€å…§çš„æ›´æ–°é€šçŸ¥"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:1061
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:666
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:667
-#: perllib/FixMyStreet/DB/Result/Problem.pm:565
-#: perllib/FixMyStreet/DB/Result/Problem.pm:575
-#: perllib/FixMyStreet/DB/Result/Problem.pm:585
-#: perllib/FixMyStreet/DB/Result/Problem.pm:597
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:378
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:393
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1084
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:673
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:674
+#: perllib/FixMyStreet/DB/Result/Problem.pm:570
+#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:590
+#: perllib/FixMyStreet/DB/Result/Problem.pm:602
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:412
msgid "Other"
msgstr "其它"
-#: templates/web/base/footer.html:27
-msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
-msgstr "我們的原始碼å¯åœ¨ <a href=\"http://github.com/mysociety/fixmystreet\">GitHub</a>å–å¾—"
-
#: templates/web/base/admin/list_updates.html:8
msgid "Owner"
msgstr "物主"
@@ -1965,12 +2001,12 @@ msgstr "找無此é "
msgid "Parent"
msgstr "上級 "
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:18
msgid "Partial"
msgstr "部份"
-#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/base/auth/general.html:53
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:68
#: templates/web/fixmystreet/report/update-form.html:116
#: templates/web/zurich/auth/general.html:32
@@ -1979,6 +2015,7 @@ msgid "Password (optional)"
msgstr "密碼(ä»»é¸):"
#: templates/web/base/auth/change_password.html:25
+#: templates/web/base/auth/general.html:36
msgid "Password:"
msgstr "密碼:"
@@ -1986,7 +2023,7 @@ msgstr "密碼:"
msgid "Permalink"
msgstr "永久連çµ"
-#: templates/web/zurich/report/new/fill_in_details_form.html:83
+#: templates/web/zurich/report/new/fill_in_details_form.html:88
msgid "Phone number"
msgstr "電話號碼"
@@ -1995,11 +2032,9 @@ msgstr "電話號碼"
msgid "Phone number (optional)"
msgstr "電話號碼(éžå¿…å¡«)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:291
-#: templates/web/base/admin/report_edit.html:81
-#: templates/web/base/report/new/fill_in_details_form.html:197
-#: templates/web/zurich/admin/report_edit-sdm.html:46
-#: templates/web/zurich/admin/report_edit.html:60
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:306
+#: templates/web/base/admin/report_edit.html:63
+#: templates/web/base/report/new/fill_in_details_form.html:198
#: templates/web/zurich/admin/stats.html:39
msgid "Phone:"
msgstr "電話"
@@ -2010,14 +2045,23 @@ msgstr "電話"
#: templates/web/zurich/admin/index-sdm.html:24
#: templates/web/zurich/admin/reports.html:16
#: templates/web/zurich/admin/stats.html:37
-#: templates/web/zurich/report/new/fill_in_details_form.html:51
+#: templates/web/zurich/report/new/fill_in_details_form.html:52
msgid "Photo"
msgstr "照片"
-#: templates/web/base/questionnaire/index.html:71
+#: perllib/FixMyStreet/App/Controller/Photo.pm:221
+#, fuzzy
+msgid "Photo is required."
+msgstr "本項資訊必填"
+
+#: templates/web/base/admin/category_edit.html:48
+#, fuzzy
+msgid "Photo required"
+msgstr "本項資訊必填"
+
+#: templates/web/base/questionnaire/index.html:80
#: templates/web/base/report/new/fill_in_details_form.html:84
#: templates/web/base/report/update-form.html:62
-#: templates/web/fixmystreet/questionnaire/index.html:91
msgid "Photo:"
msgstr "照片:"
@@ -2029,22 +2073,18 @@ msgstr "最近申報之照片"
msgid "Place pin on map"
msgstr "在地圖上作標記"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:51
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:949
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:955
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:6
#: templates/web/base/dashboard/index.html:142
#: templates/web/base/dashboard/index.html:143
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:9
#: templates/web/zurich/admin/index-dm.html:9
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:89
msgid "Planned"
msgstr "å·²è¦åŠƒ"
-#: templates/web/fixmystreet/questionnaire/index.html:45
-msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
-msgstr "請<a class=\"tab_link\" href=\"#report\">按此查看</a> 最近更新"
-
#: templates/web/base/report/new/notes.html:5
msgid "Please be polite, concise and to the point."
msgstr "用語請éµå®ˆç¦®ç¯€ï¼Œæ˜Žç¢ºè§£é‡‹å•題 "
@@ -2054,22 +2094,20 @@ msgstr "用語請éµå®ˆç¦®ç¯€ï¼Œæ˜Žç¢ºè§£é‡‹å•題 "
msgid "Please check the passwords and try again"
msgstr "è«‹å†æ¬¡ç¢ºèªæ‚¨çš„密碼"
-#: templates/web/base/auth/token.html:14
+#: templates/web/zurich/auth/token.html:16
msgid "Please check your email"
msgstr "請檢查您的電å­éƒµä»¶"
-#: templates/web/base/auth/general.html:14
-#: templates/web/base/auth/general.html:8
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:16
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:16
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:9
msgid "Please check your email address is correct"
msgstr "è«‹ç¢ºèªæ‚¨é›»éƒµåœ°å€ç„¡èª¤"
#: perllib/FixMyStreet/App/Controller/Admin.pm:343
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:876
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:883
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:948
#: perllib/FixMyStreet/DB/Result/Problem.pm:412
#: templates/web/base/js/translation_strings.html:9
msgid "Please choose a category"
@@ -2079,15 +2117,16 @@ msgstr "è«‹é¸æ“‡é¡žåˆ¥"
msgid "Please choose a property type"
msgstr "鏿“‡å…¬ç‰©ç¨®é¡ž"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:370
+#: perllib/FixMyStreet/App/Controller/Admin.pm:378
msgid "Please correct the errors below"
msgstr "請更正下方之錯誤"
#: templates/web/base/contact/blurb.html:2
#: templates/web/fixmystreet/contact/blurb.html:12
+#, fuzzy
msgid ""
"Please do <strong>not</strong> report problems through this form; messages go to\n"
-"the team behind FixMyStreet, not a council. To report a problem,\n"
+"the team behind this site, not a council. To report a problem,\n"
"please <a href=\"/\">go to the front page</a> and follow the instructions."
msgstr ""
"è«‹<strong>å‹¿</strong> é€éŽæœ¬è¡¨å–®ç”³å ±å•題; 留言會跑到\n"
@@ -2099,7 +2138,7 @@ msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the s
msgstr "請勿濫用本æœå‹™ï¼Œæ¿«ç”¨å°‡é€ æˆæ‚¨çš„æ”¿åºœè¼•視其它使用者之æ„見 "
#: perllib/FixMyStreet/App/Controller/Admin.pm:346
-#: perllib/FixMyStreet/DB/Result/Comment.pm:125
+#: perllib/FixMyStreet/DB/Result/Comment.pm:126
#: templates/web/base/js/translation_strings.html:2
msgid "Please enter a message"
msgstr "請寫下您的留言"
@@ -2110,15 +2149,15 @@ msgstr "請寫下您的留言"
msgid "Please enter a password"
msgstr "請輸入密碼"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:113
+#: perllib/FixMyStreet/App/Controller/Contact.pm:114
#: perllib/FixMyStreet/DB/Result/Problem.pm:395
#: templates/web/base/js/translation_strings.html:3
msgid "Please enter a subject"
msgstr "請填下主旨"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1048
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1084
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1137
#: perllib/FixMyStreet/App/Controller/Admin.pm:345
-#: perllib/FixMyStreet/App/Controller/Admin.pm:995
#: perllib/FixMyStreet/DB/Result/User.pm:127
#: templates/web/base/js/translation_strings.html:12
#: templates/web/base/js/translation_strings.html:16
@@ -2126,7 +2165,7 @@ msgid "Please enter a valid email"
msgstr "請輸入有效電å­éƒµä»¶"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
-#: perllib/FixMyStreet/App/Controller/Contact.pm:123
+#: perllib/FixMyStreet/App/Controller/Contact.pm:124
msgid "Please enter a valid email address"
msgstr "請輸入有效的電å­éƒµä»¶"
@@ -2135,21 +2174,19 @@ msgstr "請輸入有效的電å­éƒµä»¶"
msgid "Please enter some details"
msgstr "請填寫進一步細節"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/App/Controller/Contact.pm:113
#: perllib/FixMyStreet/DB/Result/User.pm:124
-#: templates/web/base/auth/general.html:13
-#: templates/web/base/auth/general.html:8
+#: templates/web/base/auth/general.html:10
+#: templates/web/base/auth/general.html:15
#: templates/web/base/js/translation_strings.html:11
#: templates/web/base/js/translation_strings.html:15
-#: templates/web/fixmystreet/auth/general.html:10
-#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/zurich/auth/general.html:3
#: templates/web/zurich/auth/general.html:8
msgid "Please enter your email"
msgstr "請輸入您的電å­éƒµä»¶"
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:7
-#: templates/web/zurich/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:80
msgid "Please enter your email address"
msgstr "請輸入您的電å­éƒµä»¶"
@@ -2162,8 +2199,8 @@ msgstr "請輸入您的大å"
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr "請輸入您的全åï¼Œåœ°æ–¹æ”¿åºœéœ€è¦æ­¤è³‡æ–™ – 如果您ä¸å¸Œæœ›åå­—å…¬é–‹åœ¨ç¶²ç«™ä¸Šï¼Œè«‹åœ¨ä¸‹é¢æ–¹æ ¼ä¸­åŠƒæŽ‰å‹¾é¸ã€‚"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:111
-#: perllib/FixMyStreet/DB/Result/Comment.pm:122
+#: perllib/FixMyStreet/App/Controller/Contact.pm:112
+#: perllib/FixMyStreet/DB/Result/Comment.pm:123
#: perllib/FixMyStreet/DB/Result/Problem.pm:406
#: perllib/FixMyStreet/DB/Result/User.pm:120
#: templates/web/base/js/translation_strings.html:6
@@ -2202,7 +2239,7 @@ msgstr "請在此填寫å•題的細節"
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr "請利用下方表單填寫å•題細節,在細節項請儘é‡è¿°æ˜Žæº–確的ä½ç½®ã€‚ "
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "è«‹é¸æ“‡æ‚¨æ˜¯å¦é¡˜æ„收到其它å•å·"
@@ -2225,19 +2262,24 @@ msgstr "è«‹æ³¨æ„æ‚¨çš„申報還<strong>未é€å‡º</strong>. 鏿“‡åˆé©é¡žåˆ¥å
msgid "Please note:"
msgstr "請加註記"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:254
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:256
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "å¦‚æžœæ‚¨æ˜¯å†æ¬¡ç”³å ±ï¼Œè«‹èªªæ˜ŽåŽŸå› "
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:261
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:263
msgid "Please provide some text as well as a photo"
msgstr "è«‹æä¾›ä¸€äº›æ–‡å­—æ•述與照片"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:124
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:249
msgid "Please say whether you've ever reported a problem to your council before"
msgstr "è«‹æ•æ˜Žæ‚¨æ˜¯å¦æ›¾å‘地方政府申報éŽå•題? "
+#: templates/web/zurich/admin/report_edit.html:208
+#, fuzzy
+msgid "Please select a body."
+msgstr "鏿“‡å–®ä½"
+
#: perllib/FixMyStreet/App/Controller/Alert.pm:80
msgid "Please select the feed you want"
msgstr "è«‹é¸æ“‡è¨‚閱方å¼"
@@ -2246,21 +2288,17 @@ msgstr "è«‹é¸æ“‡è¨‚閱方å¼"
msgid "Please select the type of alert you want"
msgstr "è«‹é¸æ“‡æ›´æ–°é€šçŸ¥æ–¹å¼"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:245
msgid "Please state whether or not the problem has been fixed"
msgstr "è«‹æ•æ˜Žè©²å•題是å¦å·²è§£æ±º"
-#: templates/web/base/questionnaire/index.html:26
-msgid "Please take a look at the updates that have been left."
-msgstr "請看看目å‰çš„æœ€æ–°ç‹€æ³"
-
-#: perllib/FixMyStreet/App/Controller/Photo.pm:177
-#: perllib/FixMyStreet/App/Controller/Photo.pm:187
-#: perllib/FixMyStreet/App/Controller/Photo.pm:189
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:117
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:145
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:147
msgid "Please upload a JPEG image only"
msgstr "請上傳JPEGæ ¼å¼ç…§ç‰‡"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:114
+#: perllib/FixMyStreet/App/Controller/Contact.pm:115
msgid "Please write a message"
msgstr "諘寫下您的留言"
@@ -2269,8 +2307,8 @@ msgid "Please write your update here"
msgstr "請寫下您的更新"
#: templates/web/base/contact/index.html:100
-#: templates/web/base/report/update-form.html:109
-#: templates/web/base/report/update-form.html:131
+#: templates/web/base/report/update-form.html:110
+#: templates/web/base/report/update-form.html:132
#: templates/web/base/report/update-form.html:72
#: templates/web/fixmystreet/contact/index.html:113
#: templates/web/fixmystreet/report/update-form.html:124
@@ -2291,22 +2329,36 @@ msgstr "由%s (<strong>%s</strong>) 在%s"
msgid "Posted by %s at %s"
msgstr "由 %s 在 %s 張貼"
+#: templates/web/base/front/footer-marketing.html:12
+msgid "Powered by <a class=\"platform-logo\" href=\"http://fixmystreet.org/\">FixMyStreet Platform</a>"
+msgstr ""
+
#: templates/web/base/pagination.html:7
msgid "Previous"
msgstr "之å‰"
-#: templates/web/fixmystreet/footer.html:32
+#: templates/web/fixmystreet/footer.html:41
msgid "Privacy"
msgstr "éš±ç§"
+#: templates/web/base/faq/faq-en-gb.html:7
+#: templates/web/base/open311/index.html:7
+#: templates/web/base/static/privacy.html:1
+#: templates/web/base/static/privacy.html:2
+#: templates/web/base/static/privacy.html:9
+#: templates/web/fixmystreet/contact/index.html:11
+msgid "Privacy and cookies"
+msgstr ""
+
#: templates/web/base/admin/body.html:202
#: templates/web/base/admin/body.html:85
#: templates/web/base/admin/category_edit.html:45
-#: templates/web/base/admin/report_edit.html:95
+#: templates/web/base/admin/report_edit.html:77
msgid "Private"
msgstr "ç§äºº"
-#: templates/web/base/maps/openlayers.html:89
+#: templates/web/base/maps/noscript_map.html:59
+#: templates/web/zurich/maps/noscript_map.html:57
msgid "Problem"
msgstr "å•題"
@@ -2322,12 +2374,12 @@ msgstr "%s å•題已被確èªã€€"
msgid "Problem %s sent to council %s"
msgstr "%s å•題已é€é”到地方政府 %s "
-#: templates/web/base/admin/index.html:47
+#: templates/web/base/admin/index.html:46
#: templates/web/zurich/admin/index.html:9
msgid "Problem breakdown by state"
msgstr "æœ¬ç«™å‡ºç¾æ•…éšœå•題 "
-#: perllib/FixMyStreet/App/Controller/Admin.pm:966
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1055
msgid "Problem marked as open."
msgstr "å•題標註為開放"
@@ -2343,12 +2395,10 @@ msgstr "å•題"
msgid "Problems in this area"
msgstr "本å€åŸŸå…§çš„å•題"
-#: templates/web/fixmystreet/around/tabbed_lists.html:4
#: templates/web/fixmystreet/report/display.html:43
msgid "Problems nearby"
msgstr "é„°è¿‘çš„å•題"
-#: templates/web/fixmystreet/around/tabbed_lists.html:3
#: templates/web/fixmystreet/report/display.html:41
msgid "Problems on the map"
msgstr "地圖上的å•題"
@@ -2357,12 +2407,11 @@ msgstr "地圖上的å•題"
msgid "Problems recently reported fixed on FixMyStreet"
msgstr "FixMyStreet 最近回報的已修復å•題 "
-#: templates/web/base/alert/_list.html:19
-#: templates/web/fixmystreet/alert/_list.html:21
+#: templates/web/base/alert/_list.html:21
msgid "Problems within %.1fkm of this location"
msgstr "該地點 %.1f公里內的å•題 "
-#: perllib/FixMyStreet/Cobrand/Default.pm:650
+#: perllib/FixMyStreet/Cobrand/Default.pm:642
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:120
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:139
#: perllib/FixMyStreet/Cobrand/UK.pm:207
@@ -2374,20 +2423,17 @@ msgstr "在 %s å…§çš„å•題"
msgid "Problems within %s ward"
msgstr "在 %s 里/å€çš„å•題"
+#. ("First %s is the body name, second %s the site name")
#: templates/web/base/reports/body.html:0
#: templates/web/base/reports/body.html:24
-msgid "Problems within %s, FixMyStreet"
-msgstr "在 %s çš„å•題, FixMyStreet"
+#, fuzzy
+msgid "Problems within %s, %s"
+msgstr "在 %s å…§çš„å•題"
-#: templates/web/base/alert/_list.html:40
-#: templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/base/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "在 範åœå…§çš„å•題"
-#: db/alert_types_eha.pl:8
-msgid "Properties recently reported as put back to use on reportemptyhomes.com"
-msgstr "reportemptyhomes.com近期é€å›žè™•ç†ä¹‹å…¬ç‰©ã€€"
-
#: templates/web/base/admin/report_edit.html:45
msgid "Property address:"
msgstr "公物地å€ï¼š"
@@ -2401,39 +2447,31 @@ msgstr "公物種類"
msgid "Provide an update"
msgstr "æä¾›æ›´æ–°è³‡è¨Š"
-#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/base/auth/general.html:56
msgid "Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "æä¾›å稱與密碼éžç‚ºå¿…è¦ï¼Œä½†å…¶å¯ä»¥è®“您更便於申報å•題,æä¾›æ›´æ–°èˆ‡ç®¡ç†æ‚¨çš„申報。  "
-#: templates/web/base/report/new/fill_in_details_form.html:155
-#: templates/web/base/report/update-form.html:128
+#: templates/web/base/report/new/fill_in_details_form.html:156
+#: templates/web/base/report/update-form.html:129
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:71
#: templates/web/fixmystreet/report/update-form.html:119
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr "æä¾›å稱與密碼éžç‚ºå¿…è¦ï¼Œä½†å…¶å¯ä»¥è®“您更便於申報å•題,æä¾›æ›´æ–°èˆ‡ç®¡ç†æ‚¨çš„申報。"
-#: templates/web/zurich/admin/report_edit.html:195
-#: templates/web/zurich/admin/report_edit.html:211
+#: templates/web/zurich/admin/report_edit.html:245
+#: templates/web/zurich/admin/report_edit.html:272
msgid "Public response:"
msgstr "å…¬çœ¾åæ‡‰"
-#: templates/web/zurich/admin/report_edit.html:77
+#: templates/web/zurich/admin/report_edit.html:121
#: templates/web/zurich/admin/stats.html:38
msgid "Publish photo"
msgstr "發出照片"
-#: templates/web/zurich/admin/report_edit.html:219
-msgid "Publish the response"
-msgstr "公開此回應"
-
#: templates/web/base/questionnaire/completed.html:1
#: templates/web/base/questionnaire/index.html:0
-#: templates/web/base/questionnaire/index.html:14
-#: templates/web/base/questionnaire/index.html:4
-#: templates/web/fixmystreet/questionnaire/index.html:0
-#: templates/web/fixmystreet/questionnaire/index.html:15
-#: templates/web/fixmystreet/questionnaire/index.html:33
-#: templates/web/fixmystreet/questionnaire/index.html:5
+#: templates/web/base/questionnaire/index.html:12
+#: templates/web/base/questionnaire/index.html:5
msgid "Questionnaire"
msgstr "å•å·"
@@ -2449,12 +2487,11 @@ msgstr "關於 %då•題所é€å‡ºä¹‹ %då•å· "
msgid "Questionnaire filled in by problem reporter"
msgstr "ç”±å•題申報者所填之å•å·"
-#: templates/web/base/alert/_list.html:21
+#: templates/web/base/alert/_list.html:22
#: templates/web/base/around/display_location.html:1
#: templates/web/base/around/display_location.html:3
#: templates/web/base/report/display.html:50
#: templates/web/base/reports/_rss.html:1
-#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
#: templates/web/fixmystreet/report/display.html:58
msgid "RSS feed"
@@ -2480,8 +2517,7 @@ msgstr "%s RSS訂閱"
msgid "RSS feed of %s, within %s ward"
msgstr "%s, 在%s 里/å€"
-#: templates/web/base/alert/_list.html:21
-#: templates/web/fixmystreet/alert/_list.html:22
+#: templates/web/base/alert/_list.html:22
msgid "RSS feed of nearby problems"
msgstr " RSS訂閱 %så€åŸŸå•題"
@@ -2489,7 +2525,7 @@ msgstr " RSS訂閱 %så€åŸŸå•題"
msgid "RSS feed of problems in this %s"
msgstr "æ­¤ %s å•題之RSS 訂閱"
-#: perllib/FixMyStreet/Cobrand/Default.pm:651
+#: perllib/FixMyStreet/Cobrand/Default.pm:643
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:121
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:138
#: perllib/FixMyStreet/Cobrand/UK.pm:214
@@ -2519,17 +2555,18 @@ msgstr "最近當地å•題更新的RSS訂閱"
msgid "Receive email when updates are left on this problem."
msgstr "é€éŽé›»å­éƒµä»¶æ”¶å–該å•題之更新消æ¯"
+#. ("%s is the site name")
#: templates/web/base/around/display_location.html:0
#: templates/web/base/around/display_location.html:33
-msgid "Recent local problems, FixMyStreet"
+#, fuzzy
+msgid "Recent local problems, %s"
msgstr "FixMyStreet 近期的當地å•題 "
#: templates/web/base/reports/index.html:24
msgid "Recently <br>fixed"
msgstr "最新 <br>解決"
-#: templates/web/base/index.html:30
-#: templates/web/fixmystreet/front/recent.html:11
+#: templates/web/base/front/recent.html:11
msgid "Recently reported problems"
msgstr "近期申報之å•題 "
@@ -2537,23 +2574,28 @@ msgstr "近期申報之å•題 "
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr "è¨˜ä½ FixMyStreet主è¦ç‚ºç”³å ±å¯ä¿®å¾©ä¹‹ç‰©ç†æ€§å•題。如果您的å•題ä¸é©åˆé€éŽæœ¬ç¶²ç«™æŠ•é€ï¼Œè«‹ç›´æŽ¥åˆ°åœ°æ–¹æ”¿åºœå„機關之網站。 "
-#: templates/web/base/admin/report_blocks.html:16
+#: templates/web/base/admin/report_blocks.html:46
msgid "Remove flag"
msgstr "移除標記"
-#: templates/web/base/admin/report_edit.html:110
+#: templates/web/base/admin/report_edit.html:92
#: templates/web/base/admin/update_edit.html:62
#: templates/web/zurich/admin/update_edit.html:35
msgid "Remove photo (can't be undone!)"
msgstr "移陯照片(無法回復)"
+#: templates/web/zurich/admin/report_edit.html:243
+#, fuzzy
+msgid "Reply to user:"
+msgstr "用戶編輯"
+
#: templates/web/fixmystreet/header_logo.html:2
msgid "Report"
msgstr ""
-#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:22
+#: templates/web/base/footer.html:7 templates/web/fixmystreet/footer.html:26
#: templates/web/fixmystreet/header_logo.html:2
-#: templates/web/zurich/footer.html:17
+#: templates/web/zurich/footer.html:18
#: templates/web/zurich/nav_over_content.html:4
msgid "Report a problem"
msgstr "申報å•題"
@@ -2562,7 +2604,7 @@ msgstr "申報å•題"
msgid "Report abuse"
msgstr "申報濫用"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:295
+#: perllib/FixMyStreet/App/Controller/Rss.pm:291
msgid "Report on %s"
msgstr "在%s 申報 "
@@ -2571,83 +2613,82 @@ msgstr "在%s 申報 "
msgid "Report your problem"
msgstr "申報你的å•題"
-#: templates/web/base/index.html:11
-#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/base/around/intro.html:1
#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "申報,檢視,或討論在地å•題"
-#: templates/web/base/my/my.html:82
-msgid "Reported %s"
-msgstr "已申報 %s"
-
-#: templates/web/base/my/my.html:80
-msgid "Reported %s, to %s"
-msgstr "申報 %s 給 %s"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:580
+#: perllib/FixMyStreet/DB/Result/Problem.pm:585
#: templates/web/base/contact/index.html:50
#: templates/web/fixmystreet/contact/index.html:65
msgid "Reported anonymously at %s"
msgstr "在%s 匿å申報 "
#: templates/web/base/admin/questionnaire.html:5
-#: templates/web/base/questionnaire/index.html:53
-#: templates/web/fixmystreet/questionnaire/index.html:72
+#: templates/web/base/questionnaire/index.html:62
msgid "Reported before"
msgstr "之å‰çš„申報"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
#: templates/web/base/contact/index.html:52
#: templates/web/fixmystreet/contact/index.html:67
msgid "Reported by %s at %s"
msgstr "由%s 的 %s 申報"
+#: templates/web/zurich/admin/report_edit-sdm.html:58
+#: templates/web/zurich/admin/report_edit.html:86
+#, fuzzy
+msgid "Reported by:"
+msgstr "已申報 %s"
+
#: templates/web/zurich/report/_main.html:2
msgid "Reported in the %s category"
msgstr "%s 種類之申報"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:576
+#: perllib/FixMyStreet/DB/Result/Problem.pm:581
msgid "Reported in the %s category anonymously at %s"
msgstr "%s 種類下的匿å申報"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:598
+#: perllib/FixMyStreet/DB/Result/Problem.pm:603
msgid "Reported in the %s category by %s at %s"
msgstr "%s 在 %s %s類別的申報 "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:572
+#: perllib/FixMyStreet/DB/Result/Problem.pm:577
msgid "Reported via %s anonymously at %s"
msgstr "在%s 匿å申報 "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:594
+#: perllib/FixMyStreet/DB/Result/Problem.pm:599
msgid "Reported via %s by %s at %s"
msgstr "%s é€éŽ %s 在 %s類別的申報"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:568
+#: perllib/FixMyStreet/DB/Result/Problem.pm:573
msgid "Reported via %s in the %s category anonymously at %s"
msgstr "é€éŽ %s 在 %s類別的匿å申報"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:588
+#: perllib/FixMyStreet/DB/Result/Problem.pm:593
msgid "Reported via %s in the %s category by %s at %s"
msgstr "%s 在 %s %s類別的申報 "
#: templates/web/base/reports/index.html:21
-#, fuzzy
msgid "Reported within the last four weeks"
-msgstr "%s 種類之申報"
+msgstr ""
+
+#: templates/web/zurich/admin/report_edit-sdm.html:36
+#: templates/web/zurich/admin/report_edit.html:55
+#, fuzzy
+msgid "Reported:"
+msgstr "已申報 %s"
-#: templates/web/base/around/around_index.html:1
-#: templates/web/base/around/around_index.html:3
+#: templates/web/base/around/index.html:2
#: templates/web/base/js/translation_strings.html:41
#: templates/web/base/report/new/fill_in_details.html:0
#: templates/web/base/report/new/fill_in_details.html:5
-#: templates/web/fixmystreet/around/around_index.html:2
#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "申報å•題"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1193
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:294
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1277
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:384
#: templates/web/zurich/header.html:60
msgid "Reports"
msgstr "申報"
@@ -2660,18 +2701,21 @@ msgstr "申請內容有 %s 字數é™åˆ¶ï¼Œè«‹ç°¡åŒ–您的申報。"
msgid "Reports awaiting approval"
msgstr "待核實之申報"
-#: templates/web/base/around/tabbed_lists.html:3
-msgid "Reports on and around the map"
-msgstr "地圖附近的申報"
-
#: templates/web/zurich/admin/index-sdm.html:10
msgid "Reports published"
msgstr "己公開之申報"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "Resend report"
msgstr "釿–°é€å‡ºç”³å ±"
+#: templates/web/zurich/admin/template_edit.html:1
+#: templates/web/zurich/admin/template_edit.html:4
+#: templates/web/zurich/admin/templates.html:1
+#: templates/web/zurich/admin/templates.html:3
+msgid "Response Templates for %s"
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:28
msgid "Right place?"
msgstr "正確地點?"
@@ -2686,26 +2730,32 @@ msgstr "此指定街é“之é“路營é‹è€…(å–自é“è·¯åƒç…§ç¢¼èˆ‡ç¨®é¡ž): %s"
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "此指定街é“之é“路營é‹è€…(來自OpenStreetMap): %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1403
-#: templates/web/base/admin/report_edit.html:106
-#: templates/web/zurich/admin/report_edit.html:73
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1500
+#: templates/web/base/admin/report_edit.html:88
+#: templates/web/zurich/admin/report_edit.html:116
msgid "Rotate Left"
msgstr "左轉 "
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1392
-#: templates/web/base/admin/report_edit.html:107
-#: templates/web/zurich/admin/report_edit.html:74
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1495
+#: templates/web/base/admin/report_edit.html:89
+#: templates/web/zurich/admin/report_edit.html:117
msgid "Rotate Right"
msgstr "å³è½‰ã€€"
+#: templates/web/zurich/admin/report_edit.html:388
+msgid "Rotating this photo will discard unsaved changes to the report."
+msgstr ""
+
#: templates/web/base/js/translation_strings.html:46
+#: templates/web/base/maps/google-ol.html:13
msgid "Satellite"
msgstr "衛星"
#: templates/web/base/admin/body.html:208
-#: templates/web/base/admin/category_edit.html:81
+#: templates/web/base/admin/category_edit.html:84
#: templates/web/zurich/admin/body.html:59
+#: templates/web/zurich/admin/template_edit.html:29
msgid "Save changes"
msgstr "儲存變動"
@@ -2718,7 +2768,7 @@ msgstr "æœå°‹ç”³å ±"
msgid "Search Users"
msgstr "æœå°‹ä½¿ç”¨è€…"
-#: templates/web/zurich/header.html:77
+#: templates/web/zurich/header.html:82
msgid "Search reports"
msgstr "æœå°‹ç”³å ±"
@@ -2750,20 +2800,25 @@ msgstr "鏿“‡ç‰¹å®šè­°æœƒå‘ˆé€ç”³å ±"
msgid "Select an area"
msgstr "鏿“‡å€åŸŸ"
-#: templates/web/base/alert/_list.html:8
-#: templates/web/fixmystreet/alert/_list.html:10
-msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
+#: templates/web/base/alert/_list.html:10
+#, fuzzy
+msgid "Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr "鏿“‡æ‚¨è¦æƒ³çš„é€šçŸ¥æ–¹å¼æˆ–點é¸RSS訂閱按鈕,或者輸入您的電å­éƒµä»¶ä»¥æ”¶å—通知。"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:685
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:835
+#, fuzzy
+msgid "Sent report back"
+msgstr "開啟申報 "
+
+#: perllib/FixMyStreet/DB/Result/Problem.pm:708
msgid "Sent to %s %s later"
msgstr "%s ç¨å¾Œé€çµ¦%s"
-#: templates/web/base/admin/report_edit.html:84
+#: templates/web/base/admin/report_edit.html:66
msgid "Sent:"
msgstr "é€å‡º"
-#: templates/web/base/admin/report_edit.html:89
+#: templates/web/base/admin/report_edit.html:71
#: templates/web/zurich/admin/stats.html:45
msgid "Service:"
msgstr "æœå‹™"
@@ -2772,8 +2827,8 @@ msgstr "æœå‹™"
msgid "Share"
msgstr "分享"
-#: templates/web/base/report/new/fill_in_details_form.html:192
-#: templates/web/base/report/update-form.html:157
+#: templates/web/base/report/new/fill_in_details_form.html:193
+#: templates/web/base/report/update-form.html:158
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:59
#: templates/web/fixmystreet/report/update-form.html:146
@@ -2789,34 +2844,23 @@ msgid "Show pins"
msgstr "顯示地圖標示"
#: templates/web/base/auth/general.html:3
-#: templates/web/base/auth/general.html:49
-#: templates/web/fixmystreet/auth/general.html:4
-#: templates/web/fixmystreet/auth/general.html:43
-#: templates/web/fixmystreet/auth/general.html:64
+#: templates/web/base/auth/general.html:40
+#: templates/web/base/auth/general.html:61
#: templates/web/zurich/auth/general.html:18
#: templates/web/zurich/auth/general.html:35
msgid "Sign in"
msgstr "登入"
-#: templates/web/base/auth/general.html:74
-msgid "Sign in by email"
-msgstr "é€éŽé›»å­éƒµä»¶ç™»å…¥"
-
#: templates/web/base/auth/general.html:1
-#: templates/web/fixmystreet/auth/general.html:1
#: templates/web/zurich/auth/general.html:1
msgid "Sign in or create an account"
msgstr "登入或新建帳戶"
-#: templates/web/base/auth/sign_out.html:1 templates/web/base/header.html:30
+#: templates/web/base/auth/sign_out.html:1
#: templates/web/zurich/auth/sign_out.html:1
msgid "Sign out"
msgstr "登出"
-#: templates/web/base/header.html:29
-msgid "Signed in as %s"
-msgstr "以 %s身份登入"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "æŸäº›é¡žåˆ¥è¦æ±‚其它資訊"
@@ -2835,8 +2879,9 @@ msgstr ""
msgid "Some photos of recent reports"
msgstr "最近申報之照片"
+#. ('Optional comment for translator')
#: perllib/FixMyStreet/App/View/Email.pm:32
-#: perllib/FixMyStreet/App/View/Web.pm:43
+#: perllib/FixMyStreet/App/View/Web.pm:52
msgid "Some text to localize"
msgstr "有些文字需在地化"
@@ -2844,24 +2889,32 @@ msgstr "有些文字需在地化"
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr "抱歉,該郵å€è™Ÿç¢¼æˆ‘們尚未支æ´"
+#: templates/web/base/auth/token.html:8
+msgid "Sorry, that wasn&rsquo;t a valid link"
+msgstr ""
+
#: templates/web/base/tokens/abuse.html:5
msgid "Sorry, there has been an error confirming your problem."
msgstr "抱歉無法確èªä½ çš„å•題"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:221
#: perllib/FixMyStreet/Geocode.pm:37 perllib/FixMyStreet/Geocode/Bing.pm:37
#: perllib/FixMyStreet/Geocode/FixaMinGata.pm:56
-#: perllib/FixMyStreet/Geocode/Google.pm:47
#: perllib/FixMyStreet/Geocode/OSM.pm:48
msgid "Sorry, we could not find that location."
msgstr "抱歉,我們無法找到此ä½ç½®"
#: perllib/FixMyStreet/Geocode/Bing.pm:34
-#: perllib/FixMyStreet/Geocode/Google.pm:44
-#: perllib/FixMyStreet/Geocode/Zurich.pm:87
+#: perllib/FixMyStreet/Geocode/Google.pm:45
+#: perllib/FixMyStreet/Geocode/Zurich.pm:88
msgid "Sorry, we could not parse that location. Please try again."
msgstr "æŠ±æ­‰ï¼Œæˆ‘å€‘ç„¡æ³•è§£æžæ­¤åœ°é»žï¼Œè«‹é‡è©¦ä¸€æ¬¡"
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:134
+#, fuzzy
+msgid "Sorry, we couldn't save your image(s), please try again."
+msgstr "æŠ±æ­‰ï¼Œæˆ‘å€‘ç„¡æ³•è§£æžæ­¤åœ°é»žï¼Œè«‹é‡è©¦ä¸€æ¬¡"
+
#: templates/web/base/admin/stats.html:64
msgid "Start Date:"
msgstr "å•始日:"
@@ -2877,16 +2930,17 @@ msgstr "陳述"
#: templates/web/base/admin/report_edit.html:47
#: templates/web/base/admin/update_edit.html:27
#: templates/web/base/report/update-form.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:53
-#: templates/web/zurich/admin/report_edit.html:84
+#: templates/web/zurich/admin/report_edit-sdm.html:73
+#: templates/web/zurich/admin/report_edit.html:101
+#: templates/web/zurich/admin/report_edit.html:155
#: templates/web/zurich/admin/update_edit.html:17
msgid "State:"
msgstr "陳述:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1198
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:308
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1282
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:387
#: templates/web/base/admin/stats.html:1
-#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:72
+#: templates/web/zurich/admin/stats.html:1 templates/web/zurich/header.html:73
msgid "Stats"
msgstr "統計"
@@ -2900,7 +2954,12 @@ msgstr "狀態"
msgid "Still open, via questionnaire, %s"
msgstr " %så•å·ä»é–‹æ”¾ä¸­"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:387
+#: templates/web/zurich/admin/report_edit-sdm.html:25
+#: templates/web/zurich/admin/report_edit.html:26
+msgid "Street View"
+msgstr ""
+
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:406
msgid "Subcategory: %s"
msgstr "å­é¡žåˆ¥ï¼š%s"
@@ -2915,45 +2974,42 @@ msgstr "主旨"
#: templates/web/base/admin/report_edit.html:19
#: templates/web/base/contact/index.html:88
#: templates/web/base/report/new/fill_in_details_form.html:53
-#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:39
msgid "Subject:"
msgstr "主旨:"
#: templates/web/base/questionnaire/creator_fixed.html:19
-#: templates/web/base/report/new/fill_in_details_form.html:136
-#: templates/web/base/report/new/fill_in_details_form.html:158
+#: templates/web/base/report/new/fill_in_details_form.html:137
+#: templates/web/base/report/new/fill_in_details_form.html:159
#: templates/web/base/report/new/fill_in_details_form.html:96
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:36
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:23
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:91
+#: templates/web/zurich/report/new/fill_in_details_form.html:96
msgid "Submit"
msgstr "é€å‡º"
-#: templates/web/base/admin/report_edit.html:113
+#: templates/web/base/admin/report_edit.html:95
#: templates/web/base/admin/update_edit.html:65
#: templates/web/base/admin/user-form.html:56
-#: templates/web/zurich/admin/report_edit-sdm.html:64
-#: templates/web/zurich/admin/report_edit.html:221
+#: templates/web/zurich/admin/report_edit-sdm.html:137
+#: templates/web/zurich/admin/report_edit.html:268
#: templates/web/zurich/admin/update_edit.html:38
msgid "Submit changes"
msgstr "é€å‡ºæ›´æ–°"
-#: templates/web/base/questionnaire/index.html:88
-#: templates/web/fixmystreet/questionnaire/index.html:106
+#: templates/web/base/questionnaire/index.html:97
msgid "Submit questionnaire"
msgstr "é€å‡ºå•å·"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:134
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:171
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:902
#: templates/web/zurich/admin/header.html:1
#: templates/web/zurich/admin/header.html:6
#: templates/web/zurich/admin/index-dm.html:23
#: templates/web/zurich/admin/index-dm.html:6
#: templates/web/zurich/admin/index-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:86
-#: templates/web/zurich/admin/report_edit.html:87
#: templates/web/zurich/admin/reports.html:13
-#: templates/web/zurich/report/banner.html:9
msgid "Submitted"
msgstr "å·²é€å‡º"
@@ -2964,18 +3020,19 @@ msgstr "å·²é€å‡º"
msgid "Subscribe"
msgstr "訂閱"
-#: templates/web/base/alert/_list.html:97
-#: templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/base/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "加入通知信件"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:293
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1275
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:383
#: templates/web/base/admin/bodies.html:25
#: templates/web/base/admin/index.html:1
+#: templates/web/base/status/index.html:1
+#: templates/web/base/status/index.html:3
#: templates/web/zurich/admin/index-dm.html:1
#: templates/web/zurich/admin/index-sdm.html:1
-#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:12
+#: templates/web/zurich/admin/index.html:1 templates/web/zurich/footer.html:13
#: templates/web/zurich/header.html:57
msgid "Summary"
msgstr "摘è¦"
@@ -2986,7 +3043,7 @@ msgstr "摘è¦"
msgid "Summary reports"
msgstr "申報摘è¦"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1195
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1279
msgid "Survey"
msgstr "調查"
@@ -2994,9 +3051,18 @@ msgstr "調查"
msgid "Survey Results"
msgstr "èª¿æŸ¥çµæžœ"
+#: templates/web/zurich/admin/template_edit.html:7
+msgid "Template &laquo;%s&raquo;"
+msgstr ""
+
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:394
+#: templates/web/zurich/header.html:77
+#, fuzzy
+msgid "Templates"
+msgstr "æ›´æ–°"
+
#: templates/web/base/admin/list_updates.html:12
-#: templates/web/zurich/admin/list_updates.html:10
-#: templates/web/zurich/admin/list_updates.html:31
+#: templates/web/zurich/admin/templates.html:9
msgid "Text"
msgstr "å…§æ–‡"
@@ -3005,6 +3071,7 @@ msgid "Text only version"
msgstr "文字版"
#: templates/web/base/admin/update_edit.html:20
+#: templates/web/zurich/admin/template_edit.html:24
#: templates/web/zurich/admin/update_edit.html:12
msgid "Text:"
msgstr "å…§æ–‡:"
@@ -3026,7 +3093,7 @@ msgstr "æ„Ÿè¬æ‚¨æ›´æ–°æ­¤ç‹€æ³"
msgid "Thank you for your feedback"
msgstr "æ„Ÿè¬æ‚¨çš„回饋"
-#: templates/web/fixmystreet/around/around_index.html:28
+#: templates/web/base/around/_error_multiple.html:17
msgid "Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr "感è¬ä¸Šå‚³ç…§ç‰‡ï¼Œç¾åœ¨éœ€è¦çŸ¥é“å•題的地點ä½ç½®ï¼Œè«‹åœ¨ä¸Šæ–¹æ–¹æ ¼å…§è¼¸å…¥é™„è¿‘è¡—åæˆ–郵編 "
@@ -3034,7 +3101,7 @@ msgstr "感è¬ä¸Šå‚³ç…§ç‰‡ï¼Œç¾åœ¨éœ€è¦çŸ¥é“å•題的地點ä½ç½®ï¼Œè«‹åœ¨ä¸Š
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr "è¬è¬ï¼Œå¾ˆé«˜èˆˆçŸ¥é“æ­¤å•é¡Œå·±ä¿®å¾©äº†ã€‚è«‹å•æ‚¨éŽåŽ»æ˜¯å¦æ›¾ç”³å ±éŽå•題? "
-#: perllib/FixMyStreet/App/Controller/Photo.pm:195
+#: perllib/FixMyStreet/App/Model/PhotoSet.pm:152
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "照片上傳似乎無法正常 (%s), è«‹å†è©¦ä¸€æ¬¡ã€‚ "
@@ -3052,20 +3119,19 @@ msgstr "這地點似乎ä¸åœ¨å°ç£; è«‹å†è©¦ 一次。"
msgid "That postcode was not recognised, sorry."
msgstr "抱歉此郵éžå€è™Ÿç„¡æ³•辨識"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:712
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Admin.pm:726
msgid "That problem has been marked as sent."
-msgstr "æ­¤å•é¡Œå°‡é‡æ–°é€å‡º"
+msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:704
+#: perllib/FixMyStreet/App/Controller/Admin.pm:718
msgid "That problem will now be resent."
msgstr "æ­¤å•é¡Œå°‡é‡æ–°é€å‡º"
-#: perllib/FixMyStreet/App/Controller/Report.pm:118
+#: perllib/FixMyStreet/App/Controller/Report.pm:125
msgid "That report cannot be viewed on %s."
msgstr "此申報無法在 %s上檢視 "
-#: perllib/FixMyStreet/App/Controller/Report.pm:111
+#: perllib/FixMyStreet/App/Controller/Report.pm:119
msgid "That report has been removed from FixMyStreet."
msgstr "該申報已é­FixMyStreet 移除 "
@@ -3117,30 +3183,18 @@ msgstr ""
"有關單ä½<strong>å稱</strong> å¯è¾¨èªå‡ºè©²æ©Ÿæ§‹(例如, <em>高雄市工務局公園處 </em>)\n"
"æ­¤å稱會公開顯示。"
-#: templates/web/base/auth/token.html:19 templates/web/base/email_sent.html:6
-msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
-msgstr "確èªçš„é›»å­éƒµä»¶<strong>å¯èƒ½æœƒ</strong> æ™šå¹¾åˆ†é˜æ”¶åˆ°<em>è«‹</em>è€å¿ƒç­‰å¾…。"
-
#: templates/web/base/report/new/fill_in_details_text.html:1
#: templates/web/base/report/new/fill_in_details_text.html:3
msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr "地方政府å¯èƒ½ç„¡æ³•å”åŠ©ï¼Œé™¤éžæ‚¨ç•™ä¸‹å•題的詳細細節。請仔細æè¿°å•題的明確地點(例如哪è£çš„牆é¢),什樣樣的å•題以åŠå¤šä¹…äº†ï¼Œå…·é«”æƒ…æ³æè¿°(如果有照片更佳)等等"
-#: templates/web/fixmystreet/questionnaire/index.html:44
-msgid "The details of your problem are available from the other tab above."
-msgstr "您å•題的細節å¯ä»¥å…¶å®ƒåˆ†é ä¸­æ‰¾åˆ°"
-
-#: templates/web/base/questionnaire/index.html:25
-msgid "The details of your problem are available on the right hand side of this page."
-msgstr "您å•題的細節å¯ä»¥åœ¨æœ¬é å³é‚Šæ¬„找到"
-
#: templates/web/base/admin/edit-league.html:3
#: templates/web/base/admin/edit-league.html:4
msgid "The diligency prize league table shows editors' activity (who's been editing the most records)."
msgstr "這個勤奮表單顯示用戶的活動(誰åšäº†åšå¤šçš„修改編輯活動)"
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:78
+#: perllib/FixMyStreet/App/Controller/Reports.pm:79
msgid "The error was: %s"
msgstr "顯示錯誤為: %s"
@@ -3158,10 +3212,6 @@ msgstr "下方關於最近é“路之資訊未必準確,如果鄰近有多æ¢é“
msgid "The latest local problems reported by users"
msgstr "用戶申報的本地最新å•題"
-#: db/alert_types_eha.pl:13
-msgid "The latest local reports reported by users"
-msgstr "用戶æä¾›çš„æœ¬åœ°æœ€æ–°ç”³å ±ã€€"
-
#: db/alert_types.pl:35
msgid "The latest problems for {{COUNCIL}} reported by users"
msgstr "用戶æä¾›çµ¦{{COUNCIL}} 的本地最新å•題 "
@@ -3182,21 +3232,9 @@ msgstr "用戶æä¾›çš„æœ¬åœ°æœ€æ–°å·²ä¿®å¾©å•題 "
msgid "The latest problems within {{NAME}}'s boundary reported by users"
msgstr "用戶申報{{NAME}}地å€å…§åœ°çš„æœ€æ–°å•題"
-#: db/alert_types_eha.pl:9
-msgid "The latest properties reported back to use by users"
-msgstr "用戶回報的本地公物的最新使用狀æ³ã€€"
-
-#: db/alert_types_eha.pl:20
-msgid "The latest reports for {{COUNCIL}} reported by users"
-msgstr "用戶申報給{{COUNCIL}} 的本地最新å•題 "
-
-#: db/alert_types_eha.pl:24
-msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
-msgstr "用戶申報給{{COUNCIL}} 在{{WARD}} 里/å€çš„æœ€æ–°å•題"
-
-#: db/alert_types_eha.pl:28
-msgid "The latest reports within {{NAME}}'s boundary reported by users"
-msgstr "用戶申報{{NAME}}地å€å…§åœ°çš„æœ€æ–°å•題"
+#: templates/web/base/auth/token.html:9
+msgid "The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly."
+msgstr ""
#: templates/web/base/admin/body-form.html:58
msgid "The list of available areas is being provided by the MapIt service at %s."
@@ -3212,8 +3250,7 @@ msgstr "密碼ä¸ç¬¦"
msgid "The requested URL '%s' was not found on this server"
msgstr "找ä¸åˆ°æ‚¨æ‰€è¦æ±‚的網é é€£çµã€‚"
-#: templates/web/base/alert/_list.html:14
-#: templates/web/fixmystreet/alert/_list.html:16
+#: templates/web/base/alert/_list.html:16
msgid "The simplest alert is our geographic one:"
msgstr "您的更新出錯,請å†è©¦ä¸€æ¬¡ã€‚"
@@ -3224,7 +3261,7 @@ msgstr "您的更新出錯,請å†è©¦ä¸€æ¬¡ã€‚"
msgid "The summary and description will also be made public (see our <a href=\"/privacy\">privacy policy</a>)."
msgstr "總çµèˆ‡æè¿°å°‡æœƒå…¬é–‹(請見我們的 <a href=\"/privacy\">éš±ç§æ¬Šæ”¿ç­–</a>)."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:300
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:315
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr "用戶無法在地點上標示å•題,但å¯ä»¥çœ‹åˆ°ä»–們輸入的地點"
@@ -3237,23 +3274,24 @@ msgstr ""
"用戶的<strong>åå­—</strong> 會公開出ç¾åœ¨æœªæ¨™è¨˜<em>匿å</em>的申報上\n"
"åå­—ä¸éœ€è¦ç¨ç‰¹å¯é‡è¦†ã€€"
+#: templates/web/base/around/on_map_list_items.html:12
+#: templates/web/base/my/_problem-list.html:8
#: templates/web/base/reports/_problem-list.html:15
msgid "There are no reports to show."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:76
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr "本é ç¾åœ¨ç„¡æ³•é¡˜ç¾æ‰€è¦æ±‚的申報資料,請ç¨å€™å†è©¦ã€‚"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:136
+#: perllib/FixMyStreet/App/Controller/Contact.pm:137
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
msgid "There was a problem showing this page. Please try again later."
msgstr "本é å‡ºç¾éŒ¯èª¤ï¼Œè«‹å†è©¦ä¸€æ¬¡"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:762
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:769
#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
-#: templates/web/base/auth/general.html:23
-#: templates/web/fixmystreet/auth/general.html:25
+#: templates/web/base/auth/general.html:26
#: templates/web/zurich/auth/general.html:28
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr "您的電å­éƒµä»¶èˆ‡å¯†ç¢¼ä¸ç›¸ç¬¦ï¼Œå¦‚果您éºå¿˜å¯†ç¢¼æˆ–尚未註冊,請在申請表單上填入電å­éƒµä»¶"
@@ -3266,7 +3304,7 @@ msgstr "您的電å­éƒµä»¶/密碼ä¸ç¬¦ï¼Œè«‹é‡è©¦ä¸€æ¬¡"
msgid "There was a problem with your update. Please try again."
msgstr "您的申報有å•題,請é‡è©¦ä¸€æ¬¡"
-#: perllib/FixMyStreet/App/Controller/Contact.pm:140
+#: perllib/FixMyStreet/App/Controller/Contact.pm:141
msgid "There were problems with your report. Please see below."
msgstr "您的申報有å•題,請見下方說明"
@@ -3316,16 +3354,16 @@ msgstr ""
"此單ä½åªæ¶µè“‹ <strong>負責å€åŸŸ</strong>的申報å•題處ç†ã€‚ \n"
"除éžå…¶æ¶µè“‹è‡³å°‘一個å€åŸŸï¼Œå¦å‰‡æ”¿åºœå–®ä½ä¸æœƒæŽ¥æ”¶åˆ°å•題申報 "
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:394
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:413
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr "ç•¶ç”¨æˆ¶æ²’æœ‰é¸æ“‡é¡žåˆ¥æ™‚,電å­éƒµä»¶å°‡é€åˆ°è² è²¬è©²å€åŸŸçš„å„åœ°æ–¹æ”¿åºœã€‚å¦‚æžœæ‚¨ä¸æ˜¯è©²å•題的å—ç†æ©Ÿé—œï¼Œè«‹ç•¥éŽï¼Œæˆ–讓我們知é“該å•題的類別以在系統作修正。"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:397
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:416
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr "é›»å­éƒµä»¶å°‡é€åˆ°è² è²¬è©²å€åŸŸçš„å¤šå€‹åœ°æ–¹æ”¿åºœï¼Œå› é¸æ“‡çš„類別æä¾›é€™äº›å°è±¡ã€‚å¦‚æžœæ‚¨ä¸æ˜¯è² è²¬å—ç†æ©Ÿé—œï¼Œè«‹ç•¥éŽã€‚"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:902
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:972
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:925
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:995
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:142
#: perllib/FixMyStreet/Cobrand/UK.pm:43
msgid "This information is required"
@@ -3339,7 +3377,7 @@ msgstr "本站為開發試用,å¯èƒ½éš¨æ™‚故障,資料庫也會定期刪除
msgid "This is a summary of all reports on this site."
msgstr "本站所有申報總çµ"
-#: templates/web/base/auth/token.html:9
+#: templates/web/zurich/auth/token.html:8
msgid "This may be because the link is too old or already used, or the address was not copied correctly."
msgstr "å¯èƒ½ç‚ºé€£çµå¤±æ•ˆæˆ–已被使用éŽï¼Œæˆ–是連çµç¶²å€æœªæ­£ç¢ºè¤‡è£½ã€‚"
@@ -3366,55 +3404,69 @@ msgstr "å•題正在處ç†ä¸­"
msgid "This problem is old and of unknown status."
msgstr "æ­¤å•題已失時效,目å‰ç‹€æ³ä¸æ˜Ž"
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:131
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:132
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:168
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:169
#: templates/web/zurich/report/_main.html:14
msgid "This report is awaiting moderation."
msgstr "æ­¤å•題尚待審核"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:87
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "è©²ç”³å ±ç›®å‰æ³¨è¨˜ç‚ºçµæ¡ˆç‹€æ…‹"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "è©²ç”³å ±ç›®å‰æ³¨è¨˜ç‚ºè§£æ±ºç‹€æ…‹"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:89
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "è©²ç”³å ±ç›®å‰æ³¨è¨˜ç‚ºé–‹æ”¾ç‹€æ…‹"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:311
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:326
msgid "This report was submitted anonymously"
msgstr "此為匿å申報"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:293
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:308
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr "本é åŒ…括由用戶æä¾›å應å•題的照片 "
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1194
+#: templates/web/zurich/admin/report_edit-sdm.html:123
+#: templates/web/zurich/admin/report_edit-sdm.html:76
+#: templates/web/zurich/admin/report_edit.html:104
+#: templates/web/zurich/admin/report_edit.html:148
+msgid "Time spent (in minutes):"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1278
#: templates/web/base/admin/timeline.html:1
msgid "Timeline"
msgstr "時間軸"
#: templates/web/base/admin/flagged.html:15
#: templates/web/base/admin/reports.html:12
+#: templates/web/zurich/admin/templates.html:8
msgid "Title"
msgstr "標題"
-#: templates/web/base/around/_report_banner.html:2
-msgid "To <strong>report a problem</strong>, click on the map at the correct location."
-msgstr "è¦<strong>申報å•題</strong>, 點擊下方地圖中正確之ä½ç½®ã€‚"
+#: templates/web/zurich/admin/template_edit.html:20
+#, fuzzy
+msgid "Title:"
+msgstr "標題"
+
+#: templates/web/base/alert/index.html:25
+#, fuzzy
+msgid "To find out what local alerts we have for you, please enter your %s postcode or street name and area:"
+msgstr "找出é©åˆæ‚¨çš„在地通知,請輸入您的郵編或街åå€åŸŸ"
#: templates/web/base/alert/index.html:27
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr "找出é©åˆæ‚¨çš„在地通知,請輸入您的郵編或街åå€åŸŸ"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:299
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:314
msgid "To view a map of the precise location of this issue"
msgstr "檢視地圖上å•題之確切ä½ç½®"
-#: templates/web/base/admin/index.html:55
+#: templates/web/base/admin/index.html:61
#: templates/web/base/admin/questionnaire.html:24
#: templates/web/base/admin/stats.html:24
#: templates/web/base/admin/stats.html:43
@@ -3430,8 +3482,8 @@ msgstr "å†è©¦ä¸€æ¬¡"
msgid "Try emailing us directly:"
msgstr "何ä¸ç›´æŽ¥ç™¼ä¿¡çµ¦æˆ‘們:"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:59
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:12
#: templates/web/base/report/update-form.html:30
#: templates/web/base/report/update-form.html:33
#: templates/web/fixmystreet/report/update-form.html:28
@@ -3439,11 +3491,11 @@ msgstr "何ä¸ç›´æŽ¥ç™¼ä¿¡çµ¦æˆ‘們:"
msgid "Unable to fix"
msgstr "無法修復"
-#: templates/web/base/admin/report_edit.html:48
-#: templates/web/base/admin/report_edit.html:64
+#: templates/web/base/admin/report_blocks.html:1
+#: templates/web/base/admin/report_blocks.html:19
#: templates/web/base/admin/update_edit.html:28
-#: templates/web/zurich/admin/report_edit-sdm.html:45
-#: templates/web/zurich/admin/report_edit.html:58
+#: templates/web/zurich/admin/report_edit-sdm.html:64
+#: templates/web/zurich/admin/report_edit.html:92
#: templates/web/zurich/admin/update_edit.html:18
msgid "Unconfirmed"
msgstr "未確èªçš„"
@@ -3460,7 +3512,9 @@ msgstr "未知的通知類別"
msgid "Unknown error"
msgstr "未知的錯誤"
-#: perllib/FixMyStreet/App/Controller/Report.pm:106
+#: perllib/FixMyStreet/App/Controller/Report.pm:103
+#: perllib/FixMyStreet/App/Controller/Report.pm:109
+#: perllib/FixMyStreet/App/Controller/Report.pm:112
msgid "Unknown problem ID"
msgstr "未知的å•題編號  "
@@ -3483,11 +3537,11 @@ msgid "Update below added by %s at %s"
msgstr "ç”±%d 在 %s 所æä¾›çš„æ›´æ–°"
#: templates/web/base/admin/body-form.html:240
-#: templates/web/zurich/admin/body-form.html:51
+#: templates/web/zurich/admin/body-form.html:52
msgid "Update body"
msgstr "æ›´æ–°å…§æ–‡"
-#: templates/web/base/admin/index.html:49
+#: templates/web/base/admin/index.html:55
msgid "Update breakdown by state"
msgstr "陳述目å‰çš„æ•…障 "
@@ -3522,24 +3576,24 @@ msgstr "æ›´æ–°:"
msgid "Updated"
msgstr "已更新"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1014
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1058
-#: perllib/FixMyStreet/App/Controller/Admin.pm:808
-#: perllib/FixMyStreet/App/Controller/Admin.pm:956
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:556
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:625
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1045
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1103
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1147
+#: perllib/FixMyStreet/App/Controller/Admin.pm:822
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:771
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:796
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:866
msgid "Updated!"
msgstr "已更新ï¼"
#: templates/web/base/admin/list_updates.html:2
#: templates/web/base/report/update.html:3
#: templates/web/fixmystreet/report/update.html:5
-#: templates/web/zurich/admin/list_updates.html:24
#: templates/web/zurich/report/updates.html:2
msgid "Updates"
msgstr "æ›´æ–°"
-#: perllib/FixMyStreet/DB/Result/Comment.pm:131
+#: perllib/FixMyStreet/DB/Result/Comment.pm:132
msgid "Updates are limited to %s characters in length. Please shorten your update"
msgstr "更新內容有 %s 字數é™åˆ¶ï¼Œè«‹ç°¡åŒ–您的更新。"
@@ -3547,27 +3601,30 @@ msgstr "更新內容有 %s 字數é™åˆ¶ï¼Œè«‹ç°¡åŒ–您的更新。"
msgid "Updates on {{title}}"
msgstr "ç”±{{title}}æ›´æ–°"
+#. ("%s is the site name")
#: templates/web/base/report/display.html:0
#: templates/web/base/report/display.html:5
#: templates/web/fixmystreet/report/display.html:0
#: templates/web/fixmystreet/report/display.html:9
-msgid "Updates to this problem, FixMyStreet"
+#, fuzzy
+msgid "Updates to this problem, %s"
msgstr "å‘FixMyStreet回報此å•題 "
#: templates/web/base/admin/body.html:182
msgid "Use the <strong>note</strong> to record details that are only displayed in the admin. Notes are not shown publicly, and are not sent to the body."
msgstr "使用<strong>記事本</strong> 來記錄給管ç†å“¡å¯çœ‹åˆ°çš„ç´°ç¯€å ±å‘Šã€‚é€™éƒ¨ä»½ä¸æœƒå…¬é–‹ï¼Œä¹Ÿä¸æœƒé€çµ¦ç›¸é—œå–®ä½ã€‚"
-#: templates/web/zurich/admin/list_updates.html:30
-#: templates/web/zurich/admin/list_updates.html:9
-msgid "User"
-msgstr "用戶"
+#: templates/web/zurich/admin/report_edit-sdm.html:48
+#: templates/web/zurich/admin/report_edit.html:67
+#, fuzzy
+msgid "Used map"
+msgstr "已用éŽä¹‹åœ°åœ–"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1357
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1452
msgid "User flag removed"
msgstr "移除用戶的標記警告"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1329
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1424
msgid "User flagged"
msgstr "給用戶標記警告"
@@ -3575,23 +3632,23 @@ msgstr "給用戶標記警告"
msgid "User search finds matches in users' names and email addresses."
msgstr "用戶找到相符的å稱與電å­éƒµä»¶"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1196
-#: perllib/FixMyStreet/Cobrand/Zurich.pm:307
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1280
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:399
#: templates/web/base/admin/flagged.html:29
#: templates/web/zurich/header.html:69
msgid "Users"
msgstr "使用者"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:374
-#: perllib/FixMyStreet/App/Controller/Admin.pm:404
-#: perllib/FixMyStreet/App/Controller/Admin.pm:421
+#: perllib/FixMyStreet/App/Controller/Admin.pm:382
+#: perllib/FixMyStreet/App/Controller/Admin.pm:412
+#: perllib/FixMyStreet/App/Controller/Admin.pm:429
msgid "Values updated"
msgstr "數值更新"
#: templates/web/base/admin/report_edit.html:18
#: templates/web/base/admin/update_edit.html:18
#: templates/web/zurich/admin/report_edit-sdm.html:21
-#: templates/web/zurich/admin/report_edit.html:20
+#: templates/web/zurich/admin/report_edit.html:22
#: templates/web/zurich/admin/update_edit.html:10
msgid "View report on site"
msgstr "檢視本站之申報 "
@@ -3615,16 +3672,15 @@ msgid "Wards of this council"
msgstr "地方政府轄下的里/å€"
#: templates/web/base/alert/choose.html:6
-#: templates/web/base/around/around_index.html:16
-#: templates/web/fixmystreet/around/around_index.html:17
+#: templates/web/base/around/_error_multiple.html:6
msgid "We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here."
msgstr "本å€åŸŸæˆ‘們找到更多符åˆçš„資料,我們最多顯示å筆資料。如果你無法在其中找到所è¦çš„資訊,請嘗試其它æœå°‹æ–¹å¼ã€‚"
-#: templates/web/base/auth/token.html:8
+#: templates/web/zurich/auth/token.html:7
msgid "We have not been able to confirm your account - sorry."
msgstr "æŠ±æ­‰ï¼Œæˆ‘å€‘ç„¡æ³•ç¢ºèªæ‚¨çš„帳戶。"
-#: templates/web/base/auth/token.html:16
+#: templates/web/zurich/auth/token.html:17
msgid "We have sent you an email containing a link to confirm your account."
msgstr "我們剛寄給您一å°å…§æœ‰é€£çµç¢ºèªçš„é›»å­éƒµä»¶ã€‚"
@@ -3638,7 +3694,7 @@ msgstr "æˆ‘å€‘ä¸æœƒå…¬é–‹æ‚¨çš„é›»å­éƒµä»¶"
msgid "We never show your email address or phone number."
msgstr "æˆ‘å€‘ä¸æœƒå…¬é–‹æ‚¨çš„é›»å­éƒµä»¶æˆ–是電話號碼"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:403
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:422
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr "我們ç†è§£æ­¤å•題å¯èƒ½æ˜¯%sä¹‹è²¬ä»»ï¼Œç„¶è€Œç›®å‰æˆ‘們並無他們的è¯çµ¡è³‡è¨Šã€‚如果您知é“é©ç•¶çš„è¯çµ¡äººè³‡è¨Šï¼Œè«‹å‘Šè¨´æˆ‘們。"
@@ -3663,11 +3719,15 @@ msgstr "æˆ‘å€‘æƒ³çŸ¥é“æ‚¨å°æœ¬ç«™çš„建議。請填此表單,或發é€é›»å­
msgid "We’ll get back to you as soon as we can."
msgstr "我們會儘快回覆您"
+#: templates/web/base/questionnaire/index.html:71
+msgid "What was your experience of getting the problem fixed?"
+msgstr ""
+
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:49
msgid "What’s the issue, and where is it?"
msgstr "什麼樣的å•題,地點是在?"
-#: templates/web/base/admin/category_edit.html:87
+#: templates/web/base/admin/category_edit.html:90
#: templates/web/zurich/admin/body.html:18
msgid "When edited"
msgstr "何時編輯 "
@@ -3676,7 +3736,7 @@ msgstr "何時編輯 "
msgid "When sent"
msgstr "何時é€å‡º"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:633
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:640
msgid "Whole block of empty flats"
msgstr "æ•´å€ç‚ºé–’置廢棄空間"
@@ -3684,16 +3744,22 @@ msgstr "æ•´å€ç‚ºé–’置廢棄空間"
msgid "Why stop there? <a href=\"/alert\">Set up more alerts</a> for free."
msgstr "為何在此å¡ä½ï¼Ÿå…è²»<a href=\"/alert\">設定更多訊æ¯é€šçŸ¥</a> "
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:192
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:932
+#: templates/web/zurich/admin/header.html:1
+#: templates/web/zurich/admin/header.html:14
+msgid "Wish"
+msgstr ""
+
#: templates/web/base/open311/index.html:92
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr "æœå°‹è¦æ±‚,也å¯èƒ½é™åˆ¶å–®ä¸€æ©Ÿæ§‹ä¸­æœå°‹ç›¸é—œæ¬Šè²¬å–®ä½ã€‚å…¶æœå°‹å­—眼為 <a href=\"%s\">MaPit</a>æä¾›çš„主管ID."
-#: templates/web/fixmystreet/front/footer-marketing.html:17
+#: templates/web/base/front/footer-marketing.html:17
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://fixmystreet.org\">available at fixmystreet.org</a>."
msgstr "您願為FixMyStreetè²¢ç»å—Ž?這個一個開放原始碼,å¯å¾ž <a href=\"http://fixmystreet.org\">fixmystreet.org</a>官網進一步了解 "
-#: templates/web/base/questionnaire/index.html:78
-#: templates/web/fixmystreet/questionnaire/index.html:97
+#: templates/web/base/questionnaire/index.html:87
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr "您是å¦é¡˜æ„4é€±å¾Œå†æ”¶åˆ°å¦ä¸€ä»½å•å·ï¼Ÿä»¥æé†’æ‚¨ç¢ºèªæœ€æ–°çš„ç‹€æ³"
@@ -3719,15 +3785,13 @@ msgstr "年份"
#: templates/web/base/admin/list_updates.html:34
#: templates/web/base/admin/list_updates.html:35
#: templates/web/base/admin/problem_row.html:20
-#: templates/web/base/admin/report_edit.html:76
-#: templates/web/base/admin/report_edit.html:93
+#: templates/web/base/admin/report_edit.html:58
+#: templates/web/base/admin/report_edit.html:75
#: templates/web/base/admin/update_edit.html:24
#: templates/web/base/admin/users.html:31
#: templates/web/base/questionnaire/creator_fixed.html:14
-#: templates/web/base/questionnaire/index.html:42
-#: templates/web/base/questionnaire/index.html:81
-#: templates/web/fixmystreet/questionnaire/index.html:100
-#: templates/web/fixmystreet/questionnaire/index.html:61
+#: templates/web/base/questionnaire/index.html:51
+#: templates/web/base/questionnaire/index.html:90
msgid "Yes"
msgstr "是"
@@ -3793,11 +3857,9 @@ msgstr "您å—到拒絕,請填寫上方表格。"
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr "æ‚¨å·²å›žè¦†éŽæœ¬å•å·ã€‚如果您有å•題,請<href='%s'>ä¿æŒè¯çµ¡</a>, 或是<a href='%s'>檢視 您作的申報</a>\n"
-#: templates/web/base/questionnaire/index.html:68
+#: templates/web/base/questionnaire/index.html:77
#: templates/web/base/report/new/fill_in_details_form.html:75
-#: templates/web/fixmystreet/questionnaire/index.html:88
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
-#: templates/web/zurich/report/new/fill_in_details_form.html:58
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr "您已在本申報中附加一張照片,用å¦ä¸€å¼µç…§ç‰‡å°‡å–代原照片。"
@@ -3806,6 +3868,10 @@ msgstr "您已在本申報中附加一張照片,用å¦ä¸€å¼µç…§ç‰‡å°‡å–代原
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr "您已在本申報更新中附加一張照片,用å¦ä¸€å¼µç…§ç‰‡å°‡å–代原照片。"
+#: templates/web/zurich/report/new/fill_in_details_form.html:61
+msgid "You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed)."
+msgstr ""
+
#: templates/web/base/auth/sign_out.html:4
#: templates/web/zurich/auth/sign_out.html:3
msgid "You have been signed out"
@@ -3826,15 +3892,11 @@ msgstr "您已æˆåŠŸåœ°ç¢ºèªé›»å­éƒµä»¶"
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr "您已æˆåŠŸç™»å…¥ï¼Œè«‹æª¢æŸ¥æ‚¨çš„å€‹äººè³‡è¨Šæ˜¯å¦æ­£ç¢º:"
-#: templates/web/base/my/my.html:20 templates/web/fixmystreet/my/my.html:20
+#: templates/web/base/my/my.html:20
msgid "You haven&rsquo;t created any reports yet. <a href=\"%s\">Report a problem now.</a>"
msgstr "您當未創建任何申報,<a href=\"%s\">ç«‹å³æä¾›ç”³å ±</a>"
-#: templates/web/base/email_sent.html:13
-msgid "You must now click the link in the email we've just sent you."
-msgstr "您必須打開我們é€å‡ºçš„é›»å­ç¢ºèªä¿¡ä»¶ä¸Šçš„連çµç¶²å€ã€€"
-
-#: templates/web/base/admin/index.html:18
+#: templates/web/base/admin/index.html:19
msgid "You need to <a href=\"%s\">add some bodies</a> (such as councils or departments) before any reports can be sent."
msgstr "æ‚¨éœ€è¦ <a href=\"%s\">加入相關單ä½</a> (例如地方政府或部門) ,在申報é€å‡ºä¹‹å‰ã€‚"
@@ -3848,18 +3910,16 @@ msgstr ""
"è¦è™•ç†çš„å•題類別(åƒæ˜¯è·¯é¢å‘洞或街燈故障)以åŠ\n"
"呈é€çš„æ‰¿è¾¦äººå“¡(如電å­éƒµä»¶)"
-#: templates/web/base/admin/report_edit.html:85
+#: templates/web/base/admin/report_edit.html:67
msgid "You really want to resend?"
msgstr "您真的è¦å†é€å‡ºä¸€æ¬¡å—Ž"
#: templates/web/base/my/my.html:0 templates/web/base/my/my.html:15
-#: templates/web/base/my/my.html:4 templates/web/fixmystreet/my/my.html:0
-#: templates/web/fixmystreet/my/my.html:15
-#: templates/web/fixmystreet/my/my.html:4
+#: templates/web/base/my/my.html:4
msgid "Your Reports"
msgstr "您的申報 "
-#: templates/web/fixmystreet/alert/_list.html:89
+#: templates/web/base/alert/_list.html:89
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:91
@@ -3868,22 +3928,17 @@ msgstr "您的申報 "
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:3
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:1
#: templates/web/fixmystreet/report/update-form.html:76
-#: templates/web/zurich/report/new/fill_in_details_form.html:71
+#: templates/web/zurich/report/new/fill_in_details_form.html:76
msgid "Your email"
msgstr "您的電å­éƒµä»¶"
-#: templates/web/fixmystreet/auth/general.html:27
+#: templates/web/base/auth/general.html:28
#: templates/web/fixmystreet/report/update-form.html:82
#: templates/web/zurich/auth/general.html:30
#: templates/web/zurich/auth/general.html:58
msgid "Your email address"
msgstr "您的電å­éƒµä»¶"
-#: templates/web/base/auth/general.html:27
-msgid "Your email address:"
-msgstr "您的電å­éƒµä»¶"
-
-#: templates/web/base/alert/_list.html:92
#: templates/web/base/report/new/fill_in_details_form.html:106
#: templates/web/base/report/update-form.html:81
msgid "Your email:"
@@ -3893,24 +3948,23 @@ msgstr "你的電å­éƒµä»¶:"
msgid "Your information will only be used in accordance with our <a href=\"/privacy\">privacy policy</a>"
msgstr "您的個人資料,將會ä¾ç…§<a href=\"/privacy\">æœ¬ç«™éš±ç§æ¬Šæ”¿ç­–</a>作處ç†ä½¿ç”¨"
-#: templates/web/fixmystreet/auth/general.html:54
+#: templates/web/base/auth/general.html:51
#: templates/web/fixmystreet/contact/index.html:84
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:18
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:54
#: templates/web/fixmystreet/report/update-form.html:142
#: templates/web/zurich/auth/general.html:61
-#: templates/web/zurich/report/new/fill_in_details_form.html:81
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Your name"
msgstr "å§“å"
-#: templates/web/base/auth/general.html:59
#: templates/web/base/contact/index.html:73
-#: templates/web/base/report/new/fill_in_details_form.html:185
-#: templates/web/base/report/update-form.html:151
+#: templates/web/base/report/new/fill_in_details_form.html:186
+#: templates/web/base/report/update-form.html:152
msgid "Your name:"
msgstr "å§“å:"
-#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/base/auth/general.html:39
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:22
#: templates/web/fixmystreet/report/update-form.html:96
#: templates/web/zurich/auth/general.html:34
@@ -3923,19 +3977,15 @@ msgstr "密碼已更新"
#: templates/web/fixmystreet/report/new/form_user_loggedin.html:27
#: templates/web/fixmystreet/report/new/form_user_loggedout.html:63
-#: templates/web/zurich/report/new/fill_in_details_form.html:87
+#: templates/web/zurich/report/new/fill_in_details_form.html:92
msgid "Your phone number"
msgstr "電話號碼"
-#: templates/web/fixmystreet/questionnaire/index.html:16
-msgid "Your report"
-msgstr "申報"
-
-#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:24
+#: templates/web/base/footer.html:9 templates/web/fixmystreet/footer.html:29
msgid "Your reports"
msgstr "你作的申報"
-#: templates/web/base/my/my.html:53 templates/web/fixmystreet/my/my.html:41
+#: templates/web/base/my/my.html:41
msgid "Your updates"
msgstr "æ›´æ–°"
@@ -3943,23 +3993,31 @@ msgstr "æ›´æ–°"
msgid "Your&nbsp;email:"
msgstr "您的電å­éƒµä»¶:"
+#: templates/web/base/reports/_list-filters.html:3
+#, fuzzy
+msgid "all reports"
+msgstr "所有事件申報"
+
#: templates/web/base/admin/timeline.html:4
msgid "by %s"
msgstr "ç”± %s"
+#: templates/web/base/reports/_list-filters.html:5
+#, fuzzy
+msgid "closed reports"
+msgstr "完çµä¹‹ç”³å ± "
+
#: templates/web/base/reports/body.html:6
#: templates/web/base/reports/body.html:7
msgid "council"
msgstr "地方政府"
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "didn't use map"
msgstr "ä¸ä½¿ç”¨åœ°åœ–"
#: templates/web/base/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:20
+#: templates/web/base/around/postcode_form.html:15
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "例如 ‘%s’ 或 ‘%s’"
@@ -3968,17 +4026,22 @@ msgstr "例如 ‘%s’ 或 ‘%s’"
msgid "edit user"
msgstr "用戶編輯"
-#: templates/web/base/admin/index.html:34
+#: templates/web/base/reports/_list-filters.html:6
+#, fuzzy
+msgid "fixed reports"
+msgstr "已處ç†ä¹‹ç”³å ±ã€€"
+
+#: templates/web/base/admin/index.html:33
#: templates/web/zurich/admin/index.html:5
msgid "from %d different users"
msgstr "從ä¸åŒçš„用戶%d "
-#: templates/web/fixmystreet/report/_item.html:17
+#: templates/web/base/report/_item.html:17
#: templates/web/zurich/report/_item.html:16
msgid "last updated %s"
msgstr "%s上回更新:"
-#: perllib/Utils.pm:235
+#: perllib/Utils.pm:204
msgid "less than a minute"
msgstr "少於一分é˜"
@@ -4023,14 +4086,13 @@ msgstr "標註為己è¦ç•«"
msgid "marked as unable to fix"
msgstr "標註為無法解決"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:130
+#: perllib/FixMyStreet/App/Controller/Admin.pm:129
#: templates/web/base/admin/questionnaire.html:15
#: templates/web/base/admin/questionnaire.html:16
msgid "n/a"
msgstr "ä¸é©ç”¨"
-#: templates/web/base/alert/_list.html:87
-#: templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/base/alert/_list.html:85
msgid "or"
msgstr "或"
@@ -4040,16 +4102,16 @@ msgstr "自動辨識我所在ä½ç½® "
#: templates/web/base/admin/report_edit.html:28
#: templates/web/base/admin/report_edit.html:30
-#: templates/web/zurich/admin/report_edit-sdm.html:27
-#: templates/web/zurich/admin/report_edit-sdm.html:29
-#: templates/web/zurich/admin/report_edit-sdm.html:36
-#: templates/web/zurich/admin/report_edit-sdm.html:38
-#: templates/web/zurich/admin/report_edit.html:27
-#: templates/web/zurich/admin/report_edit.html:29
-#: templates/web/zurich/admin/report_edit.html:38
-#: templates/web/zurich/admin/report_edit.html:40
+#: templates/web/zurich/admin/report_edit-sdm.html:30
+#: templates/web/zurich/admin/report_edit-sdm.html:32
+#: templates/web/zurich/admin/report_edit-sdm.html:53
+#: templates/web/zurich/admin/report_edit-sdm.html:55
+#: templates/web/zurich/admin/report_edit.html:32
+#: templates/web/zurich/admin/report_edit.html:34
+#: templates/web/zurich/admin/report_edit.html:48
#: templates/web/zurich/admin/report_edit.html:50
-#: templates/web/zurich/admin/report_edit.html:52
+#: templates/web/zurich/admin/report_edit.html:72
+#: templates/web/zurich/admin/report_edit.html:74
msgid "originally entered: &ldquo;%s&rdquo;"
msgstr "原始輸入者"
@@ -4062,8 +4124,8 @@ msgstr "其它地å€:"
msgid "reopened"
msgstr "é‡å•Ÿç”³å ±"
-#: templates/web/fixmystreet/header.html:59
-#: templates/web/zurich/footer.html:12
+#: templates/web/base/header.html:33 templates/web/fixmystreet/header.html:64
+#: templates/web/zurich/footer.html:13
msgid "sign out"
msgstr "登出"
@@ -4079,17 +4141,20 @@ msgstr "當地地府"
msgid "there is no pin shown as the user did not use the map"
msgstr "地圖上無標記,用戶未使用地圖"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:379
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:398
msgid "this type of local problem"
msgstr "此類在地å•題"
-#: perllib/Utils.pm:207
+#: perllib/Utils.pm:176
msgid "today"
msgstr "今天"
+#: templates/web/base/reports/_list-filters.html:4
+#, fuzzy
+msgid "unfixed reports"
+msgstr "已處ç†ä¹‹ç”³å ±ã€€"
+
#: templates/web/base/admin/report_edit.html:32
-#: templates/web/zurich/admin/report_edit-sdm.html:40
-#: templates/web/zurich/admin/report_edit.html:54
msgid "used map"
msgstr "已用éŽä¹‹åœ°åœ–"
@@ -4112,7 +4177,7 @@ msgid "<big>%s</big> report recently"
msgid_plural "<big>%s</big> reports recently"
msgstr[0] "近期的申報 <big>%s</big> "
-#: perllib/Utils.pm:254
+#: perllib/Utils.pm:223
#, perl-format
msgid "%d hour"
msgid_plural "%d hours"
@@ -4124,7 +4189,7 @@ msgid "%d supporter"
msgid_plural "%d supporters"
msgstr[0] "%d 支æ´è€…"
-#: perllib/Utils.pm:256
+#: perllib/Utils.pm:225
#, perl-format
msgid "%d minute"
msgid_plural "%d minutes"
@@ -4142,7 +4207,7 @@ msgid "We do not yet have details for the council that covers this location."
msgid_plural "We do not yet have details for the councils that cover this location."
msgstr[0] "我們尚未有該å€åŸŸè² è²¬å–®ä½ä¹‹ç´°ç¯€ã€€"
-#: perllib/Utils.pm:250
+#: perllib/Utils.pm:219
#, perl-format
msgid "%d week"
msgid_plural "%d weeks"
@@ -4160,7 +4225,7 @@ msgid "<big>%s</big> fixed in past month"
msgid_plural "<big>%s</big> fixed in past month"
msgstr[0] "上個月解決的<big>%s</big> "
-#: perllib/Utils.pm:252
+#: perllib/Utils.pm:221
#, perl-format
msgid "%d day"
msgid_plural "%d days"
@@ -4172,5 +4237,143 @@ msgid "We do <strong>not</strong> yet have details for the other council that co
msgid_plural "We do <strong>not</strong> yet have details for the other councils that cover this location."
msgstr[0] "我們<strong>尚未<strong>有該å€åŸŸå…¶å®ƒå–®ä½ä¹‹ç´°ç¯€ã€€"
-#~ msgid "For council(s):"
-#~ msgstr "給地方政府(s):"
+#~ msgid "(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)"
+#~ msgstr "(別擔心 &mdash; 在您檢查email這段時間,我們會ä¿ç•™ä½ çš„通知。)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)"
+#~ msgstr "(別擔心 &mdash; 在您檢查email這段時間,我們會ä¿ç•™ä½ çš„申報。)"
+
+#~ msgid "(Don't worry &mdash; we'll hang on to your update while you're checking your email.)"
+#~ msgstr "(別擔心 &mdash; 在您檢查email這段時間,我們會ä¿ç•™ä½ çš„æ›´æ–°ã€‚)"
+
+#~ msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
+#~ msgstr "<small>如果無法檢視此地圖, <a href='%s' rel='nofollow'>ç•¥éŽæ­¤æ­¥é©Ÿ</a>.</small>"
+
+#~ msgid "<strong>No</strong>, I do not, let me sign in by email:"
+#~ msgstr "<strong>ä¸</strong>, ä¸ç”¨, 我è¦ç”¨é›»å­éƒµä»¶ç™»å…¥:"
+
+#~ msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
+#~ msgstr "您是å¦ç‚º<strong>程å¼é–‹ç™¼å“¡</strong>?您願æ„為一起本軟體開發作貢ç»å—Žã€€ "
+
+#~ msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
+#~ msgstr "最鄰近å•題<small>(&nbsp;%s公里之內)</small>"
+
+#~ msgid "Contact FixMyStreet"
+#~ msgstr "連絡「FixMyStreetã€"
+
+#~ msgid "Do you have a FixMyBarangay password?"
+#~ msgstr "æ‚¨æ˜¯å¦æœ‰FixMyBarangay 之密碼?"
+
+#~ msgid "FixMyStreet admin:"
+#~ msgstr "FixMyStreet 管ç†å“¡:"
+
+#~ msgid "If you do not, your alert will not be activated."
+#~ msgstr "如果您é¸ä¸ï¼Œæ‚¨çš„é€šçŸ¥å°‡ä¸æœƒç”Ÿæ•ˆ"
+
+#~ msgid "If you do not, your problem will not be posted."
+#~ msgstr "å¦‚æžœæ‚¨é¸æ“‡ä¸ï¼Œæ‚¨çš„å•é¡Œå°‡ä¸æœƒè¢«è²¼å‡º"
+
+#~ msgid "If you do not, your update will not be posted."
+#~ msgstr "å¦‚æžœæ‚¨é¸æ“‡ä¸ï¼Œæ‚¨çš„æ›´æ–°å°‡ä¸æœƒé¡¯ç¤º"
+
+#~ msgid "New local reports on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.com 上之新近申報 "
+
+#~ msgid "New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.com{{里/å€}}{{地方政府}} 之新近å•題"
+
+#~ msgid "New reports on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.comæ–°è¿‘å•題 "
+
+#~ msgid "New reports on reportemptyhomes.com near {{POSTCODE}}"
+#~ msgstr "reportemptyhomes.com上{{郵éžå€è™Ÿ}} 之新近å•題 "
+
+#~ msgid "New reports to {{COUNCIL}} on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.com上給{{地方政府}} 之新近å•題 "
+
+#~ msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.com{{Name}} ç¯„åœ ä¹‹æ–°è¿‘å•題 "
+
+#~ msgid "New update:"
+#~ msgstr "好"
+
+#~ msgid "No problems found."
+#~ msgstr "找無å•題"
+
+#~ msgid "No problems have been reported yet."
+#~ msgstr "å°šç„¡å•題申報"
+
+#~ msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
+#~ msgstr "ç¾åœ¨é€å‡ºæ‚¨çš„申報 &hellip; æ‚¨æ˜¯å¦æœ‰æœ¬ç«™å¸³å¯†ï¼Ÿ"
+
+#~ msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
+#~ msgstr "ç¾åœ¨é€å‡ºæ‚¨æ›´æ–°çš„申報 &hellip;"
+
+#~ msgid "Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
+#~ msgstr "我們的原始碼å¯åœ¨ <a href=\"http://github.com/mysociety/fixmystreet\">GitHub</a>å–å¾—"
+
+#~ msgid "Please <a class=\"tab_link\" href=\"#report\">take a look</a> at the updates that have been left."
+#~ msgstr "請<a class=\"tab_link\" href=\"#report\">按此查看</a> 最近更新"
+
+#~ msgid "Please take a look at the updates that have been left."
+#~ msgstr "請看看目å‰çš„æœ€æ–°ç‹€æ³"
+
+#~ msgid "Problems within %s, FixMyStreet"
+#~ msgstr "在 %s çš„å•題, FixMyStreet"
+
+#~ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
+#~ msgstr "reportemptyhomes.com近期é€å›žè™•ç†ä¹‹å…¬ç‰©ã€€"
+
+#~ msgid "Publish the response"
+#~ msgstr "公開此回應"
+
+#~ msgid "Reported %s, to %s"
+#~ msgstr "申報 %s 給 %s"
+
+#~ msgid "Reports on and around the map"
+#~ msgstr "地圖附近的申報"
+
+#~ msgid "Sign in by email"
+#~ msgstr "é€éŽé›»å­éƒµä»¶ç™»å…¥"
+
+#~ msgid "Signed in as %s"
+#~ msgstr "以 %s身份登入"
+
+#~ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient."
+#~ msgstr "確èªçš„é›»å­éƒµä»¶<strong>å¯èƒ½æœƒ</strong> æ™šå¹¾åˆ†é˜æ”¶åˆ°<em>è«‹</em>è€å¿ƒç­‰å¾…。"
+
+#~ msgid "The details of your problem are available from the other tab above."
+#~ msgstr "您å•題的細節å¯ä»¥å…¶å®ƒåˆ†é ä¸­æ‰¾åˆ°"
+
+#~ msgid "The details of your problem are available on the right hand side of this page."
+#~ msgstr "您å•題的細節å¯ä»¥åœ¨æœ¬é å³é‚Šæ¬„找到"
+
+#~ msgid "The latest local reports reported by users"
+#~ msgstr "用戶æä¾›çš„æœ¬åœ°æœ€æ–°ç”³å ±ã€€"
+
+#~ msgid "The latest properties reported back to use by users"
+#~ msgstr "用戶回報的本地公物的最新使用狀æ³ã€€"
+
+#~ msgid "The latest reports for {{COUNCIL}} reported by users"
+#~ msgstr "用戶申報給{{COUNCIL}} 的本地最新å•題 "
+
+#~ msgid "The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users"
+#~ msgstr "用戶申報給{{COUNCIL}} 在{{WARD}} 里/å€çš„æœ€æ–°å•題"
+
+#~ msgid "The latest reports within {{NAME}}'s boundary reported by users"
+#~ msgstr "用戶申報{{NAME}}地å€å…§åœ°çš„æœ€æ–°å•題"
+
+#~ msgid "To <strong>report a problem</strong>, click on the map at the correct location."
+#~ msgstr "è¦<strong>申報å•題</strong>, 點擊下方地圖中正確之ä½ç½®ã€‚"
+
+#~ msgid "User"
+#~ msgstr "用戶"
+
+#~ msgid "You must now click the link in the email we've just sent you."
+#~ msgstr "您必須打開我們é€å‡ºçš„é›»å­ç¢ºèªä¿¡ä»¶ä¸Šçš„連çµç¶²å€ã€€"
+
+#~ msgid "Your email address:"
+#~ msgstr "您的電å­éƒµä»¶"
+
+#~ msgid "Your report"
+#~ msgstr "申報"
diff --git a/notes/cobranding.txt b/notes/cobranding.txt
index 3e902abc8..a62747397 100644
--- a/notes/cobranding.txt
+++ b/notes/cobranding.txt
@@ -10,8 +10,7 @@ NB: this is moderately specific to producing cobrands for UK councils
1: copy an exiting perllib/FixMyStreet/Cobrand/ file to perllib/FixMyStreet/Cobrand/ExampleCom.pm
* Change package name at top of file
* Change following functions accordingly:
- site_restriction
- problems_clause
+ body_restriction
enter_postcode_text
area_check
base_url
diff --git a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm
deleted file mode 100644
index 2c398ab1b..000000000
--- a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm
+++ /dev/null
@@ -1,248 +0,0 @@
-
-package BarnetElements::Z_CRM_SERVICE_ORDER_CREATE;
-use strict;
-use warnings;
-
-{ # BLOCK to scope variables
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' }
-
-__PACKAGE__->__set_name('Z_CRM_SERVICE_ORDER_CREATE');
-__PACKAGE__->__set_nillable();
-__PACKAGE__->__set_minOccurs();
-__PACKAGE__->__set_maxOccurs();
-__PACKAGE__->__set_ref();
-
-use base qw(
- SOAP::WSDL::XSD::Typelib::Element
- SOAP::WSDL::XSD::Typelib::ComplexType
-);
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %ET_RETURN_of :ATTR(:get<ET_RETURN>);
-my %IT_PROBLEM_DESC_of :ATTR(:get<IT_PROBLEM_DESC>);
-my %IV_CUST_EMAIL_of :ATTR(:get<IV_CUST_EMAIL>);
-my %IV_CUST_NAME_of :ATTR(:get<IV_CUST_NAME>);
-my %IV_KBID_of :ATTR(:get<IV_KBID>);
-my %IV_PROBLEM_ID_of :ATTR(:get<IV_PROBLEM_ID>);
-my %IV_PROBLEM_LOC_of :ATTR(:get<IV_PROBLEM_LOC>);
-my %IV_PROBLEM_SUB_of :ATTR(:get<IV_PROBLEM_SUB>);
-
-__PACKAGE__->_factory(
- [ qw( ET_RETURN
- IT_PROBLEM_DESC
- IV_CUST_EMAIL
- IV_CUST_NAME
- IV_KBID
- IV_PROBLEM_ID
- IV_PROBLEM_LOC
- IV_PROBLEM_SUB
-
- ) ],
- {
- 'ET_RETURN' => \%ET_RETURN_of,
- 'IT_PROBLEM_DESC' => \%IT_PROBLEM_DESC_of,
- 'IV_CUST_EMAIL' => \%IV_CUST_EMAIL_of,
- 'IV_CUST_NAME' => \%IV_CUST_NAME_of,
- 'IV_KBID' => \%IV_KBID_of,
- 'IV_PROBLEM_ID' => \%IV_PROBLEM_ID_of,
- 'IV_PROBLEM_LOC' => \%IV_PROBLEM_LOC_of,
- 'IV_PROBLEM_SUB' => \%IV_PROBLEM_SUB_of,
- },
- {
- 'ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
- 'IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
- 'IV_CUST_EMAIL' => 'BarnetTypes::char241',
- 'IV_CUST_NAME' => 'BarnetTypes::char50',
- 'IV_KBID' => 'BarnetTypes::char50',
- 'IV_PROBLEM_ID' => 'BarnetTypes::char35',
- 'IV_PROBLEM_LOC' => 'BarnetTypes::BAPI_TTET_ADDRESS_COM',
- 'IV_PROBLEM_SUB' => 'BarnetTypes::char40',
- },
- {
-
- 'ET_RETURN' => 'ET_RETURN',
- 'IT_PROBLEM_DESC' => 'IT_PROBLEM_DESC',
- 'IV_CUST_EMAIL' => 'IV_CUST_EMAIL',
- 'IV_CUST_NAME' => 'IV_CUST_NAME',
- 'IV_KBID' => 'IV_KBID',
- 'IV_PROBLEM_ID' => 'IV_PROBLEM_ID',
- 'IV_PROBLEM_LOC' => 'IV_PROBLEM_LOC',
- 'IV_PROBLEM_SUB' => 'IV_PROBLEM_SUB',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-} # end of BLOCK
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetElements::Z_CRM_SERVICE_ORDER_CREATE
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined element
-Z_CRM_SERVICE_ORDER_CREATE from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-
-=head1 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * ET_RETURN
-
- $element->set_ET_RETURN($data);
- $element->get_ET_RETURN();
-
-
-
-
-=item * IT_PROBLEM_DESC
-
- $element->set_IT_PROBLEM_DESC($data);
- $element->get_IT_PROBLEM_DESC();
-
-
-
-
-=item * IV_CUST_EMAIL
-
- $element->set_IV_CUST_EMAIL($data);
- $element->get_IV_CUST_EMAIL();
-
-
-
-
-=item * IV_CUST_NAME
-
- $element->set_IV_CUST_NAME($data);
- $element->get_IV_CUST_NAME();
-
-
-
-
-=item * IV_KBID
-
- $element->set_IV_KBID($data);
- $element->get_IV_KBID();
-
-
-
-
-=item * IV_PROBLEM_ID
-
- $element->set_IV_PROBLEM_ID($data);
- $element->get_IV_PROBLEM_ID();
-
-
-
-
-=item * IV_PROBLEM_LOC
-
- $element->set_IV_PROBLEM_LOC($data);
- $element->get_IV_PROBLEM_LOC();
-
-
-
-
-=item * IV_PROBLEM_SUB
-
- $element->set_IV_PROBLEM_SUB($data);
- $element->get_IV_PROBLEM_SUB();
-
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
- my $element = BarnetElements::Z_CRM_SERVICE_ORDER_CREATE->new($data);
-
-Constructor. The following data structure may be passed to new():
-
- {
- ET_RETURN => { # BarnetTypes::TABLE_OF_BAPIRET2
- item => { # BarnetTypes::BAPIRET2
- TYPE => $some_value, # char1
- ID => $some_value, # char20
- NUMBER => $some_value, # numeric3
- MESSAGE => $some_value, # char220
- LOG_NO => $some_value, # char20
- LOG_MSG_NO => $some_value, # numeric6
- MESSAGE_V1 => $some_value, # char50
- MESSAGE_V2 => $some_value, # char50
- MESSAGE_V3 => $some_value, # char50
- MESSAGE_V4 => $some_value, # char50
- PARAMETER => $some_value, # char32
- ROW => $some_value, # int
- FIELD => $some_value, # char30
- SYSTEM => $some_value, # char10
- },
- },
- IT_PROBLEM_DESC => { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
- item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
- TEXT_LINE => $some_value, # char132
- },
- },
- IV_CUST_EMAIL => $some_value, # char241
- IV_CUST_NAME => $some_value, # char50
- IV_KBID => $some_value, # char50
- IV_PROBLEM_ID => $some_value, # char35
- IV_PROBLEM_LOC => { # BarnetTypes::BAPI_TTET_ADDRESS_COM
- COUNTRY2 => $some_value, # char2
- REGION => $some_value, # char3
- COUNTY => $some_value, # char30
- CITY => $some_value, # char30
- POSTALCODE => $some_value, # char10
- STREET => $some_value, # char30
- STREETNUMBER => $some_value, # char5
- GEOCODE => $some_value, # char32
- },
- IV_PROBLEM_SUB => $some_value, # char40
- },
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm
deleted file mode 100644
index ae95d3234..000000000
--- a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm
+++ /dev/null
@@ -1,64 +0,0 @@
-
-package BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception;
-use strict;
-use warnings;
-
-{ # BLOCK to scope variables
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' }
-
-__PACKAGE__->__set_name('Z_CRM_SERVICE_ORDER_CREATE.Exception');
-__PACKAGE__->__set_nillable();
-__PACKAGE__->__set_minOccurs();
-__PACKAGE__->__set_maxOccurs();
-__PACKAGE__->__set_ref();
-use base qw(
- SOAP::WSDL::XSD::Typelib::Element
- BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
-);
-
-}
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined element
-Z_CRM_SERVICE_ORDER_CREATE.Exception from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-
-=head1 METHODS
-
-=head2 new
-
- my $element = BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception->new($data);
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
- Name => $some_value, # Z_CRM_SERVICE_ORDER_CREATE.RfcExceptions
- Text => $some_value, # string
- Message => { # BarnetTypes::RfcException::Message
- ID => $some_value, # string
- Number => $some_value, # RfcException.Message.Number
- },
- },
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm
deleted file mode 100644
index 5755d0b49..000000000
--- a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm
+++ /dev/null
@@ -1,183 +0,0 @@
-
-package BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse;
-use strict;
-use warnings;
-
-{ # BLOCK to scope variables
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' }
-
-__PACKAGE__->__set_name('Z_CRM_SERVICE_ORDER_CREATEResponse');
-__PACKAGE__->__set_nillable();
-__PACKAGE__->__set_minOccurs();
-__PACKAGE__->__set_maxOccurs();
-__PACKAGE__->__set_ref();
-
-use base qw(
- SOAP::WSDL::XSD::Typelib::Element
- SOAP::WSDL::XSD::Typelib::ComplexType
-);
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %ET_RETURN_of :ATTR(:get<ET_RETURN>);
-my %EV_ORDER_GUID_of :ATTR(:get<EV_ORDER_GUID>);
-my %EV_ORDER_NO_of :ATTR(:get<EV_ORDER_NO>);
-my %IT_PROBLEM_DESC_of :ATTR(:get<IT_PROBLEM_DESC>);
-
-__PACKAGE__->_factory(
- [ qw( ET_RETURN
- EV_ORDER_GUID
- EV_ORDER_NO
- IT_PROBLEM_DESC
-
- ) ],
- {
- 'ET_RETURN' => \%ET_RETURN_of,
- 'EV_ORDER_GUID' => \%EV_ORDER_GUID_of,
- 'EV_ORDER_NO' => \%EV_ORDER_NO_of,
- 'IT_PROBLEM_DESC' => \%IT_PROBLEM_DESC_of,
- },
- {
- 'ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
- 'EV_ORDER_GUID' => 'BarnetTypes::char32',
- 'EV_ORDER_NO' => 'BarnetTypes::char10',
- 'IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
- },
- {
-
- 'ET_RETURN' => 'ET_RETURN',
- 'EV_ORDER_GUID' => 'EV_ORDER_GUID',
- 'EV_ORDER_NO' => 'EV_ORDER_NO',
- 'IT_PROBLEM_DESC' => 'IT_PROBLEM_DESC',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-} # end of BLOCK
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined element
-Z_CRM_SERVICE_ORDER_CREATEResponse from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-
-=head1 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * ET_RETURN
-
- $element->set_ET_RETURN($data);
- $element->get_ET_RETURN();
-
-
-
-
-=item * EV_ORDER_GUID
-
- $element->set_EV_ORDER_GUID($data);
- $element->get_EV_ORDER_GUID();
-
-
-
-
-=item * EV_ORDER_NO
-
- $element->set_EV_ORDER_NO($data);
- $element->get_EV_ORDER_NO();
-
-
-
-
-=item * IT_PROBLEM_DESC
-
- $element->set_IT_PROBLEM_DESC($data);
- $element->get_IT_PROBLEM_DESC();
-
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
- my $element = BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse->new($data);
-
-Constructor. The following data structure may be passed to new():
-
- {
- ET_RETURN => { # BarnetTypes::TABLE_OF_BAPIRET2
- item => { # BarnetTypes::BAPIRET2
- TYPE => $some_value, # char1
- ID => $some_value, # char20
- NUMBER => $some_value, # numeric3
- MESSAGE => $some_value, # char220
- LOG_NO => $some_value, # char20
- LOG_MSG_NO => $some_value, # numeric6
- MESSAGE_V1 => $some_value, # char50
- MESSAGE_V2 => $some_value, # char50
- MESSAGE_V3 => $some_value, # char50
- MESSAGE_V4 => $some_value, # char50
- PARAMETER => $some_value, # char32
- ROW => $some_value, # int
- FIELD => $some_value, # char30
- SYSTEM => $some_value, # char10
- },
- },
- EV_ORDER_GUID => $some_value, # char32
- EV_ORDER_NO => $some_value, # char10
- IT_PROBLEM_DESC => { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
- item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
- TEXT_LINE => $some_value, # char132
- },
- },
- },
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm b/perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm
deleted file mode 100644
index 94e0cd4db..000000000
--- a/perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm
+++ /dev/null
@@ -1,166 +0,0 @@
-package BarnetInterfaces::service::ZLBB_SERVICE_ORDER;
-use strict;
-use warnings;
-use Class::Std::Fast::Storable;
-use Scalar::Util qw(blessed);
-use base qw(SOAP::WSDL::Client::Base);
-
-# only load if it hasn't been loaded before
-require BarnetTypemaps::service
- if not BarnetTypemaps::service->can('get_class');
-
-sub START {
- $_[0]->set_proxy('http://lbbcrmdev.barnet.gov.uk:8000/sap/bc/srt/rfc/sap/zlbb_service_order/200/zlbb_service_order/zlbb_service_order') if not $_[2]->{proxy};
- $_[0]->set_class_resolver('BarnetTypemaps::service')
- if not $_[2]->{class_resolver};
-
- $_[0]->set_prefix($_[2]->{use_prefix}) if exists $_[2]->{use_prefix};
-}
-
-sub Z_CRM_SERVICE_ORDER_CREATE {
- my ($self, $body, $header) = @_;
- die "Z_CRM_SERVICE_ORDER_CREATE must be called as object method (\$self is <$self>)" if not blessed($self);
- return $self->SUPER::call({
- operation => 'Z_CRM_SERVICE_ORDER_CREATE',
- soap_action => '',
- style => 'document',
- body => {
-
-
- 'use' => 'literal',
- namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
- encodingStyle => '',
- parts => [qw( BarnetElements::Z_CRM_SERVICE_ORDER_CREATE )],
- },
- header => {
-
- },
- headerfault => {
-
- }
- }, $body, $header);
-}
-
-
-
-
-1;
-
-
-
-__END__
-
-=pod
-
-=head1 NAME
-
-BarnetInterfaces::service::ZLBB_SERVICE_ORDER - SOAP Interface for the service Web Service
-
-=head1 SYNOPSIS
-
- use BarnetInterfaces::service::ZLBB_SERVICE_ORDER;
- my $interface = BarnetInterfaces::service::ZLBB_SERVICE_ORDER->new();
-
- my $response;
- $response = $interface->Z_CRM_SERVICE_ORDER_CREATE();
-
-
-
-=head1 DESCRIPTION
-
-SOAP Interface for the service web service
-located at http://lbbcrmdev.barnet.gov.uk:8000/sap/bc/srt/rfc/sap/zlbb_service_order/200/zlbb_service_order/zlbb_service_order.
-
-=head1 SERVICE service
-
-
-
-=head2 Port ZLBB_SERVICE_ORDER
-
-
-
-=head1 METHODS
-
-=head2 General methods
-
-=head3 new
-
-Constructor.
-
-All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
-
-=head2 SOAP Service methods
-
-Method synopsis is displayed with hash refs as parameters.
-
-The commented class names in the method's parameters denote that objects
-of the corresponding class can be passed instead of the marked hash ref.
-
-You may pass any combination of objects, hash and list refs to these
-methods, as long as you meet the structure.
-
-List items (i.e. multiple occurences) are not displayed in the synopsis.
-You may generally pass a list ref of hash refs (or objects) instead of a hash
-ref - this may result in invalid XML if used improperly, though. Note that
-SOAP::WSDL always expects list references at maximum depth position.
-
-XML attributes are not displayed in this synopsis and cannot be set using
-hash refs. See the respective class' documentation for additional information.
-
-
-
-=head3 Z_CRM_SERVICE_ORDER_CREATE
-
-
-
-Returns a L<BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse|BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse> object.
-
- $response = $interface->Z_CRM_SERVICE_ORDER_CREATE( {
- ET_RETURN => { # BarnetTypes::TABLE_OF_BAPIRET2
- item => { # BarnetTypes::BAPIRET2
- TYPE => $some_value, # char1
- ID => $some_value, # char20
- NUMBER => $some_value, # numeric3
- MESSAGE => $some_value, # char220
- LOG_NO => $some_value, # char20
- LOG_MSG_NO => $some_value, # numeric6
- MESSAGE_V1 => $some_value, # char50
- MESSAGE_V2 => $some_value, # char50
- MESSAGE_V3 => $some_value, # char50
- MESSAGE_V4 => $some_value, # char50
- PARAMETER => $some_value, # char32
- ROW => $some_value, # int
- FIELD => $some_value, # char30
- SYSTEM => $some_value, # char10
- },
- },
- IT_PROBLEM_DESC => { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
- item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
- TEXT_LINE => $some_value, # char132
- },
- },
- IV_CUST_EMAIL => $some_value, # char241
- IV_CUST_NAME => $some_value, # char50
- IV_KBID => $some_value, # char50
- IV_PROBLEM_ID => $some_value, # char35
- IV_PROBLEM_LOC => { # BarnetTypes::BAPI_TTET_ADDRESS_COM
- COUNTRY2 => $some_value, # char2
- REGION => $some_value, # char3
- COUNTY => $some_value, # char30
- CITY => $some_value, # char30
- POSTALCODE => $some_value, # char10
- STREET => $some_value, # char30
- STREETNUMBER => $some_value, # char5
- GEOCODE => $some_value, # char32
- },
- IV_PROBLEM_SUB => $some_value, # char40
- },,
- );
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL on Fri Apr 8 10:23:03 2011
-
-=cut
diff --git a/perllib/BarnetTypemaps/service.pm b/perllib/BarnetTypemaps/service.pm
deleted file mode 100644
index dd9f98162..000000000
--- a/perllib/BarnetTypemaps/service.pm
+++ /dev/null
@@ -1,103 +0,0 @@
-
-package BarnetTypemaps::service;
-use strict;
-use warnings;
-
-our $typemap_1 = {
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/EV_ORDER_NO' => 'BarnetTypes::char10',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/GEOCODE' => 'BarnetTypes::char32',
- 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/COUNTRY2' => 'BarnetTypes::char2',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/NUMBER' => 'BarnetTypes::numeric3',
- 'Z_CRM_SERVICE_ORDER_CREATE/IT_PROBLEM_DESC/item' => 'BarnetTypes::CRMT_SERVICE_REQUEST_TEXT',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V1' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/POSTALCODE' => 'BarnetTypes::char10',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/LOG_NO' => 'BarnetTypes::char20',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V2' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V3' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_SUB' => 'BarnetTypes::char40',
- 'Z_CRM_SERVICE_ORDER_CREATE/IT_PROBLEM_DESC/item/TEXT_LINE' => 'BarnetTypes::char132',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/LOG_NO' => 'BarnetTypes::char20',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/ROW' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/IT_PROBLEM_DESC/item' => 'BarnetTypes::CRMT_SERVICE_REQUEST_TEXT',
- 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/PARAMETER' => 'BarnetTypes::char32',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item' => 'BarnetTypes::BAPIRET2',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_CUST_NAME' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V2' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/ROW' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
- 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
- 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Message/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/NUMBER' => 'BarnetTypes::numeric3',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse' => 'BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse',
- 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Text' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V1' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/PARAMETER' => 'BarnetTypes::char32',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE' => 'BarnetTypes::char220',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/TYPE' => 'BarnetTypes::char1',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE' => 'BarnetTypes::char220',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC' => 'BarnetTypes::BAPI_TTET_ADDRESS_COM',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/TYPE' => 'BarnetTypes::char1',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_CUST_EMAIL' => 'BarnetTypes::char241',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/FIELD' => 'BarnetTypes::char30',
- 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Name' => 'BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcExceptions',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/IT_PROBLEM_DESC/item/TEXT_LINE' => 'BarnetTypes::char132',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/ID' => 'BarnetTypes::char20',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/EV_ORDER_GUID' => 'BarnetTypes::char32',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/SYSTEM' => 'BarnetTypes::char10',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_ID' => 'BarnetTypes::char35',
- 'Z_CRM_SERVICE_ORDER_CREATE' => 'BarnetElements::Z_CRM_SERVICE_ORDER_CREATE',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/REGION' => 'BarnetTypes::char3',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/LOG_MSG_NO' => 'BarnetTypes::numeric6',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V4' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/FIELD' => 'BarnetTypes::char30',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/SYSTEM' => 'BarnetTypes::char10',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/COUNTY' => 'BarnetTypes::char30',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/LOG_MSG_NO' => 'BarnetTypes::numeric6',
- 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Message' => 'BarnetTypes::RfcException::Message',
- 'Z_CRM_SERVICE_ORDER_CREATE/IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
- 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item' => 'BarnetTypes::BAPIRET2',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/CITY' => 'BarnetTypes::char30',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V4' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATE.Exception' => 'BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception',
- 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/STREETNUMBER' => 'BarnetTypes::char5',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/ID' => 'BarnetTypes::char20',
- 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/STREET' => 'BarnetTypes::char30',
- 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Message/Number' => 'BarnetTypes::RfcException::Message::Number',
- 'Z_CRM_SERVICE_ORDER_CREATE/IV_KBID' => 'BarnetTypes::char50',
- 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V3' => 'BarnetTypes::char50'
- };
-;
-
-sub get_class {
- my $name = join '/', @{ $_[1] };
- return $typemap_1->{ $name };
-}
-
-sub get_typemap {
- return $typemap_1;
-}
-
-1;
-
-__END__
-
-__END__
-
-=pod
-
-=head1 NAME
-
-BarnetTypemaps::service - typemap for service
-
-=head1 DESCRIPTION
-
-Typemap created by SOAP::WSDL for map-based SOAP message parsers.
-
-=cut
-
diff --git a/perllib/BarnetTypes/BAPIRET2.pm b/perllib/BarnetTypes/BAPIRET2.pm
deleted file mode 100644
index 2ca20894c..000000000
--- a/perllib/BarnetTypes/BAPIRET2.pm
+++ /dev/null
@@ -1,219 +0,0 @@
-package BarnetTypes::BAPIRET2;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %TYPE_of :ATTR(:get<TYPE>);
-my %ID_of :ATTR(:get<ID>);
-my %NUMBER_of :ATTR(:get<NUMBER>);
-my %MESSAGE_of :ATTR(:get<MESSAGE>);
-my %LOG_NO_of :ATTR(:get<LOG_NO>);
-my %LOG_MSG_NO_of :ATTR(:get<LOG_MSG_NO>);
-my %MESSAGE_V1_of :ATTR(:get<MESSAGE_V1>);
-my %MESSAGE_V2_of :ATTR(:get<MESSAGE_V2>);
-my %MESSAGE_V3_of :ATTR(:get<MESSAGE_V3>);
-my %MESSAGE_V4_of :ATTR(:get<MESSAGE_V4>);
-my %PARAMETER_of :ATTR(:get<PARAMETER>);
-my %ROW_of :ATTR(:get<ROW>);
-my %FIELD_of :ATTR(:get<FIELD>);
-my %SYSTEM_of :ATTR(:get<SYSTEM>);
-
-__PACKAGE__->_factory(
- [ qw( TYPE
- ID
- NUMBER
- MESSAGE
- LOG_NO
- LOG_MSG_NO
- MESSAGE_V1
- MESSAGE_V2
- MESSAGE_V3
- MESSAGE_V4
- PARAMETER
- ROW
- FIELD
- SYSTEM
-
- ) ],
- {
- 'TYPE' => \%TYPE_of,
- 'ID' => \%ID_of,
- 'NUMBER' => \%NUMBER_of,
- 'MESSAGE' => \%MESSAGE_of,
- 'LOG_NO' => \%LOG_NO_of,
- 'LOG_MSG_NO' => \%LOG_MSG_NO_of,
- 'MESSAGE_V1' => \%MESSAGE_V1_of,
- 'MESSAGE_V2' => \%MESSAGE_V2_of,
- 'MESSAGE_V3' => \%MESSAGE_V3_of,
- 'MESSAGE_V4' => \%MESSAGE_V4_of,
- 'PARAMETER' => \%PARAMETER_of,
- 'ROW' => \%ROW_of,
- 'FIELD' => \%FIELD_of,
- 'SYSTEM' => \%SYSTEM_of,
- },
- {
- 'TYPE' => 'BarnetTypes::char1',
- 'ID' => 'BarnetTypes::char20',
- 'NUMBER' => 'BarnetTypes::numeric3',
- 'MESSAGE' => 'BarnetTypes::char220',
- 'LOG_NO' => 'BarnetTypes::char20',
- 'LOG_MSG_NO' => 'BarnetTypes::numeric6',
- 'MESSAGE_V1' => 'BarnetTypes::char50',
- 'MESSAGE_V2' => 'BarnetTypes::char50',
- 'MESSAGE_V3' => 'BarnetTypes::char50',
- 'MESSAGE_V4' => 'BarnetTypes::char50',
- 'PARAMETER' => 'BarnetTypes::char32',
- 'ROW' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
- 'FIELD' => 'BarnetTypes::char30',
- 'SYSTEM' => 'BarnetTypes::char10',
- },
- {
-
- 'TYPE' => 'TYPE',
- 'ID' => 'ID',
- 'NUMBER' => 'NUMBER',
- 'MESSAGE' => 'MESSAGE',
- 'LOG_NO' => 'LOG_NO',
- 'LOG_MSG_NO' => 'LOG_MSG_NO',
- 'MESSAGE_V1' => 'MESSAGE_V1',
- 'MESSAGE_V2' => 'MESSAGE_V2',
- 'MESSAGE_V3' => 'MESSAGE_V3',
- 'MESSAGE_V4' => 'MESSAGE_V4',
- 'PARAMETER' => 'PARAMETER',
- 'ROW' => 'ROW',
- 'FIELD' => 'FIELD',
- 'SYSTEM' => 'SYSTEM',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::BAPIRET2
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-BAPIRET2 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * TYPE
-
-
-=item * ID
-
-
-=item * NUMBER
-
-
-=item * MESSAGE
-
-
-=item * LOG_NO
-
-
-=item * LOG_MSG_NO
-
-
-=item * MESSAGE_V1
-
-
-=item * MESSAGE_V2
-
-
-=item * MESSAGE_V3
-
-
-=item * MESSAGE_V4
-
-
-=item * PARAMETER
-
-
-=item * ROW
-
-
-=item * FIELD
-
-
-=item * SYSTEM
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::BAPIRET2
- TYPE => $some_value, # char1
- ID => $some_value, # char20
- NUMBER => $some_value, # numeric3
- MESSAGE => $some_value, # char220
- LOG_NO => $some_value, # char20
- LOG_MSG_NO => $some_value, # numeric6
- MESSAGE_V1 => $some_value, # char50
- MESSAGE_V2 => $some_value, # char50
- MESSAGE_V3 => $some_value, # char50
- MESSAGE_V4 => $some_value, # char50
- PARAMETER => $some_value, # char32
- ROW => $some_value, # int
- FIELD => $some_value, # char30
- SYSTEM => $some_value, # char10
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm b/perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm
deleted file mode 100644
index b4a8b00ca..000000000
--- a/perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm
+++ /dev/null
@@ -1,165 +0,0 @@
-package BarnetTypes::BAPI_TTET_ADDRESS_COM;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %COUNTRY2_of :ATTR(:get<COUNTRY2>);
-my %REGION_of :ATTR(:get<REGION>);
-my %COUNTY_of :ATTR(:get<COUNTY>);
-my %CITY_of :ATTR(:get<CITY>);
-my %POSTALCODE_of :ATTR(:get<POSTALCODE>);
-my %STREET_of :ATTR(:get<STREET>);
-my %STREETNUMBER_of :ATTR(:get<STREETNUMBER>);
-my %GEOCODE_of :ATTR(:get<GEOCODE>);
-
-__PACKAGE__->_factory(
- [ qw( COUNTRY2
- REGION
- COUNTY
- CITY
- POSTALCODE
- STREET
- STREETNUMBER
- GEOCODE
-
- ) ],
- {
- 'COUNTRY2' => \%COUNTRY2_of,
- 'REGION' => \%REGION_of,
- 'COUNTY' => \%COUNTY_of,
- 'CITY' => \%CITY_of,
- 'POSTALCODE' => \%POSTALCODE_of,
- 'STREET' => \%STREET_of,
- 'STREETNUMBER' => \%STREETNUMBER_of,
- 'GEOCODE' => \%GEOCODE_of,
- },
- {
- 'COUNTRY2' => 'BarnetTypes::char2',
- 'REGION' => 'BarnetTypes::char3',
- 'COUNTY' => 'BarnetTypes::char30',
- 'CITY' => 'BarnetTypes::char30',
- 'POSTALCODE' => 'BarnetTypes::char10',
- 'STREET' => 'BarnetTypes::char30',
- 'STREETNUMBER' => 'BarnetTypes::char5',
- 'GEOCODE' => 'BarnetTypes::char32',
- },
- {
-
- 'COUNTRY2' => 'COUNTRY2',
- 'REGION' => 'REGION',
- 'COUNTY' => 'COUNTY',
- 'CITY' => 'CITY',
- 'POSTALCODE' => 'POSTALCODE',
- 'STREET' => 'STREET',
- 'STREETNUMBER' => 'STREETNUMBER',
- 'GEOCODE' => 'GEOCODE',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::BAPI_TTET_ADDRESS_COM
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-BAPI_TTET_ADDRESS_COM from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * COUNTRY2
-
-
-=item * REGION
-
-
-=item * COUNTY
-
-
-=item * CITY
-
-
-=item * POSTALCODE
-
-
-=item * STREET
-
-
-=item * STREETNUMBER
-
-
-=item * GEOCODE
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::BAPI_TTET_ADDRESS_COM
- COUNTRY2 => $some_value, # char2
- REGION => $some_value, # char3
- COUNTY => $some_value, # char30
- CITY => $some_value, # char30
- POSTALCODE => $some_value, # char10
- STREET => $some_value, # char30
- STREETNUMBER => $some_value, # char5
- GEOCODE => $some_value, # char32
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm b/perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm
deleted file mode 100644
index 39e2ad1ce..000000000
--- a/perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm
+++ /dev/null
@@ -1,102 +0,0 @@
-package BarnetTypes::CRMT_SERVICE_REQUEST_TEXT;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %TEXT_LINE_of :ATTR(:get<TEXT_LINE>);
-
-__PACKAGE__->_factory(
- [ qw( TEXT_LINE
-
- ) ],
- {
- 'TEXT_LINE' => \%TEXT_LINE_of,
- },
- {
- 'TEXT_LINE' => 'BarnetTypes::char132',
- },
- {
-
- 'TEXT_LINE' => 'TEXT_LINE',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-CRMT_SERVICE_REQUEST_TEXT from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * TEXT_LINE
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
- TEXT_LINE => $some_value, # char132
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/RfcException/Message.pm b/perllib/BarnetTypes/RfcException/Message.pm
deleted file mode 100644
index 71b94bf7c..000000000
--- a/perllib/BarnetTypes/RfcException/Message.pm
+++ /dev/null
@@ -1,111 +0,0 @@
-package BarnetTypes::RfcException::Message;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %ID_of :ATTR(:get<ID>);
-my %Number_of :ATTR(:get<Number>);
-
-__PACKAGE__->_factory(
- [ qw( ID
- Number
-
- ) ],
- {
- 'ID' => \%ID_of,
- 'Number' => \%Number_of,
- },
- {
- 'ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
- 'Number' => 'BarnetTypes::RfcException::Message::Number',
- },
- {
-
- 'ID' => 'ID',
- 'Number' => 'Number',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::RfcException::Message
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-RfcException.Message from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * ID
-
-
-=item * Number
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::RfcException::Message
- ID => $some_value, # string
- Number => $some_value, # RfcException.Message.Number
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/RfcException/Message/Number.pm b/perllib/BarnetTypes/RfcException/Message/Number.pm
deleted file mode 100644
index 9353df454..000000000
--- a/perllib/BarnetTypes/RfcException/Message/Number.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::RfcException::Message::Number;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-RfcException.Message.Number from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm b/perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm
deleted file mode 100644
index c248bc907..000000000
--- a/perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm
+++ /dev/null
@@ -1,117 +0,0 @@
-package BarnetTypes::TABLE_OF_BAPIRET2;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %item_of :ATTR(:get<item>);
-
-__PACKAGE__->_factory(
- [ qw( item
-
- ) ],
- {
- 'item' => \%item_of,
- },
- {
- 'item' => 'BarnetTypes::BAPIRET2',
- },
- {
-
- 'item' => 'item',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::TABLE_OF_BAPIRET2
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-TABLE_OF_BAPIRET2 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * item
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::TABLE_OF_BAPIRET2
- item => { # BarnetTypes::BAPIRET2
- TYPE => $some_value, # char1
- ID => $some_value, # char20
- NUMBER => $some_value, # numeric3
- MESSAGE => $some_value, # char220
- LOG_NO => $some_value, # char20
- LOG_MSG_NO => $some_value, # numeric6
- MESSAGE_V1 => $some_value, # char50
- MESSAGE_V2 => $some_value, # char50
- MESSAGE_V3 => $some_value, # char50
- MESSAGE_V4 => $some_value, # char50
- PARAMETER => $some_value, # char32
- ROW => $some_value, # int
- FIELD => $some_value, # char30
- SYSTEM => $some_value, # char10
- },
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm b/perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm
deleted file mode 100644
index 62eb7b774..000000000
--- a/perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm
+++ /dev/null
@@ -1,104 +0,0 @@
-package BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %item_of :ATTR(:get<item>);
-
-__PACKAGE__->_factory(
- [ qw( item
-
- ) ],
- {
- 'item' => \%item_of,
- },
- {
- 'item' => 'BarnetTypes::CRMT_SERVICE_REQUEST_TEXT',
- },
- {
-
- 'item' => 'item',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-TABLE_OF_CRMT_SERVICE_REQUEST_TEXT from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * item
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
- item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
- TEXT_LINE => $some_value, # char132
- },
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm b/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm
deleted file mode 100644
index 8d04adf53..000000000
--- a/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm
+++ /dev/null
@@ -1,123 +0,0 @@
-package BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException;
-use strict;
-use warnings;
-
-
-__PACKAGE__->_set_element_form_qualified(0);
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
-
-our $XML_ATTRIBUTE_CLASS;
-undef $XML_ATTRIBUTE_CLASS;
-
-sub __get_attr_class {
- return $XML_ATTRIBUTE_CLASS;
-}
-
-use Class::Std::Fast::Storable constructor => 'none';
-use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
-
-Class::Std::initialize();
-
-{ # BLOCK to scope variables
-
-my %Name_of :ATTR(:get<Name>);
-my %Text_of :ATTR(:get<Text>);
-my %Message_of :ATTR(:get<Message>);
-
-__PACKAGE__->_factory(
- [ qw( Name
- Text
- Message
-
- ) ],
- {
- 'Name' => \%Name_of,
- 'Text' => \%Text_of,
- 'Message' => \%Message_of,
- },
- {
- 'Name' => 'BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcExceptions',
- 'Text' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
- 'Message' => 'BarnetTypes::RfcException::Message',
- },
- {
-
- 'Name' => 'Name',
- 'Text' => 'Text',
- 'Message' => 'Message',
- }
-);
-
-} # end BLOCK
-
-
-
-
-
-
-
-1;
-
-
-=pod
-
-=head1 NAME
-
-BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined complexType
-Z_CRM_SERVICE_ORDER_CREATE.RfcException from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-
-=head2 PROPERTIES
-
-The following properties may be accessed using get_PROPERTY / set_PROPERTY
-methods:
-
-=over
-
-=item * Name
-
-
-=item * Text
-
-
-=item * Message
-
-
-
-
-=back
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor. The following data structure may be passed to new():
-
- { # BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
- Name => $some_value, # Z_CRM_SERVICE_ORDER_CREATE.RfcExceptions
- Text => $some_value, # string
- Message => { # BarnetTypes::RfcException::Message
- ID => $some_value, # string
- Number => $some_value, # RfcException.Message.Number
- },
- },
-
-
-
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm b/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm
deleted file mode 100644
index ffc2237bc..000000000
--- a/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcExceptions;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-Z_CRM_SERVICE_ORDER_CREATE.RfcExceptions from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char1.pm b/perllib/BarnetTypes/char1.pm
deleted file mode 100644
index d0bab8e5e..000000000
--- a/perllib/BarnetTypes/char1.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char1;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char1 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char10.pm b/perllib/BarnetTypes/char10.pm
deleted file mode 100644
index 6ff454e4b..000000000
--- a/perllib/BarnetTypes/char10.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char10;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char10 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char132.pm b/perllib/BarnetTypes/char132.pm
deleted file mode 100644
index 46a41077b..000000000
--- a/perllib/BarnetTypes/char132.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char132;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char132 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char2.pm b/perllib/BarnetTypes/char2.pm
deleted file mode 100644
index 35c476fbe..000000000
--- a/perllib/BarnetTypes/char2.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char2;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char2 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char20.pm b/perllib/BarnetTypes/char20.pm
deleted file mode 100644
index 1c2df092a..000000000
--- a/perllib/BarnetTypes/char20.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char20;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char20 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char220.pm b/perllib/BarnetTypes/char220.pm
deleted file mode 100644
index 7ccde81f8..000000000
--- a/perllib/BarnetTypes/char220.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char220;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char220 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char241.pm b/perllib/BarnetTypes/char241.pm
deleted file mode 100644
index e6567554f..000000000
--- a/perllib/BarnetTypes/char241.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char241;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char241 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char3.pm b/perllib/BarnetTypes/char3.pm
deleted file mode 100644
index f9d001cda..000000000
--- a/perllib/BarnetTypes/char3.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char3;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char3 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char30.pm b/perllib/BarnetTypes/char30.pm
deleted file mode 100644
index 91d98eb30..000000000
--- a/perllib/BarnetTypes/char30.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char30;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char30 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char32.pm b/perllib/BarnetTypes/char32.pm
deleted file mode 100644
index c5efdaabd..000000000
--- a/perllib/BarnetTypes/char32.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char32;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char32 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char35.pm b/perllib/BarnetTypes/char35.pm
deleted file mode 100644
index 40aef3d7a..000000000
--- a/perllib/BarnetTypes/char35.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char35;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char35 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char40.pm b/perllib/BarnetTypes/char40.pm
deleted file mode 100644
index 4402875c1..000000000
--- a/perllib/BarnetTypes/char40.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char40;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char40 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char5.pm b/perllib/BarnetTypes/char5.pm
deleted file mode 100644
index fed108437..000000000
--- a/perllib/BarnetTypes/char5.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char5;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char5 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/char50.pm b/perllib/BarnetTypes/char50.pm
deleted file mode 100644
index 34e5720d1..000000000
--- a/perllib/BarnetTypes/char50.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::char50;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-char50 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/numeric3.pm b/perllib/BarnetTypes/numeric3.pm
deleted file mode 100644
index c473d2866..000000000
--- a/perllib/BarnetTypes/numeric3.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::numeric3;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-numeric3 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/BarnetTypes/numeric6.pm b/perllib/BarnetTypes/numeric6.pm
deleted file mode 100644
index b5438c1aa..000000000
--- a/perllib/BarnetTypes/numeric6.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package BarnetTypes::numeric6;
-use strict;
-use warnings;
-
-sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
-
-# derivation by restriction
-use base qw(
- SOAP::WSDL::XSD::Typelib::Builtin::string);
-
-
-
-1;
-
-__END__
-
-=pod
-
-=head1 NAME
-
-
-
-=head1 DESCRIPTION
-
-Perl data type class for the XML Schema defined simpleType
-numeric6 from the namespace urn:sap-com:document:sap:rfc:functions.
-
-
-
-
-
-This clase is derived from
- SOAP::WSDL::XSD::Typelib::Builtin::string
-. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
-like it's base type.
-
-# Description of restrictions not implemented yet.
-
-
-=head1 METHODS
-
-=head2 new
-
-Constructor.
-
-=head2 get_value / set_value
-
-Getter and setter for the simpleType's value.
-
-=head1 OVERLOADING
-
-Depending on the simple type's base type, the following operations are overloaded
-
- Stringification
- Numerification
- Boolification
-
-Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
-
-=head1 AUTHOR
-
-Generated by SOAP::WSDL
-
-=cut
-
diff --git a/perllib/Catalyst/Engine.pm b/perllib/Catalyst/Engine.pm
new file mode 100644
index 000000000..236713976
--- /dev/null
+++ b/perllib/Catalyst/Engine.pm
@@ -0,0 +1,738 @@
+package Catalyst::Engine;
+
+use Moose;
+with 'MooseX::Emulate::Class::Accessor::Fast';
+
+use CGI::Simple::Cookie;
+use Data::Dump qw/dump/;
+use Errno 'EWOULDBLOCK';
+use HTML::Entities;
+use HTTP::Body;
+use HTTP::Headers;
+use URI::QueryParam;
+use Plack::Loader;
+use Catalyst::EngineLoader;
+use Encode ();
+use utf8;
+
+use namespace::clean -except => 'meta';
+
+# Amount of data to read from input on each pass
+our $CHUNKSIZE = 64 * 1024;
+
+# XXX - this is only here for compat, do not use!
+has env => ( is => 'rw', writer => '_set_env' );
+my $WARN_ABOUT_ENV = 0;
+around env => sub {
+ my ($orig, $self, @args) = @_;
+ if(@args) {
+ warn "env as a writer is deprecated, you probably need to upgrade Catalyst::Engine::PSGI"
+ unless $WARN_ABOUT_ENV++;
+ return $self->_set_env(@args);
+ }
+ return $self->$orig;
+};
+
+# XXX - Only here for Engine::PSGI compat
+sub prepare_connection {
+ my ($self, $ctx) = @_;
+ $ctx->request->prepare_connection;
+}
+
+=head1 NAME
+
+Catalyst::Engine - The Catalyst Engine
+
+=head1 SYNOPSIS
+
+See L<Catalyst>.
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+
+=head2 $self->finalize_body($c)
+
+Finalize body. Prints the response output.
+
+=cut
+
+sub finalize_body {
+ my ( $self, $c ) = @_;
+ my $body = $c->response->body;
+ no warnings 'uninitialized';
+ if ( blessed($body) && $body->can('read') or ref($body) eq 'GLOB' ) {
+ my $got;
+ do {
+ $got = read $body, my ($buffer), $CHUNKSIZE;
+ $got = 0 unless $self->write( $c, $buffer );
+ } while $got > 0;
+
+ close $body;
+ }
+ else {
+ $self->write( $c, $body );
+ }
+
+ my $res = $c->response;
+ $res->_writer->close;
+ $res->_clear_writer;
+
+ return;
+}
+
+=head2 $self->finalize_cookies($c)
+
+Create CGI::Simple::Cookie objects from $c->res->cookies, and set them as
+response headers.
+
+=cut
+
+sub finalize_cookies {
+ my ( $self, $c ) = @_;
+
+ my @cookies;
+ my $response = $c->response;
+
+ foreach my $name (keys %{ $response->cookies }) {
+
+ my $val = $response->cookies->{$name};
+
+ my $cookie = (
+ blessed($val)
+ ? $val
+ : CGI::Simple::Cookie->new(
+ -name => $name,
+ -value => $val->{value},
+ -expires => $val->{expires},
+ -domain => $val->{domain},
+ -path => $val->{path},
+ -secure => $val->{secure} || 0,
+ -httponly => $val->{httponly} || 0,
+ )
+ );
+ if (!defined $cookie) {
+ $c->log->warn("undef passed in '$name' cookie value - not setting cookie")
+ if $c->debug;
+ next;
+ }
+
+ push @cookies, $cookie->as_string;
+ }
+
+ for my $cookie (@cookies) {
+ $response->headers->push_header( 'Set-Cookie' => $cookie );
+ }
+}
+
+=head2 $self->finalize_error($c)
+
+Output an appropriate error message. Called if there's an error in $c
+after the dispatch has finished. Will output debug messages if Catalyst
+is in debug mode, or a `please come back later` message otherwise.
+
+=cut
+
+sub _dump_error_page_element {
+ my ($self, $i, $element) = @_;
+ my ($name, $val) = @{ $element };
+
+ # This is fugly, but the metaclass is _HUGE_ and demands waaay too much
+ # scrolling. Suggestions for more pleasant ways to do this welcome.
+ local $val->{'__MOP__'} = "Stringified: "
+ . $val->{'__MOP__'} if ref $val eq 'HASH' && exists $val->{'__MOP__'};
+
+ my $text = encode_entities( dump( $val ));
+ sprintf <<"EOF", $name, $text;
+<h2><a href="#" onclick="toggleDump('dump_$i'); return false">%s</a></h2>
+<div id="dump_$i">
+ <pre wrap="">%s</pre>
+</div>
+EOF
+}
+
+sub finalize_error {
+ my ( $self, $c ) = @_;
+
+ $c->res->content_type('text/html; charset=utf-8');
+ my $name = ref($c)->config->{name} || join(' ', split('::', ref $c));
+
+ # Prevent Catalyst::Plugin::Unicode::Encoding from running.
+ # This is a little nasty, but it's the best way to be clean whether or
+ # not the user has an encoding plugin.
+
+ if ($c->can('encoding')) {
+ $c->{encoding} = '';
+ }
+
+ my ( $title, $error, $infos );
+ if ( $c->debug ) {
+
+ # For pretty dumps
+ $error = join '', map {
+ '<p><code class="error">'
+ . encode_entities($_)
+ . '</code></p>'
+ } @{ $c->error };
+ $error ||= 'No output';
+ $error = qq{<pre wrap="">$error</pre>};
+ $title = $name = "$name on Catalyst $Catalyst::VERSION";
+ $name = "<h1>$name</h1>";
+
+ # Don't show context in the dump
+ $c->res->_clear_context;
+
+ # Don't show body parser in the dump
+ $c->req->_clear_body;
+
+ my @infos;
+ my $i = 0;
+ for my $dump ( $c->dump_these ) {
+ push @infos, $self->_dump_error_page_element($i, $dump);
+ $i++;
+ }
+ $infos = join "\n", @infos;
+ }
+ else {
+ $title = $name;
+ $error = '';
+ $infos = <<"";
+<pre>
+(en) Please come back later
+(fr) SVP veuillez revenir plus tard
+(de) Bitte versuchen sie es spaeter nocheinmal
+(at) Konnten's bitt'schoen spaeter nochmal reinschauen
+(no) Vennligst prov igjen senere
+(dk) Venligst prov igen senere
+(pl) Prosze sprobowac pozniej
+(pt) Por favor volte mais tarde
+(ru) Попробуйте еще раз позже
+(ua) Спробуйте ще раз пізніше
+</pre>
+
+ $name = '';
+ }
+ $c->res->body( <<"" );
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta http-equiv="Content-Language" content="en" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>$title</title>
+ <script type="text/javascript">
+ <!--
+ function toggleDump (dumpElement) {
+ var e = document.getElementById( dumpElement );
+ if (e.style.display == "none") {
+ e.style.display = "";
+ }
+ else {
+ e.style.display = "none";
+ }
+ }
+ -->
+ </script>
+ <style type="text/css">
+ body {
+ font-family: "Bitstream Vera Sans", "Trebuchet MS", Verdana,
+ Tahoma, Arial, helvetica, sans-serif;
+ color: #333;
+ background-color: #eee;
+ margin: 0px;
+ padding: 0px;
+ }
+ :link, :link:hover, :visited, :visited:hover {
+ color: #000;
+ }
+ div.box {
+ position: relative;
+ background-color: #ccc;
+ border: 1px solid #aaa;
+ padding: 4px;
+ margin: 10px;
+ }
+ div.error {
+ background-color: #cce;
+ border: 1px solid #755;
+ padding: 8px;
+ margin: 4px;
+ margin-bottom: 10px;
+ }
+ div.infos {
+ background-color: #eee;
+ border: 1px solid #575;
+ padding: 8px;
+ margin: 4px;
+ margin-bottom: 10px;
+ }
+ div.name {
+ background-color: #cce;
+ border: 1px solid #557;
+ padding: 8px;
+ margin: 4px;
+ }
+ code.error {
+ display: block;
+ margin: 1em 0;
+ overflow: auto;
+ }
+ div.name h1, div.error p {
+ margin: 0;
+ }
+ h2 {
+ margin-top: 0;
+ margin-bottom: 10px;
+ font-size: medium;
+ font-weight: bold;
+ text-decoration: underline;
+ }
+ h1 {
+ font-size: medium;
+ font-weight: normal;
+ }
+ /* from http://users.tkk.fi/~tkarvine/linux/doc/pre-wrap/pre-wrap-css3-mozilla-opera-ie.html */
+ /* Browser specific (not valid) styles to make preformatted text wrap */
+ pre {
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+ }
+ </style>
+</head>
+<body>
+ <div class="box">
+ <div class="error">$error</div>
+ <div class="infos">$infos</div>
+ <div class="name">$name</div>
+ </div>
+</body>
+</html>
+
+ # Trick IE. Old versions of IE would display their own error page instead
+ # of ours if we'd give it less than 512 bytes.
+ $c->res->{body} .= ( ' ' x 512 );
+
+ $c->res->{body} = Encode::encode("UTF-8", $c->res->{body});
+
+ # Return 500
+ $c->res->status(500);
+}
+
+=head2 $self->finalize_headers($c)
+
+Allows engines to write headers to response
+
+=cut
+
+sub finalize_headers {
+ my ($self, $ctx) = @_;
+
+ $ctx->finalize_headers unless $ctx->response->finalized_headers;
+ return;
+}
+
+=head2 $self->finalize_uploads($c)
+
+Clean up after uploads, deleting temp files.
+
+=cut
+
+sub finalize_uploads {
+ my ( $self, $c ) = @_;
+
+ # N.B. This code is theoretically entirely unneeded due to ->cleanup(1)
+ # on the HTTP::Body object.
+ my $request = $c->request;
+ foreach my $key (keys %{ $request->uploads }) {
+ my $upload = $request->uploads->{$key};
+ unlink grep { -e $_ } map { $_->tempname }
+ (ref $upload eq 'ARRAY' ? @{$upload} : ($upload));
+ }
+
+}
+
+=head2 $self->prepare_body($c)
+
+sets up the L<Catalyst::Request> object body using L<HTTP::Body>
+
+=cut
+
+sub prepare_body {
+ my ( $self, $c ) = @_;
+
+ $c->request->prepare_body;
+}
+
+=head2 $self->prepare_body_chunk($c)
+
+Add a chunk to the request body.
+
+=cut
+
+# XXX - Can this be deleted?
+sub prepare_body_chunk {
+ my ( $self, $c, $chunk ) = @_;
+
+ $c->request->prepare_body_chunk($chunk);
+}
+
+=head2 $self->prepare_body_parameters($c)
+
+Sets up parameters from body.
+
+=cut
+
+sub prepare_body_parameters {
+ my ( $self, $c ) = @_;
+
+ $c->request->prepare_body_parameters;
+}
+
+=head2 $self->prepare_parameters($c)
+
+Sets up parameters from query and post parameters.
+If parameters have already been set up will clear
+existing parameters and set up again.
+
+=cut
+
+sub prepare_parameters {
+ my ( $self, $c ) = @_;
+
+ $c->request->_clear_parameters;
+ return $c->request->parameters;
+}
+
+=head2 $self->prepare_path($c)
+
+abstract method, implemented by engines.
+
+=cut
+
+sub prepare_path {
+ my ($self, $ctx) = @_;
+
+ my $env = $ctx->request->env;
+
+ my $scheme = $ctx->request->secure ? 'https' : 'http';
+ my $host = $env->{HTTP_HOST} || $env->{SERVER_NAME};
+ my $port = $env->{SERVER_PORT} || 80;
+ my $base_path = $env->{SCRIPT_NAME} || "/";
+
+ # set the request URI
+ my $path;
+ if (!$ctx->config->{use_request_uri_for_path}) {
+ my $path_info = $env->{PATH_INFO};
+ if ( exists $env->{REDIRECT_URL} ) {
+ $base_path = $env->{REDIRECT_URL};
+ $base_path =~ s/\Q$path_info\E$//;
+ }
+ $path = $base_path . $path_info;
+ $path =~ s{^/+}{};
+ $path =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
+ $path =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
+ }
+ else {
+ my $req_uri = $env->{REQUEST_URI};
+ $req_uri =~ s/\?.*$//;
+ $path = $req_uri;
+ $path =~ s{^/+}{};
+ }
+
+ # Using URI directly is way too slow, so we construct the URLs manually
+ my $uri_class = "URI::$scheme";
+
+ # HTTP_HOST will include the port even if it's 80/443
+ $host =~ s/:(?:80|443)$//;
+
+ if ($port !~ /^(?:80|443)$/ && $host !~ /:/) {
+ $host .= ":$port";
+ }
+
+ my $query = $env->{QUERY_STRING} ? '?' . $env->{QUERY_STRING} : '';
+ my $uri = $scheme . '://' . $host . '/' . $path . $query;
+
+ $ctx->request->uri( (bless \$uri, $uri_class)->canonical );
+
+ # set the base URI
+ # base must end in a slash
+ $base_path .= '/' unless $base_path =~ m{/$};
+
+ my $base_uri = $scheme . '://' . $host . $base_path;
+
+ $ctx->request->base( bless \$base_uri, $uri_class );
+
+ return;
+}
+
+=head2 $self->prepare_request($c)
+
+=head2 $self->prepare_query_parameters($c)
+
+process the query string and extract query parameters.
+
+=cut
+
+sub prepare_query_parameters {
+ my ($self, $c) = @_;
+
+ my $env = $c->request->env;
+ my $query_string = exists $env->{QUERY_STRING}
+ ? $env->{QUERY_STRING}
+ : '';
+
+ # Check for keywords (no = signs)
+ # (yes, index() is faster than a regex :))
+ if ( index( $query_string, '=' ) < 0 ) {
+ $c->request->query_keywords( $self->unescape_uri($query_string) );
+ return;
+ }
+
+ my %query;
+
+ # replace semi-colons
+ $query_string =~ s/;/&/g;
+
+ my @params = grep { length $_ } split /&/, $query_string;
+
+ for my $item ( @params ) {
+
+ my ($param, $value)
+ = map { $self->unescape_uri($_) }
+ split( /=/, $item, 2 );
+
+ $param = $self->unescape_uri($item) unless defined $param;
+
+ if ( exists $query{$param} ) {
+ if ( ref $query{$param} ) {
+ push @{ $query{$param} }, $value;
+ }
+ else {
+ $query{$param} = [ $query{$param}, $value ];
+ }
+ }
+ else {
+ $query{$param} = $value;
+ }
+ }
+ $c->request->query_parameters( \%query );
+}
+
+=head2 $self->prepare_read($c)
+
+Prepare to read by initializing the Content-Length from headers.
+
+=cut
+
+sub prepare_read {
+ my ( $self, $c ) = @_;
+
+ # Initialize the amount of data we think we need to read
+ $c->request->_read_length;
+}
+
+=head2 $self->prepare_request(@arguments)
+
+Populate the context object from the request object.
+
+=cut
+
+sub prepare_request {
+ my ($self, $ctx, %args) = @_;
+ $ctx->log->psgienv($args{env}) if $ctx->log->can('psgienv');
+ $ctx->request->_set_env($args{env});
+ $self->_set_env($args{env}); # Nasty back compat!
+ $ctx->response->_set_response_cb($args{response_cb});
+}
+
+=head2 $self->prepare_uploads($c)
+
+=cut
+
+sub prepare_uploads {
+ my ( $self, $c ) = @_;
+
+ my $request = $c->request;
+ return unless $request->_body;
+
+ my $uploads = $request->_body->upload;
+ my $parameters = $request->parameters;
+ foreach my $name (keys %$uploads) {
+ my $files = $uploads->{$name};
+ my @uploads;
+ for my $upload (ref $files eq 'ARRAY' ? @$files : ($files)) {
+ my $headers = HTTP::Headers->new( %{ $upload->{headers} } );
+ my $u = Catalyst::Request::Upload->new
+ (
+ size => $upload->{size},
+ type => scalar $headers->content_type,
+ headers => $headers,
+ tempname => $upload->{tempname},
+ filename => $upload->{filename},
+ );
+ push @uploads, $u;
+ }
+ $request->uploads->{$name} = @uploads > 1 ? \@uploads : $uploads[0];
+
+ # support access to the filename as a normal param
+ my @filenames = map { $_->{filename} } @uploads;
+ # append, if there's already params with this name
+ if (exists $parameters->{$name}) {
+ if (ref $parameters->{$name} eq 'ARRAY') {
+ push @{ $parameters->{$name} }, @filenames;
+ }
+ else {
+ $parameters->{$name} = [ $parameters->{$name}, @filenames ];
+ }
+ }
+ else {
+ $parameters->{$name} = @filenames > 1 ? \@filenames : $filenames[0];
+ }
+ }
+}
+
+=head2 $self->write($c, $buffer)
+
+Writes the buffer to the client.
+
+=cut
+
+sub write {
+ my ( $self, $c, $buffer ) = @_;
+
+ $c->response->write($buffer);
+}
+
+=head2 $self->read($c, [$maxlength])
+
+Reads from the input stream by calling C<< $self->read_chunk >>.
+
+Maintains the read_length and read_position counters as data is read.
+
+=cut
+
+sub read {
+ my ( $self, $c, $maxlength ) = @_;
+
+ $c->request->read($maxlength);
+}
+
+=head2 $self->read_chunk($c, \$buffer, $length)
+
+Each engine implements read_chunk as its preferred way of reading a chunk
+of data. Returns the number of bytes read. A return of 0 indicates that
+there is no more data to be read.
+
+=cut
+
+sub read_chunk {
+ my ($self, $ctx) = (shift, shift);
+ return $ctx->request->read_chunk(@_);
+}
+
+=head2 $self->run($app, $server)
+
+Start the engine. Builds a PSGI application and calls the
+run method on the server passed in, which then causes the
+engine to loop, handling requests..
+
+=cut
+
+sub run {
+ my ($self, $app, $psgi, @args) = @_;
+ # @args left here rather than just a $options, $server for back compat with the
+ # old style scripts which send a few args, then a hashref
+
+ # They should never actually be used in the normal case as the Plack engine is
+ # passed in got all the 'standard' args via the loader in the script already.
+
+ # FIXME - we should stash the options in an attribute so that custom args
+ # like Gitalist's --git_dir are possible to get from the app without stupid tricks.
+ my $server = pop @args if (scalar @args && blessed $args[-1]);
+ my $options = pop @args if (scalar @args && ref($args[-1]) eq 'HASH');
+ # Back compat hack for applications with old (non Catalyst::Script) scripts to work in FCGI.
+ if (scalar @args && !ref($args[0])) {
+ if (my $listen = shift @args) {
+ $options->{listen} ||= [$listen];
+ }
+ }
+ if (! $server ) {
+ $server = Catalyst::EngineLoader->new(application_name => ref($self))->auto(%$options);
+ # We're not being called from a script, so auto detect what backend to
+ # run on. This should never happen, as mod_perl never calls ->run,
+ # instead the $app->handle method is called per request.
+ $app->log->warn("Not supplied a Plack engine, falling back to engine auto-loader (are your scripts ancient?)")
+ }
+ $app->run_options($options);
+ $server->run($psgi, $options);
+}
+
+=head2 build_psgi_app ($app, @args)
+
+Builds and returns a PSGI application closure. (Raw, not wrapped in middleware)
+
+=cut
+
+sub build_psgi_app {
+ my ($self, $app, @args) = @_;
+
+ return sub {
+ my ($env) = @_;
+
+ return sub {
+ my ($respond) = @_;
+ confess("Did not get a response callback for writer, cannot continiue") unless $respond;
+ $app->handle_request(env => $env, response_cb => $respond);
+ };
+ };
+}
+
+=head2 $self->unescape_uri($uri)
+
+Unescapes a given URI using the most efficient method available. Engines such
+as Apache may implement this using Apache's C-based modules, for example.
+
+=cut
+
+sub unescape_uri {
+ my ( $self, $str ) = @_;
+
+ $str =~ s/(?:%([0-9A-Fa-f]{2})|\+)/defined $1 ? chr(hex($1)) : ' '/eg;
+
+ return $str;
+}
+
+=head2 $self->finalize_output
+
+<obsolete>, see finalize_body
+
+=head2 $self->env
+
+Hash containing environment variables including many special variables inserted
+by WWW server - like SERVER_*, REMOTE_*, HTTP_* ...
+
+Before accessing environment variables consider whether the same information is
+not directly available via Catalyst objects $c->request, $c->engine ...
+
+BEWARE: If you really need to access some environment variable from your Catalyst
+application you should use $c->engine->env->{VARNAME} instead of $ENV{VARNAME},
+as in some environments the %ENV hash does not contain what you would expect.
+
+=head1 AUTHORS
+
+Catalyst Contributors, see Catalyst.pm
+
+=head1 COPYRIGHT
+
+This library is free software. You can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/perllib/Catalyst/Log.pm b/perllib/Catalyst/Log.pm
new file mode 100644
index 000000000..d72ee162f
--- /dev/null
+++ b/perllib/Catalyst/Log.pm
@@ -0,0 +1,329 @@
+package Catalyst::Log;
+
+use Moose;
+with 'MooseX::Emulate::Class::Accessor::Fast';
+
+use Data::Dump;
+use Class::MOP ();
+use Carp qw/ cluck /;
+
+our %LEVELS = (); # Levels stored as bit field, ergo debug = 1, warn = 2 etc
+our %LEVEL_MATCH = (); # Stored as additive, thus debug = 31, warn = 30 etc
+
+has level => (is => 'rw');
+has _body => (is => 'rw');
+has abort => (is => 'rw');
+has _psgi_logger => (is => 'rw', predicate => '_has_psgi_logger', clearer => '_clear_psgi_logger');
+has _psgi_errors => (is => 'rw', predicate => '_has_psgi_errors', clearer => '_clear_psgi_errors');
+
+sub clear_psgi {
+ my $self = shift;
+ $self->_clear_psgi_logger;
+ $self->_clear_psgi_errors;
+}
+
+sub psgienv {
+ my ($self, $env) = @_;
+
+ $self->_psgi_logger($env->{'psgix.logger'}) if $env->{'psgix.logger'};
+ $self->_psgi_errors($env->{'psgi.errors'}) if $env->{'psgi.errors'};
+}
+
+
+{
+ my @levels = qw[ debug info warn error fatal ];
+
+ my $meta = Class::MOP::get_metaclass_by_name(__PACKAGE__);
+ my $summed_level = 0;
+ for ( my $i = $#levels ; $i >= 0 ; $i-- ) {
+
+ my $name = $levels[$i];
+
+ my $level = 1 << $i;
+ $summed_level |= $level;
+
+ $LEVELS{$name} = $level;
+ $LEVEL_MATCH{$name} = $summed_level;
+
+ $meta->add_method($name, sub {
+ my $self = shift;
+
+ if ( $self->level & $level ) {
+ $self->_log( $name, @_ );
+ }
+ });
+
+ $meta->add_method("is_$name", sub {
+ my $self = shift;
+ return $self->level & $level;
+ });;
+ }
+}
+
+around new => sub {
+ my $orig = shift;
+ my $class = shift;
+ my $self = $class->$orig;
+
+ $self->levels( scalar(@_) ? @_ : keys %LEVELS );
+
+ return $self;
+};
+
+sub levels {
+ my ( $self, @levels ) = @_;
+ $self->level(0);
+ $self->enable(@levels);
+}
+
+sub enable {
+ my ( $self, @levels ) = @_;
+ my $level = $self->level;
+ for(map { $LEVEL_MATCH{$_} } @levels){
+ $level |= $_;
+ }
+ $self->level($level);
+}
+
+sub disable {
+ my ( $self, @levels ) = @_;
+ my $level = $self->level;
+ for(map { $LEVELS{$_} } @levels){
+ $level &= ~$_;
+ }
+ $self->level($level);
+}
+
+our $HAS_DUMPED;
+sub _dump {
+ my $self = shift;
+ unless ($HAS_DUMPED++) {
+ cluck("Catalyst::Log::_dump is deprecated and will be removed. Please change to using your own Dumper.\n");
+ }
+ $self->info( Data::Dump::dump(@_) );
+}
+
+sub _log {
+ my $self = shift;
+ my $level = shift;
+ my $message = join( "\n", @_ );
+ if ($self->can('_has_psgi_logger') and $self->_has_psgi_logger) {
+ $self->_psgi_logger->({
+ level => $level,
+ message => $message,
+ });
+ } else {
+ $message .= "\n" unless $message =~ /\n$/;
+ my $body = $self->_body;
+ $body .= sprintf( "[%s] %s", $level, $message );
+ $self->_body($body);
+ }
+}
+
+sub _flush {
+ my $self = shift;
+ if ( $self->abort || !$self->_body ) {
+ $self->abort(undef);
+ }
+ else {
+ $self->_send_to_log( $self->_body );
+ }
+ $self->_body(undef);
+}
+
+sub _send_to_log {
+ my $self = shift;
+ if ($self->can('_has_psgi_errors') and $self->_has_psgi_errors) {
+ $self->_psgi_errors->print(@_);
+ } else {
+ print STDERR @_;
+ }
+}
+
+# 5.7 compat code.
+# Alias _body to body, add a before modifier to warn..
+my $meta = __PACKAGE__->meta; # Calling meta method here fine as we happen at compile time.
+$meta->add_method('body', $meta->get_method('_body'));
+my %package_hash; # Only warn once per method, per package.
+ # I haven't provided a way to disable them, patches welcome.
+$meta->add_before_method_modifier('body', sub {
+ my $class = blessed(shift);
+ $package_hash{$class}++ || do {
+ warn("Class $class is calling the deprecated method Catalyst::Log->body method,\n"
+ . "this will be removed in Catalyst 5.81");
+ };
+});
+# End 5.70 backwards compatibility hacks.
+
+no Moose;
+__PACKAGE__->meta->make_immutable(inline_constructor => 0);
+
+1;
+
+__END__
+
+=for stopwords psgienv
+
+=head1 NAME
+
+Catalyst::Log - Catalyst Log Class
+
+=head1 SYNOPSIS
+
+ $log = $c->log;
+ $log->debug($message);
+ $log->info($message);
+ $log->warn($message);
+ $log->error($message);
+ $log->fatal($message);
+
+ if ( $log->is_debug ) {
+ # expensive debugging
+ }
+
+
+See L<Catalyst>.
+
+=head1 DESCRIPTION
+
+This module provides the default, simple logging functionality for Catalyst.
+If you want something different set C<< $c->log >> in your application module,
+e.g.:
+
+ $c->log( MyLogger->new );
+
+Your logging object is expected to provide the interface described here.
+Good alternatives to consider are Log::Log4Perl and Log::Dispatch.
+
+If you want to be able to log arbitrary warnings, you can do something along
+the lines of
+
+ $SIG{__WARN__} = sub { MyApp->log->warn(@_); };
+
+however this is (a) global, (b) hairy and (c) may have unexpected side effects.
+Don't say we didn't warn you.
+
+=head1 LOG LEVELS
+
+=head2 debug
+
+ $log->is_debug;
+ $log->debug($message);
+
+=head2 info
+
+ $log->is_info;
+ $log->info($message);
+
+=head2 warn
+
+ $log->is_warn;
+ $log->warn($message);
+
+=head2 error
+
+ $log->is_error;
+ $log->error($message);
+
+=head2 fatal
+
+ $log->is_fatal;
+ $log->fatal($message);
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. Defaults to enable all levels unless levels are provided in
+arguments.
+
+ $log = Catalyst::Log->new;
+ $log = Catalyst::Log->new( 'warn', 'error' );
+
+=head2 level
+
+Contains a bitmask of the currently set log levels.
+
+=head2 levels
+
+Set log levels
+
+ $log->levels( 'warn', 'error', 'fatal' );
+
+=head2 enable
+
+Enable log levels
+
+ $log->enable( 'warn', 'error' );
+
+=head2 disable
+
+Disable log levels
+
+ $log->disable( 'warn', 'error' );
+
+=head2 is_debug
+
+=head2 is_error
+
+=head2 is_fatal
+
+=head2 is_info
+
+=head2 is_warn
+
+Is the log level active?
+
+=head2 abort
+
+Should Catalyst emit logs for this request? Will be reset at the end of
+each request.
+
+*NOTE* This method is not compatible with other log apis, so if you plan
+to use Log4Perl or another logger, you should call it like this:
+
+ $c->log->abort(1) if $c->log->can('abort');
+
+=head2 _send_to_log
+
+ $log->_send_to_log( @messages );
+
+This protected method is what actually sends the log information to STDERR.
+You may subclass this module and override this method to get finer control
+over the log output.
+
+=head2 psgienv $env
+
+ $log->psgienv($env);
+
+NOTE: This is not meant for public consumption.
+
+Set the PSGI environment for this request. This ensures logs will be sent to
+the right place. If the environment has a C<psgix.logger>, it will be used. If
+not, we will send logs to C<psgi.errors> if that exists. As a last fallback, we
+will send to STDERR as before.
+
+=head2 clear_psgi
+
+Clears the PSGI environment attributes set by L</psgienv>.
+
+=head2 meta
+
+=head1 SEE ALSO
+
+L<Catalyst>.
+
+=head1 AUTHORS
+
+Catalyst Contributors, see Catalyst.pm
+
+=head1 COPYRIGHT
+
+This library is free software. You can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/perllib/Catalyst/Plugin/Session/State/Cookie.pm b/perllib/Catalyst/Plugin/Session/State/Cookie.pm
index e0a651ed9..bef0c1e66 100644
--- a/perllib/Catalyst/Plugin/Session/State/Cookie.pm
+++ b/perllib/Catalyst/Plugin/Session/State/Cookie.pm
@@ -50,6 +50,9 @@ sub update_session_cookie {
sub cookie_is_rejecting {
my ( $c, $cookie ) = @_;
+ # Prevent infinite loop in request->path. mySociety addition
+ return 0 if $c->request->has_uri && !$c->request->_has_path;
+
# Don't output cookie for JS or JPEG files. mySociety addition
return 1 if substr($c->request->path, -3) eq '.js'
|| substr($c->request->path, -5) eq '.jpeg';
diff --git a/perllib/FixMyStreet.pm b/perllib/FixMyStreet.pm
index 76760b967..76befb96a 100644
--- a/perllib/FixMyStreet.pm
+++ b/perllib/FixMyStreet.pm
@@ -124,11 +124,14 @@ sub override_config($&) {
}
);
+ FixMyStreet::Map::reload_allowed_maps() if $config->{MAP_TYPE};
+
$code->();
$override_guard1->restore();
$override_guard2->restore();
- mySociety::MaPit::configure() if $config->{MAPIT_URL};;
+ mySociety::MaPit::configure() if $config->{MAPIT_URL};
+ FixMyStreet::Map::reload_allowed_maps() if $config->{MAP_TYPE};
}
=head2 dbic_connect_info
diff --git a/perllib/FixMyStreet/App.pm b/perllib/FixMyStreet/App.pm
index 787755a05..c9286b177 100644
--- a/perllib/FixMyStreet/App.pm
+++ b/perllib/FixMyStreet/App.pm
@@ -191,6 +191,8 @@ sub setup_request {
$c->log->debug( sprintf "Set lang to '%s' and cobrand to '%s'",
$set_lang, $cobrand->moniker );
+ $c->stash->{site_name} = Utils::trim_text($c->render_fragment('site-name.html'));
+
$c->model('DB::Problem')->set_restriction( $cobrand->site_key() );
Memcached::set_namespace( FixMyStreet->config('FMS_DB_NAME') . ":" );
@@ -205,7 +207,8 @@ sub setup_request {
# XXX Put in cobrand / do properly
if ($c->cobrand->moniker eq 'zurich') {
- FixMyStreet::DB::Result::Problem->visible_states_add_unconfirmed();
+ FixMyStreet::DB::Result::Problem->visible_states_add('unconfirmed');
+ FixMyStreet::DB::Result::Problem->visible_states_remove('investigating');
}
if (FixMyStreet->test_mode) {
@@ -316,15 +319,15 @@ sub send_email {
]
};
+ return if $c->is_abuser($vars->{to});
+
# render the template
my $content = $c->view('Email')->render( $c, $template, $vars );
# create an email - will parse headers out of content
my $email = Email::Simple->new($content);
- $email->header_set( ucfirst($_), $vars->{$_} )
- for grep { $vars->{$_} } qw( to from subject);
-
- return if $c->is_abuser( $email->header('To') );
+ $email->header_set( 'Subject', $vars->{subject} ) if $vars->{subject};
+ $email->header_set( 'Reply-To', $vars->{'Reply-To'} ) if $vars->{'Reply-To'};
$email->header_set( 'Message-ID', sprintf('<fms-%s-%s@%s>',
time(), unpack('h*', random_bytes(5, 1)), $c->config->{EMAIL_DOMAIN}
@@ -337,10 +340,16 @@ sub send_email {
_template_ => $email->body, # will get line wrapped
_parameters_ => {},
_line_indent => '',
+ From => $vars->{from},
+ To => $vars->{to},
$email->header_pairs
}
) };
+ if (my $attachments = $extra_stash_values->{attachments}) {
+ $email_text = munge_attachments($email_text, $attachments);
+ }
+
# send the email
$c->model('EmailSend')->send($email_text);
@@ -350,17 +359,14 @@ sub send_email {
sub send_email_cron {
my ( $c, $params, $env_from, $nomail, $cobrand, $lang_code ) = @_;
- my $first_to;
- if (ref($params->{To}) eq 'ARRAY') {
- if (ref($params->{To}[0]) eq 'ARRAY') {
- $first_to = $params->{To}[0][0];
- } else {
- $first_to = $params->{To}[0];
- }
- } else {
- $first_to = $params->{To};
+ my $sender = $c->config->{DO_NOT_REPLY_EMAIL};
+ $env_from ||= $sender;
+ if (!$params->{From}) {
+ my $sender_name = $cobrand->contact_name;
+ $params->{From} = [ $sender, _($sender_name) ];
}
- return 1 if $c->is_abuser($first_to);
+
+ return 1 if $c->is_abuser($params->{To});
$params->{'Message-ID'} = sprintf('<fms-cron-%s-%s@%s>', time(),
unpack('h*', random_bytes(5, 1)), FixMyStreet->config('EMAIL_DOMAIN')
@@ -394,8 +400,12 @@ sub send_email_cron {
$params->{_parameters_}->{site_name} = $site_name;
$params->{_line_indent} = '';
+ my $attachments = delete $params->{attachments};
+
my $email = mySociety::Locale::in_gb_locale { mySociety::Email::construct_email($params) };
+ $email = munge_attachments($email, $attachments) if $attachments;
+
if ($nomail) {
print $email;
return 1; # Failure
@@ -409,6 +419,44 @@ sub send_email_cron {
}
}
+sub munge_attachments {
+ my ($message, $attachments) = @_;
+ # $attachments should be an array_ref of things that can be parsed to Email::MIME,
+ # for example
+ # [
+ # body => $binary_data,
+ # attributes => {
+ # content_type => 'image/jpeg',
+ # encoding => 'base64',
+ # filename => '1234.1.jpeg',
+ # name => '1234.1.jpeg',
+ # },
+ # ...
+ # ]
+ #
+ # XXX: mySociety::Email::construct_email isn't using a MIME library and
+ # requires more analysis to refactor, so for now, we'll simply parse the
+ # generated MIME and add attachments.
+ #
+ # (Yes, this means that the email is constructed by Email::Simple, munged
+ # manually by custom code, turned back into Email::Simple, and then munged
+ # with Email::MIME. What's your point?)
+
+ require Email::MIME;
+ my $mime = Email::MIME->new($message);
+ $mime->parts_add([ map { Email::MIME->create(%$_)} @$attachments ]);
+ my $data = $mime->as_string;
+
+ # unsure why Email::MIME adds \r\n. Possibly mail client should handle
+ # gracefully, BUT perhaps as the segment constructed by
+ # mySociety::Email::construct_email strips to \n, they seem not to.
+ # So we re-run the same regexp here to the added part.
+ $data =~ s/\r\n/\n/gs;
+
+ return $data;
+}
+
+
=head2 uri_with
$uri = $c->uri_with( ... );
@@ -524,7 +572,17 @@ sub get_photo_params {
}
sub is_abuser {
- my ($c, $email) = @_;
+ my ($c, $to) = @_;
+ my $email;
+ if (ref($to) eq 'ARRAY') {
+ if (ref($to->[0]) eq 'ARRAY') {
+ $email = $to->[0][0];
+ } else {
+ $email = $to->[0];
+ }
+ } else {
+ $email = $to;
+ }
my ($domain) = $email =~ m{ @ (.*) \z }x;
return $c->model('DB::Abuse')->search( { email => [ $email, $domain ] } )->first;
}
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 6145a6eb0..a61032988 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -10,6 +10,7 @@ use Digest::SHA qw(sha1_hex);
use mySociety::EmailUtil qw(is_valid_email);
use if !$ENV{TRAVIS}, 'Image::Magick';
use DateTime::Format::Strptime;
+use List::Util 'first';
use FixMyStreet::SendReport;
@@ -70,8 +71,6 @@ sub index : Path : Args(0) {
return $c->cobrand->admin();
}
- my $site_restriction = $c->cobrand->site_restriction();
-
my $problems = $c->cobrand->problems->summary_count;
my %prob_counts =
@@ -85,7 +84,7 @@ sub index : Path : Args(0) {
for ( FixMyStreet::DB::Result::Problem->visible_states() );
$c->stash->{total_problems_users} = $c->cobrand->problems->unique_users;
- my $comments = $c->model('DB::Comment')->summary_count( $site_restriction );
+ my $comments = $c->model('DB::Comment')->summary_count( $c->cobrand->body_restriction );
my %comment_counts =
map { $_->state => $_->get_column('state_count') } $comments->all;
@@ -130,7 +129,9 @@ sub index : Path : Args(0) {
: _('n/a');
$c->stash->{questionnaires} = \%questionnaire_counts;
- $c->stash->{categories} = $c->cobrand->problems->categories_summary();
+ if ($c->get_param('show_categories')) {
+ $c->stash->{categories} = $c->cobrand->problems->categories_summary();
+ }
$c->stash->{total_bodies} = $c->model('DB::Body')->count();
@@ -150,7 +151,6 @@ sub config_page : Path( 'config' ) : Args(0) {
sub timeline : Path( 'timeline' ) : Args(0) {
my ($self, $c) = @_;
- my $site_restriction = $c->cobrand->site_restriction();
my %time;
$c->model('DB')->schema->storage->sql_maker->quote_char( '"' );
@@ -171,7 +171,7 @@ sub timeline : Path( 'timeline' ) : Args(0) {
push @{$time{$_->whenanswered->epoch}}, { type => 'quesAnswered', date => $_->whenanswered, obj => $_ } if $_->whenanswered;
}
- my $updates = $c->model('DB::Comment')->timeline( $site_restriction );
+ my $updates = $c->model('DB::Comment')->timeline( $c->cobrand->body_restriction );
foreach ($updates->all) {
push @{$time{$_->created->epoch}}, { type => 'update', date => $_->created, obj => $_} ;
@@ -359,13 +359,21 @@ sub update_contacts : Private {
$contact->deleted( $c->get_param('deleted') ? 1 : 0 );
$contact->non_public( $c->get_param('non_public') ? 1 : 0 );
$contact->note( $c->get_param('note') );
- $contact->whenedited( \'ms_current_timestamp()' );
+ $contact->whenedited( \'current_timestamp' );
$contact->editor( $editor );
$contact->endpoint( $c->get_param('endpoint') );
$contact->jurisdiction( $c->get_param('jurisdiction') );
$contact->api_key( $c->get_param('api_key') );
$contact->send_method( $c->get_param('send_method') );
+ # Set the photo_required flag in extra to the appropriate value
+ if ( $c->get_param('photo_required') ) {
+ $contact->set_extra_metadata_if_undefined( photo_required => 1 );
+ }
+ else {
+ $contact->unset_extra_metadata( 'photo_required' );
+ }
+
if ( %errors ) {
$c->stash->{updated} = _('Please correct the errors below');
$c->stash->{contact} = $contact;
@@ -395,7 +403,7 @@ sub update_contacts : Private {
$contacts->update(
{
confirmed => 1,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'Confirmed',
editor => $editor,
}
@@ -538,8 +546,6 @@ sub reports : Path('reports') {
if (my $search = $c->get_param('search')) {
$c->stash->{searched} = $search;
- my $site_restriction = $c->cobrand->site_restriction;
-
my $search_n = 0;
$search_n = int($search) if $search =~ /^\d+$/;
@@ -616,9 +622,10 @@ sub reports : Path('reports') {
}
if (@$query) {
- my $updates = $c->model('DB::Comment')->search(
+ my $updates = $c->model('DB::Comment')
+ ->to_body($c->cobrand->body_restriction)
+ ->search(
{
- %{ $site_restriction },
-or => $query,
},
{
@@ -650,8 +657,6 @@ sub reports : Path('reports') {
sub report_edit : Path('report_edit') : Args(1) {
my ( $self, $c, $id ) = @_;
- my $site_restriction = $c->cobrand->site_restriction;
-
my $problem = $c->cobrand->problems->search( { id => $id } )->first;
$c->detach( '/page_error_404_not_found' )
@@ -675,12 +680,21 @@ sub report_edit : Path('report_edit') : Args(1) {
type => 'big',
} ]
: [],
+ print_report => 1,
);
}
- if ( $c->get_param('rotate_photo') ) {
- $c->forward('rotate_photo');
- return 1;
+ if (my $rotate_photo_param = $self->_get_rotate_photo_param($c)) {
+ $self->rotate_photo($c, @$rotate_photo_param);
+ if ( $c->cobrand->moniker eq 'zurich' ) {
+ # Clicking the photo rotation buttons should do nothing
+ # except for rotating the photo, so return the user
+ # to the report screen now.
+ $c->res->redirect( $c->uri_for( 'report_edit', $problem->id ) );
+ return;
+ } else {
+ return 1;
+ }
}
if ( $c->cobrand->moniker eq 'zurich' ) {
@@ -707,7 +721,7 @@ sub report_edit : Path('report_edit') : Args(1) {
}
elsif ( $c->get_param('mark_sent') ) {
$c->forward('check_token');
- $problem->whensent(\'ms_current_timestamp()');
+ $problem->whensent(\'current_timestamp');
$problem->update();
$c->stash->{status_message} = '<p><em>' . _('That problem has been marked as sent.') . '</em></p>';
$c->forward( 'log_edit', [ $id, 'problem', 'marked sent' ] );
@@ -787,14 +801,14 @@ sub report_edit : Path('report_edit') : Args(1) {
}
if ( $problem->is_visible() and $old_state eq 'unconfirmed' ) {
- $problem->confirmed( \'ms_current_timestamp()' );
+ $problem->confirmed( \'current_timestamp' );
}
if ($done) {
$problem->discard_changes;
}
else {
- $problem->lastupdate( \'ms_current_timestamp()' ) if $edited || $new_state ne $old_state;
+ $problem->lastupdate( \'current_timestamp' ) if $edited || $new_state ne $old_state;
$problem->update;
if ( $new_state ne $old_state ) {
@@ -816,6 +830,85 @@ sub report_edit : Path('report_edit') : Args(1) {
return 1;
}
+sub templates : Path('templates') : Args(0) {
+ my ( $self, $c ) = @_;
+
+ $c->detach( '/page_error_404_not_found' )
+ unless $c->cobrand->moniker eq 'zurich';
+
+ my $user = $c->user;
+
+ $self->templates_for_body($c, $user->from_body );
+}
+
+sub templates_view : Path('templates') : Args(1) {
+ my ($self, $c, $body_id) = @_;
+
+ $c->detach( '/page_error_404_not_found' )
+ unless $c->cobrand->moniker eq 'zurich';
+
+ # e.g. for admin
+
+ my $body = $c->model('DB::Body')->find($body_id)
+ or $c->detach( '/page_error_404_not_found' );
+
+ $self->templates_for_body($c, $body);
+}
+
+sub template_edit : Path('templates') : Args(2) {
+ my ( $self, $c, $body_id, $template_id ) = @_;
+
+ $c->detach( '/page_error_404_not_found' )
+ unless $c->cobrand->moniker eq 'zurich';
+
+ my $body = $c->model('DB::Body')->find($body_id)
+ or $c->detach( '/page_error_404_not_found' );
+ $c->stash->{body} = $body;
+
+ my $template;
+ if ($template_id eq 'new') {
+ $template = $body->response_templates->new({});
+ }
+ else {
+ $template = $body->response_templates->find( $template_id )
+ or $c->detach( '/page_error_404_not_found' );
+ }
+
+ if ($c->req->method eq 'POST') {
+ if ($c->get_param('delete_template') eq _("Delete template")) {
+ $template->delete;
+ } else {
+ $template->title( $c->get_param('title') );
+ $template->text ( $c->get_param('text') );
+ $template->update_or_insert;
+ }
+
+ $c->res->redirect( $c->uri_for( 'templates', $body->id ) );
+ }
+
+ $c->stash->{response_template} = $template;
+
+ $c->stash->{template} = 'admin/template_edit.html';
+}
+
+
+sub templates_for_body {
+ my ( $self, $c, $body ) = @_;
+
+ $c->stash->{body} = $body;
+
+ my @templates = $body->response_templates->search(
+ undef,
+ {
+ order_by => 'title'
+ }
+ );
+
+ $c->stash->{response_templates} = \@templates;
+
+ $c->stash->{template} = 'admin/templates.html';
+}
+
sub users: Path('users') : Args(0) {
my ( $self, $c ) = @_;
@@ -874,13 +967,9 @@ sub users: Path('users') : Args(0) {
sub update_edit : Path('update_edit') : Args(1) {
my ( $self, $c, $id ) = @_;
- my $site_restriction = $c->cobrand->site_restriction;
- my $update = $c->model('DB::Comment')->search(
- {
- id => $id,
- %{$site_restriction},
- }
- )->first;
+ my $update = $c->model('DB::Comment')
+ ->to_body($c->cobrand->body_restriction)
+ ->search({ id => $id })->first;
$c->detach( '/page_error_404_not_found' )
unless $update;
@@ -943,10 +1032,10 @@ sub update_edit : Path('update_edit') : Args(1) {
}
if ( $new_state eq 'confirmed' and $old_state eq 'unconfirmed' ) {
- $update->confirmed( \'ms_current_timestamp()' );
+ $update->confirmed( \'current_timestamp' );
if ( $update->problem_state && $update->created > $update->problem->lastupdate ) {
$update->problem->state( $update->problem_state );
- $update->problem->lastupdate( \'ms_current_timestamp()' );
+ $update->problem->lastupdate( \'current_timestamp' );
$update->problem->update;
}
}
@@ -1064,7 +1153,7 @@ sub user_edit : Path('user_edit') : Args(1) {
sub flagged : Path('flagged') : Args(0) {
my ( $self, $c ) = @_;
- my $problems = $c->model('DB::Problem')->search( { flagged => 1 } );
+ my $problems = $c->cobrand->problems->search( { flagged => 1 } );
# pass in as array ref as using same template as search_reports
# which has to use an array ref for sql quoting reasons
@@ -1121,9 +1210,6 @@ sub stats : Path('stats') : Args(0) {
my $bymonth = $c->get_param('bymonth');
$c->stash->{bymonth} = $bymonth;
- my ( %body, %dates );
- $body{bodies_str} = { like => $c->get_param('body') }
- if $c->get_param('body');
$c->stash->{selected_body} = $c->get_param('body');
@@ -1154,14 +1240,12 @@ sub stats : Path('stats') : Args(0) {
);
}
- my $p = $c->model('DB::Problem')->search(
+ my $p = $c->cobrand->problems->to_body($c->get_param('body'))->search(
{
-AND => [
$field => { '>=', $start_date},
$field => { '<=', $end_date + $one_day },
],
- %body,
- %dates,
},
\%select,
);
@@ -1266,13 +1350,24 @@ Adds an entry into the admin_log table using the current user.
=cut
sub log_edit : Private {
- my ( $self, $c, $id, $object_type, $action ) = @_;
+ my ( $self, $c, $id, $object_type, $action, $time_spent ) = @_;
+
+ $time_spent //= 0;
+ $time_spent = 0 if $time_spent < 0;
+
+ my $user_object = do {
+ my $auth_user = $c->user;
+ $auth_user ? $auth_user->get_object : undef;
+ };
+
$c->model('DB::AdminLog')->create(
{
admin_user => $c->forward('get_user'),
+ $user_object ? ( user => $user_object ) : (), # as (rel => undef) doesn't work
object_type => $object_type,
action => $action,
object_id => $id,
+ time_spent => $time_spent,
}
)->insert();
}
@@ -1385,36 +1480,27 @@ Rotate a photo 90 degrees left or right
=cut
+# returns index of photo to rotate, if any
+sub _get_rotate_photo_param {
+ my ($self, $c) = @_;
+ my $key = first { /^rotate_photo/ } keys %{ $c->req->params } or return;
+ my ($index) = $key =~ /(\d+)$/;
+ my $direction = $c->get_param($key);
+ return [ $index || 0, $key, $direction ];
+}
+
sub rotate_photo : Private {
- my ( $self, $c ) =@_;
+ my ( $self, $c, $index, $key, $direction ) = @_;
- my $direction = $c->get_param('rotate_photo');
return unless $direction eq _('Rotate Left') or $direction eq _('Rotate Right');
- my $photo = $c->stash->{problem}->photo;
- my $file;
+ my $problem = $c->stash->{problem};
+ my $fileid = $problem->get_photoset($c)->rotate_image(
+ $index,
+ $direction eq _('Rotate Left') ? -90 : 90
+ ) or return;
- # If photo field contains a hash
- if ( length($photo) == 40 ) {
- $file = file( $c->config->{UPLOAD_DIR}, "$photo.jpeg" );
- $photo = $file->slurp;
- }
-
- $photo = _rotate_image( $photo, $direction eq _('Rotate Left') ? -90 : 90 );
- return unless $photo;
-
- # Write out to new location
- my $fileid = sha1_hex($photo);
- $file = file( $c->config->{UPLOAD_DIR}, "$fileid.jpeg" );
-
- my $fh = $file->open('w');
- print $fh $photo;
- close $fh;
-
- unlink glob FixMyStreet->path_to( 'web', 'photo', $c->stash->{problem}->id . '.*' );
-
- $c->stash->{problem}->photo( $fileid );
- $c->stash->{problem}->update();
+ $problem->update({ photo => $fileid });
return 1;
}
@@ -1464,18 +1550,6 @@ sub trim {
return $e;
}
-sub _rotate_image {
- my ($photo, $direction) = @_;
- my $image = Image::Magick->new;
- $image->BlobToImage($photo);
- my $err = $image->Rotate($direction);
- return 0 if $err;
- my @blobs = $image->ImageToBlob();
- undef $image;
- return $blobs[0];
-}
-
-
=head1 AUTHOR
Struan Donald
diff --git a/perllib/FixMyStreet/App/Controller/Around.pm b/perllib/FixMyStreet/App/Controller/Around.pm
index 723684793..4aa695ae5 100644
--- a/perllib/FixMyStreet/App/Controller/Around.pm
+++ b/perllib/FixMyStreet/App/Controller/Around.pm
@@ -28,7 +28,7 @@ If no search redirect back to the homepage.
=cut
-sub around_index : Path : Args(0) {
+sub index : Path : Args(0) {
my ( $self, $c ) = @_;
# handle old coord systems
@@ -302,15 +302,10 @@ sub ajax : Path('/ajax') {
'around/on_map_list_items.html',
{ on_map => $on_map, around_map => $around_map }
);
- my $around_map_list_html = $c->render_fragment(
- 'around/around_map_list_items.html',
- { on_map => $on_map, around_map => $around_map }
- );
# JSON encode the response
my $json = { pins => $pins };
$json->{current} = $on_map_list_html if $on_map_list_html;
- $json->{current_near} = $around_map_list_html if $around_map_list_html;
my $body = JSON->new->utf8(1)->encode($json);
$c->res->body($body);
}
diff --git a/perllib/FixMyStreet/App/Controller/Auth.pm b/perllib/FixMyStreet/App/Controller/Auth.pm
index 63bf91ff5..6de416c53 100644
--- a/perllib/FixMyStreet/App/Controller/Auth.pm
+++ b/perllib/FixMyStreet/App/Controller/Auth.pm
@@ -36,16 +36,23 @@ sub general : Path : Args(0) {
return unless $c->req->method eq 'POST';
# decide which action to take
- my $has_password = $c->get_param('sign_in') || $c->get_param('password_sign_in');
- my $has_email = $c->get_param('email_sign_in') || $c->get_param('name') || $c->get_param('password_register');
+ my $clicked_password = $c->get_param('sign_in');
+ my $clicked_email = $c->get_param('email_sign_in');
+ my $data_password = $c->get_param('password_sign_in');
+ my $data_email = $c->get_param('name') || $c->get_param('password_register');
- $c->detach('email_sign_in') if $has_email && !$has_password;
+ $c->detach('email_sign_in') if $clicked_email || ($data_email && !$data_password);
$c->forward( 'sign_in' )
&& $c->detach( 'redirect_on_signin', [ $c->get_param('r') ] );
}
+sub general_test : Path('_test_') : Args(0) {
+ my ( $self, $c ) = @_;
+ $c->stash->{template} = 'auth/token.html';
+}
+
=head2 sign_in
Allow the user to sign in with a username and a password.
diff --git a/perllib/FixMyStreet/App/Controller/Contact.pm b/perllib/FixMyStreet/App/Controller/Contact.pm
index 912224649..115f4e3d2 100644
--- a/perllib/FixMyStreet/App/Controller/Contact.pm
+++ b/perllib/FixMyStreet/App/Controller/Contact.pm
@@ -5,6 +5,7 @@ use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
use mySociety::EmailUtil;
+use FixMyStreet::Email;
=head1 NAME
@@ -239,11 +240,19 @@ sub send_email : Private {
? ' ( forwarded from ' . $c->req->header('X-Forwarded-For') . ' )'
: '';
- $c->send_email( 'contact.txt', {
+ my $from = [ $c->stash->{em}, $c->stash->{form_name} ];
+ my $params = {
to => [ [ $recipient, _($recipient_name) ] ],
- from => [ $c->stash->{em}, $c->stash->{form_name} ],
subject => 'FMS message: ' . $c->stash->{subject},
- });
+ };
+ if (FixMyStreet::Email::test_dmarc($c->stash->{em})) {
+ $params->{'Reply-To'} = [ $from ];
+ $params->{from} = [ $recipient, $c->stash->{form_name} ];
+ } else {
+ $params->{from} = $from;
+ }
+
+ $c->send_email('contact.txt', $params);
# above is always succesful :(
$c->stash->{success} = 1;
diff --git a/perllib/FixMyStreet/App/Controller/Dashboard.pm b/perllib/FixMyStreet/App/Controller/Dashboard.pm
index c3aa35008..faddaa89e 100644
--- a/perllib/FixMyStreet/App/Controller/Dashboard.pm
+++ b/perllib/FixMyStreet/App/Controller/Dashboard.pm
@@ -89,6 +89,7 @@ sub index : Path : Args(0) {
my ( $self, $c ) = @_;
my $body = $c->forward('check_page_allowed');
+ $c->stash->{body} = $body;
# Set up the data for the dropdowns
@@ -112,7 +113,6 @@ sub index : Path : Args(0) {
$c->stash->{category} = $c->get_param('category');
my %where = (
- bodies_str => $body->id, # XXX Does this break in a two tier council? Restriction needs looking at...
'problem.state' => [ FixMyStreet::DB::Result::Problem->visible_states() ],
);
$where{areas} = { 'like', '%,' . $c->stash->{ward} . ',%' }
@@ -155,7 +155,7 @@ sub index : Path : Args(0) {
%$prob_where,
'me.confirmed' => { '>=', $dtf->format_datetime( $now->clone->subtract( days => 30 ) ) },
};
- my $problems_rs = $c->cobrand->problems->search( $params );
+ my $problems_rs = $c->cobrand->problems->to_body($body)->search( $params );
my @problems = $problems_rs->all;
my %problems;
@@ -270,12 +270,14 @@ sub export_as_csv {
sub updates_search : Private {
my ( $self, $c, $time ) = @_;
+ my $body = $c->stash->{body};
+
my $params = {
%{$c->stash->{where}},
'me.confirmed' => { '>=', $time },
};
- my $comments = $c->model('DB::Comment')->search(
+ my $comments = $c->model('DB::Comment')->to_body($body)->search(
$params,
{
group_by => [ 'problem_state' ],
@@ -302,7 +304,7 @@ sub updates_search : Private {
my $col = shift @$vars;
my $substmt = "select min(id) from comment where me.problem_id=comment.problem_id and problem_state in ('"
. join("','", @$vars) . "')";
- $comments = $c->model('DB::Comment')->search(
+ $comments = $c->model('DB::Comment')->to_body($body)->search(
{ %$params,
problem_state => $vars,
'me.id' => \"= ($substmt)",
@@ -319,7 +321,7 @@ sub updates_search : Private {
$counts{$col} = int( ($comments->get_column('time')||0) / 60 / 60 / 24 + 0.5 );
}
- $counts{fixed_user} = $c->model('DB::Comment')->search(
+ $counts{fixed_user} = $c->model('DB::Comment')->to_body($body)->search(
{ %$params, mark_fixed => 1, problem_state => undef }, { join => 'problem' }
)->count;
@@ -327,7 +329,7 @@ sub updates_search : Private {
%{$c->stash->{prob_where}},
'me.confirmed' => { '>=', $time },
};
- $counts{total} = $c->cobrand->problems->search( $params )->count;
+ $counts{total} = $c->cobrand->problems->to_body($body)->search( $params )->count;
$params = {
%{$c->stash->{prob_where}},
@@ -335,7 +337,7 @@ sub updates_search : Private {
state => 'confirmed',
'(select min(id) from comment where me.id=problem_id and problem_state is not null)' => undef,
};
- $counts{not_marked} = $c->cobrand->problems->search( $params )->count;
+ $counts{not_marked} = $c->cobrand->problems->to_body($body)->search( $params )->count;
return \%counts;
}
diff --git a/perllib/FixMyStreet/App/Controller/Moderate.pm b/perllib/FixMyStreet/App/Controller/Moderate.pm
index 08c4280a1..77a3346dc 100644
--- a/perllib/FixMyStreet/App/Controller/Moderate.pm
+++ b/perllib/FixMyStreet/App/Controller/Moderate.pm
@@ -102,9 +102,6 @@ sub report_moderate_audit : Private {
my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($problem->cobrand)->new();
- my $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
- my $sender_name = _($cobrand->contact_name);
-
my $token = $c->model("DB::Token")->create({
scope => 'moderation',
data => { id => $problem->id }
@@ -113,7 +110,6 @@ sub report_moderate_audit : Private {
$c->send_email( 'problem-moderated.txt', {
to => [ [ $user->email, $user->name ] ],
- from => [ $sender, $sender_name ],
types => $types_csv,
user => $user,
problem => $problem,
diff --git a/perllib/FixMyStreet/App/Controller/My.pm b/perllib/FixMyStreet/App/Controller/My.pm
index 83d5f7adb..3c4ce2cf7 100644
--- a/perllib/FixMyStreet/App/Controller/My.pm
+++ b/perllib/FixMyStreet/App/Controller/My.pm
@@ -31,16 +31,12 @@ sub my : Path : Args(0) {
$c->forward( '/reports/stash_report_filter_status' );
my $pins = [];
- my $problems = {};
+ my $problems = [];
my $states = $c->stash->{filter_problem_states};
my $params = {
state => [ keys %$states ],
};
- $params = {
- %{ $c->cobrand->problems_clause },
- %$params
- } if $c->cobrand->problems_clause;
my $category = $c->get_param('filter_category');
if ( $category ) {
@@ -48,7 +44,9 @@ sub my : Path : Args(0) {
$c->stash->{filter_category} = $category;
}
- my $rs = $c->user->problems->search( $params, {
+ my $rs = $c->user->problems
+ ->to_body($c->cobrand->body_restriction)
+ ->search( $params, {
order_by => { -desc => 'confirmed' },
rows => 50
} )->page( $p_page );
@@ -62,9 +60,7 @@ sub my : Path : Args(0) {
id => $problem->id,
title => $problem->title,
};
- my $state = $problem->is_fixed ? 'fixed' : $problem->is_closed ? 'closed' : 'confirmed';
- push @{ $problems->{$state} }, $problem;
- push @{ $problems->{all} }, $problem;
+ push @$problems, $problem;
}
$c->stash->{problems_pager} = $rs->pager;
$c->stash->{problems} = $problems;
diff --git a/perllib/FixMyStreet/App/Controller/Photo.pm b/perllib/FixMyStreet/App/Controller/Photo.pm
index a2ec7d4c8..bc72f4bfb 100644
--- a/perllib/FixMyStreet/App/Controller/Photo.pm
+++ b/perllib/FixMyStreet/App/Controller/Photo.pm
@@ -8,8 +8,8 @@ use DateTime::Format::HTTP;
use Digest::SHA qw(sha1_hex);
use File::Path;
use File::Slurp;
-use Image::Size;
use Path::Class;
+use FixMyStreet::App::Model::PhotoSet;
use if !$ENV{TRAVIS}, 'Image::Magick';
=head1 NAME
@@ -49,13 +49,13 @@ sub during :LocalRegex('^([0-9a-f]{40})\.(temp|fulltemp)\.jpeg$') {
$c->forward( 'output', [ $photo ] );
}
-sub index :LocalRegex('^(c/)?(\d+)(?:\.(full|tn|fp))?\.jpeg$') {
+sub index :LocalRegex('^(c/)?(\d+)(?:\.(\d+))?(?:\.(full|tn|fp))?\.jpeg$') {
my ( $self, $c ) = @_;
- my ( $is_update, $id, $size ) = @{ $c->req->captures };
+ my ( $is_update, $id, $photo_number, $size ) = @{ $c->req->captures };
- my @photo;
+ my $item;
if ( $is_update ) {
- @photo = $c->model('DB::Comment')->search( {
+ ($item) = $c->model('DB::Comment')->search( {
id => $id,
state => 'confirmed',
photo => { '!=', undef },
@@ -67,34 +67,40 @@ sub index :LocalRegex('^(c/)?(\d+)(?:\.(full|tn|fp))?\.jpeg$') {
}
$c->detach( 'no_photo' ) if $id =~ /\D/;
- @photo = $c->cobrand->problems->search( {
+ ($item) = $c->cobrand->problems->search( {
id => $id,
state => [ FixMyStreet::DB::Result::Problem->visible_states(), 'partial' ],
photo => { '!=', undef },
} );
}
- $c->detach( 'no_photo' ) unless @photo;
+ $c->detach( 'no_photo' ) unless $item;
- my $item = $photo[0];
$c->detach( 'no_photo' ) unless $c->cobrand->allow_photo_display($item); # Should only be for reports, not updates
- my $photo = $item->photo;
- # If photo field contains a hash
- if (length($photo) == 40) {
- my $file = file( $c->config->{UPLOAD_DIR}, "$photo.jpeg" );
- $photo = $file->slurp;
- }
-
- if ( $size eq 'tn' ) {
- $photo = _shrink( $photo, 'x100' );
- } elsif ( $size eq 'fp' ) {
- $photo = _crop( $photo );
- } elsif ( $size eq 'full' ) {
- } elsif ( $c->cobrand->default_photo_resize ) {
- $photo = _shrink( $photo, $c->cobrand->default_photo_resize );
+ my $photo;
+ if ($item->can('get_photoset')) {
+ $photo = $item->get_photoset( $c )
+ ->get_image_data( num => $photo_number, size => $size )
+ or $c->detach( 'no_photo' );
} else {
- $photo = _shrink( $photo, '250x250' );
+ $photo = $item->photo;
+ # If photo field contains a hash
+ if (length($photo) == 40) {
+ my $file = file( $c->config->{UPLOAD_DIR}, "$photo.jpeg" );
+ $photo = $file->slurp;
+ }
+
+ if ( $size eq 'tn' ) {
+ $photo = _shrink( $photo, 'x100' );
+ } elsif ( $size eq 'fp' ) {
+ $photo = _crop( $photo );
+ } elsif ( $size eq 'full' ) {
+ } elsif ( $c->cobrand->default_photo_resize ) {
+ $photo = _shrink( $photo, $c->cobrand->default_photo_resize );
+ } else {
+ $photo = _shrink( $photo, '250x250' );
+ }
}
$c->forward( 'output', [ $photo ] );
@@ -156,84 +162,67 @@ sub process_photo : Private {
my ( $self, $c ) = @_;
return
- $c->forward('process_photo_upload')
- || $c->forward('process_photo_cache')
+ $c->forward('process_photo_upload_or_cache')
+ || $c->forward('process_photo_required')
|| 1; # always return true
}
-sub process_photo_upload : Private {
+sub process_photo_upload_or_cache : Private {
my ( $self, $c ) = @_;
-
- # check for upload or return
- my $upload = $c->req->upload('photo')
- || return;
-
- # check that the photo is a jpeg
- my $ct = $upload->type;
- $ct =~ s/x-citrix-//; # Thanks, Citrix
- # Had a report of a JPEG from an Android 2.1 coming through as a byte stream
- unless ( $ct eq 'image/jpeg' || $ct eq 'image/pjpeg' || $ct eq 'application/octet-stream' ) {
- $c->log->info('Bad photo tried to upload, type=' . $ct);
- $c->stash->{photo_error} = _('Please upload a JPEG image only');
- return;
- }
-
- # get the photo into a variable
- my $photo_blob = eval {
- my $filename = $upload->tempname;
- my $out = `jhead -se -autorot $filename 2>&1`;
- unless (defined $out) {
- my ($w, $h, $err) = Image::Size::imgsize($filename);
- die _("Please upload a JPEG image only") . "\n" if !defined $w || $err ne 'JPG';
- }
- die _("Please upload a JPEG image only") . "\n" if $out && $out =~ /Not JPEG:/;
- my $photo = $upload->slurp;
- return $photo;
- };
- if ( my $error = $@ ) {
- my $format = _(
-"That image doesn't appear to have uploaded correctly (%s), please try again."
- );
- $c->stash->{photo_error} = sprintf( $format, $error );
- return;
- }
-
- # we have an image we can use - save it to the upload dir for storage
- my $cache_dir = dir( $c->config->{UPLOAD_DIR} );
- $cache_dir->mkpath;
- unless ( -d $cache_dir && -w $cache_dir ) {
- warn "Can't find/write to photo cache directory '$cache_dir'";
- return;
- }
-
- my $fileid = sha1_hex($photo_blob);
- $upload->copy_to( file($cache_dir, $fileid . '.jpeg') );
-
- # stick the hash on the stash, so don't have to reupload in case of error
- $c->stash->{upload_fileid} = $fileid;
-
+ my @items = (
+ ( map {
+ /^photo/ ? # photo, photo1, photo2 etc.
+ ($c->req->upload($_)) : ()
+ } sort $c->req->upload),
+ split /,/, ($c->get_param('upload_fileid') || '')
+ );
+
+ my $photoset = FixMyStreet::App::Model::PhotoSet->new({
+ c => $c,
+ data_items => \@items,
+ });
+
+ my $fileid = $photoset->data;
+
+ $c->stash->{upload_fileid} = $fileid or return;
return 1;
}
-=head2 process_photo_cache
+=head2 process_photo_required
+
+Checks that a report has a photo attached if any of its Contacts
+require it (by setting extra->photo_required == 1). Puts an error in
+photo_error on the stash if it's required and missing, otherwise returns
+true.
-Look for the upload_fileid parameter and check it matches a file on disk. If it
-does return true and put fileid on stash, otherwise false.
+(Note that as we have reached this action, we *know* that the photo
+is missing, otherwise it would have already been handled.)
=cut
-sub process_photo_cache : Private {
+sub process_photo_required : Private {
my ( $self, $c ) = @_;
- # get the fileid and make sure it is just a hex number
- my $fileid = $c->get_param('upload_fileid') || '';
- $fileid =~ s{[^0-9a-f]}{}gi;
- return unless $fileid;
-
- my $file = file( $c->config->{UPLOAD_DIR}, "$fileid.jpeg" );
- return unless -e $file;
+ # load the report
+ my $report = $c->stash->{report} or return 1; # don't check photo for updates
+ my $bodies = $c->stash->{bodies};
+
+ my @contacts = $c-> #
+ model('DB::Contact') #
+ ->not_deleted #
+ ->search(
+ {
+ body_id => [ keys %$bodies ],
+ category => $report->category
+ }
+ )->all;
+ foreach my $contact ( @contacts ) {
+ if ( $contact->get_extra_metadata('photo_required') ) {
+ $c->stash->{photo_error} = _("Photo is required.");
+ return;
+ }
+ }
- $c->stash->{upload_fileid} = $fileid;
return 1;
}
diff --git a/perllib/FixMyStreet/App/Controller/Questionnaire.pm b/perllib/FixMyStreet/App/Controller/Questionnaire.pm
index f9a08e408..8fe2514c0 100755
--- a/perllib/FixMyStreet/App/Controller/Questionnaire.pm
+++ b/perllib/FixMyStreet/App/Controller/Questionnaire.pm
@@ -142,8 +142,8 @@ sub submit_creator_fixed : Private {
$questionnaire->ever_reported( $c->stash->{reported} eq 'Yes' ? 1 : 0 );
$questionnaire->old_state( $old_state );
- $questionnaire->whensent( \'ms_current_timestamp()' );
- $questionnaire->whenanswered( \'ms_current_timestamp()' );
+ $questionnaire->whensent( \'current_timestamp' );
+ $questionnaire->whenanswered( \'current_timestamp' );
$questionnaire->insert;
}
@@ -173,13 +173,13 @@ sub submit_standard : Private {
# Record state change, if there was one
if ( $new_state ) {
$problem->state( $new_state );
- $problem->lastupdate( \'ms_current_timestamp()' );
+ $problem->lastupdate( \'current_timestamp' );
}
# If it's not fixed and they say it's still not been fixed, record time update
if ( $c->stash->{been_fixed} eq 'No' &&
FixMyStreet::DB::Result::Problem->open_states->{$old_state} ) {
- $problem->lastupdate( \'ms_current_timestamp()' );
+ $problem->lastupdate( \'current_timestamp' );
}
# Record questionnaire response
@@ -189,7 +189,7 @@ sub submit_standard : Private {
my $q = $c->stash->{questionnaire};
$q->update( {
- whenanswered => \'ms_current_timestamp()',
+ whenanswered => \'current_timestamp',
ever_reported => $reported,
old_state => $old_state,
new_state => $c->stash->{been_fixed} eq 'Unknown' ? 'unknown' : ($new_state || $old_state),
@@ -210,7 +210,7 @@ sub submit_standard : Private {
lang => $c->stash->{lang_code},
cobrand => $c->cobrand->moniker,
cobrand_data => '',
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
anonymous => $problem->anonymous,
}
);
@@ -234,6 +234,8 @@ sub process_questionnaire : Private {
map { $c->stash->{$_} = $c->get_param($_) || '' } qw(been_fixed reported another update);
+ $c->stash->{update} = Utils::cleanup_text($c->stash->{update}, { allow_multiline => 1 });
+
# EHA questionnaires done for you
if ($c->cobrand->moniker eq 'emptyhomes') {
$c->stash->{another} = $c->stash->{num_questionnaire}==1 ? 'Yes' : 'No';
diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm
index 7b001ee4c..d7cae05d4 100644
--- a/perllib/FixMyStreet/App/Controller/Report.pm
+++ b/perllib/FixMyStreet/App/Controller/Report.pm
@@ -99,23 +99,30 @@ sub load_problem_or_display_error : Private {
my $problem
= ( !$id || $id =~ m{\D} ) # is id non-numeric?
? undef # ...don't even search
- : $c->cobrand->problems->find( { id => $id } );
+ : $c->cobrand->problems->find( { id => $id } )
+ or $c->detach( '/page_error_404_not_found', [ _('Unknown problem ID') ] );
# check that the problem is suitable to show.
- if ( !$problem || ($problem->state eq 'unconfirmed' && !$c->cobrand->show_unconfirmed_reports) || $problem->state eq 'partial' ) {
+ # hidden_states includes partial and unconfirmed, but they have specific handling,
+ # so we check for them first.
+ if ( $problem->state eq 'partial' ) {
$c->detach( '/page_error_404_not_found', [ _('Unknown problem ID') ] );
}
- elsif ( $problem->state eq 'hidden' ) {
+ elsif ( $problem->state eq 'unconfirmed' ) {
+ $c->detach( '/page_error_404_not_found', [ _('Unknown problem ID') ] )
+ unless $c->cobrand->show_unconfirmed_reports ;
+ }
+ elsif ( $problem->hidden_states->{ $problem->state } or
+ (($problem->get_extra_metadata('closure_status')||'') eq 'hidden')) {
$c->detach(
'/page_error_410_gone',
[ _('That report has been removed from FixMyStreet.') ] #
);
} elsif ( $problem->non_public ) {
if ( !$c->user || $c->user->id != $problem->user->id ) {
- my $site_name = Utils::trim_text($c->render_fragment('site-name.html'));
$c->detach(
'/page_error_403_access_denied',
- [ sprintf(_('That report cannot be viewed on %s.'), $site_name) ] #
+ [ sprintf(_('That report cannot be viewed on %s.'), $c->stash->{site_name}) ]
);
}
}
@@ -242,7 +249,7 @@ sub delete :Local :Args(1) {
return $c->res->redirect($uri) unless $p->bodies->{$body->id};
$p->state('hidden');
- $p->lastupdate( \'ms_current_timestamp()' );
+ $p->lastupdate( \'current_timestamp' );
$p->update;
$c->model('DB::AdminLog')->create( {
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm
index b540a1961..246facbee 100644
--- a/perllib/FixMyStreet/App/Controller/Report/New.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/New.pm
@@ -93,6 +93,7 @@ sub report_new : Path : Args(0) {
$c->forward('check_for_category');
# deal with the user and report and check both are happy
+
return unless $c->forward('check_form_submitted');
$c->forward('process_user');
$c->forward('process_report');
@@ -106,6 +107,12 @@ sub report_new : Path : Args(0) {
# report_new but there's a few workflow differences as we only ever want
# to sent JSON back here
+sub report_new_test : Path('_test_') : Args(0) {
+ my ( $self, $c ) = @_;
+ $c->stash->{template} = 'email_sent.html';
+ $c->stash->{email_type} = $c->get_param('email_type');
+}
+
sub report_new_ajax : Path('mobile') : Args(0) {
my ( $self, $c ) = @_;
@@ -284,7 +291,7 @@ sub report_import : Path('/import') {
}
# handle the photo upload
- $c->forward( '/photo/process_photo_upload' );
+ $c->forward( '/photo/process_photo' );
my $fileid = $c->stash->{upload_fileid};
if ( my $error = $c->stash->{photo_error} ) {
push @errors, $error;
@@ -883,13 +890,29 @@ sub process_report : Private {
$report->bodies_str(-1);
} else {
# construct the bodies string:
- # 'x,x' - x are body IDs that have this category
- # 'x,x|y' - x are body IDs that have this category, y body IDs with *no* contact
- my $body_string = join( ',', map { $_->body_id } @contacts );
- $body_string .=
- '|' . join( ',', map { $_->id } @{ $c->stash->{missing_details_bodies} } )
- if $body_string && @{ $c->stash->{missing_details_bodies} };
+ my $body_string = do {
+ if ( $c->cobrand->can('singleton_bodies_str') && $c->cobrand->singleton_bodies_str ) {
+ # Cobrands like Zurich can only ever have a single body: 'x', because some functionality
+ # relies on string comparison against bodies_str.
+ if (@contacts) {
+ $contacts[0]->body_id;
+ }
+ else {
+ '';
+ }
+ }
+ else {
+ # 'x,x' - x are body IDs that have this category
+ my $bs = join( ',', map { $_->body_id } @contacts );
+ $bs;
+ };
+ };
$report->bodies_str($body_string);
+ # Record any body IDs which might have meant to match, but had no contact
+ if ($body_string && @{ $c->stash->{missing_details_bodies} }) {
+ my $missing = join( ',', map { $_->id } @{ $c->stash->{missing_details_bodies} } );
+ $report->bodies_missing($missing);
+ }
}
my @extra;
@@ -1142,6 +1165,9 @@ sub redirect_or_confirm_creation : Private {
return 1;
}
+ my $template = 'problem-confirm.txt';
+ $template = 'problem-confirm-not-sending.txt' unless $report->bodies_str;
+
# otherwise create a confirm token and email it to them.
my $data = $c->stash->{token_data} || {};
my $token = $c->model("DB::Token")->create( {
@@ -1152,7 +1178,10 @@ sub redirect_or_confirm_creation : Private {
}
} );
$c->stash->{token_url} = $c->uri_for_email( '/P', $token->token );
- $c->send_email( 'problem-confirm.txt', {
+ if ($c->cobrand->can('problem_confirm_email_extras')) {
+ $c->cobrand->problem_confirm_email_extras($report);
+ }
+ $c->send_email( $template, {
to => [ $report->name ? [ $report->user->email, $report->name ] : $report->user->email ],
} );
diff --git a/perllib/FixMyStreet/App/Controller/Report/Update.pm b/perllib/FixMyStreet/App/Controller/Report/Update.pm
index 17aec2113..445723fec 100644
--- a/perllib/FixMyStreet/App/Controller/Report/Update.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/Update.pm
@@ -80,7 +80,7 @@ sub update_problem : Private {
$problem->interest_count( \'interest_count + 1' );
}
- $problem->lastupdate( \'ms_current_timestamp()' );
+ $problem->lastupdate( \'current_timestamp' );
$problem->update;
$c->stash->{problem_id} = $problem->id;
diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm
index 6b0d516a6..407fc625e 100644
--- a/perllib/FixMyStreet/App/Controller/Reports.pm
+++ b/perllib/FixMyStreet/App/Controller/Reports.pm
@@ -33,6 +33,7 @@ sub index : Path : Args(0) {
# Zurich goes straight to map page, with all reports
if ( $c->cobrand->moniker eq 'zurich' ) {
+ $c->forward( 'stash_report_filter_status' );
$c->forward( 'load_and_group_problems' );
my $pins = $c->stash->{pins};
$c->stash->{page} = 'reports';
@@ -121,7 +122,7 @@ sub ward : Path : Args(2) {
$c->stash->{stats} = $c->cobrand->get_report_stats();
- my @categories = $c->stash->{body}->contacts->search( undef, {
+ my @categories = $c->stash->{body}->contacts->not_deleted->search( undef, {
columns => [ 'category' ],
distinct => 1,
order_by => [ 'category' ],
@@ -269,9 +270,7 @@ sub rss_ward : Path('/rss/reports') : Args(2) {
# Problems sent to a council
$c->stash->{type} = 'council_problems';
$c->stash->{title_params} = { COUNCIL => $c->stash->{body}->name };
- # XXX This looks up in both bodies_str and areas, but is only using body ID.
- # This will not work properly in any install where body IDs are not === area IDs.
- $c->stash->{db_params} = [ $c->stash->{body}->id, $c->stash->{body}->id ];
+ $c->stash->{db_params} = [ $c->stash->{body}->id ];
}
# Send on to the RSS generation
@@ -396,20 +395,20 @@ sub load_and_group_problems : Private {
my $not_open = [ FixMyStreet::DB::Result::Problem::fixed_states(), FixMyStreet::DB::Result::Problem::closed_states() ];
if ( $type eq 'new' ) {
- $where->{confirmed} = { '>', \"ms_current_timestamp() - INTERVAL '4 week'" };
+ $where->{confirmed} = { '>', \"current_timestamp - INTERVAL '4 week'" };
$where->{state} = { 'IN', [ FixMyStreet::DB::Result::Problem::open_states() ] };
} elsif ( $type eq 'older' ) {
- $where->{confirmed} = { '<', \"ms_current_timestamp() - INTERVAL '4 week'" };
- $where->{lastupdate} = { '>', \"ms_current_timestamp() - INTERVAL '8 week'" };
+ $where->{confirmed} = { '<', \"current_timestamp - INTERVAL '4 week'" };
+ $where->{lastupdate} = { '>', \"current_timestamp - INTERVAL '8 week'" };
$where->{state} = { 'IN', [ FixMyStreet::DB::Result::Problem::open_states() ] };
} elsif ( $type eq 'unknown' ) {
- $where->{lastupdate} = { '<', \"ms_current_timestamp() - INTERVAL '8 week'" };
+ $where->{lastupdate} = { '<', \"current_timestamp - INTERVAL '8 week'" };
$where->{state} = { 'IN', [ FixMyStreet::DB::Result::Problem::open_states() ] };
} elsif ( $type eq 'fixed' ) {
- $where->{lastupdate} = { '>', \"ms_current_timestamp() - INTERVAL '8 week'" };
+ $where->{lastupdate} = { '>', \"current_timestamp - INTERVAL '8 week'" };
$where->{state} = $not_open;
} elsif ( $type eq 'older_fixed' ) {
- $where->{lastupdate} = { '<', \"ms_current_timestamp() - INTERVAL '8 week'" };
+ $where->{lastupdate} = { '<', \"current_timestamp - INTERVAL '8 week'" };
$where->{state} = $not_open;
}
@@ -417,29 +416,16 @@ sub load_and_group_problems : Private {
$where->{category} = $category;
}
+ my $problems = $c->cobrand->problems;
+
if ($c->stash->{ward}) {
$where->{areas} = { 'like', '%,' . $c->stash->{ward}->{id} . ',%' };
- $where->{bodies_str} = [
- undef,
- $c->stash->{body}->id,
- { 'like', $c->stash->{body}->id . ',%' },
- { 'like', '%,' . $c->stash->{body}->id },
- ];
+ $problems = $problems->to_body($c->stash->{body});
} elsif ($c->stash->{body}) {
- # XXX FixMyStreet used to have the following line so that reports not
- # currently sent anywhere could still be listed in the appropriate
- # (body/area), as they were the same. Now they're not, not sure if
- # there's a way to do this easily.
- #$where->{areas} = { 'like', '%,' . $c->stash->{body}->id . ',%' };
- $where->{bodies_str} = [
- # undef,
- $c->stash->{body}->id,
- { 'like', $c->stash->{body}->id . ',%' },
- { 'like', '%,' . $c->stash->{body}->id },
- ];
+ $problems = $problems->to_body($c->stash->{body});
}
- my $problems = $c->cobrand->problems->search(
+ $problems = $problems->search(
$where,
{
order_by => $c->cobrand->reports_ordering,
@@ -463,7 +449,6 @@ sub load_and_group_problems : Private {
}
} else {
# Add to bodies it was sent to
- # XXX Assumes body ID matches "council ID"
my $bodies = $problem->bodies_str_ids;
foreach ( @$bodies ) {
next if $_ != $c->stash->{body}->id;
@@ -507,6 +492,9 @@ sub stash_report_filter_status : Private {
} elsif ( $status eq 'open' ) {
$c->stash->{filter_status} = 'open';
$c->stash->{filter_problem_states} = FixMyStreet::DB::Result::Problem->open_states();
+ } elsif ( $status eq 'closed' ) {
+ $c->stash->{filter_status} = 'closed';
+ $c->stash->{filter_problem_states} = FixMyStreet::DB::Result::Problem->closed_states();
} elsif ( $status eq 'fixed' ) {
$c->stash->{filter_status} = 'fixed';
$c->stash->{filter_problem_states} = FixMyStreet::DB::Result::Problem->fixed_states();
diff --git a/perllib/FixMyStreet/App/Controller/Rss.pm b/perllib/FixMyStreet/App/Controller/Rss.pm
index 7aafc99ff..b817fe326 100755
--- a/perllib/FixMyStreet/App/Controller/Rss.pm
+++ b/perllib/FixMyStreet/App/Controller/Rss.pm
@@ -264,11 +264,7 @@ sub add_row : Private {
(my $link = $alert_type->item_link) =~ s/{{(.*?)}}/$row->{$1}/g;
(my $desc = _($alert_type->item_description)) =~ s/{{(.*?)}}/$row->{$1}/g;
- my $hashref_restriction = $c->cobrand->site_restriction;
- my $base_url = $c->cobrand->base_url;
- if ( $hashref_restriction && $hashref_restriction->{bodies_str} && $row->{bodies_str} && $row->{bodies_str} ne $hashref_restriction->{bodies_str} ) {
- $base_url = $c->config->{BASE_URL};
- }
+ my $base_url = $c->cobrand->base_url_for_report($row);
my $url = $base_url . $link;
my %item = (
diff --git a/perllib/FixMyStreet/App/Controller/Status.pm b/perllib/FixMyStreet/App/Controller/Status.pm
new file mode 100755
index 000000000..907fe5456
--- /dev/null
+++ b/perllib/FixMyStreet/App/Controller/Status.pm
@@ -0,0 +1,70 @@
+package FixMyStreet::App::Controller::Status;
+use Moose;
+use namespace::autoclean;
+
+use HTTP::Negotiate;
+use JSON;
+
+BEGIN { extends 'Catalyst::Controller'; }
+
+=head1 NAME
+
+FixMyStreet::App::Controller::Status - Catalyst Controller
+
+=head1 DESCRIPTION
+
+Status page Catalyst Controller.
+
+=head1 METHODS
+
+=cut
+
+sub index_json : Path('/status.json') : Args(0) {
+ my ($self, $c) = @_;
+ $c->forward('index', [ 'json' ]);
+}
+
+sub index : Path : Args(0) {
+ my ($self, $c, $format) = @_;
+
+ # Fetch summary stats from admin front page
+ $c->forward('/admin/index');
+
+ # Fetch git version
+ $c->forward('/admin/config_page');
+
+ my $chosen = $format;
+ unless ($chosen) {
+ my $variants = [
+ ['html', undef, 'text/html', undef, undef, undef, undef],
+ ['json', undef, 'application/json', undef, undef, undef, undef],
+ ];
+ $chosen = HTTP::Negotiate::choose($variants, $c->req->headers);
+ $chosen = 'html' unless $chosen;
+ }
+
+ # TODO Perform health checks here
+
+ if ($chosen eq 'json') {
+ $c->res->content_type('application/json; charset=utf-8');
+ my $data = {
+ version => $c->stash->{git_version},
+ reports => $c->stash->{total_problems_live},
+ updates => $c->stash->{comments}{confirmed},
+ alerts_confirmed => $c->stash->{alerts}{1},
+ alerts_unconfirmed => $c->stash->{alerts}{0},
+ questionnaires_sent => $c->stash->{questionnaires}{total},
+ questionnaires_answered => $c->stash->{questionnaires}{1},
+ bodies => $c->stash->{total_bodies},
+ contacts => $c->stash->{contacts}{total},
+ };
+ my $body = JSON->new->utf8(1)->pretty->encode($data);
+ $c->res->body($body);
+ }
+
+ return 1;
+}
+
+__PACKAGE__->meta->make_immutable;
+
+1;
diff --git a/perllib/FixMyStreet/App/Controller/Tokens.pm b/perllib/FixMyStreet/App/Controller/Tokens.pm
index 21c269502..ba15162ce 100644
--- a/perllib/FixMyStreet/App/Controller/Tokens.pm
+++ b/perllib/FixMyStreet/App/Controller/Tokens.pm
@@ -58,7 +58,7 @@ sub confirm_problem : Path('/P') {
# check that this email or domain are not the cause of abuse. If so hide it.
if ( $problem->is_from_abuser ) {
$problem->update(
- { state => 'hidden', lastupdate => \'ms_current_timestamp()' } );
+ { state => 'hidden', lastupdate => \'current_timestamp' } );
$c->stash->{template} = 'tokens/abuse.html';
return;
}
@@ -68,7 +68,7 @@ sub confirm_problem : Path('/P') {
if ($c->cobrand->moniker eq 'zurich') {
$problem->set_extra_metadata( email_confirmed => 1 );
$problem->update( {
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
} );
if ( $data->{name} || $data->{password} ) {
@@ -90,8 +90,8 @@ sub confirm_problem : Path('/P') {
$problem->update(
{
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
- lastupdate => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
+ lastupdate => \'current_timestamp',
}
);
diff --git a/perllib/FixMyStreet/App/Model/PhotoSet.pm b/perllib/FixMyStreet/App/Model/PhotoSet.pm
new file mode 100644
index 000000000..b18460821
--- /dev/null
+++ b/perllib/FixMyStreet/App/Model/PhotoSet.pm
@@ -0,0 +1,306 @@
+package FixMyStreet::App::Model::PhotoSet;
+
+# TODO this isn't a Cat model, rename to something else
+
+use Moose;
+use Path::Tiny 'path';
+use if !$ENV{TRAVIS}, 'Image::Magick';
+use Scalar::Util 'openhandle', 'blessed';
+use Digest::SHA qw(sha1_hex);
+use Image::Size;
+use MIME::Base64;
+
+has c => (
+ is => 'ro',
+);
+
+has object => (
+ is => 'ro',
+);
+
+has data => ( # generic data from DB field
+ is => 'ro',
+ lazy => 1,
+ default => sub {
+ # yes, this is a little circular: data -> data_items -> items -> data
+ # e.g. if not provided, then we're presumably uploading/etc., so calculate from
+ # the stored cached fileids
+ # (obviously if you provide none of these, then you'll get an infinite loop)
+ my $self = shift;
+ my $data = join ',', map { $_->[0] } $self->all_images;
+ return $data;
+ }
+);
+
+has data_items => ( # either a) split from data or b) provided by photo upload
+ isa => 'ArrayRef',
+ is => 'rw',
+ traits => ['Array'],
+ lazy => 1,
+ handles => {
+ map_data_items => 'map',
+ },
+ default => sub {
+ my $self = shift;
+ my $data = $self->data
+ or return [];
+
+ return [$data] if (_jpeg_magic($data));
+
+ return [ split ',' => $data ];
+ },
+);
+
+has upload_dir => (
+ is => 'ro',
+ lazy => 1,
+ default => sub {
+ my $self = shift;
+ my $cache_dir = path( $self->c->config->{UPLOAD_DIR} );
+ $cache_dir->mkpath;
+ unless ( -d $cache_dir && -w $cache_dir ) {
+ warn "Can't find/write to photo cache directory '$cache_dir'";
+ return;
+ }
+ $cache_dir;
+ },
+);
+
+sub _jpeg_magic {
+ $_[0] =~ /^\x{ff}\x{d8}/; # JPEG
+ # NB: should we also handle \x{89}\x{50} (PNG, 15 results in live DB) ?
+ # and \x{49}\x{49} (Tiff, 3 results in live DB) ?
+}
+
+=head2 C<images>, C<num_images>, C<get_raw_image_data>, C<all_images>
+
+C<$photoset-E<GT>images> is an AoA containing the filed and the binary image data.
+
+ [
+ [ $fileid1, $binary_data ],
+ [ $fileid2, $binary_data ],
+ ...
+ ]
+
+Various accessors are provided onto it:
+
+ num_images: count
+ get_raw_image_data ($index): return the [$fileid, $binary_data] tuple
+ all_images: return AoA as an array (e.g. rather than arrayref)
+
+=cut
+
+has images => ( # AoA of [$fileid, $binary_data] tuples
+ isa => 'ArrayRef',
+ is => 'rw',
+ traits => ['Array'],
+ lazy => 1,
+ handles => {
+ num_images => 'count',
+ get_raw_image_data => 'get',
+ all_images => 'elements',
+ },
+ default => sub {
+ my $self = shift;
+ my @photos = $self->map_data_items( sub {
+ my $part = $_;
+
+ if (blessed $part and $part->isa('Catalyst::Request::Upload')) {
+ # check that the photo is a jpeg
+ my $upload = $part;
+ my $ct = $upload->type;
+ $ct =~ s/x-citrix-//; # Thanks, Citrix
+ # Had a report of a JPEG from an Android 2.1 coming through as a byte stream
+ unless ( $ct eq 'image/jpeg' || $ct eq 'image/pjpeg' || $ct eq 'application/octet-stream' ) {
+ my $c = $self->c;
+ $c->log->info('Bad photo tried to upload, type=' . $ct);
+ $c->stash->{photo_error} = _('Please upload a JPEG image only');
+ return ();
+ }
+
+ # base64 decode the file if it's encoded that way
+ # Catalyst::Request::Upload doesn't do this automatically
+ # unfortunately.
+ my $transfer_encoding = $upload->headers->header('Content-Transfer-Encoding');
+ if (defined $transfer_encoding && $transfer_encoding eq 'base64') {
+ my $decoded = decode_base64($upload->slurp);
+ if (open my $fh, '>', $upload->tempname) {
+ binmode $fh;
+ print $fh $decoded;
+ close $fh
+ } else {
+ my $c = $self->c;
+ $c->log->info('Couldn\'t open temp file to save base64 decoded image: ' . $!);
+ $c->stash->{photo_error} = _("Sorry, we couldn't save your image(s), please try again.");
+ return ();
+ }
+ }
+
+ # get the photo into a variable
+ my $photo_blob = eval {
+ my $filename = $upload->tempname;
+ my $out = `jhead -se -autorot $filename 2>&1`;
+ unless (defined $out) {
+ my ($w, $h, $err) = Image::Size::imgsize($filename);
+ die _("Please upload a JPEG image only") . "\n" if !defined $w || $err ne 'JPG';
+ }
+ die _("Please upload a JPEG image only") . "\n" if $out && $out =~ /Not JPEG:/;
+ my $photo = $upload->slurp;
+ };
+ if ( my $error = $@ ) {
+ my $format = _(
+ "That image doesn't appear to have uploaded correctly (%s), please try again."
+ );
+ $self->c->stash->{photo_error} = sprintf( $format, $error );
+ return ();
+ }
+
+ # we have an image we can use - save it to the upload dir for storage
+ my $fileid = $self->get_fileid($photo_blob);
+ my $file = $self->get_file($fileid);
+ $upload->copy_to( $file );
+ return [$fileid, $photo_blob];
+
+ }
+ if (_jpeg_magic($part)) {
+ my $photo_blob = $part;
+ my $fileid = $self->get_fileid($photo_blob);
+ my $file = $self->get_file($fileid);
+ $file->spew_raw($photo_blob);
+ return [$fileid, $photo_blob];
+ }
+ if (length($part) == 40) {
+ my $fileid = $part;
+ my $file = $self->get_file($fileid);
+ if ($file->exists) {
+ my $photo = $file->slurp_raw;
+ [$fileid, $photo];
+ }
+ else {
+ warn "File $fileid doesn't exist";
+ ();
+ }
+ }
+ else {
+ warn sprintf "Received bad photo hash of length %d", length($part);
+ ();
+ }
+ });
+ return \@photos;
+ },
+);
+
+sub get_fileid {
+ my ($self, $photo_blob) = @_;
+ return sha1_hex($photo_blob);
+}
+
+sub get_file {
+ my ($self, $fileid) = @_;
+ my $cache_dir = $self->upload_dir;
+ return path( $cache_dir, "$fileid.jpeg" );
+}
+
+sub get_image_data {
+ my ($self, %args) = @_;
+ my $num = $args{num} || 0;
+
+ my $data = $self->get_raw_image_data( $num )
+ or return;
+
+ my ($fileid, $photo) = @$data;
+
+ my $size = $args{size};
+ if ( $size eq 'tn' ) {
+ $photo = _shrink( $photo, 'x100' );
+ } elsif ( $size eq 'fp' ) {
+ $photo = _crop( $photo );
+ } elsif ( $size eq 'full' ) {
+ # do nothing
+ } else {
+ $photo = _shrink( $photo, $self->c->cobrand->default_photo_resize || '250x250' );
+ }
+
+ return $photo;
+}
+
+sub delete_cached {
+ my ($self) = @_;
+ my $object = $self->object or return;
+
+ unlink glob FixMyStreet->path_to(
+ 'web',
+ 'photo',
+ $object->id . '.*'
+ );
+}
+
+sub rotate_image {
+ my ($self, $index, $direction) = @_;
+
+ my @images = $self->all_images;
+ return if $index > $#images;
+
+ my @items = map $_->[0], @images;
+ $items[$index] = _rotate_image( $images[$index][1], $direction );
+
+ my $new_set = (ref $self)->new({
+ data_items => \@items,
+ c => $self->c,
+ object => $self->object,
+ });
+
+ $self->delete_cached();
+
+ return $new_set->data; # e.g. new comma-separated fileid
+}
+
+sub _rotate_image {
+ my ($photo, $direction) = @_;
+ return $photo unless $Image::Magick::VERSION;
+ my $image = Image::Magick->new;
+ $image->BlobToImage($photo);
+ my $err = $image->Rotate($direction);
+ return 0 if $err;
+ my @blobs = $image->ImageToBlob();
+ undef $image;
+ return $blobs[0];
+}
+
+
+
+
+
+# NB: These 2 subs stolen from A::C::Photo, should be purged from there!
+#
+# Shrinks a picture to the specified size, but keeping in proportion.
+sub _shrink {
+ my ($photo, $size) = @_;
+ return $photo unless $Image::Magick::VERSION;
+ my $image = Image::Magick->new;
+ $image->BlobToImage($photo);
+ my $err = $image->Scale(geometry => "$size>");
+ throw Error::Simple("resize failed: $err") if "$err";
+ $image->Strip();
+ my @blobs = $image->ImageToBlob();
+ undef $image;
+ return $blobs[0];
+}
+
+# Shrinks a picture to 90x60, cropping so that it is exactly that.
+sub _crop {
+ my ($photo) = @_;
+ return $photo unless $Image::Magick::VERSION;
+ my $image = Image::Magick->new;
+ $image->BlobToImage($photo);
+ my $err = $image->Resize( geometry => "90x60^" );
+ throw Error::Simple("resize failed: $err") if "$err";
+ $err = $image->Extent( geometry => '90x60', gravity => 'Center' );
+ throw Error::Simple("resize failed: $err") if "$err";
+ $image->Strip();
+ my @blobs = $image->ImageToBlob();
+ undef $image;
+ return $blobs[0];
+}
+
+1;
diff --git a/perllib/FixMyStreet/App/View/Web.pm b/perllib/FixMyStreet/App/View/Web.pm
index da549ece8..a92021f0c 100644
--- a/perllib/FixMyStreet/App/View/Web.pm
+++ b/perllib/FixMyStreet/App/View/Web.pm
@@ -11,7 +11,7 @@ use Utils;
__PACKAGE__->config(
TEMPLATE_EXTENSION => '.html',
- INCLUDE_PATH => [ #
+ INCLUDE_PATH => [
FixMyStreet->path_to( 'templates', 'web', 'base' ),
],
ENCODING => 'utf8',
@@ -38,17 +38,26 @@ TT View for FixMyStreet::App.
=cut
+# Override parent function so that errors are only logged once.
+sub _rendering_error {
+ my ($self, $c, $err) = @_;
+ my $error = qq/Couldn't render template "$err"/;
+ # $c->log->error($error);
+ $c->error($error);
+ return 0;
+}
+
=head2 loc
- [% loc('Some text to localize') %]
+ [% loc('Some text to localize', 'Optional comment for translator') %]
Passes the text to the localisation engine for translations.
=cut
sub loc {
- my ( $self, $c, @args ) = @_;
- return _(@args);
+ my ( $self, $c, $msgid ) = @_;
+ return _($msgid);
}
=head2 nget
@@ -133,6 +142,9 @@ sub escape_js {
'>' => 'u003e',
);
$text =~ s/([\\"'<>])/\\$lookup{$1}/g;
+
+ $text =~ s/(?:\r\n|\n|\r)/\\n/g; # replace newlines
+
return $text;
}
diff --git a/perllib/FixMyStreet/Cobrand/Bromley.pm b/perllib/FixMyStreet/Cobrand/Bromley.pm
index 9bee45128..687843a2a 100644
--- a/perllib/FixMyStreet/Cobrand/Bromley.pm
+++ b/perllib/FixMyStreet/Cobrand/Bromley.pm
@@ -20,15 +20,7 @@ sub disambiguate_location {
my $town = 'Bromley';
- # Bing turns High St Bromley into Bromley High St which is in
- # Bromley by Bow.
- $town .= ', BR1' if $string =~ /^high\s+st(reet)?$/i;
-
- # Disambiguations required for BR5
- $town .= ', BR5' if $string =~ /^kelsey\s+r(?:oa)?d$/i;
- $town = 'BR5 Bromley' if $string =~ /^leith\s+hill$/i; # doesn't like appended BR5 for some reason
-
- # There has also been a road name change for a section of Ramsden Road
+ # There has been a road name change for a section of Ramsden Road
# (BR5) between Church Hill and Court Road has changed to 'Old Priory
# Avenue' - presently entering Old Priory Avenue simply takes the user to
# a different Priory Avenue in Petts Wood
@@ -37,18 +29,10 @@ sub disambiguate_location {
$string = 'Ramsden Road';
$town = ', BR6 0PL';
}
- $town .= ', BR5' if $string =~ /^meadway/i;
-
- # and BR6
- $town .= ', BR6' if $string =~ /^berrylands/i;
# White Horse Hill is on boundary with Greenwich, so need a
# specific postcode
- $town = 'chislehurst, BR7 6DH' if $string =~ /^white\s+horse/i;
-
- # Mottingham Lane is 90% inside Bromley, but goes outside too and Bing
- # defaults to the top end of it.
- $town = 'Mottingham Lane, SE9 4RW' if $string =~ /^mottingham\s+lane/i;
+ $string = 'BR7 6DH' if $string =~ /^white\s+horse/i;
$town = '' if $string =~ /orpington/i;
@@ -61,6 +45,10 @@ sub disambiguate_location {
};
}
+sub get_geocoder {
+ return 'OSM'; # default of Bing gives poor results, let's try overriding.
+}
+
sub example_places {
return ( 'BR1 3UH', 'Glebe Rd, Bromley' );
}
diff --git a/perllib/FixMyStreet/Cobrand/Default.pm b/perllib/FixMyStreet/Cobrand/Default.pm
index c3185ea05..9541f2601 100644
--- a/perllib/FixMyStreet/Cobrand/Default.pm
+++ b/perllib/FixMyStreet/Cobrand/Default.pm
@@ -45,15 +45,6 @@ sub country {
return '';
}
-=head1 problems_clause
-
-Returns a hash for a query to be used by problems (and elsewhere in joined
-queries) to restrict results for a cobrand.
-
-=cut
-
-sub problems_clause {}
-
=head1 problems
Returns a ResultSet of Problems, restricted to a subset if we're on a cobrand
@@ -66,20 +57,20 @@ sub problems {
return $self->{c}->model('DB::Problem');
}
-=head1 site_restriction
+=head1 body_restriction
-Return a site key and a hash of extra query parameters if the cobrand uses a
-subset of the FixMyStreet data. Parameter is any extra data the cobrand needs.
-Returns a site key of 0 and an empty hash if the cobrand uses all the data.
+Return an extra query parameter to restrict reports to those sent to a
+particular body.
=cut
-sub site_restriction { return {}; }
+sub body_restriction {}
+
sub site_key { return 0; }
=head2 restriction
-Return a restriction to pull out data saved while using the cobrand site.
+Return a restriction to data saved while using this specific cobrand site.
=cut
@@ -117,7 +108,8 @@ sub base_url { FixMyStreet->config('BASE_URL') }
=head2 base_url_for_report
Return the base url for a report (might be different in a two-tier county, but
-most of the time will be same as base_url).
+most of the time will be same as base_url). Report may be an object, or a
+hashref.
=cut
@@ -921,4 +913,48 @@ sub jurisdiction_id_example {
return $self->moniker;
}
+=head2 body_details_data
+
+Returns a list of bodies to create with ensure_body. These
+are mostly just passed to ->find_or_create, but there is some
+pre-processing so that you can enter:
+
+ area_id => 123,
+ parent => 'Big Town',
+
+instead of
+
+ body_areas => [ { area_id => 123 } ],
+ parent => { name => 'Big Town' },
+
+For example:
+
+ return (
+ {
+ name => 'Big Town',
+ },
+ {
+ name => 'Small town',
+ parent => 'Big Town',
+ area_id => 1234,
+ },
+
+
+=cut
+
+sub body_details_data {
+ return ();
+}
+
+=head2 contact_details_data
+
+Returns a list of contact_data to create with setup_contacts.
+See Zurich for an example.
+
+=cut
+
+sub contact_details_data {
+ return ()
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/EastSussex.pm b/perllib/FixMyStreet/Cobrand/EastSussex.pm
index 5aabae449..2ba3a4f70 100644
--- a/perllib/FixMyStreet/Cobrand/EastSussex.pm
+++ b/perllib/FixMyStreet/Cobrand/EastSussex.pm
@@ -48,16 +48,16 @@ Can run with a script or command line like:
=cut
use constant POTHOLE_SIZES => [
- {'key' => ['Blank'], 'name' => ['--']},
- {'key' => ['golf'], 'name' => ['Golf ball sized']},
- {'key' => ['tennis'], 'name' => ['Tennis ball sized']},
+ {'key' => ['Blank'], 'name' => ['--']},
+ {'key' => ['golf'], 'name' => ['Golf ball sized']},
+ {'key' => ['tennis'], 'name' => ['Tennis ball sized']},
{'key' => ['football'], 'name' => ['Football sized']},
{'key' => ['larger'], 'name' => ['Larger']}
];
use constant POTHOLE_DICT => {
map {
- @{ $_->{key} },
+ @{ $_->{key} },
@{ $_->{name} },
} @{ POTHOLE_SIZES() },
};
@@ -86,7 +86,7 @@ sub temp_update_potholes_contact {
'description' => 'Size of the pothole?',
'required' => 'true',
'datatype' => 'singlevaluelist',
- 'datatype_description' => {},
+ 'datatype_description' => {},
'values' => {
'value' => $self->POTHOLE_SIZES,
},
@@ -123,5 +123,10 @@ sub send_questionnaires {
return 0;
}
+sub contact_email {
+ my $self = shift;
+ return join( '@', 'highways', 'eastsussex.gov.uk' );
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/Greenwich.pm b/perllib/FixMyStreet/Cobrand/Greenwich.pm
index 18b0c2f5e..7535a34bf 100644
--- a/perllib/FixMyStreet/Cobrand/Greenwich.pm
+++ b/perllib/FixMyStreet/Cobrand/Greenwich.pm
@@ -44,4 +44,9 @@ sub pin_colour {
return 'yellow';
}
+sub contact_email {
+ my $self = shift;
+ return join( '@', 'fixmystreet', 'royalgreenwich.gov.uk' );
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/Oxfordshire.pm b/perllib/FixMyStreet/Cobrand/Oxfordshire.pm
index b9d48a95c..c78ae5e09 100644
--- a/perllib/FixMyStreet/Cobrand/Oxfordshire.pm
+++ b/perllib/FixMyStreet/Cobrand/Oxfordshire.pm
@@ -103,4 +103,9 @@ sub pin_colour {
sub on_map_default_status { return 'open'; }
+sub contact_email {
+ my $self = shift;
+ return join( '@', 'highway.enquiries', 'oxfordshire.gov.uk' );
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/SeeSomething.pm b/perllib/FixMyStreet/Cobrand/SeeSomething.pm
index 75f1c32e8..9ae15fd8d 100644
--- a/perllib/FixMyStreet/Cobrand/SeeSomething.pm
+++ b/perllib/FixMyStreet/Cobrand/SeeSomething.pm
@@ -10,14 +10,9 @@ sub council_name { return 'See Something Say Something'; }
sub council_url { return 'seesomething'; }
sub area_types { [ 'MTD' ] }
-sub site_restriction {
+sub body_restriction {
my $self = shift;
- return { bodies_str => { IN => $self->council_id } };
-}
-
-sub problems_clause {
- my $self = shift;
- return { bodies_str => { IN => $self->council_id } };
+ return $self->council_id;
}
sub area_check {
diff --git a/perllib/FixMyStreet/Cobrand/Stevenage.pm b/perllib/FixMyStreet/Cobrand/Stevenage.pm
index 1de44a50d..5e2f07341 100644
--- a/perllib/FixMyStreet/Cobrand/Stevenage.pm
+++ b/perllib/FixMyStreet/Cobrand/Stevenage.pm
@@ -29,5 +29,10 @@ sub default_map_zoom { return 3; }
sub users_can_hide { return 1; }
+sub contact_email {
+ my $self = shift;
+ return join( '@', 'csc', 'stevenage.gov.uk' );
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/UKCouncils.pm b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
index e653ae522..074da0915 100644
--- a/perllib/FixMyStreet/Cobrand/UKCouncils.pm
+++ b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
@@ -22,10 +22,11 @@ sub path_to_web_templates {
];
}
-sub site_restriction {
+sub body_restriction {
my $self = shift;
- return { bodies_str => sprintf('%d', $self->council_id) };
+ return $self->council_id;
}
+
sub site_key {
my $self = shift;
return $self->council_url;
@@ -35,23 +36,9 @@ sub restriction {
return { cobrand => shift->moniker };
}
-# Different function to site_restriction due to two-tier use
-sub problems_clause {
- my $self = shift;
-
- if ($self->is_two_tier) {
- return { bodies_str => {
- like => ('%' . $self->council_id . '%')
- }};
- }
- else {
- return { bodies_str => sprintf('%d', $self->council_id) };
- }
-}
-
sub problems {
my $self = shift;
- return $self->{c}->model('DB::Problem')->search( $self->problems_clause );
+ return $self->{c}->model('DB::Problem')->to_body($self->council_id);
}
sub base_url {
@@ -122,8 +109,15 @@ sub recent_photos {
# Returns true if the cobrand owns the problem.
sub owns_problem {
my ($self, $report) = @_;
- my $bodies = $report->bodies;
- my %areas = map { %{$_->areas} } values %$bodies;
+ my @bodies;
+ if (ref $report eq 'HASH') {
+ return unless $report->{bodies_str};
+ @bodies = split /,/, $report->{bodies_str};
+ @bodies = FixMyStreet::App->model('DB::Body')->search({ id => \@bodies })->all;
+ } else { # Object
+ @bodies = values %{$report->bodies};
+ }
+ my %areas = map { %{$_->areas} } @bodies;
return $areas{$self->council_id} ? 1 : undef;
}
diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm
index c64fe1177..6da3e566c 100644
--- a/perllib/FixMyStreet/Cobrand/Zurich.pm
+++ b/perllib/FixMyStreet/Cobrand/Zurich.pm
@@ -5,9 +5,12 @@ use DateTime;
use POSIX qw(strcoll);
use RABX;
use Scalar::Util 'blessed';
+use DateTime::Format::Pg;
use strict;
use warnings;
+use feature 'say';
+use utf8;
=head1 NAME
@@ -105,8 +108,11 @@ sub prettify_dt {
sub zurich_closed_states {
my $states = {
'fixed - council' => 1,
- 'closed' => 1,
+ 'closed' => 1, # extern
'hidden' => 1,
+ 'investigating' => 1, # wish
+ 'unable to fix' => 1, # jurisdiction unknown
+ 'partial' => 1, # not contactable
};
return wantarray ? keys %{ $states } : $states;
@@ -117,6 +123,37 @@ sub problem_is_closed {
return exists $self->zurich_closed_states->{ $problem->state } ? 1 : 0;
}
+sub zurich_public_response_states {
+ my $states = {
+ 'fixed - council' => 1,
+ 'closed' => 1, # extern
+ 'unable to fix' => 1, # jurisdiction unknown
+ };
+
+ return wantarray ? keys %{ $states } : $states;
+}
+
+sub zurich_user_response_states {
+ my $states = {
+ 'hidden' => 1,
+ 'investigating' => 1, # wish
+ 'partial' => 1, # not contactable
+ };
+
+ return wantarray ? keys %{ $states } : $states;
+}
+
+sub problem_has_public_response {
+ my ($self, $problem) = @_;
+ return exists $self->zurich_public_response_states->{ $problem->state } ? 1 : 0;
+}
+
+sub problem_has_user_response {
+ my ($self, $problem) = @_;
+ my $state_matches = exists $self->zurich_user_response_states->{ $problem->state } ? 1 : 0;
+ return $state_matches && $problem->get_extra_metadata('public_response');
+}
+
sub problem_as_hashref {
my $self = shift;
my $problem = shift;
@@ -132,16 +169,35 @@ sub problem_as_hashref {
$hashref->{title} = _('This report is awaiting moderation.');
$hashref->{state} = 'submitted';
$hashref->{state_t} = _('Submitted');
+ $hashref->{banner_id} = 'closed';
} else {
if ( $problem->state eq 'confirmed' ) {
$hashref->{state} = 'open';
$hashref->{state_t} = _('Open');
+ $hashref->{banner_id} = 'closed';
+ } elsif ( $problem->state eq 'closed' ) {
+ $hashref->{state} = 'extern'; # is this correct?
+ $hashref->{banner_id} = 'closed';
+ $hashref->{state_t} = _('Extern');
+ } elsif ( $problem->state eq 'unable to fix' ) {
+ $hashref->{state} = 'jurisdiction unknown'; # is this correct?
+ $hashref->{state_t} = _('Jurisdiction Unknown');
+ $hashref->{banner_id} = 'fixed'; # green
+ } elsif ( $problem->state eq 'partial' ) {
+ $hashref->{state} = 'not contactable'; # is this correct?
+ $hashref->{state_t} = _('Not contactable');
+ # no banner_id as hidden
+ } elsif ( $problem->state eq 'investigating' ) {
+ $hashref->{state} = 'wish'; # is this correct?
+ $hashref->{state_t} = _('Wish');
} elsif ( $problem->is_fixed ) {
$hashref->{state} = 'closed';
+ $hashref->{banner_id} = 'fixed';
$hashref->{state_t} = _('Closed');
} elsif ( $problem->state eq 'in progress' || $problem->state eq 'planned' ) {
$hashref->{state} = 'in progress';
$hashref->{state_t} = _('In progress');
+ $hashref->{banner_id} = 'progress';
}
}
@@ -275,13 +331,46 @@ sub get_or_check_overdue {
return $self->overdue($problem);
}
+=head1 C<set_problem_state>
+
+If the state has changed, sets the state and calls C::Admin's C<log_edit> action.
+If the state hasn't changed, defers to update_admin_log (to update time_spent if any).
+
+Returns either undef or the AdminLog entry created.
+
+=cut
+
sub set_problem_state {
my ($self, $c, $problem, $new_state) = @_;
- return if $new_state eq $problem->state;
+ return $self->update_admin_log($c, $problem) if $new_state eq $problem->state;
$problem->state( $new_state );
$c->forward( 'log_edit', [ $problem->id, 'problem', "state change to $new_state" ] );
}
+=head1 C<update_admin_log>
+
+Calls C::Admin's C<log_edit> if either a) text is provided, or b) there has
+been time_spent on the task. As set_problem_state will already call log_edit
+if required, don't call this as well.
+
+Returns either undef or the AdminLog entry created.
+
+=cut
+
+sub update_admin_log {
+ my ($self, $c, $problem, $text) = @_;
+
+ my $time_spent = ( ($c->get_param('time_spent') // 0) + 0 );
+ $c->set_param('time_spent' => 0); # explicitly zero this to avoid duplicates
+
+ if (!$text) {
+ return unless $time_spent;
+ $text = "Logging time_spent";
+ }
+
+ $c->forward( 'log_edit', [ $problem->id, 'problem', $text, $time_spent ] );
+}
+
# Specific administrative displays
sub admin_pages {
@@ -289,23 +378,25 @@ sub admin_pages {
my $c = $self->{c};
my $type = $c->stash->{admin_type};
+
my $pages = {
'summary' => [_('Summary'), 0],
'reports' => [_('Reports'), 2],
'report_edit' => [undef, undef],
'update_edit' => [undef, undef],
+ 'stats' => [_('Stats'), 4],
};
return $pages if $type eq 'sdm';
$pages = { %$pages,
'bodies' => [_('Bodies'), 1],
'body' => [undef, undef],
+ 'templates' => [_('Templates'), 2],
};
return $pages if $type eq 'dm';
$pages = { %$pages,
'users' => [_('Users'), 3],
- 'stats' => [_('Stats'), 4],
'user_edit' => [undef, undef],
};
return $pages if $type eq 'super';
@@ -448,7 +539,7 @@ sub admin_report_edit {
}
- # If super or sdm check that the token is correct before proceeding
+ # If super or dm check that the token is correct before proceeding
if ( ($type eq 'super' || $type eq 'dm') && $c->get_param('submit') ) {
$c->forward('check_token');
}
@@ -468,6 +559,7 @@ sub admin_report_edit {
}
}
+
# Problem updates upon submission
if ( ($type eq 'super' || $type eq 'dm') && $c->get_param('submit') ) {
$problem->set_extra_metadata('publish_photo' => $c->get_param('publish_photo') || 0 );
@@ -488,10 +580,43 @@ sub admin_report_edit {
my $internal_note_text = "";
# Workflow things
+ #
+ # Note that 2 types of email may be sent
+ # 1) _admin_send_email() sends an email to the *user*, if their email is confirmed
+ #
+ # 2) setting $problem->whensent(undef) may make it eligible for generating an email
+ # to the body (internal or external). See DBRS::Problem->send_reports for Zurich-
+ # specific categories which are eligible for this.
+ #
+ # It looks like both of these will do:
+ # a) TT processing of [% ... %] directives, in FMS::App->send_email(_cron)
+ # b) pseudo-PHP substitution of <?=$values['name']?> which is done as
+ # naive substitution
+ # commonlib mySociety::Email
+ #
+ # So it makes sense to add new parameters as the more powerful TT (a).
+
my $redirect = 0;
- my $new_cat = $c->get_param('category');
- if ( $new_cat && $new_cat ne $problem->category ) {
- my $cat = $c->model('DB::Contact')->search( { category => $c->get_param('category') } )->first;
+ my $new_cat = $c->get_param('category') || '';
+ my $state = $c->get_param('state') || '';
+ my $oldstate = $problem->state;
+
+ my $closure_states = $self->zurich_closed_states;
+ delete $closure_states->{'fixed - council'}; # may not be needed?
+
+ my $old_closure_state = $problem->get_extra_metadata('closure_status');
+
+ # update the public update from DM
+ if (my $update = $c->get_param('status_update')) {
+ $problem->set_extra_metadata(public_response => $update);
+ }
+
+ if (
+ ($state eq 'confirmed')
+ && $new_cat
+ && $new_cat ne $problem->category
+ ) {
+ my $cat = $c->model('DB::Contact')->search({ category => $c->get_param('category') } )->first;
my $old_cat = $problem->category;
$problem->category( $new_cat );
$problem->external_body( undef );
@@ -499,7 +624,25 @@ sub admin_report_edit {
$problem->whensent( undef );
$problem->set_extra_metadata(changed_category => 1);
$internal_note_text = "Weitergeleitet von $old_cat an $new_cat";
+ $self->update_admin_log($c, $problem, "Changed category from $old_cat to $new_cat");
$redirect = 1 if $cat->body_id ne $body->id;
+ } elsif ( $closure_states->{$state} and
+ ( $oldstate ne 'planned' )
+ || (($old_closure_state ||'') ne $state))
+ {
+ # for these states
+ # - closed (Extern)
+ # - investigating (Wish)
+ # - hidden
+ # - partial (Not contactable)
+ # - unable to fix (Jurisdiction unknown)
+ # we divert to planned (Rueckmeldung ausstehend) and set closure_status to the requested state
+ # From here, the DM can reply to the user, triggering the setting of problem to correct state
+ $problem->set_extra_metadata( closure_status => $state );
+ $self->set_problem_state($c, $problem, 'planned');
+ $state = 'planned';
+ $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) );
+
} elsif ( my $subdiv = $c->get_param('body_subdivision') ) {
$problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) );
$self->set_problem_state($c, $problem, 'in progress');
@@ -507,31 +650,82 @@ sub admin_report_edit {
$problem->bodies_str( $subdiv );
$problem->whensent( undef );
$redirect = 1;
- } elsif ( my $external = $c->get_param('body_external') ) {
- $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) );
- $self->set_problem_state($c, $problem, 'closed');
- $problem->set_extra_metadata_if_undefined( closed_overdue => $self->overdue( $problem ) );
- $problem->external_body( $external );
- $problem->whensent( undef );
- _admin_send_email( $c, 'problem-external.txt', $problem );
- $redirect = 1;
} else {
- if (my $state = $c->get_param('state')) {
+ if ($state) {
- if ($problem->state eq 'unconfirmed' and $state ne 'unconfirmed') {
+ if ($oldstate eq 'unconfirmed' and $state ne 'unconfirmed') {
# only set this for the first state change
$problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) );
}
- $self->set_problem_state($c, $problem, $state);
+ $self->set_problem_state($c, $problem, $state)
+ unless $closure_states->{$state};
+ # we'll defer to 'planned' clause below to change the state
+ }
+ }
+
+ if ($problem->state eq 'planned') {
+ # Rueckmeldung ausstehend
+ # override $state from the metadata set above
+ $state = $problem->get_extra_metadata('closure_status') || '';
+ my ($moderated, $closed) = (0, 0);
- if ($self->problem_is_closed($problem)) {
- $problem->set_extra_metadata_if_undefined( closed_overdue => $self->overdue( $problem ) );
+ if ($state eq 'hidden' && $c->get_param('publish_response') ) {
+ _admin_send_email( $c, 'problem-rejected.txt', $problem );
+
+ $self->set_problem_state($c, $problem, $state);
+ $moderated++;
+ $closed++;
+ }
+ elsif ($state =~/^(closed|investigating)$/) { # Extern | Wish
+ $moderated++;
+ # Nested if instead of `and` because in these cases, we *don't*
+ # want to close unless we have body_external (so we don't want
+ # the final elsif clause below to kick in on publish_response)
+ if (my $external = $c->get_param('body_external')) {
+ my $external_body = $c->model('DB::Body')->find($external)
+ or die "Body $external not found";
+ $problem->external_body( $external );
+ }
+ if ($problem->external_body && $c->get_param('publish_response')) {
+ $problem->whensent( undef );
+ $self->set_problem_state($c, $problem, $state);
+ my $template = ($state eq 'investigating') ? 'problem-wish.txt' : 'problem-external.txt';
+ _admin_send_email( $c, $template, $problem );
+ $redirect = 0;
+ $closed++;
}
- if ( $state eq 'hidden' && $c->get_param('send_rejected_email') ) {
- _admin_send_email( $c, 'problem-rejected.txt', $problem );
+ # set the external_message in extra, so that it can be edited again
+ if ( my $external_message = $c->get_param('external_message') ) {
+ $problem->set_extra_metadata( external_message => $external_message );
}
+ # else should really return a message here
+ }
+ elsif ($c->get_param('publish_response')) {
+ # otherwise we only set the state if publish_response is set
+ #
+
+ # if $state wasn't set, then we are simply closing the message as fixed
+ $state ||= 'fixed - council';
+ _admin_send_email( $c, 'problem-closed.txt', $problem );
+ $redirect = 0;
+ $moderated++;
+ $closed++;
+ }
+
+ if ($moderated) {
+ $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) );
}
+
+ if ($closed) {
+ # set to either the closure_status from metadata or 'fixed - council' as above
+ $self->set_problem_state($c, $problem, $state);
+ $problem->set_extra_metadata_if_undefined( closed_overdue => $self->overdue( $problem ) );
+ $problem->unset_extra_metadata('closure_status');
+ }
+ }
+ else {
+ $problem->unset_extra_metadata('closure_status');
}
$problem->title( $c->get_param('title') ) if $c->get_param('title');
@@ -539,21 +733,42 @@ sub admin_report_edit {
$problem->latitude( $c->get_param('latitude') );
$problem->longitude( $c->get_param('longitude') );
- # Final, public, Update from DM
- if (my $update = $c->get_param('status_update')) {
- $problem->set_extra_metadata(public_response => $update);
- if ($c->get_param('publish_response')) {
- $self->set_problem_state($c, $problem, 'fixed - council');
- $problem->set_extra_metadata( closed_overdue => $self->overdue( $problem ) );
- _admin_send_email( $c, 'problem-closed.txt', $problem );
- }
+ # send external_message if provided and state is *now* Wish|Extern
+ # e.g. was already, or was set in the Rueckmeldung ausstehend clause above.
+ if ( my $external_message = $c->get_param('external_message')
+ and $problem->state =~ /^(closed|investigating)$/)
+ {
+ my $external = $problem->external_body;
+ my $external_body = $c->model('DB::Body')->find($external)
+ or die "Body $external not found";
+
+ $problem->set_extra_metadata_if_undefined( moderated_overdue => $self->overdue( $problem ) );
+ # Create a Comment on this Problem with the content of the external message.
+ # NB this isn't directly shown anywhere, but is for logging purposes.
+ $problem->add_to_comments( {
+ text => (
+ sprintf '(%s %s) %s',
+ $state eq 'closed' ?
+ _('Forwarded to external body') :
+ _('Forwarded wish to external body'),
+ $external_body->name,
+ $external_message,
+ ),
+ user => $c->user->obj,
+ state => 'hidden', # seems best fit, should not be shown publicly
+ mark_fixed => 0,
+ anonymous => 1,
+ extra => { is_internal_note => 1, is_external_message => 1 },
+ } );
+ # set the external_message in extra, so that it will be picked up
+ # later by send-reports
+ $problem->set_extra_metadata( external_message => $external_message );
}
- $problem->lastupdate( \'ms_current_timestamp()' );
+ $problem->lastupdate( \'current_timestamp' );
$problem->update;
- $c->stash->{status_message} =
- '<p><em>' . _('Updated!') . '</em></p>';
+ $c->stash->{status_message} = '<p class="message-updated">' . _('Updated!') . '</p>';
# do this here otherwise lastupdate and confirmed times
# do not display correctly (reloads problem from database, including
@@ -572,14 +787,21 @@ sub admin_report_edit {
} );
}
- if ( $redirect ) {
- $c->detach('index');
+ # Just update if time_spent still hasn't been logged
+ # (this will only happen if no other update_admin_log has already been called)
+ $self->update_admin_log($c, $problem);
+
+ if ( $redirect and $type eq 'dm' ) {
+ # only redirect for DM
+ $c->stash->{status_message} ||= '<p class="message-updated">' . _('Updated!') . '</p>';
+ $c->go('index');
}
$c->stash->{updates} = [ $c->model('DB::Comment')
->search( { problem_id => $problem->id }, { order_by => 'created' } )
->all ];
+ $self->stash_states($problem);
return 1;
}
@@ -588,15 +810,32 @@ sub admin_report_edit {
# Has cut-down edit template for adding update and sending back up only
$c->stash->{template} = 'admin/report_edit-sdm.html';
- if ($c->get_param('send_back')) {
+ if ($c->get_param('send_back') or $c->get_param('not_contactable')) {
+ # SDM can send back a report either to be assigned to a different
+ # subdivision, or because the customer was not contactable.
+ # We handle these in the same way but with different statuses.
+
$c->forward('check_token');
+ my $not_contactable = $c->get_param('not_contactable');
+
$problem->bodies_str( $body->parent->id );
- $self->set_problem_state($c, $problem, 'confirmed');
+ if ($not_contactable) {
+ # we can't directly set state, but mark the closure_status for DM to confirm.
+ $self->set_problem_state($c, $problem, 'planned');
+ $problem->set_extra_metadata( closure_status => 'partial');
+ }
+ else {
+ $self->set_problem_state($c, $problem, 'confirmed');
+ }
$problem->update;
- # log here
+ $c->forward( 'log_edit', [ $problem->id, 'problem',
+ $not_contactable ?
+ _('Customer not contactable')
+ : _('Sent report back') ] );
+ # Make sure the problem's time_spent is updated
+ $self->update_admin_log($c, $problem);
$c->res->redirect( '/admin/summary' );
-
} elsif ($c->get_param('submit')) {
$c->forward('check_token');
@@ -621,8 +860,10 @@ sub admin_report_edit {
anonymous => 1,
} );
}
+ # Make sure the problem's time_spent is updated
+ $self->update_admin_log($c, $problem);
- $c->stash->{status_message} = '<p><em>' . _('Updated!') . '</em></p>';
+ $c->stash->{status_message} = '<p class="message-updated">' . _('Updated!') . '</p>';
# If they clicked the no more updates button, we're done.
if ($c->get_param('no_more_updates')) {
@@ -639,14 +880,113 @@ sub admin_report_edit {
->search( { problem_id => $problem->id }, { order_by => 'created' } )
->all ];
+ $self->stash_states($problem);
return 1;
}
+ $self->stash_states($problem);
return 0;
}
+sub stash_states {
+ my ($self, $problem) = @_;
+ my $c = $self->{c};
+
+ # current problem state affects which states are visible in dropdowns
+ my @states = (
+ {
+ # Erfasst
+ state => 'unconfirmed',
+ trans => _('Submitted'),
+ unconfirmed => 1,
+ hidden => 1,
+ },
+ {
+ # Aufgenommen
+ state => 'confirmed',
+ trans => _('Open'),
+ unconfirmed => 1,
+ },
+ {
+ # Unsichtbar (hidden)
+ state => 'hidden',
+ trans => _('Hidden'),
+ unconfirmed => 1,
+ hidden => 1,
+ },
+ {
+ # Extern
+ state => 'closed',
+ trans => _('Extern'),
+ },
+ {
+ # Zustaendigkeit unbekannt
+ state => 'unable to fix',
+ trans => _('Jurisdiction unknown'),
+ },
+ {
+ # Wunsch (hidden)
+ state => 'investigating',
+ trans => _('Wish'),
+ },
+ {
+ # Nicht kontaktierbar (hidden)
+ state => 'partial',
+ trans => _('Not contactable'),
+ },
+ );
+ my %state_trans = map { $_->{state} => $_->{trans} } @states;
+
+ my $state = $problem->state;
+
+ # Rueckmeldung ausstehend may also indicate the status it's working towards.
+ push @states, do {
+ if ($state eq 'planned' and my $closure_status = $problem->get_extra_metadata('closure_status')) {
+ {
+ state => $closure_status,
+ trans => sprintf '%s (%s)', _('Planned'), $state_trans{$closure_status},
+ };
+ }
+ else {
+ {
+ state => 'planned',
+ trans => _('Planned'),
+ };
+ }
+ };
+
+ if ($state eq 'in progress') {
+ push @states, {
+ state => 'in progress',
+ trans => _('In progress'),
+ };
+ }
+ elsif ($state eq 'fixed - council') {
+ push @states, {
+ state => 'fixed - council',
+ trans => _('Closed'),
+ };
+ }
+ elsif ($state =~/^(hidden|unconfirmed)$/) {
+ @states = grep { $_->{$state} } @states;
+ }
+ $c->stash->{states} = \@states;
+ $c->stash->{states_trans} = { map { $_->{state} => $_->{trans} } @states }; # [% states_trans.${problem.state} %]
+
+ # stash details about the public response
+ $c->stash->{default_public_response} = "\nFreundliche Grüsse\n\nIhre Stadt Zürich\n";
+ $c->stash->{show_publish_response} =
+ ($problem->state eq 'planned');
+}
+
+=head2 _admin_send_email
+
+Send an email to the B<user> who logged the problem, if their email address is confirmed.
+
+=cut
+
sub _admin_send_email {
my ( $c, $template, $problem ) = @_;
@@ -665,9 +1005,36 @@ sub _admin_send_email {
to => [ $to ],
url => $c->uri_for_email( $problem->url ),
from => [ $sender, $sender_name ],
+ problem => $problem,
} );
}
+sub munge_sendreport_params {
+ my ($self, $c, $row, $h, $params) = @_;
+ if ($row->state =~ /^(closed|investigating)$/ && $row->get_extra_metadata('publish_photo')) {
+ # we attach images to reports sent to external bodies
+ my $photoset = $row->get_photoset($c);
+ my @images = $photoset->all_images
+ or return;
+ my $index = 0;
+ my $id = $row->id;
+ my @attachments = map {
+ my $i = $index++;
+ {
+ body => $_->[1],
+ attributes => {
+ filename => "$id.$i.jpeg",
+ content_type => 'image/jpeg',
+ encoding => 'base64',
+ # quoted-printable ends up with newlines corrupting binary data
+ name => "$id.$i.jpeg",
+ },
+ }
+ } @images;
+ $params->{attachments} = \@attachments;
+ }
+}
+
sub admin_fetch_all_bodies {
my ( $self, @bodies ) = @_;
@@ -718,7 +1085,10 @@ sub admin_stats {
if ($y && $m) {
$c->stash->{start_date} = DateTime->new( year => $y, month => $m, day => 1 );
$c->stash->{end_date} = $c->stash->{start_date} + DateTime::Duration->new( months => 1 );
- $date_params{created} = { '>=', $c->stash->{start_date}, '<', $c->stash->{end_date} };
+ $date_params{created} = {
+ '>=', DateTime::Format::Pg->format_datetime($c->stash->{start_date}),
+ '<', DateTime::Format::Pg->format_datetime($c->stash->{end_date}),
+ };
}
my %params = (
@@ -730,6 +1100,8 @@ sub admin_stats {
my $problems = $c->model('DB::Problem')->search(
{%date_params},
{
+ join => 'admin_log_entries',
+ distinct => 1,
columns => [
'id', 'created',
'latitude', 'longitude',
@@ -741,10 +1113,11 @@ sub admin_stats {
'whensent', 'lastupdate',
'service',
'extra',
- ],
+ { sum_time_spent => { sum => 'admin_log_entries.time_spent' } },
+ ]
}
);
- my $body = "Report ID,Created,Sent to Agency,Last Updated,E,N,Category,Status,UserID,External Body,Title,Detail,Media URL,Interface Used,Council Response\n";
+ my $body = "Report ID,Created,Sent to Agency,Last Updated,E,N,Category,Status,UserID,External Body,Time Spent,Title,Detail,Media URL,Interface Used,Council Response\n";
require Text::CSV;
my $csv = Text::CSV->new({ binary => 1 });
while ( my $report = $problems->next ) {
@@ -759,7 +1132,10 @@ sub admin_stats {
# replace newlines with HTML <br/> element
$detail =~ s{\r?\n}{ <br/> }g;
- $public_response =~ s{\r?\n}{ <br/> }g;
+ $public_response =~ s{\r?\n}{ <br/> }g if $public_response;
+
+ # Assemble photo URL, if report has a photo
+ my $media_url = $report->get_photo_params->{url} ? ($c->cobrand->base_url . $report->get_photo_params->{url}) : '';
my @columns = (
$report->id,
@@ -769,9 +1145,10 @@ sub admin_stats {
$report->local_coords, $report->category,
$report->state, $report->user_id,
$body_name,
+ $report->get_column('sum_time_spent') || 0,
$report->title,
$detail,
- $c->cobrand->base_url . $report->get_photo_params->{url},
+ $media_url,
$report->service || 'Web interface',
$public_response,
);
@@ -850,4 +1227,111 @@ sub admin_stats {
return 1;
}
+sub problem_confirm_email_extras {
+ my ($self, $report) = @_;
+ my $confirmed_reports = $report->user->problems->search({
+ extra => { like => '%email_confirmed%' },
+ })->count;
+
+ $self->{c}->stash->{email_confirmed} = $confirmed_reports;
+}
+
+sub body_details_data {
+ return (
+ {
+ name => 'Stadt Zurich'
+ },
+ {
+ name => 'Elektrizitäwerk Stadt Zürich',
+ parent => 'Stadt Zurich',
+ area_id => 423017,
+ },
+ {
+ name => 'ERZ Entsorgung + Recycling Zürich',
+ parent => 'Stadt Zurich',
+ area_id => 423017,
+ },
+ {
+ name => 'Fachstelle Graffiti',
+ parent => 'Stadt Zurich',
+ area_id => 423017,
+ },
+ {
+ name => 'Grün Stadt Zürich',
+ parent => 'Stadt Zurich',
+ area_id => 423017,
+ },
+ {
+ name => 'Tiefbauamt Stadt Zürich',
+ parent => 'Stadt Zurich',
+ area_id => 423017,
+ },
+ {
+ name => 'Dienstabteilung Verkehr',
+ parent => 'Stadt Zurich',
+ area_id => 423017,
+ },
+ );
+}
+
+sub contact_details_data {
+ return (
+ {
+ category => 'Beleuchtung/Uhren',
+ body_name => 'Elektrizitätswerk Stadt Zürich',
+ fields => [
+ {
+ code => 'strasse',
+ description => 'Strasse',
+ datatype => 'string',
+ required => 'yes',
+ },
+ {
+ code => 'haus_nr',
+ description => 'Haus-Nr.',
+ datatype => 'string',
+ },
+ {
+ code => 'mast_nr',
+ description => 'Mast-Nr.',
+ datatype => 'string',
+ }
+ ],
+ },
+ {
+ category => 'Brunnen/Hydranten',
+ # body_name ???
+ fields => [
+ {
+ code => 'hydranten_nr',
+ description => 'Hydranten-Nr.',
+ datatype => 'string',
+ },
+ ],
+ },
+ {
+ category => "Grünflächen/Spielplätze",
+ body_name => 'Grün Stadt Zürich',
+ rename_from => "Tiere/Grünflächen",
+ },
+ {
+ category => 'Spielplatz/Sitzbank',
+ body_name => 'Grün Stadt Zürich',
+ delete => 1,
+ },
+ );
+}
+
+sub contact_details_data_body_default {
+ my ($self) = @_;
+ # temporary measure to assign un-bodied contacts to parent
+ # (this isn't at all how things will be setup in live, but is
+ # handy during dev.)
+ return $self->{c}->model('DB::Body')->find({ name => 'Stadt Zurich' });
+}
+
+sub reports_per_page { return 20; }
+
+sub singleton_bodies_str { 1 }
+
1;
diff --git a/perllib/FixMyStreet/DB/Result/AdminLog.pm b/perllib/FixMyStreet/DB/Result/AdminLog.pm
index 41bc3100a..d60915cfc 100644
--- a/perllib/FixMyStreet/DB/Result/AdminLog.pm
+++ b/perllib/FixMyStreet/DB/Result/AdminLog.pm
@@ -29,13 +29,16 @@ __PACKAGE__->add_columns(
"whenedited",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
"user_id",
{ data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
"reason",
{ data_type => "text", default_value => "", is_nullable => 0 },
+ "time_spent",
+ { data_type => "integer", default_value => "0", is_nullable => 0 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->belongs_to(
@@ -51,7 +54,7 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2014-07-31 15:58:54
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:okGiaKaVYaTrlz0LCV01vA
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:RCi1FEwb9T2MZ2X+QOTTUA
1;
diff --git a/perllib/FixMyStreet/DB/Result/Alert.pm b/perllib/FixMyStreet/DB/Result/Alert.pm
index c64cb2ff4..35cce8368 100644
--- a/perllib/FixMyStreet/DB/Result/Alert.pm
+++ b/perllib/FixMyStreet/DB/Result/Alert.pm
@@ -37,8 +37,9 @@ __PACKAGE__->add_columns(
"whensubscribed",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
"whendisabled",
{ data_type => "timestamp", is_nullable => 1 },
@@ -64,8 +65,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2013-09-10 17:11:54
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:d9yIFiTGtbtFaULXZNKstQ
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:5RNyB430T8PqtFlmGV/MUg
# You can replace this text with custom code or comments, and it will be preserved on regeneration
@@ -106,7 +107,7 @@ sub confirm {
sub disable {
my $self = shift;
- $self->whendisabled( \'ms_current_timestamp()' );
+ $self->whendisabled( \'current_timestamp' );
$self->update;
return 1;
diff --git a/perllib/FixMyStreet/DB/Result/AlertSent.pm b/perllib/FixMyStreet/DB/Result/AlertSent.pm
index 422e010a9..83043a33b 100644
--- a/perllib/FixMyStreet/DB/Result/AlertSent.pm
+++ b/perllib/FixMyStreet/DB/Result/AlertSent.pm
@@ -18,8 +18,9 @@ __PACKAGE__->add_columns(
"whenqueued",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
);
__PACKAGE__->belongs_to(
@@ -30,8 +31,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2013-09-10 17:11:54
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:COwsprqRSNZS1IxJrPYgMQ
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:/+Vodu8VJxJ0EY9P3Qjjjw
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Body.pm b/perllib/FixMyStreet/DB/Result/Body.pm
index 0c1046cd8..a2e004c6a 100644
--- a/perllib/FixMyStreet/DB/Result/Body.pm
+++ b/perllib/FixMyStreet/DB/Result/Body.pm
@@ -18,12 +18,6 @@ __PACKAGE__->add_columns(
is_nullable => 0,
sequence => "body_id_seq",
},
- "name",
- { data_type => "text", is_nullable => 0 },
- "external_url",
- { data_type => "text", is_nullable => 1 },
- "parent",
- { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
"endpoint",
{ data_type => "text", is_nullable => 1 },
"jurisdiction",
@@ -42,8 +36,14 @@ __PACKAGE__->add_columns(
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
"send_extended_statuses",
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
+ "name",
+ { data_type => "text", is_nullable => 0 },
+ "parent",
+ { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
"deleted",
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
+ "external_url",
+ { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
@@ -87,6 +87,12 @@ __PACKAGE__->belongs_to(
},
);
__PACKAGE__->has_many(
+ "response_templates",
+ "FixMyStreet::DB::Result::ResponseTemplate",
+ { "foreign.body_id" => "self.id" },
+ { cascade_copy => 0, cascade_delete => 0 },
+);
+__PACKAGE__->has_many(
"user_body_permissions",
"FixMyStreet::DB::Result::UserBodyPermission",
{ "foreign.body_id" => "self.id" },
@@ -100,8 +106,8 @@ __PACKAGE__->has_many(
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2014-07-29 13:54:07
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:PhUeFDRLSQVMk7Sts5K6MQ
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-02-19 16:13:43
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:d6GuQm8vrNmCc4NWw58srA
sub url {
my ( $self, $c, $args ) = @_;
diff --git a/perllib/FixMyStreet/DB/Result/Comment.pm b/perllib/FixMyStreet/DB/Result/Comment.pm
index 836462ed5..0caaa8968 100644
--- a/perllib/FixMyStreet/DB/Result/Comment.pm
+++ b/perllib/FixMyStreet/DB/Result/Comment.pm
@@ -31,8 +31,9 @@ __PACKAGE__->add_columns(
"created",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
"confirmed",
{ data_type => "timestamp", is_nullable => 1 },
@@ -88,8 +89,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2014-07-31 15:59:43
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:08AtJ6CZFyUe7qKMF50MHg
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZR+YNA1Jej3s+8mr52iq6Q
#
__PACKAGE__->load_components("+FixMyStreet::DB::RABXColumn");
@@ -144,7 +145,7 @@ sub confirm {
my $self = shift;
$self->state( 'confirmed' );
- $self->confirmed( \'ms_current_timestamp()' );
+ $self->confirmed( \'current_timestamp' );
}
=head2 get_photo_params
diff --git a/perllib/FixMyStreet/DB/Result/ModerationOriginalData.pm b/perllib/FixMyStreet/DB/Result/ModerationOriginalData.pm
index 08d03f94b..d7240cd5d 100644
--- a/perllib/FixMyStreet/DB/Result/ModerationOriginalData.pm
+++ b/perllib/FixMyStreet/DB/Result/ModerationOriginalData.pm
@@ -33,8 +33,9 @@ __PACKAGE__->add_columns(
"created",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
);
__PACKAGE__->set_primary_key("id");
@@ -46,7 +47,7 @@ __PACKAGE__->belongs_to(
{
is_deferrable => 0,
join_type => "LEFT",
- on_delete => "NO ACTION",
+ on_delete => "CASCADE,",
on_update => "NO ACTION",
},
);
@@ -54,12 +55,12 @@ __PACKAGE__->belongs_to(
"problem",
"FixMyStreet::DB::Result::Problem",
{ id => "problem_id" },
- { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
+ { is_deferrable => 0, on_delete => "CASCADE,", on_update => "NO ACTION" },
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2014-07-31 15:59:43
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:yR1Vi7cJQrX67dFwAcJW6w
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:DBtGjCJykDtLnGtkj638eA
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index bed2f160a..3b7f8bcfd 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -53,8 +53,9 @@ __PACKAGE__->add_columns(
"created",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
"confirmed",
{ data_type => "timestamp", is_nullable => 1 },
@@ -71,8 +72,9 @@ __PACKAGE__->add_columns(
"lastupdate",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
"whensent",
{ data_type => "timestamp", is_nullable => 1 },
@@ -102,6 +104,8 @@ __PACKAGE__->add_columns(
{ data_type => "integer", default_value => 0, is_nullable => 1 },
"subcategory",
{ data_type => "text", is_nullable => 1 },
+ "bodies_missing",
+ { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
@@ -130,8 +134,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07035 @ 2014-07-31 15:57:02
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:EvD4sS1mdJJyI1muZ4TrCw
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Go+T9oFRfwQ1Ag89qPpF/g
# Add fake relationship to stored procedure table
__PACKAGE__->has_one(
@@ -319,10 +323,6 @@ sub visible_states_remove {
}
}
-sub visible_states_add_unconfirmed {
- $_[0]->visible_states_add('unconfirmed')
-}
-
=head2
@states = FixMyStreet::DB::Problem::council_states();
@@ -400,7 +400,7 @@ sub check_for_errors {
$errors{bodies} = _('No council selected')
unless $self->bodies_str
- && $self->bodies_str =~ m/^(?:-1|[\d,]+(?:\|[\d,]+)?)$/;
+ && $self->bodies_str =~ m/^(?:-1|[\d,]+)$/;
if ( !$self->name || $self->name !~ m/\S/ ) {
$errors{name} = _('Please enter your name');
@@ -441,15 +441,14 @@ sub confirm {
return if $self->state eq 'confirmed';
$self->state('confirmed');
- $self->confirmed( \'ms_current_timestamp()' );
+ $self->confirmed( \'current_timestamp' );
return 1;
}
sub bodies_str_ids {
my $self = shift;
return unless $self->bodies_str;
- (my $bodies = $self->bodies_str) =~ s/\|.*$//;
- my @bodies = split( /,/, $bodies );
+ my @bodies = split( /,/, $self->bodies_str );
return \@bodies;
}
@@ -480,11 +479,17 @@ sub url {
=head2 get_photo_params
-Returns a hashref of details of any attached photo for use in templates.
+Returns a hashref of details of the attached photo, if any, for use in templates.
+
+NB: this method doesn't currently support multiple photos gracefully.
+
+Use get_photoset($c) instead to do the right thing with reports with 0, 1, or more photos.
=cut
sub get_photo_params {
+ # use Carp 'cluck';
+ # cluck "get_photo_params called"; # TEMPORARY die to make sure I've done right thing with Zurich templates
my $self = shift;
return FixMyStreet::App::get_photo_params($self, 'id');
}
@@ -634,6 +639,25 @@ sub body {
return $body;
}
+=head2 response_templates
+
+Returns all ResponseTemplates attached to this problem's bodies, in alphabetical
+order of title.
+
+=cut
+
+sub response_templates {
+ my $problem = shift;
+ return FixMyStreet::App->model('DB::ResponseTemplate')->search(
+ {
+ body_id => $problem->bodies_str_ids
+ },
+ {
+ order_by => 'title'
+ }
+ );
+}
+
# returns true if the external id is the council's ref, i.e., useful to publish it
# (by way of an example, the barnet send method returns a useful reference when
# it succeeds, so that is the ref we should show on the problem report page).
@@ -642,8 +666,7 @@ sub body {
# Note: this only makes sense when called on a problem that has been sent!
sub can_display_external_id {
my $self = shift;
- if ($self->external_id && $self->send_method_used &&
- ($self->send_method_used eq 'barnet' || $self->bodies_str =~ /2237/)) {
+ if ($self->external_id && $self->send_method_used && $self->bodies_str =~ /2237/) {
return 1;
}
return 0;
@@ -735,8 +758,8 @@ sub update_from_open311_service_request {
{
problem_id => $self->id,
state => 'confirmed',
- created => $updated || \'ms_current_timestamp()',
- confirmed => \'ms_current_timestamp()',
+ created => $updated || \'current_timestamp',
+ confirmed => \'current_timestamp',
text => $status_notes,
mark_open => 0,
mark_fixed => 0,
@@ -789,7 +812,7 @@ sub update_send_failed {
$self->update( {
send_fail_count => $self->send_fail_count + 1,
- send_fail_timestamp => \'ms_current_timestamp()',
+ send_fail_timestamp => \'current_timestamp',
send_fail_reason => $msg
} );
}
@@ -828,6 +851,27 @@ sub latest_moderation_log_entry {
return $self->admin_log_entries->search({ action => 'moderation' }, { order_by => 'id desc' })->first;
}
+=head2 get_photoset
+
+Return a PhotoSet object for all photos attached to this field
+
+ my $photoset = $obj->get_photoset( $c );
+ print $photoset->num_images;
+ return $photoset->get_image_data(num => 0, size => 'full');
+
+=cut
+
+sub get_photoset {
+ my ($self, $c) = @_;
+ my $class = 'FixMyStreet::App::Model::PhotoSet';
+ eval "use $class";
+ return $class->new({
+ c => $c,
+ data => $self->photo,
+ object => $self,
+ });
+}
+
__PACKAGE__->has_many(
"admin_log_entries",
"FixMyStreet::DB::Result::AdminLog",
@@ -838,6 +882,18 @@ __PACKAGE__->has_many(
}
);
+sub get_time_spent {
+ my $self = shift;
+ my $admin_logs = $self->admin_log_entries->search({},
+ {
+ group_by => 'object_id',
+ columns => [
+ { sum_time_spent => { sum => 'time_spent' } },
+ ]
+ })->single;
+ return $admin_logs ? $admin_logs->get_column('sum_time_spent') : 0;
+}
+
# we need the inline_constructor bit as we don't inherit from Moose
__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
diff --git a/perllib/FixMyStreet/DB/Result/ResponseTemplate.pm b/perllib/FixMyStreet/DB/Result/ResponseTemplate.pm
new file mode 100644
index 000000000..48a1ab3ae
--- /dev/null
+++ b/perllib/FixMyStreet/DB/Result/ResponseTemplate.pm
@@ -0,0 +1,49 @@
+use utf8;
+package FixMyStreet::DB::Result::ResponseTemplate;
+
+# Created by DBIx::Class::Schema::Loader
+# DO NOT MODIFY THE FIRST PART OF THIS FILE
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
+__PACKAGE__->table("response_templates");
+__PACKAGE__->add_columns(
+ "id",
+ {
+ data_type => "integer",
+ is_auto_increment => 1,
+ is_nullable => 0,
+ sequence => "response_templates_id_seq",
+ },
+ "body_id",
+ { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
+ "title",
+ { data_type => "text", is_nullable => 0 },
+ "text",
+ { data_type => "text", is_nullable => 0 },
+ "created",
+ {
+ data_type => "timestamp",
+ default_value => \"current_timestamp",
+ is_nullable => 0,
+ },
+);
+__PACKAGE__->set_primary_key("id");
+__PACKAGE__->add_unique_constraint("response_templates_body_id_title_key", ["body_id", "title"]);
+__PACKAGE__->belongs_to(
+ "body",
+ "FixMyStreet::DB::Result::Body",
+ { id => "body_id" },
+ { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
+);
+
+
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-02-19 16:13:43
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:xzhmxtu0taAnBMZN0HBocw
+
+
+# You can replace this text with custom code or comments, and it will be preserved on regeneration
+1;
diff --git a/perllib/FixMyStreet/DB/Result/Token.pm b/perllib/FixMyStreet/DB/Result/Token.pm
index 0156af137..a60e23839 100644
--- a/perllib/FixMyStreet/DB/Result/Token.pm
+++ b/perllib/FixMyStreet/DB/Result/Token.pm
@@ -20,15 +20,16 @@ __PACKAGE__->add_columns(
"created",
{
data_type => "timestamp",
- default_value => \"ms_current_timestamp()",
+ default_value => \"current_timestamp",
is_nullable => 0,
+ original => { default_value => \"now()" },
},
);
__PACKAGE__->set_primary_key("scope", "token");
-# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+LLZ8P5GXqPetuGyrra2vw
+# Created by DBIx::Class::Schema::Loader v0.07035 @ 2015-08-13 16:33:38
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:HkvzOY5STjOdXN64hxg5NA
use mySociety::AuthToken;
@@ -42,8 +43,7 @@ Representation of mySociety::AuthToken in the DBIx::Class world.
The 'data' value is automatically inflated and deflated in the same way that the
AuthToken would do it. 'token' is set to a new random value by default and the
-'created' timestamp is achieved using the database function
-ms_current_timestamp.
+'created' timestamp is achieved using the database function current_timestamp.
=cut
@@ -55,7 +55,7 @@ sub new {
my ( $class, $attrs ) = @_;
$attrs->{token} ||= mySociety::AuthToken::random_token();
- $attrs->{created} ||= \'ms_current_timestamp()';
+ $attrs->{created} ||= \'current_timestamp';
my $new = $class->next::method($attrs);
return $new;
diff --git a/perllib/FixMyStreet/DB/ResultSet/Alert.pm b/perllib/FixMyStreet/DB/ResultSet/Alert.pm
index 5848265f1..bb1c61141 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Alert.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Alert.pm
@@ -14,7 +14,7 @@ sub timeline_created {
return $rs->search(
{
- whensubscribed => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
+ whensubscribed => { '>=', \"current_timestamp-'7 days'::interval" },
confirmed => 1,
%{ $restriction },
},
@@ -29,7 +29,7 @@ sub timeline_disabled {
return $rs->search(
{
- whendisabled => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
+ whendisabled => { '>=', \"current_timestamp-'7 days'::interval" },
%{ $restriction },
},
);
diff --git a/perllib/FixMyStreet/DB/ResultSet/AlertType.pm b/perllib/FixMyStreet/DB/ResultSet/AlertType.pm
index 0b430008a..25c727e25 100644
--- a/perllib/FixMyStreet/DB/ResultSet/AlertType.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/AlertType.pm
@@ -30,18 +30,19 @@ sub email_alerts ($) {
$item_table.name as item_name, $item_table.anonymous as item_anonymous,
$item_table.confirmed as item_confirmed,
$head_table.*
- from alert
- inner join $item_table on alert.parameter::integer = $item_table.${head_table}_id
- inner join $head_table on alert.parameter::integer = $head_table.id
+ from alert, $item_table, $head_table
+ where alert.parameter::integer = $head_table.id
+ and $item_table.${head_table}_id = $head_table.id
";
} else {
$query .= " $item_table.*,
$item_table.id as item_id
- from alert, $item_table";
+ from alert, $item_table
+ where 1 = 1";
}
$query .= "
- where alert_type='$ref' and whendisabled is null and $item_table.confirmed >= whensubscribed
- and $item_table.confirmed >= ms_current_timestamp() - '7 days'::interval
+ and alert_type='$ref' and whendisabled is null and $item_table.confirmed >= whensubscribed
+ and $item_table.confirmed >= current_timestamp - '7 days'::interval
and (select whenqueued from alert_sent where alert_sent.alert_id = alert.id and alert_sent.parameter::integer = $item_table.id) is null
and $item_table.user_id <> alert.user_id
and " . $alert_type->item_where . "
@@ -69,8 +70,6 @@ sub email_alerts ($) {
# this is for the new_updates alerts
next if $row->{non_public} and $row->{user_id} != $row->{alert_user_id};
- my $hashref_restriction = $cobrand->site_restriction( $row->{cobrand_data} );
-
FixMyStreet::App->model('DB::AlertSent')->create( {
alert_id => $row->{alert_id},
parameter => $row->{item_id},
@@ -89,10 +88,7 @@ sub email_alerts ($) {
$data{state_message} = _("This report is currently marked as open.");
}
- my $url = $cobrand->base_url( $row->{alert_cobrand_data} );
- if ( $hashref_restriction && $hashref_restriction->{bodies_str} && $row->{bodies_str} ne $hashref_restriction->{bodies_str} ) {
- $url = mySociety::Config::get('BASE_URL');
- }
+ my $url = $cobrand->base_url_for_report($row);
# this is currently only for new_updates
if ($row->{item_text}) {
if ( $cobrand->moniker ne 'zurich' && $row->{alert_user_id} == $row->{user_id} ) {
@@ -171,7 +167,6 @@ sub email_alerts ($) {
my $longitude = $alert->parameter;
my $latitude = $alert->parameter2;
- my $hashref_restriction = $cobrand->site_restriction( $alert->cobrand_data );
my $d = mySociety::Gaze::get_radius_containing_population($latitude, $longitude, 200000);
# Convert integer to GB locale string (with a ".")
$d = mySociety::Locale::in_gb_locale {
@@ -184,7 +179,7 @@ sub email_alerts ($) {
and problem.user_id = users.id
and problem.state in ($states)
and problem.non_public = 'f'
- and problem.confirmed >= ? and problem.confirmed >= ms_current_timestamp() - '7 days'::interval
+ and problem.confirmed >= ? and problem.confirmed >= current_timestamp - '7 days'::interval
and (select whenqueued from alert_sent where alert_sent.alert_id = ? and alert_sent.parameter::integer = problem.id) is null
and users.email <> ?
order by confirmed desc";
@@ -195,10 +190,7 @@ sub email_alerts ($) {
alert_id => $alert->id,
parameter => $row->{id},
} );
- my $url = $cobrand->base_url( $alert->cobrand_data );
- if ( $hashref_restriction && $hashref_restriction->{bodies_str} && $row->{bodies_str} ne $hashref_restriction->{bodies_str} ) {
- $url = mySociety::Config::get('BASE_URL');
- }
+ my $url = $cobrand->base_url_for_report($row);
$data{data} .= $url . "/report/" . $row->{id} . " - $row->{title}\n\n";
if ( exists $row->{geocode} && $row->{geocode} ) {
my $nearest_st = _get_address_from_gecode( $row->{geocode} );
@@ -241,15 +233,13 @@ sub _send_aggregated_alert_email(%) {
my $template = FixMyStreet->get_email_template($cobrand->moniker, $data{lang}, "$data{template}.txt");
- my $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
my $result = FixMyStreet::App->send_email_cron(
{
_template_ => $template,
_parameters_ => \%data,
- From => [ $sender, _($cobrand->contact_name) ],
To => $data{alert_email},
},
- $sender,
+ undef,
0,
$cobrand,
$data{lang}
diff --git a/perllib/FixMyStreet/DB/ResultSet/Comment.pm b/perllib/FixMyStreet/DB/ResultSet/Comment.pm
index 70f8027aa..1b6afb819 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Comment.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Comment.pm
@@ -4,19 +4,24 @@ use base 'DBIx::Class::ResultSet';
use strict;
use warnings;
+sub to_body {
+ my ($rs, $body_restriction) = @_;
+ return FixMyStreet::DB::ResultSet::Problem::to_body($rs, $body_restriction);
+}
+
+
sub timeline {
- my ( $rs, $restriction ) = @_;
+ my ( $rs, $body_restriction ) = @_;
my $prefetch =
FixMyStreet::App->model('DB')->schema->storage->sql_maker->quote_char ?
[ qw/user/ ] :
[];
- return $rs->search(
+ return $rs->to_body($body_restriction)->search(
{
state => 'confirmed',
- created => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
- %{ $restriction },
+ created => { '>=', \"current_timestamp-'7 days'::interval" },
},
{
prefetch => $prefetch,
@@ -25,17 +30,18 @@ sub timeline {
}
sub summary_count {
- my ( $rs, $restriction ) = @_;
+ my ( $rs, $body_restriction ) = @_;
- return $rs->search(
- $restriction,
- {
- group_by => ['me.state'],
- select => [ 'me.state', { count => 'me.id' } ],
- as => [qw/state state_count/],
- join => 'problem'
- }
- );
+ my $params = {
+ group_by => ['me.state'],
+ select => [ 'me.state', { count => 'me.id' } ],
+ as => [qw/state state_count/],
+ };
+ if ($body_restriction) {
+ $rs = $rs->to_body($body_restriction);
+ $params->{join} = 'problem';
+ }
+ return $rs->search(undef, $params);
}
1;
diff --git a/perllib/FixMyStreet/DB/ResultSet/Contact.pm b/perllib/FixMyStreet/DB/ResultSet/Contact.pm
index 6fa6a03a0..f402b5461 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Contact.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Contact.pm
@@ -4,6 +4,8 @@ use base 'DBIx::Class::ResultSet';
use strict;
use warnings;
+sub me { join('.', shift->current_source_alias, shift || q{}) }
+
=head2 not_deleted
$rs = $rs->not_deleted();
@@ -14,7 +16,7 @@ Filter down to not deleted contacts - which have C<deleted> set to false;
sub not_deleted {
my $rs = shift;
- return $rs->search( { deleted => 0 } );
+ return $rs->search( { $rs->me('deleted') => 0 } );
}
sub summary_count {
diff --git a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
index a0ccb8a6d..a6b00ef7b 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
@@ -19,12 +19,10 @@ sub nearby {
if $interval;
$params->{id} = { -not_in => $ids }
if $ids;
- $params = {
- %{ $c->cobrand->problems_clause },
- %$params
- } if $c->cobrand->problems_clause;
$params->{category} = $category if $category;
+ $rs = FixMyStreet::DB::ResultSet::Problem::to_body($rs, $c->cobrand->body_restriction);
+
my $attrs = {
prefetch => 'problem',
bind => [ $mid_lat, $mid_lon, $dist ],
@@ -36,16 +34,4 @@ sub nearby {
return \@problems;
}
-# XXX Not currently used, so not migrating at present.
-#sub fixed_nearby {
-# my ($dist, $mid_lat, $mid_lon) = @_;
-# mySociety::Locale::in_gb_locale { select_all(
-# "select id, title, latitude, longitude, distance
-# from problem_find_nearby(?, ?, $dist) as nearby, problem
-# where nearby.problem_id = problem.id and state='fixed'
-# site_restriction
-# order by lastupdate desc", $mid_lat, $mid_lon);
-# }
-#}
-
1;
diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
index 7885c28b3..e9f5d0f8e 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
@@ -20,6 +20,18 @@ sub set_restriction {
$site_key = $key;
}
+sub to_body {
+ my ($rs, $bodies) = @_;
+ return $rs unless $bodies;
+ unless (ref $bodies eq 'ARRAY') {
+ $bodies = [ map { ref $_ ? $_->id : $_ } $bodies ];
+ }
+ $rs = $rs->search(
+ \[ "regexp_split_to_array(bodies_str, ',') && ?", [ {} => $bodies ] ]
+ );
+ return $rs;
+}
+
# Front page statistics
sub recent_fixed {
@@ -168,9 +180,9 @@ sub timeline {
return $rs->search(
{
-or => {
- created => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
- confirmed => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
- whensent => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
+ created => { '>=', \"current_timestamp-'7 days'::interval" },
+ confirmed => { '>=', \"current_timestamp-'7 days'::interval" },
+ whensent => { '>=', \"current_timestamp-'7 days'::interval" },
}
},
{
@@ -198,7 +210,10 @@ sub unique_users {
return $rs->search( {
state => [ FixMyStreet::DB::Result::Problem->visible_states() ],
}, {
- select => [ { count => { distinct => 'user_id' } } ],
+ select => [ { distinct => 'user_id' } ],
+ as => [ 'user_id' ]
+ } )->as_subselect_rs->search( undef, {
+ select => [ { count => 'user_id' } ],
as => [ 'count' ]
} )->first->get_column('count');
}
@@ -235,8 +250,8 @@ sub send_reports {
my $site = $site_override || CronFns::site($base_url);
my $states = [ 'confirmed', 'fixed' ];
- $states = [ 'unconfirmed', 'confirmed', 'in progress', 'planned', 'closed' ] if $site eq 'zurich';
- my $unsent = FixMyStreet::App->model("DB::Problem")->search( {
+ $states = [ 'unconfirmed', 'confirmed', 'in progress', 'planned', 'closed', 'investigating' ] if $site eq 'zurich';
+ my $unsent = $rs->search( {
state => $states,
whensent => undef,
bodies_str => { '!=', undef },
@@ -320,15 +335,19 @@ sub send_reports {
$cobrand->process_additional_metadata_for_email($row, \%h);
}
- # XXX Needs locks!
- # XXX Only copes with at most one missing body
- my ($bodies, $missing) = $row->bodies_str =~ /^([\d,]+)(?:\|(\d+))?/;
- my @bodies = split(/,/, $bodies);
- $bodies = FixMyStreet::App->model("DB::Body")->search(
- { id => \@bodies },
+ my $bodies = FixMyStreet::App->model("DB::Body")->search(
+ { id => $row->bodies_str_ids },
{ order_by => 'name' },
);
- $missing = FixMyStreet::App->model("DB::Body")->find($missing) if $missing;
+
+ my $missing;
+ if ($row->bodies_missing) {
+ my @missing = FixMyStreet::App->model("DB::Body")->search(
+ { id => [ split /,/, $row->bodies_missing ] },
+ { order_by => 'name' }
+ )->get_column('name')->all;
+ $missing = join(' / ', @missing) if @missing;
+ }
my @dear;
my %reporters = ();
@@ -337,7 +356,7 @@ sub send_reports {
my $sender = "FixMyStreet::SendReport::" . $sender_info->{method};
if ( ! exists $senders->{ $sender } ) {
- warn "No such sender [ $sender ] for body $body->name ( $body->id )";
+ warn sprintf "No such sender [ $sender ] for body %s ( %d )", $body->name, $body->id;
next;
}
$reporters{ $sender } ||= $sender->new();
@@ -400,7 +419,7 @@ sub send_reports {
$h{missing} = '';
if ($missing) {
$h{missing} = '[ '
- . sprintf(_('We realise this problem might be the responsibility of %s; however, we don\'t currently have any contact details for them. If you know of an appropriate contact address, please do get in touch.'), $missing->name)
+ . sprintf(_('We realise this problem might be the responsibility of %s; however, we don\'t currently have any contact details for them. If you know of an appropriate contact address, please do get in touch.'), $missing)
. " ]\n\n";
}
@@ -433,8 +452,8 @@ sub send_reports {
unless ($result) {
$row->update( {
- whensent => \'ms_current_timestamp()',
- lastupdate => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
+ lastupdate => \'current_timestamp',
} );
if ( $cobrand->report_sent_confirmation_email && !$h{anonymous_report}) {
_send_report_sent_email( $row, \%h, $nomail, $cobrand );
@@ -468,7 +487,7 @@ sub send_reports {
}
}
my $sending_errors = '';
- my $unsent = FixMyStreet::App->model("DB::Problem")->search( {
+ my $unsent = $rs->search( {
state => [ 'confirmed', 'fixed' ],
whensent => undef,
bodies_str => { '!=', undef },
@@ -499,7 +518,7 @@ sub _send_report_sent_email {
_template_ => $template,
_parameters_ => $h,
To => $row->user->email,
- From => mySociety::Config::get('CONTACT_EMAIL'),
+ From => [ mySociety::Config::get('CONTACT_EMAIL'), $cobrand->contact_name ],
},
mySociety::Config::get('CONTACT_EMAIL'),
$nomail,
diff --git a/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm b/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm
index 63a91697d..bf1c68c49 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm
@@ -22,7 +22,7 @@ sub send_questionnaires_period {
whensent => [
'-and',
{ '!=', undef },
- { '<', \"ms_current_timestamp() - '$period'::interval" },
+ { '<', \"current_timestamp - '$period'::interval" },
],
send_questionnaire => 1,
};
@@ -34,7 +34,7 @@ sub send_questionnaires_period {
} else {
$q_params->{'-or'} = [
'(select max(whensent) from questionnaire where me.id=problem_id)' => undef,
- '(select max(whenanswered) from questionnaire where me.id=problem_id)' => { '<', \"ms_current_timestamp() - '$period'::interval" }
+ '(select max(whenanswered) from questionnaire where me.id=problem_id)' => { '<', \"current_timestamp - '$period'::interval" }
];
}
@@ -70,7 +70,7 @@ sub send_questionnaires_period {
my $questionnaire = FixMyStreet::App->model('DB::Questionnaire')->create( {
problem_id => $row->id,
- whensent => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
} );
# We won't send another questionnaire unless they ask for it (or it was
@@ -84,9 +84,6 @@ sub send_questionnaires_period {
} );
$h{url} = $cobrand->base_url($row->cobrand_data) . '/Q/' . $token->token;
- my $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
- my $sender_name = _($cobrand->contact_name);
-
print "Sending questionnaire " . $questionnaire->id . ", problem "
. $row->id . ", token " . $token->token . " to "
. $row->user->email . "\n"
@@ -97,9 +94,8 @@ sub send_questionnaires_period {
_template_ => $template,
_parameters_ => \%h,
To => [ [ $row->user->email, $row->name ] ],
- From => [ $sender, $sender_name ],
},
- $sender,
+ undef,
$params->{nomail},
$cobrand
);
@@ -117,32 +113,36 @@ sub send_questionnaires_period {
sub timeline {
my ( $rs, $restriction ) = @_;
+ my $attrs;
+ if (%$restriction) {
+ $attrs = {
+ -select => [qw/me.*/],
+ prefetch => [qw/problem/],
+ }
+ }
return $rs->search(
{
-or => {
- whenanswered => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
- 'me.whensent' => { '>=', \"ms_current_timestamp()-'7 days'::interval" },
+ whenanswered => { '>=', \"current_timestamp-'7 days'::interval" },
+ 'me.whensent' => { '>=', \"current_timestamp-'7 days'::interval" },
},
%{ $restriction },
},
- {
- -select => [qw/me.*/],
- prefetch => [qw/problem/],
- }
+ $attrs
);
}
sub summary_count {
my ( $rs, $restriction ) = @_;
- return $rs->search(
- $restriction,
- {
- group_by => [ \'whenanswered is not null' ],
- select => [ \'(whenanswered is not null)', { count => 'me.id' } ],
- as => [qw/answered questionnaire_count/],
- join => 'problem'
- }
- );
+ my $params = {
+ group_by => [ \'whenanswered is not null' ],
+ select => [ \'(whenanswered is not null)', { count => 'me.id' } ],
+ as => [qw/answered questionnaire_count/],
+ };
+ if (%$restriction) {
+ $params->{join} = 'problem';
+ }
+ return $rs->search($restriction, $params);
}
1;
diff --git a/perllib/FixMyStreet/Email.pm b/perllib/FixMyStreet/Email.pm
new file mode 100644
index 000000000..4a2784787
--- /dev/null
+++ b/perllib/FixMyStreet/Email.pm
@@ -0,0 +1,12 @@
+package FixMyStreet::Email;
+
+use Utils::Email;
+use FixMyStreet;
+
+sub test_dmarc {
+ my $email = shift;
+ return if FixMyStreet->test_mode;
+ return Utils::Email::test_dmarc($email);
+}
+
+1;
diff --git a/perllib/FixMyStreet/Geocode/Google.pm b/perllib/FixMyStreet/Geocode/Google.pm
index 35fcec36f..5261bb7e4 100644
--- a/perllib/FixMyStreet/Geocode/Google.pm
+++ b/perllib/FixMyStreet/Geocode/Google.pm
@@ -28,34 +28,32 @@ sub string {
$s = FixMyStreet::Geocode::escape($s);
- my $url = 'http://maps.google.com/maps/geo?q=' . $s;
- $url .= '&ll=' . $params->{centre} if $params->{centre};
- $url .= '&spn=' . $params->{span} if $params->{span};
+ my $url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . $s;
+ $url .= '&bounds=' . $params->{bounds}[0] . ',' . $params->{bounds}[1]
+ . '|' . $params->{bounds}[2] . ',' . $params->{bounds}[3]
+ if $params->{bounds};
if ($params->{google_country}) {
- $url .= '&gl=' . $params->{google_country};
+ $url .= '&region=' . $params->{google_country};
} elsif ($params->{country}) {
- $url .= '&gl=' . $params->{country};
+ $url .= '&region=' . $params->{country};
}
- $url .= '&hl=' . $params->{lang} if $params->{lang};
+ $url .= '&language=' . $params->{lang} if $params->{lang};
- my $args = 'sensor=false&key=' . FixMyStreet->config('GOOGLE_MAPS_API_KEY');
- my $js = FixMyStreet::Geocode::cache('google', $url, $args, qr/"code":6[12]0/);
+ my $args = 'key=' . FixMyStreet->config('GOOGLE_MAPS_API_KEY');
+ my $js = FixMyStreet::Geocode::cache('google', $url, $args, qr/"status"\s*:\s*"(OVER_QUERY_LIMIT|REQUEST_DENIED|INVALID_REQUEST|UNKNOWN_ERROR)"/);
if (!$js) {
return { error => _('Sorry, we could not parse that location. Please try again.') };
}
- if ($js->{Status}->{code} ne '200') {
- return { error => _('Sorry, we could not find that location.') };
- }
+ return unless $js->{status} eq 'OK';
- my $results = $js->{Placemark};
+ my $results = $js->{results};
my ( $error, @valid_locations, $latitude, $longitude );
foreach (@$results) {
- next unless $_->{AddressDetails}->{Accuracy} >= 4;
- my $address = $_->{address};
+ my $address = $_->{formatted_address};
next unless $c->cobrand->geocoded_string_check( $address );
( $longitude, $latitude ) =
map { Utils::truncate_coordinate($_) }
- @{ $_->{Point}->{coordinates} };
+ ($_->{geometry}{location}{lat}, $_->{geometry}{location}{lng});
push (@$error, {
address => $address,
latitude => $latitude,
diff --git a/perllib/FixMyStreet/Geocode/Zurich.pm b/perllib/FixMyStreet/Geocode/Zurich.pm
index aad918b0e..50a7c355e 100644
--- a/perllib/FixMyStreet/Geocode/Zurich.pm
+++ b/perllib/FixMyStreet/Geocode/Zurich.pm
@@ -31,6 +31,7 @@ sub setup_soap {
my $action = "$attr/IFixMyZuerich/";
require SOAP::Lite;
+ # SOAP::Lite->import( +trace => [transport => \&log_message ] );
# Set up the SOAP handler
$security = SOAP::Header->name("Security")->attr({
@@ -109,5 +110,15 @@ sub string {
return { error => $error };
}
+sub log_message {
+ my ($in) = @_;
+ eval {
+ printf "log_message [$in]: %s\n\n", $in->content; # ...for example
+ };
+ if ($@) {
+ print "log_message [$in]: ???? \n\n";
+ }
+}
+
1;
diff --git a/perllib/FixMyStreet/Map.pm b/perllib/FixMyStreet/Map.pm
index b050592ba..81b81f656 100644
--- a/perllib/FixMyStreet/Map.pm
+++ b/perllib/FixMyStreet/Map.pm
@@ -35,6 +35,16 @@ sub allowed_maps {
return grep { $avail{$_} } @allowed;
}
+=head2 reload_allowed_maps
+
+Allows tests to override MAP_TYPE at run time.
+
+=cut
+
+sub reload_allowed_maps {
+ @ALL_MAP_CLASSES = allowed_maps();
+}
+
=head2 map_class
Set and return the appropriate class given a query parameter string.
diff --git a/perllib/FixMyStreet/Map/Zurich.pm b/perllib/FixMyStreet/Map/Zurich.pm
index 9b01f2978..3e198f820 100644
--- a/perllib/FixMyStreet/Map/Zurich.pm
+++ b/perllib/FixMyStreet/Map/Zurich.pm
@@ -11,25 +11,53 @@ use Geo::Coordinates::CH1903;
use Math::Trig;
use Utils;
-use constant ZOOM_LEVELS => 8;
+use constant ZOOM_LEVELS => 9;
use constant DEFAULT_ZOOM => 5;
use constant MIN_ZOOM_LEVEL => 0;
use constant ID_OFFSET => 2;
+use constant TILE_SIZE => 512;
sub map_tiles {
- my ( $self, %params ) = @_;
- my ( $col, $row, $z ) = ( $params{x_tile}, $params{y_tile}, $params{matrix_id} );
+ my ($self, %params) = @_;
+ my ($left_col, $top_row, $z) = @params{'x_left_tile', 'y_top_tile', 'matrix_id'};
my $tile_url = $self->base_tile_url();
+ my $cols = $params{cols};
+ my $rows = $params{rows};
+
+ my @col_offsets = (0.. ($cols-1) );
+ my @row_offsets = (0.. ($rows-1) );
+
return [
- "$tile_url/$z/" . ($row - 1) . "/" . ($col - 1) . ".jpg",
- "$tile_url/$z/" . ($row - 1) . "/$col.jpg",
- "$tile_url/$z/$row/" . ($col - 1) . ".jpg",
- "$tile_url/$z/$row/$col.jpg",
+ map {
+ my $row_offset = $_;
+ [
+ map {
+ my $col_offset = $_;
+ my $row = $top_row + $row_offset;
+ my $col = $left_col + $col_offset;
+ my $src = sprintf '%s/%d/%d/%d.jpg',
+ $tile_url, $z, $row, $col;
+ my $dotted_id = sprintf '%d.%d', $col, $row;
+
+ # return the data structure for the cell
+ +{
+ src => $src,
+ row_offset => $row_offset,
+ col_offset => $col_offset,
+ dotted_id => $dotted_id,
+ alt => "Map tile $dotted_id", # TODO "NW map tile"?
+ }
+ }
+ @col_offsets
+ ]
+ }
+ @row_offsets
];
}
sub base_tile_url {
- return '/maps/Hybrid/1.0.0/Hybrid/default/nativeTileMatrixSet';
+ # use the new 512px maps as used by Javascript
+ return 'http://www.gis.stadt-zuerich.ch/maps/rest/services/tiled/LuftbildHybrid/MapServer/WMTS/tile/1.0.0/tiled_LuftbildHybrid/default/default028mm';
}
sub copyright {
@@ -50,29 +78,77 @@ sub display_map {
$params{longitude} = Utils::truncate_coordinate($c->get_param('lon') + 0)
if defined $c->get_param('lon');
- my $zoom = defined $c->get_param('zoom')
- ? $c->get_param('zoom') + 0
- : $c->stash->{page} eq 'report'
- ? DEFAULT_ZOOM+1
- : DEFAULT_ZOOM;
- $zoom = ZOOM_LEVELS - 1 if $zoom >= ZOOM_LEVELS;
- $zoom = 0 if $zoom < 0;
+ $params{rows} //= 2; # 2x2 square is default
+ $params{cols} //= 2;
+
+ $params{zoom} = do {
+ my $zoom = defined $c->get_param('zoom')
+ ? $c->get_param('zoom') + 0
+ : $c->stash->{page} eq 'report'
+ ? DEFAULT_ZOOM+1
+ : DEFAULT_ZOOM;
+ $zoom = ZOOM_LEVELS - 1 if $zoom >= ZOOM_LEVELS;
+ $zoom = 0 if $zoom < 0;
+ $zoom;
+ };
+
+ $c->stash->{map} = $self->get_map_hash( %params );
- ($params{x_tile}, $params{y_tile}, $params{matrix_id}) = latlon_to_tile_with_adjust($params{latitude}, $params{longitude}, $zoom);
+ if ($params{print_report}) {
+ $params{zoom}++ unless $params{zoom} >= ZOOM_LEVELS;
+ $c->stash->{print_report_map}
+ = $self->get_map_hash(
+ %params,
+ img_type => 'img',
+ cols => 4, rows => 4,
+ );
+ # NB: we can passthrough img_type as literal here, as only designed for print
- foreach my $pin (@{$params{pins}}) {
- ($pin->{px}, $pin->{py}) = latlon_to_px($pin->{latitude}, $pin->{longitude}, $params{x_tile}, $params{y_tile}, $zoom);
+ # NB we can do arbitrary size, including non-squares, however we'd have
+ # to modify .square-map style with padding-bottom percentage calculated in
+ # an inline style:
+ # <zarino> in which case, the only change that'd be required is
+ # removing { padding-bottom: 100% } from .square-map__outer, putting
+ # the percentage into an inline style on the element itself, and then
+ # probably renaming .square-map__* to .fixed-aspect-map__* or something
+ # since it's no longer necessarily square
}
+}
+
+sub get_map_hash {
+ my ($self, %params) = @_;
- $c->stash->{map} = {
+ @params{'x_centre_tile', 'y_centre_tile', 'matrix_id'}
+ = latlon_to_tile_with_adjust(
+ @params{'latitude', 'longitude', 'zoom', 'rows', 'cols'});
+
+ # centre_(row|col) is either in middle, or just to right.
+ # e.g. if centre is the number in parens:
+ # 1 (2) 3 => 2 - int( 3/2 ) = 1
+ # 1 2 (3) 4 => 3 - int( 4/2 ) = 1
+ $params{x_left_tile} = $params{x_centre_tile} - int($params{cols} / 2);
+ $params{y_top_tile} = $params{y_centre_tile} - int($params{rows} / 2);
+
+ $params{pins} = [
+ map {
+ my $pin = { %$_ }; # shallow clone
+ ($pin->{px}, $pin->{py})
+ = latlon_to_px($pin->{latitude}, $pin->{longitude},
+ @params{'x_left_tile', 'y_top_tile', 'zoom'});
+ $pin;
+ } @{ $params{pins} }
+ ];
+
+ return {
%params,
type => 'zurich',
map_type => 'OpenLayers.Layer.WMTS',
tiles => $self->map_tiles( %params ),
copyright => $self->copyright(),
- zoom => $zoom,
+ zoom => $params{zoom},,
zoomOffset => MIN_ZOOM_LEVEL,
numZoomLevels => ZOOM_LEVELS,
+ tile_size => TILE_SIZE,
};
}
@@ -83,29 +159,46 @@ sub latlon_to_tile($$$) {
my ($x, $y) = Geo::Coordinates::CH1903::from_latlon($lat, $lon);
my $matrix_id = $zoom + ID_OFFSET;
- my @scales = ( '250000', '125000', '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500' );
+ my @scales = (
+ '250000', '125000',
+ '64000', '32000',
+ '16000', '8000',
+ '4000', '2000',
+ '1000', '500',
+ '250'
+ );
my $tileOrigin = { lat => 30814423, lon => -29386322 };
- my $tileSize = 256;
- my $res = $scales[$matrix_id] / (39.3701 * 96); # OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH
+ my $res = $scales[$matrix_id] / (39.3701 * 96);
+ # OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH
- my $fx = ( $x - $tileOrigin->{lon} ) / ($res * $tileSize);
- my $fy = ( $tileOrigin->{lat} - $y ) / ($res * $tileSize);
+ my $fx = ( $x - $tileOrigin->{lon} ) / ($res * TILE_SIZE);
+ my $fy = ( $tileOrigin->{lat} - $y ) / ($res * TILE_SIZE);
return ( $fx, $fy, $matrix_id );
}
# Given a lat/lon, convert it to OSM tile co-ordinates (nearest actual tile,
# adjusted so the point will be near the centre of a 2x2 tiled map).
-sub latlon_to_tile_with_adjust($$$) {
- my ($lat, $lon, $zoom) = @_;
- my ($x_tile, $y_tile, $matrix_id) = latlon_to_tile($lat, $lon, $zoom);
+#
+# Takes parameter for rows/cols. For even sizes (2x2, 4x4 etc.) will
+# do adjustment, but simply returns actual for odd sizes.
+#
+sub latlon_to_tile_with_adjust {
+ my ($lat, $lon, $zoom, $rows, $cols) = @_;
+ my ($x_tile, $y_tile, $matrix_id)
+ = my @ret
+ = latlon_to_tile($lat, $lon, $zoom);
- # Try and have point near centre of map
- if ($x_tile - int($x_tile) > 0.5) {
- $x_tile += 1;
+ # Try and have point near centre of map, passing through if odd
+ unless ($cols % 2) {
+ if ($x_tile - int($x_tile) > 0.5) {
+ $x_tile += 1;
+ }
}
- if ($y_tile - int($y_tile) > 0.5) {
- $y_tile += 1;
+ unless ($rows % 2) {
+ if ($y_tile - int($y_tile) > 0.5) {
+ $y_tile += 1;
+ }
}
return ( int($x_tile), int($y_tile), $matrix_id );
@@ -115,13 +208,12 @@ sub tile_to_latlon {
my ($fx, $fy, $zoom) = @_;
my $matrix_id = $zoom + ID_OFFSET;
- my @scales = ( '250000', '125000', '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500' );
+ my @scales = ( '250000', '125000', '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500', '250' );
my $tileOrigin = { lat => 30814423, lon => -29386322 };
- my $tileSize = 256;
my $res = $scales[$matrix_id] / (39.3701 * 96); # OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH
- my $x = $fx * $res * $tileSize + $tileOrigin->{lon};
- my $y = $tileOrigin->{lat} - $fy * $res * $tileSize;
+ my $x = $fx * $res * TILE_SIZE + $tileOrigin->{lon};
+ my $y = $tileOrigin->{lat} - $fy * $res * TILE_SIZE;
my ($lat, $lon) = Geo::Coordinates::CH1903::to_latlon($x, $y);
@@ -141,16 +233,16 @@ sub latlon_to_px($$$$$) {
# C is centre tile reference of displayed map
sub tile_to_px {
my ($p, $c) = @_;
- $p = 256 * ($p - $c + 1);
+ $p = TILE_SIZE * ($p - $c);
$p = int($p + .5 * ($p <=> 0));
return $p;
}
sub click_to_tile {
my ($pin_tile, $pin) = @_;
- $pin -= 256 while $pin > 256;
- $pin += 256 while $pin < 0;
- return $pin_tile + $pin / 256;
+ $pin -= TILE_SIZE while $pin > TILE_SIZE;
+ $pin += TILE_SIZE while $pin < 0;
+ return $pin_tile + $pin / TILE_SIZE;
}
# Given some click co-ords (the tile they were on, and where in the
diff --git a/perllib/FixMyStreet/SendReport/Barnet.pm b/perllib/FixMyStreet/SendReport/Barnet.pm
deleted file mode 100644
index 07adb4c33..000000000
--- a/perllib/FixMyStreet/SendReport/Barnet.pm
+++ /dev/null
@@ -1,208 +0,0 @@
-package FixMyStreet::SendReport::Barnet;
-
-use Moose;
-
-BEGIN { extends 'FixMyStreet::SendReport'; }
-
-use Encode;
-use Utils;
-use mySociety::Config;
-use mySociety::Web qw(ent);
-
-# specific council numbers
-use constant COUNCIL_ID_BARNET => 2489;
-use constant MAX_LINE_LENGTH => 132;
-
-sub construct_message {
- my %h = @_;
- my $message = <<EOF;
-Subject: $h{title}
-
-Details: $h{detail}
-
-$h{fuzzy}, or to provide an update on the problem, please visit the following link:
-
-$h{url}
-
-$h{closest_address}
-EOF
-}
-
-
-sub send {
- my ( $self, $row, $h ) = @_;
-
- my %h = %$h;
-
- $h{message} = construct_message(%h);
-
- my $return = 1;
- my $err_msg = "";
-
- my $default_kbid = 14; # This is the default, "Street Scene"
- my $kbid = sprintf( "%050d", Utils::barnet_categories()->{$h{category}} || $default_kbid);
-
- my $geo_code = "$h{easting} $h{northing}";
-
- require BarnetInterfaces::service::ZLBB_SERVICE_ORDER;
- my $interface = BarnetInterfaces::service::ZLBB_SERVICE_ORDER->new();
-
- my ($nearest_postcode, $nearest_street) = ('', '');
- for ($h{closest_address}) {
- $nearest_postcode = sprintf("%-10s", $1) if /Nearest postcode [^:]+: ((\w{1,4}\s?\w+|\w+))/;
- # use partial postcode or comma as delimiter, strip leading number (possible letter 221B) off too
- # "99 Foo Street, London N11 1XX" becomes Foo Street
- # "99 Foo Street N11 1XX" becomes Foo Street
- $nearest_street = $1 if /Nearest road [^:]+: (?:\d+\w? )?(.*?)(\b[A-Z]+\d|,|$)/m;
- }
- my $postcode = mySociety::PostcodeUtil::is_valid_postcode($h{query})
- ? $h{query} : $nearest_postcode; # use given postcode if available
-
- # note: endpoint can be of form 'https://username:password@url'
- my $body = FixMyStreet::App->model("DB::Body")->search( { 'body_areas.area_id' => COUNCIL_ID_BARNET }, { join => "body_areas" } )->first;
- if ($body and $body->endpoint) {
- $interface->set_proxy($body->endpoint);
- # Barnet web service doesn't like namespaces in the elements so use a prefix
- $interface->set_prefix('urn');
- # uncomment these lines to print XML that will be sent rather
- # than connecting to the endpoint
- #$interface->outputxml(1);
- #$interface->no_dispatch(1);
- } else {
- die "Barnet webservice FAIL: looks like you're missing some config data: no endpoint (URL) found for area ID " . COUNCIL_ID_BARNET;
- }
-
- eval {
- my $result = $interface->Z_CRM_SERVICE_ORDER_CREATE( {
- ET_RETURN => { # ignored by server
- item => {
- TYPE => "", ID => "", NUMBER => "", MESSAGE => "", LOG_NO => "", LOG_MSG_NO => "",
- MESSAGE_V1 => "", MESSAGE_V2 => "", MESSAGE_V3 => "", MESSAGE_V4 => "", PARAMETER => "",
- ROW => "", FIELD => "", SYSTEM => "",
- },
- },
- IT_PROBLEM_DESC => { # MyTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
- item => [ # MyTypes::CRMT_SERVICE_REQUEST_TEXT
- map { { TEXT_LINE => $_ } } split_text_with_entities(ent(encode_utf8($h{message})), 132) # char132
- ],
- },
- IV_CUST_EMAIL => truncate_string_with_entities(ent(encode_utf8($h{email})), 241), # char241
- IV_CUST_NAME => truncate_string_with_entities(ent(encode_utf8($h{name})), 50), # char50
- IV_KBID => $kbid, # char50
- IV_PROBLEM_ID => $h{id}, # char35
- IV_PROBLEM_LOC => { # MyTypes::BAPI_TTET_ADDRESS_COM
- COUNTRY2 => 'GB', # char2
- REGION => "", # char3
- COUNTY => "", # char30
- CITY => "", # char30
- POSTALCODE => $postcode, # char10
- STREET => truncate_string_with_entities(ent(encode_utf8($nearest_street)), 30), # char30
- STREETNUMBER => "", # char5
- GEOCODE => $geo_code, # char32
- },
- IV_PROBLEM_SUB => truncate_string_with_entities(ent(encode_utf8($h{title})), 40), # char40
- },
- );
- if ($result) {
- # currently not using this: get_EV_ORDER_GUID (maybe that's the customer number in the CRM)
- if (my $barnet_id = $result->get_EV_ORDER_NO()) {
- $row->external_id( $barnet_id );
- $row->external_body( 'Barnet Borough Council' ); # better to use $row->body()?
- $row->send_method_used('barnet');
- $return = 0;
- } else {
- my @returned_items = split /<item[^>]*>/, $result->get_ET_RETURN;
- my @messages = ();
- foreach my $item (@returned_items) {
- if ($item=~/<MESSAGE [^>]*>\s*(\S.*?)<\/MESSAGE>/) { # if there's a non-null MESSAGE in there, grab it
- push @messages, $1; # best stab at extracting useful error message back from convoluted response
- }
- }
- push @messages, "service returned no external id" unless @messages;
- $err_msg = "Failed (problem id $h{id}): " . join(" \n ", @messages);
- }
- } else {
- my %fault = (
- 'code' => $result->get_faultcode(),
- 'actor' => $result->get_faultactor(),
- 'string' => $result->get_faultstring(),
- 'detail' => $result->get_detail(), # possibly only contains debug info
- );
- foreach (keys %fault) {
- $fault{$_}="" unless defined $fault{$_};
- $fault{$_}=~s/^\s*|\s*$//g;
- }
- $fault{actor}&&=" (actor: $fault{actor})";
- $fault{'detail'} &&= "\n" . $fault{'detail'};
- $err_msg = "Failed (problem id $h{id}): Fault $fault{code}$fault{actor}\n$fault{string}$fault{detail}";
- }
-
- };
- if ($err_msg) {
- # for timeouts, we can tidy the message a wee bit (i.e. strip the 'error deserializing...' message)
- $err_msg=~s/(?:Error deserializing message:.*)(Can't connect to [a-zA-Z0-9.:]+\s*\(Connection timed out\)).*/$1/s;
- print "$err_msg\n";
- }
- if ($@) {
- my $e = shift;
- print "Caught an error: $@\n";
- }
- if ( $return ) {
- $self->error( "Error sending to Barnet: $err_msg" );
- }
- $self->success( !$return );
- return $return;
-}
-
-# for barnet webservice: max-length fields require truncate and split
-
-# truncate_string_with_entities
-# args: text to truncate
-# max number of chars
-# returns: string truncated
-# Note: must not partially truncate an entity (e.g., &amp;)
-sub truncate_string_with_entities {
- my ($str, $max_len) = @_;
- my $retVal = "";
- foreach my $chunk (split /(\&(?:\#\d+|\w+);)/, $str) {
- if ($chunk=~/^\&(\#\d+|\w+);$/){
- my $next = $retVal.$chunk;
- last if length $next > $max_len;
- $retVal=$next
- } else {
- $retVal.=$chunk;
- if (length $retVal > $max_len) {
- $retVal = substr($retVal, 0, $max_len);
- last
- }
- }
- }
- return $retVal
-}
-
-# split_text_with_entities into lines
-# args: text to be broken into lines
-# max length (option: uses constant MAX_LINE_LENGTH)
-# returns: array of lines
-# Must not to split an entity (e.g., &amp;)
-# Not worrying about hyphenating here, since a word is only ever split if
-# it's longer than the whole line, which is uncommon in genuine problem reports
-sub split_text_with_entities {
- my ($text, $max_line_length) = @_;
- $max_line_length ||= MAX_LINE_LENGTH;
- my @lines;
- foreach my $line (split "\n", $text) {
- while (length $line > $max_line_length) {
- if (! ($line =~ s/^(.{1,$max_line_length})\s// # break on a space
- or $line =~ s/^(.{1,$max_line_length})(\&(\#\d+|\w+);)/$2/ # break before an entity
- or $line =~ s/(.{$max_line_length})//)) { # break the word ruthlessly
- $line =~ s/(.*)//; # otherwise gobble whole line (which is now shorter than max length)
- }
- push @lines, $1;
- }
- push @lines, $line;
- }
- return @lines;
-}
-
-1;
diff --git a/perllib/FixMyStreet/SendReport/Email.pm b/perllib/FixMyStreet/SendReport/Email.pm
index fa4d437fb..bac408510 100644
--- a/perllib/FixMyStreet/SendReport/Email.pm
+++ b/perllib/FixMyStreet/SendReport/Email.pm
@@ -1,6 +1,7 @@
package FixMyStreet::SendReport::Email;
use Moose;
+use FixMyStreet::Email;
BEGIN { extends 'FixMyStreet::SendReport'; }
@@ -92,8 +93,19 @@ sub send {
To => $self->to,
From => $self->send_from( $row ),
};
+
+ my $app = FixMyStreet::App->new( cobrand => $cobrand );
+
+ $cobrand->munge_sendreport_params($app, $row, $h, $params) if $cobrand->can('munge_sendreport_params');
+
$params->{Bcc} = $self->bcc if @{$self->bcc};
- my $result = FixMyStreet::App->send_email_cron(
+
+ if (FixMyStreet::Email::test_dmarc($params->{From}[0])) {
+ $params->{'Reply-To'} = [ $params->{From} ];
+ $params->{From} = [ mySociety::Config::get('CONTACT_EMAIL'), $params->{From}[1] ];
+ }
+
+ my $result = $app->send_email_cron(
$params,
mySociety::Config::get('CONTACT_EMAIL'),
$nomail,
diff --git a/perllib/FixMyStreet/SendReport/Zurich.pm b/perllib/FixMyStreet/SendReport/Zurich.pm
index 40417b41e..2838440cb 100644
--- a/perllib/FixMyStreet/SendReport/Zurich.pm
+++ b/perllib/FixMyStreet/SendReport/Zurich.pm
@@ -9,10 +9,21 @@ sub build_recipient_list {
# Only one body ever, most of the time with an email endpoint
my $body = @{ $self->bodies }[0];
+
+ # we set external_message (but default to '' in case of race condition e.g.
+ # Wunsch set, but external_message hasn't yet been filled in. TODO should
+ # we instead be holding off sending?)
if ( $row->external_body ) {
$body = FixMyStreet::App->model("DB::Body")->find( { id => $row->external_body } );
$h->{bodies_name} = $body->name;
+ $h->{external_message} = $row->get_extra_metadata('external_message') || '';
}
+ $h->{external_message} //= '';
+
+ my ($west, $nord) = $row->local_coords;
+ $h->{west} = $west;
+ $h->{nord} = $nord;
+
my $body_email = $body->endpoint;
my $parent = $body->parent;
@@ -39,6 +50,8 @@ sub get_template {
$template = 'submit-in-progress.txt';
} elsif ( $row->state eq 'planned' ) {
$template = 'submit-feedback-pending.txt';
+ } elsif ( $row->state eq 'investigating' ) {
+ $template = 'submit-external-wish.txt';
} elsif ( $row->state eq 'closed' ) {
$template = 'submit-external.txt';
if ( $row->extra->{third_personal} ) {
diff --git a/perllib/FixMyStreet/TestMech.pm b/perllib/FixMyStreet/TestMech.pm
index bd2ca4096..cc5f9dd71 100644
--- a/perllib/FixMyStreet/TestMech.pm
+++ b/perllib/FixMyStreet/TestMech.pm
@@ -165,6 +165,7 @@ sub delete_user {
$a->delete;
}
$_->delete for $user->comments;
+ $_->delete for $user->admin_logs;
$user->delete;
return 1;
@@ -221,6 +222,24 @@ sub get_email {
return $emails[0];
}
+=head2 get_first_email
+
+ $email = $mech->get_first_email(@emails);
+
+Returns first email in queue as a string and fails a test if the mail doesn't have a date and epoch-containing Message-ID header.
+
+=cut
+
+sub get_first_email {
+ my $mech = shift;
+ my $email = shift or do { fail 'No email retrieved'; return };
+ my $email_as_string = $email->as_string;
+ ok $email_as_string =~ s{\s+Date:\s+\S.*?$}{}xmsg, "Found and stripped out date";
+ ok $email_as_string =~ s{\s+Message-ID:\s+\S.*?$}{}xmsg, "Found and stripped out message ID (contains epoch)";
+ return $email_as_string;
+}
+
+
=head2 page_errors
my $arrayref = $mech->page_errors;
@@ -383,7 +402,7 @@ sub extract_update_metas {
my $result = scraper {
process 'div#updates div.problem-update p em', 'meta[]', 'TEXT';
- process '.update-text .meta-2', 'meta[]', 'TEXT';
+ process '.item-list__update-text .meta-2', 'meta[]', 'TEXT';
}
->scrape( $mech->response );
@@ -404,7 +423,7 @@ sub extract_problem_list {
my $mech = shift;
my $result = scraper {
- process 'ul.issue-list-a li a h4', 'problems[]', 'TEXT';
+ process 'ul.item-list--reports li a h4', 'problems[]', 'TEXT';
}->scrape( $mech->response );
return $result->{ problems } || [];
@@ -631,7 +650,7 @@ sub create_problems_for_body {
latitude => '51.5016605453401',
longitude => '-0.142497580865087',
user_id => $user->id,
- photo => 1,
+ photo => $mech->get_photo_data,
};
my %report_params = ( %$default_params, %$params );
@@ -646,4 +665,13 @@ sub create_problems_for_body {
return @problems;
}
+sub get_photo_data {
+ my $mech = shift;
+ return $mech->{sample_photo} ||= do {
+ my $sample_file = FixMyStreet->path_to( 't/app/controller/sample.jpg' );
+ $mech->builder->ok( -f "$sample_file", "sample file $sample_file exists" );
+ $sample_file->slurp(iomode => '<:raw');
+ };
+}
+
1;
diff --git a/perllib/Open311/GetServiceRequestUpdates.pm b/perllib/Open311/GetServiceRequestUpdates.pm
index f7b758137..1e5f4dc6b 100644
--- a/perllib/Open311/GetServiceRequestUpdates.pm
+++ b/perllib/Open311/GetServiceRequestUpdates.pm
@@ -48,12 +48,12 @@ sub fetch {
$self->suppress_alerts( $body->suppress_alerts );
$self->system_user( $body->comment_user );
- $self->update_comments( $o, { areas => $body->areas }, );
+ $self->update_comments( $o, $body );
}
}
sub update_comments {
- my ( $self, $open311, $body_details ) = @_;
+ my ( $self, $open311, $body ) = @_;
my @args = ();
@@ -63,7 +63,7 @@ sub update_comments {
push @args, $self->start_date;
push @args, $self->end_date;
# default to asking for last 2 hours worth if not Bromley
- } elsif ( ! $body_details->{areas}->{$AREA_ID_BROMLEY} ) {
+ } elsif ( ! $body->areas->{$AREA_ID_BROMLEY} ) {
my $end_dt = DateTime->now();
my $start_dt = $end_dt->clone;
$start_dt->add( hours => -2 );
@@ -75,7 +75,7 @@ sub update_comments {
my $requests = $open311->get_service_request_updates( @args );
unless ( $open311->success ) {
- warn "Failed to fetch ServiceRequest Updates for " . join(",", keys %{$body_details->{areas}}) . ":\n" . $open311->error
+ warn "Failed to fetch ServiceRequest Updates for " . $body->name . ":\n" . $open311->error
if $self->verbose;
return 0;
}
@@ -90,10 +90,8 @@ sub update_comments {
my $problem;
my $criteria = {
external_id => $request_id,
- # XXX This assumes that areas will actually only be one area.
- bodies_str => { like => '%' . join(",", keys %{$body_details->{areas}}) . '%' },
};
- $problem = FixMyStreet::App->model('DB::Problem')->search( $criteria );
+ $problem = FixMyStreet::App->model('DB::Problem')->to_body($body)->search( $criteria );
if (my $p = $problem->first) {
my $c = $p->comments->search( { external_id => $request->{update_id} } );
diff --git a/perllib/Open311/GetUpdates.pm b/perllib/Open311/GetUpdates.pm
index 5007a1f82..bc55086f0 100644
--- a/perllib/Open311/GetUpdates.pm
+++ b/perllib/Open311/GetUpdates.pm
@@ -17,9 +17,8 @@ sub get_updates {
api_key => $body->api_key
);
- my $reports = FixMyStreet::App->model('DB::Problem')->search(
+ my $reports = FixMyStreet::App->model('DB::Problem')->to_body($body)->search(
{
- bodies_str => { like => "\%" . $body->id . "\%" },
state => { 'IN', [qw/confirmed fixed/] },
-and => [
external_id => { '!=', undef },
diff --git a/perllib/Open311/PopulateServiceList.pm b/perllib/Open311/PopulateServiceList.pm
index e4f0b8357..5f45382e2 100644
--- a/perllib/Open311/PopulateServiceList.pm
+++ b/perllib/Open311/PopulateServiceList.pm
@@ -143,7 +143,7 @@ sub _handle_existing_contact {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'automatically undeleted by script',
}
);
@@ -181,7 +181,7 @@ sub _create_contact {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'created automatically by script',
}
);
@@ -309,7 +309,7 @@ sub _delete_contacts_not_in_service_list {
{
deleted => 1,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'automatically marked as deleted by script'
}
);
diff --git a/perllib/Utils.pm b/perllib/Utils.pm
index 21a7311f2..87c1a10d6 100644
--- a/perllib/Utils.pm
+++ b/perllib/Utils.pm
@@ -91,37 +91,6 @@ sub truncate_coordinate {
return $out;
}
-sub barnet_categories {
- # The values here are KBIDs from Barnet's system: see bin/send-reports for formatting.
- # They are no longer used since Barnet switched to email for delivery of problem reports.
- # and can be removed when SendReport/Barnet.pm is removed.
- if (mySociety::Config::get('STAGING_SITE')) { # note staging site must use different KBIDs
- return {
- 'Street scene misc' => 14 # for test
- }
- } else {
- return {
- 'Accumulated Litter' => 349,
- 'Dog Bin' => 203,
- 'Dog Fouling' => 288,
- 'Drain or Gully' => 256,
- 'Fly Posting' => 465,
- 'Fly Tipping' => 449,
- 'Graffiti' => 292,
- 'Gritting' => 200,
- 'Highways' => 186,
- 'Litter Bin Overflowing' => 205,
- 'Manhole Cover' => 417,
- 'Overhanging Foliage' => 421,
- 'Pavement Damaged/Cracked' => 195,
- 'Pothole' => 204,
- 'Road Sign' => 80,
- 'Roadworks' => 246,
- 'Street Lighting' => 251,
- };
- }
-}
-
=head2 trim_text
my $text = trim_text( $text_to_trim );
diff --git a/perllib/Utils/Email.pm b/perllib/Utils/Email.pm
new file mode 100644
index 000000000..a30e41c61
--- /dev/null
+++ b/perllib/Utils/Email.pm
@@ -0,0 +1,37 @@
+package Utils::Email;
+
+use Email::Address;
+use Net::DNS::Resolver;
+
+# DMARC stabbity stab
+sub test_dmarc {
+ my $email = shift;
+
+ my $addr = (Email::Address->parse($email))[0];
+ return unless $addr;
+
+ my $domain = $addr->host;
+ my @answers = _send(Net::DNS::Resolver->new, "_dmarc.$domain", 'TXT');
+ @answers = map { $_->txtdata } @answers;
+ my $dmarc = join(' ', @answers);
+ return unless $dmarc =~ /p *= *reject/;
+
+ return 1;
+}
+
+# Same as send->answer, but follows one CNAME and returns only matching results
+sub _send {
+ my ($resolver, $domain, $type) = @_;
+ my $packet = $resolver->send($domain, $type);
+ my @answers;
+ foreach my $rr ($packet->answer) {
+ if ($rr->type eq 'CNAME') {
+ push @answers, $resolver->send($rr->cname, $type)->answer;
+ } else {
+ push @answers, $rr;
+ }
+ }
+ return grep { $_->type eq $type } @answers;
+}
+
+1;
diff --git a/t/MapIt.pm b/t/MapIt.pm
index ebef934e1..a10118013 100644
--- a/t/MapIt.pm
+++ b/t/MapIt.pm
@@ -24,12 +24,27 @@ sub dispatch_request {
$self->json->encode($response) };
return [ 200, [ 'Content-Type' => 'application/json' ], [ $json ] ];
},
+
+ sub (GET + /point/**) {
+ my ($self, $point) = @_;
+ my $response = {
+ "63999" => {"parent_area" => 2245, "generation_high" => 25, "all_names" => {}, "id" => 63999, "codes" => {"ons" => "00HYNS", "gss" => "E05008366", "unit_id" => "44025"}, "name" => "Kington", "country" => "E", "type_name" => "Unitary Authority electoral division (UTE)", "generation_low" => 12, "country_name" => "England", "type" => "UTE"},
+ "65822" => {"parent_area" => undef, "generation_high" => 25, "all_names" => {}, "id" => 65822, "codes" => {"gss" => "E14000860", "unit_id" => "24903"}, "name" => "North Wiltshire", "country" => "E", "type_name" => "UK Parliament constituency", "generation_low" => 13, "country_name" => "England", "type" => "WMC"},
+ "11814" => {"parent_area" => undef, "generation_high" => 25, "all_names" => {}, "id" => 11814, "codes" => {"ons" => "09", "gss" => "E15000009", "unit_id" => "41427"}, "name" => "South West", "country" => "E", "type_name" => "European region", "generation_low" => 1, "country_name" => "England", "type" => "EUR"},
+ "2245" => {"parent_area" => undef, "generation_high" => 25, "all_names" => {}, "id" => 2245, "codes" => {"ons" => "00HY", "gss" => "E06000054", "unit_id" => "43925"}, "name" => "Wiltshire Council", "country" => "E", "type_name" => "Unitary Authority", "generation_low" => 11, "country_name" => "England", "type" => "UTA"}
+ };
+ # We must make sure we output correctly for testing purposes, we might
+ # be within a different locale here...
+ my $json = mySociety::Locale::in_gb_locale {
+ $self->json->encode($response) };
+ return [ 200, [ 'Content-Type' => 'application/json' ], [ $json ] ];
+ },
}
sub postcode {
my ($self, $postcode) = @_;
return {
- wgs84_lat => 51.5, wgs84_lon => 2.1, postcode => $postcode,
+ wgs84_lat => 51.5, wgs84_lon => -2.1, postcode => $postcode, coordsyst => 'G',
};
}
diff --git a/t/app/controller/admin.t b/t/app/controller/admin.t
index 498f1cedc..e2dd5df19 100644
--- a/t/app/controller/admin.t
+++ b/t/app/controller/admin.t
@@ -88,7 +88,7 @@ subtest 'check summary counts' => sub {
FixMyStreet::App->model('DB::Problem')->search( { bodies_str => 2489 } )->update( { bodies_str => 1 } );
my $q = FixMyStreet::App->model('DB::Questionnaire')->find_or_new( { problem => $report, });
- $q->whensent( \'ms_current_timestamp()' );
+ $q->whensent( \'current_timestamp' );
$q->in_storage ? $q->update : $q->insert;
my $alerts = FixMyStreet::App->model('DB::Alert')->search( { confirmed => { '>' => 0 } } );
diff --git a/t/app/controller/alert_new.t b/t/app/controller/alert_new.t
index ac2ec20ac..777d733e2 100644
--- a/t/app/controller/alert_new.t
+++ b/t/app/controller/alert_new.t
@@ -11,7 +11,7 @@ foreach my $test (
{
email => 'test@example.com',
type => 'area_problems',
- content => 'your alert will not be activated',
+ content => 'Click the link in our confirmation email to activate your alert',
email_text => "confirms that you'd like to receive an email",
uri =>
'/alert/subscribe?type=local&rznvy=test@example.com&feed=area:1000:A_Location',
@@ -20,7 +20,7 @@ foreach my $test (
{
email => 'test@example.com',
type => 'council_problems',
- content => 'your alert will not be activated',
+ content => 'Click the link in our confirmation email to activate your alert',
email_text => "confirms that you'd like to receive an email",
uri =>
'/alert/subscribe?type=local&rznvy=test@example.com&feed=council:1000:A_Location',
@@ -30,7 +30,7 @@ foreach my $test (
{
email => 'test@example.com',
type => 'ward_problems',
- content => 'your alert will not be activated',
+ content => 'Click the link in our confirmation email to activate your alert',
email_text => "confirms that you'd like to receive an email",
uri =>
'/alert/subscribe?type=local&rznvy=test@example.com&feed=ward:1000:1001:A_Location:Diff_Location',
@@ -40,7 +40,7 @@ foreach my $test (
{
email => 'test@example.com',
type => 'local_problems',
- content => 'your alert will not be activated',
+ content => 'Click the link in our confirmation email to activate your alert',
email_text => "confirms that you'd like to receive an email",
uri =>
'/alert/subscribe?type=local&rznvy=test@example.com&feed=local:10.2:20.1',
@@ -50,7 +50,7 @@ foreach my $test (
{
email => 'test@example.com',
type => 'new_updates',
- content => 'your alert will not be activated',
+ content => 'Click the link in our confirmation email to activate your alert',
email_text => "confirms that you'd like to receive an email",
uri => '/alert/subscribe?type=updates&rznvy=test@example.com&id=1',
param1 => 1,
@@ -236,7 +236,7 @@ for my $test (
{
email => 'test@example.com',
type => 'new_updates',
- content => 'your alert will not be activated',
+ content => 'Click the link in our confirmation email to activate your alert',
email_text => 'confirm the alert',
uri => '/alert/subscribe?type=updates&rznvy=test@example.com&id=1',
param1 => 1,
diff --git a/t/app/controller/around.t b/t/app/controller/around.t
index 03bcebf96..a70116525 100644
--- a/t/app/controller/around.t
+++ b/t/app/controller/around.t
@@ -1,7 +1,9 @@
use strict;
use warnings;
use Test::More;
+use LWP::Protocol::PSGI;
+use t::MapIt;
use FixMyStreet::TestMech;
my $mech = FixMyStreet::TestMech->new;
@@ -71,8 +73,8 @@ foreach my $test (
foreach my $test (
{
pc => 'SW1A 1AA',
- latitude => '51.501009',
- longitude => '-0.141588',
+ latitude => '51.5',
+ longitude => '-2.1',
},
{
pc => 'TQ 388 773',
@@ -82,10 +84,12 @@ foreach my $test (
)
{
subtest "check lat/lng for '$test->{pc}'" => sub {
+ LWP::Protocol::PSGI->register(t::MapIt->run_if_script, host => 'mapit.uk');
+
$mech->get_ok('/');
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ],
- MAPIT_URL => 'http://mapit.mysociety.org/',
+ MAPIT_URL => 'http://mapit.uk/',
}, sub {
$mech->submit_form_ok( { with_fields => { pc => $test->{pc} } },
"good location" );
diff --git a/t/app/controller/contact.t b/t/app/controller/contact.t
index cf8a3161b..4ac69a9f8 100644
--- a/t/app/controller/contact.t
+++ b/t/app/controller/contact.t
@@ -93,7 +93,7 @@ for my $test (
user => $update_user,
state => 'confirmed',
text => $update_info->{text},
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
mark_fixed => 'f',
anonymous => 'f',
}
diff --git a/t/app/controller/moderate.t b/t/app/controller/moderate.t
index cd4c742bb..b79f50e73 100644
--- a/t/app/controller/moderate.t
+++ b/t/app/controller/moderate.t
@@ -42,10 +42,7 @@ sub create_report {
latitude => '51.4129',
longitude => '0.007831',
user_id => $user->id,
- photo => 'DUMMY DATA', # this obv fake data would not be
- # accepted by front-end but is
- # enough to trigger "I have a
- # photo" behaviour
+ photo => $mech->get_photo_data,
});
}
my $report = create_report();
@@ -216,7 +213,7 @@ sub create_update {
user => $user,
name => 'Test User',
anonymous => 'f',
- photo => 'DUMMY DATA', # as above
+ photo => $mech->get_photo_data,
text => 'update good good bad good',
state => 'confirmed',
mark_fixed => 0,
@@ -283,7 +280,8 @@ subtest 'updates' => sub {
$mech->get_ok($REPORT_URL);
- $mech->content_contains('Photo of this report');
+ $mech->content_contains('Photo of this report')
+ or die $mech->content;
$mech->post_ok( $MODERATE_UPDATE_URL, {
%update_prepopulated,
diff --git a/t/app/controller/photo.t b/t/app/controller/photo.t
new file mode 100644
index 000000000..6e61ebb32
--- /dev/null
+++ b/t/app/controller/photo.t
@@ -0,0 +1,75 @@
+use strict;
+use utf8; # sign in error message has &ndash; in it
+use warnings;
+use feature 'say';
+use Test::More;
+use utf8;
+
+use FixMyStreet::TestMech;
+use FixMyStreet::App;
+use Web::Scraper;
+use Path::Tiny;
+use File::Temp 'tempdir';
+
+# disable info logs for this test run
+FixMyStreet::App->log->disable('info');
+END { FixMyStreet::App->log->enable('info'); }
+
+my $mech = FixMyStreet::TestMech->new;
+
+my $sample_file = path(__FILE__)->parent->child("sample.jpg");
+ok $sample_file->exists, "sample file $sample_file exists";
+
+my $westminster = $mech->create_body_ok(2527, 'Liverpool City Council');
+
+subtest "Check multiple upload worked" => sub {
+ $mech->get_ok('/around');
+
+ my $UPLOAD_DIR = tempdir( CLEANUP => 1 );
+
+ # submit initial pc form
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ { fixmystreet => '.' } ],
+ MAPIT_URL => 'http://mapit.mysociety.org/',
+ UPLOAD_DIR => $UPLOAD_DIR,
+ }, sub {
+
+ $mech->log_in_ok('test@example.com');
+
+
+ # submit the main form
+ # can't post_ok as we lose the Content_Type header
+ # (TODO rewrite with HTTP::Request::Common and request_ok)
+ $mech->post( '/report/new',
+ Content_Type => 'form-data',
+ Content =>
+ {
+ submit_problem => 1,
+ title => 'Test',
+ lat => 53.4031156, lon => -2.9840579, # in Liverpool
+ pc => 'L1 4LN',
+ detail => 'Detail',
+ photo1 => [ $sample_file, undef, Content_Type => 'application/octet-stream' ],
+ photo2 => [ $sample_file, undef, Content_Type => 'application/octet-stream' ],
+ photo3 => [ $sample_file, undef, Content_Type => 'application/octet-stream' ],
+ name => 'Bob Jones',
+ may_show_name => '1',
+ email => 'test@example.com',
+ phone => '',
+ category => 'Street lighting',
+ #password_sign_in => '',
+ #password_register => '',
+ #remember_me => undef,
+ }
+ );
+ ok $mech->success, 'Made request with multiple photo upload';
+ $mech->base_is('http://localhost/report/new');
+ $mech->content_contains(
+ 'name="upload_fileid" value="1cdd4329ceee2234bd4e89cb33b42061a0724687,1cdd4329ceee2234bd4e89cb33b42061a0724687,1cdd4329ceee2234bd4e89cb33b42061a0724687"',
+ 'Returned upload_fileid contains expected hash, 3 times');
+ my $image_file = path($UPLOAD_DIR, '1cdd4329ceee2234bd4e89cb33b42061a0724687.jpeg');
+ ok $image_file->exists, 'File uploaded to temp';
+ };
+};
+
+done_testing();
diff --git a/t/app/controller/questionnaire.t b/t/app/controller/questionnaire.t
index 5938acc79..2a89454d5 100644
--- a/t/app/controller/questionnaire.t
+++ b/t/app/controller/questionnaire.t
@@ -96,7 +96,7 @@ foreach my $test (
},
{
desc => 'User goes to questionnaire URL for an already answered questionnaire',
- answered => \'ms_current_timestamp()',
+ answered => \'current_timestamp',
content => 'already answered this questionnaire',
},
) {
@@ -191,6 +191,16 @@ foreach my $test (
},
},
{
+ desc => 'Fixed report, reopened, reported before, blank update, no further questionnaire',
+ problem_state => 'fixed',
+ fields => {
+ been_fixed => 'No',
+ reported => 'Yes',
+ another => 'No',
+ update => ' ',
+ },
+ },
+ {
desc => 'Closed report, said fixed, reported before, no update, no further questionnaire',
problem_state => 'closed',
fields => {
@@ -266,7 +276,7 @@ foreach my $test (
$questionnaire->discard_changes;
is $report->state, $result eq 'unknown' ? $test->{problem_state} : $result;
is $report->send_questionnaire, $another;
- ok DateTime::Format::Pg->format_datetime( $report->lastupdate) gt $report_time, 'lastupdate changed'
+ ok (DateTime::Format::Pg->format_datetime( $report->lastupdate) gt $report_time, 'lastupdate changed')
unless $test->{fields}{been_fixed} eq 'Unknown' || $test->{lastupdate_static};
is $questionnaire->old_state, $test->{problem_state};
is $questionnaire->new_state, $result;
@@ -315,7 +325,7 @@ my $comment = FixMyStreet::App->model('DB::Comment')->find_or_create(
);
subtest 'Check updates are shown correctly on questionnaire page' => sub {
$mech->get_ok("/Q/" . $token->token);
- $mech->content_contains( 'updates that have been left' );
+ $mech->content_contains( 'Show all updates' );
$mech->content_contains( 'This is some update text' );
};
diff --git a/t/app/controller/report_display.t b/t/app/controller/report_display.t
index 002cdc1e5..265760d86 100644
--- a/t/app/controller/report_display.t
+++ b/t/app/controller/report_display.t
@@ -96,19 +96,6 @@ subtest "change report to unconfirmed and check for 404 status" => sub {
};
-subtest "Zurich unconfirmeds are 200" => sub {
- FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
- }, sub {
- $mech->host( 'zurich.example.com' );
- ok $report->update( { state => 'unconfirmed' } ), 'unconfirm report';
- $mech->get_ok("/report/$report_id");
- $mech->content_contains( '&Uuml;berpr&uuml;fung ausstehend' );
- ok $report->update( { state => 'confirmed' } ), 'confirm report again';
- $mech->host( 'www.fixmystreet.com' );
- };
-};
-
subtest "change report to hidden and check for 410 status" => sub {
ok $report->update( { state => 'hidden' } ), 'hide report';
ok $mech->get("/report/$report_id"), "get '/report/$report_id'";
@@ -400,9 +387,72 @@ for my $test (
};
}
+my $body_westminster = $mech->create_body_ok(2504, 'Westminster City Council');
+my $body_camden = $mech->create_body_ok(2505, 'Camden Borough Council');
+
+for my $test (
+ {
+ desc => 'no state dropdown if user not from authority',
+ from_body => undef,
+ no_state => 1,
+ report_body => $body_westminster->id,
+ },
+ {
+ desc => 'state dropdown if user from authority',
+ from_body => $body_westminster->id,
+ no_state => 0,
+ report_body => $body_westminster->id,
+ },
+ {
+ desc => 'no state dropdown if user not from same body as problem',
+ from_body => $body_camden->id,
+ no_state => 1,
+ report_body => $body_westminster->id,
+ },
+ {
+ desc => 'state dropdown if user from authority and problem sent to multiple bodies',
+ from_body => $body_westminster->id,
+ no_state => 0,
+ report_body => $body_westminster->id . ',2506',
+ },
+) {
+ subtest $test->{desc} => sub {
+ $mech->log_in_ok( $user->email );
+ $user->from_body( $test->{from_body} );
+ $user->update;
+
+ $report->discard_changes;
+ $report->bodies_str( $test->{report_body} );
+ $report->update;
+
+ $mech->get_ok("/report/$report_id");
+ my $fields = $mech->visible_form_values( 'updateForm' );
+ if ( $test->{no_state} ) {
+ ok !$fields->{state};
+ } else {
+ ok $fields->{state};
+ }
+ };
+}
+
+subtest "Zurich unconfirmeds are 200" => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ $mech->host( 'zurich.example.com' );
+ ok $report->update( { state => 'unconfirmed' } ), 'unconfirm report';
+ $mech->get_ok("/report/$report_id");
+ $mech->content_contains( '&Uuml;berpr&uuml;fung ausstehend' );
+ ok $report->update( { state => 'confirmed' } ), 'confirm report again';
+ $mech->host( 'www.fixmystreet.com' );
+ };
+};
+
subtest "Zurich banners are displayed correctly" => sub {
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->host( 'zurich.example.com' );
@@ -428,8 +478,8 @@ subtest "Zurich banners are displayed correctly" => sub {
{
description => 'closed report',
state => 'closed',
- banner_id => 'fixed',
- banner_text => 'Beantwortet',
+ banner_id => 'closed',
+ banner_text => _('Extern'),
},
{
description => 'in progress report',
@@ -443,6 +493,21 @@ subtest "Zurich banners are displayed correctly" => sub {
banner_id => 'progress',
banner_text => 'In Bearbeitung',
},
+ {
+ description => 'planned report',
+ state => 'planned',
+ banner_id => 'progress',
+ banner_text => 'In Bearbeitung',
+ },
+ {
+ description => 'jurisdiction unknown',
+ state => 'unable to fix',
+ banner_id => 'fixed',
+ # We can't use _('Jurisdiction Unknown') here because
+ # TestMech::extract_problem_banner decodes the HTML entities before
+ # the string is passed back.
+ banner_text => 'Zust\x{e4}ndigkeit unbekannt',
+ },
) {
subtest "banner for $test->{description}" => sub {
$report->state( $test->{state} );
@@ -470,53 +535,6 @@ subtest "Zurich banners are displayed correctly" => sub {
};
};
-my $body_westminster = $mech->create_body_ok(2504, 'Westminster City Council');
-my $body_camden = $mech->create_body_ok(2505, 'Camden Borough Council');
-
-for my $test (
- {
- desc => 'no state dropdown if user not from authority',
- from_body => undef,
- no_state => 1,
- report_body => $body_westminster->id,
- },
- {
- desc => 'state dropdown if user from authority',
- from_body => $body_westminster->id,
- no_state => 0,
- report_body => $body_westminster->id,
- },
- {
- desc => 'no state dropdown if user not from same body as problem',
- from_body => $body_camden->id,
- no_state => 1,
- report_body => $body_westminster->id,
- },
- {
- desc => 'state dropdown if user from authority and problem sent to multiple bodies',
- from_body => $body_westminster->id,
- no_state => 0,
- report_body => $body_westminster->id . ',2506',
- },
-) {
- subtest $test->{desc} => sub {
- $mech->log_in_ok( $user->email );
- $user->from_body( $test->{from_body} );
- $user->update;
-
- $report->discard_changes;
- $report->bodies_str( $test->{report_body} );
- $report->update;
-
- $mech->get_ok("/report/$report_id");
- my $fields = $mech->visible_form_values( 'updateForm' );
- if ( $test->{no_state} ) {
- ok !$fields->{state};
- } else {
- ok $fields->{state};
- }
- };
-}
END {
$mech->delete_user('test@example.com');
diff --git a/t/app/controller/report_import.t b/t/app/controller/report_import.t
index ff6508149..4d0f6e5d1 100644
--- a/t/app/controller/report_import.t
+++ b/t/app/controller/report_import.t
@@ -1,7 +1,9 @@
use strict;
use warnings;
use Test::More;
+use LWP::Protocol::PSGI;
+use t::MapIt;
use FixMyStreet::TestMech;
use FixMyStreet::App;
use Web::Scraper;
@@ -17,7 +19,7 @@ ok -e $sample_file, "sample file $sample_file exists";
FixMyStreet::App->log->disable('info');
END { FixMyStreet::App->log->enable('info'); }
-my $body = $mech->create_body_ok(2504, 'Westminster City Council');
+my $body = $mech->create_body_ok(2245, 'Wiltshire Council');
$mech->create_contact_ok(
body_id => $body->id,
category => 'Street lighting',
@@ -90,6 +92,7 @@ subtest "Test creating bad partial entries" => sub {
};
subtest "Submit a correct entry" => sub {
+ LWP::Protocol::PSGI->register(t::MapIt->run_if_script, host => 'mapit.uk');
$mech->get_ok('/import');
@@ -120,7 +123,7 @@ subtest "Submit a correct entry" => sub {
# go to the token url
FixMyStreet::override_config {
- MAPIT_URL => 'http://mapit.mysociety.org/',
+ MAPIT_URL => 'http://mapit.uk/',
}, sub {
$mech->get_ok($token_url);
};
@@ -134,10 +137,10 @@ subtest "Submit a correct entry" => sub {
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'fixmystreet' ],
- MAPIT_URL => 'http://mapit.mysociety.org/',
+ MAPIT_URL => 'http://mapit.uk/',
}, sub {
$mech->submit_form_ok(
- { with_fields => { pc => 'SW1A 1AA' } },
+ { with_fields => { pc => 'SN15 5NG' } },
"fill in postcode"
);
};
@@ -159,15 +162,15 @@ subtest "Submit a correct entry" => sub {
# Check photo present, and still there after map submission (testing bug #18)
$mech->content_contains( '<img align="right" src="/photo/' );
- $mech->content_contains('latitude" value="51.501009"', 'Check latitude');
- $mech->content_contains('longitude" value="-0.141588"', 'Check longitude');
+ $mech->content_contains('latitude" value="51.5"', 'Check latitude');
+ $mech->content_contains('longitude" value="-2.1"', 'Check longitude');
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ],
- MAPIT_URL => 'http://mapit.mysociety.org/',
+ MAPIT_URL => 'http://mapit.uk/',
}, sub {
$mech->submit_form_ok(
{
- button => 'tile_32742.21793',
+ button => 'tile_16192.10896',
x => 10,
y => 10,
},
@@ -175,8 +178,8 @@ subtest "Submit a correct entry" => sub {
);
};
$mech->content_contains( '<img align="right" src="/photo/' );
- $mech->content_contains('latitude" value="51.50519"', 'Check latitude');
- $mech->content_contains('longitude" value="-0.142608"', 'Check longitude');
+ $mech->content_contains('latitude" value="51.508475"', 'Check latitude');
+ $mech->content_contains('longitude" value="-2.108946"', 'Check longitude');
# check that fields haven't changed at all
is_deeply $mech->visible_form_values,
@@ -194,7 +197,7 @@ subtest "Submit a correct entry" => sub {
# change the details
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ { 'fixmystreet' => '.' } ],
- MAPIT_URL => 'http://mapit.mysociety.org/',
+ MAPIT_URL => 'http://mapit.uk/',
}, sub {
$mech->submit_form_ok(
{
@@ -232,8 +235,8 @@ subtest "Submit a correct entry (with location)" => sub {
{
with_fields => {
service => 'test-script',
- lat => '51.5010096115539', # SW1A 1AA
- lon => '-0.141587067110009',
+ lat => '51.5',
+ lon => '-2.1',
name => 'Test User ll',
email => 'test-ll@example.com',
subject => 'Test report ll',
@@ -318,6 +321,7 @@ subtest "Submit a correct entry (with location) to cobrand" => sub {
MAPIT_URL => 'http://global.mapit.mysociety.org/',
MAPIT_TYPES => [ 'O08' ],
MAPIT_ID_WHITELIST => [],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
ok $mech->host("zurich.example.org"), 'change host to zurich';
@@ -361,11 +365,14 @@ subtest "Submit a correct entry (with location) to cobrand" => sub {
{
name => 'Test User ll',
detail => 'This is a test report ll',
- photo => '',
+ photo1 => '',
+ photo2 => '',
+ photo3 => '',
phone => '',
email => 'test-ll@example.com',
},
- "check imported fields are shown";
+ "check imported fields are shown"
+ or diag Dumper( $mech->visible_form_values ); use Data::Dumper;
my $user =
FixMyStreet::App->model('DB::User')
diff --git a/t/app/controller/report_new.t b/t/app/controller/report_new.t
index bd0001be8..3c05adfbd 100644
--- a/t/app/controller/report_new.t
+++ b/t/app/controller/report_new.t
@@ -1475,7 +1475,7 @@ subtest "unresponsive body handling works" => sub {
ok $mech->content_like( qr{Edinburgh.*accept reports.*/unresponsive\?body=$body_id} );
my $test_email = 'test-2@example.com';
- my $user = $mech->log_in_ok($test_email);
+ $mech->log_out_ok;
$mech->get_ok('/around');
$mech->submit_form_ok( { with_fields => { pc => 'EH1 1BB', } }, "submit location" );
$mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" );
@@ -1486,6 +1486,7 @@ subtest "unresponsive body handling works" => sub {
detail => 'Test report details.',
photo => '',
name => 'Joe Bloggs',
+ email => $test_email,
may_show_name => '1',
phone => '07903 123 456',
category => 'Trees',
@@ -1494,10 +1495,17 @@ subtest "unresponsive body handling works" => sub {
"submit good details"
);
+ my $user = FixMyStreet::App->model('DB::User')->find( { email => $test_email } );
+ ok $user, "test user does exist";
+
my $report = $user->problems->first;
ok $report, "Found the report";
is $report->bodies_str, undef, "Report not going anywhere";
+ my $email = $mech->get_email;
+ ok $email, "got an email";
+ like $email->body, qr/despite not being sent/i, "correct email sent";
+
$user->problems->delete;
$contact1->body->update( { send_method => $old_send } );
@@ -1517,6 +1525,7 @@ subtest "unresponsive body handling works" => sub {
detail => 'Test report details.',
photo => '',
name => 'Joe Bloggs',
+ email => $test_email,
may_show_name => '1',
phone => '07903 123 456',
category => 'Trees',
diff --git a/t/app/controller/report_updates.t b/t/app/controller/report_updates.t
index fa6c44292..6c6b4ca19 100644
--- a/t/app/controller/report_updates.t
+++ b/t/app/controller/report_updates.t
@@ -353,7 +353,7 @@ for my $test (
'submit update'
);
- $mech->content_contains('Nearly Done! Now check your email');
+ $mech->content_contains('Nearly done! Now check your email');
my $email = $mech->get_email;
ok $email, "got an email";
@@ -1007,7 +1007,7 @@ subtest 'submit an update for a registered user, creating update by email' => su
},
}, 'submit update' );
- $mech->content_contains('Nearly Done! Now check your email');
+ $mech->content_contains('Nearly done! Now check your email');
# No change to user yet.
$user->discard_changes;
@@ -1339,7 +1339,7 @@ foreach my $test (
{
problem_id => $report_id,
ever_reported => 'y',
- whensent => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
}
);
@@ -1481,7 +1481,7 @@ for my $test (
{
problem_id => $report_id,
ever_reported => 'y',
- whensent => \'ms_current_timestamp()',
+ whensent => \'current_timestamp',
}
);
diff --git a/t/app/controller/reports.t b/t/app/controller/reports.t
index ecb43f447..02625fcc7 100644
--- a/t/app/controller/reports.t
+++ b/t/app/controller/reports.t
@@ -216,5 +216,28 @@ subtest "test fiksgatami all reports page" => sub {
}
};
+subtest "test greenwich all reports page" => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'greenwich' ],
+ MAPIT_URL => 'http://mapit.mysociety.org/'
+ }, sub {
+ my $body = $mech->create_body_ok(2493, 'Royal Borough of Greenwich');
+ my $deleted_contact = $mech->create_contact_ok(
+ body_id => $body->id,
+ category => 'Deleted',
+ email => 'deleted@example.com',
+ deleted => 1
+ );
+ ok $mech->host("greenwich.fixmystreet.com"), 'change host to greenwich';
+ $mech->get_ok('/reports/Royal+Borough+of+Greenwich');
+ # There should not be deleted categories in the list
+ my $category_select = $mech->forms()->[0]->find_input('filter_category');
+ is $category_select->possible_values, 1, 'deleted categories are not shown';
+
+ # Clean up after the test
+ $deleted_contact->delete;
+ }
+};
+
done_testing();
diff --git a/t/app/controller/rss.t b/t/app/controller/rss.t
index ae1c0d193..db653c094 100644
--- a/t/app/controller/rss.t
+++ b/t/app/controller/rss.t
@@ -127,11 +127,14 @@ $mech->content_contains( '18 North Bridge, Edinburgh' );
$report->delete();
+my $council = $mech->create_body_ok(2333, 'Hart Council');
+my $county = $mech->create_body_ok(2227, 'Hampshire Council');
+
my $now = DateTime->now();
my $report_to_council = FixMyStreet::App->model('DB::Problem')->find_or_create(
{
postcode => 'GU51 4AE',
- bodies_str => '2333',
+ bodies_str => $council->id,
areas => ',2333,2227,',
category => 'Other',
title => 'council report',
@@ -155,7 +158,7 @@ my $report_to_council = FixMyStreet::App->model('DB::Problem')->find_or_create(
my $report_to_county_council = FixMyStreet::App->model('DB::Problem')->find_or_create(
{
postcode => 'GU51 4AE',
- bodies_str => '2227',
+ bodies_str => $county->id,
areas => ',2333,2227,',
category => 'Other',
title => 'county report',
diff --git a/t/app/helpers/grey.gif b/t/app/helpers/grey.gif
new file mode 100644
index 000000000..98eee7d12
--- /dev/null
+++ b/t/app/helpers/grey.gif
Binary files differ
diff --git a/t/app/helpers/send_email.t b/t/app/helpers/send_email.t
index 14c7d363b..d1609cb2f 100644
--- a/t/app/helpers/send_email.t
+++ b/t/app/helpers/send_email.t
@@ -9,12 +9,16 @@ BEGIN {
FixMyStreet->test_mode(1);
}
-use Test::More tests => 5;
+use Test::More;
+use Test::LongString;
use Catalyst::Test 'FixMyStreet::App';
use Email::Send::Test;
-use Path::Class;
+use Path::Tiny;
+
+use FixMyStreet::TestMech;
+my $mech = FixMyStreet::TestMech->new;
my $c = ctx_request("/");
@@ -33,16 +37,66 @@ my @emails = Email::Send::Test->emails;
is scalar(@emails), 1, "caught one email";
# Get the email, check it has a date and then strip it out
-my $email_as_string = $emails[0]->as_string;
-ok $email_as_string =~ s{\s+Date:\s+\S.*?$}{}xms, "Found and stripped out date";
-ok $email_as_string =~ s{\s+Message-ID:\s+\S.*?$}{}xms, "Found and stripped out message ID (contains epoch)";
+my $email_as_string = $mech->get_first_email(@emails);
-my $expected_email_content = file(__FILE__)->dir->file('send_email_sample.txt')->slurp;
+my $expected_email_content = path(__FILE__)->parent->child('send_email_sample.txt')->slurp;
my $name = FixMyStreet->config('CONTACT_NAME');
$name = "\"$name\"" if $name =~ / /;
my $sender = $name . ' <' . FixMyStreet->config('DO_NOT_REPLY_EMAIL') . '>';
$expected_email_content =~ s{CONTACT_EMAIL}{$sender};
-is $email_as_string,
-$expected_email_content,
- "email is as expected";
+is_string $email_as_string, $expected_email_content, "email is as expected";
+
+subtest 'MIME attachments' => sub {
+ my $data = path(__FILE__)->parent->child('grey.gif')->slurp_raw;
+
+ Email::Send::Test->clear;
+ my @emails = Email::Send::Test->emails;
+ is scalar(@emails), 0, "reset";
+
+ ok $c->send_email( 'test.txt',
+ { to => 'test@recipient.com',
+ attachments => [
+ {
+ body => $data,
+ attributes => {
+ filename => 'foo.gif',
+ content_type => 'image/gif',
+ encoding => 'quoted-printable',
+ name => 'foo.gif',
+ },
+ },
+ {
+ body => $data,
+ attributes => {
+ filename => 'bar.gif',
+ content_type => 'image/gif',
+ encoding => 'quoted-printable',
+ name => 'bar.gif',
+ },
+ },
+ ]
+ } ), "sent an email with MIME attachments";
+
+ @emails = $mech->get_email;
+ is scalar(@emails), 1, "caught one email";
+
+ my $email_as_string = $mech->get_first_email(@emails);
+
+ my ($boundary) = $email_as_string =~ /boundary="([A-Za-z0-9.]*)"/ms;
+ my $changes = $email_as_string =~ s{$boundary}{}g;
+ is $changes, 5, '5 boundaries'; # header + 4 around the 3x parts (text + 2 images)
+
+ my $expected_email_content = path(__FILE__)->parent->child('send_email_sample_mime.txt')->slurp;
+ $expected_email_content =~ s{CONTACT_EMAIL}{$sender}g;
+
+ is_string $email_as_string, $expected_email_content, 'MIME email text ok'
+ or do {
+ (my $test_name = $0) =~ s{/}{_}g;
+ my $path = path("test-output-$test_name.tmp");
+ $path->spew($email_as_string);
+ diag "Saved output in $path";
+ };
+};
+
+done_testing;
diff --git a/t/app/helpers/send_email_sample_mime.txt b/t/app/helpers/send_email_sample_mime.txt
new file mode 100644
index 000000000..4ce0f9520
--- /dev/null
+++ b/t/app/helpers/send_email_sample_mime.txt
@@ -0,0 +1,57 @@
+MIME-Version: 1.0
+Subject: test email =?utf-8?Q?=E2=98=BA?=
+Content-Type: multipart/mixed; boundary=""
+To: test@recipient.com
+Content-Transfer-Encoding: 7bit
+From: CONTACT_EMAIL
+
+
+--
+MIME-Version: 1.0
+Subject: test email =?utf-8?Q?=E2=98=BA?=
+Content-Type: text/plain; charset="utf-8"
+To: test@recipient.com
+Content-Transfer-Encoding: quoted-printable
+From: CONTACT_EMAIL
+
+Hello,
+
+This is a test email where foo: bar.
+
+utf8: =E6=88=91=E4=BB=AC=E5=BA=94=E8=AF=A5=E8=83=BD=E5=A4=9F=E6=97=A0=E7=BC=
+=9D=E5=A4=84=E7=90=86UTF8=E7=BC=96=E7=A0=81
+
+ indented_text
+
+long line: Lorem ipsum dolor sit amet, consectetur adipisicing elit,
+sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
+reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+culpa qui officia deserunt mollit anim id est laborum.
+
+Yours,=20=20
+FixMyStreet.=20=
+
+
+
+--
+MIME-Version: 1.0
+Content-Type: image/gif; name="foo.gif"
+Content-Disposition: inline; filename="foo.gif"
+Content-Transfer-Encoding: quoted-printable
+
+GIF89a=01=00=01=00=80=00=00=00=00=00=CC=CC=CC,=00=00=00=00=01=00=01=00=00=
+=02=01L=00;=
+
+--
+MIME-Version: 1.0
+Content-Type: image/gif; name="bar.gif"
+Content-Disposition: inline; filename="bar.gif"
+Content-Transfer-Encoding: quoted-printable
+
+GIF89a=01=00=01=00=80=00=00=00=00=00=CC=CC=CC,=00=00=00=00=01=00=01=00=00=
+=02=01L=00;=
+
+----
diff --git a/t/app/model/alert_type.t b/t/app/model/alert_type.t
index 528c4d354..2620dd68c 100644
--- a/t/app/model/alert_type.t
+++ b/t/app/model/alert_type.t
@@ -87,7 +87,7 @@ my $comment2 = FixMyStreet::App->model('DB::Comment')->find_or_create(
}
);
-$comment->confirmed( \"ms_current_timestamp() - '3 days'::interval" );
+$comment->confirmed( \"current_timestamp - '3 days'::interval" );
$comment->update;
my $alert = FixMyStreet::App->model('DB::Alert')->find_or_create(
diff --git a/t/app/model/photoset.t b/t/app/model/photoset.t
new file mode 100644
index 000000000..9e566f873
--- /dev/null
+++ b/t/app/model/photoset.t
@@ -0,0 +1,76 @@
+use strict;
+use warnings;
+use Test::More;
+use Test::Exception;
+use utf8;
+
+use FixMyStreet::App;
+use Data::Dumper;
+use DateTime;
+use Path::Tiny 'path';
+use File::Temp 'tempdir';
+
+my $dt = DateTime->now;
+
+my $c = FixMyStreet::App->new;
+my $UPLOAD_DIR = tempdir( CLEANUP => 1 );
+local $c->config->{UPLOAD_DIR} = $UPLOAD_DIR;
+
+my $user = $c->model('DB::User')->find_or_create({
+ name => 'Bob', email => 'bob@example.com',
+});
+
+my $image_path = path('t/app/controller/sample.jpg');
+
+my $db = FixMyStreet::App->model('DB')->schema;
+$db->txn_begin;
+
+sub make_report {
+ my $photo_data = shift;
+ return $db->resultset('Problem')->create({
+ postcode => 'BR1 3SB',
+ bodies_str => '',
+ areas => ",,",
+ category => 'Other',
+ title => 'test',
+ detail => 'test',
+ used_map => 't',
+ name => 'Anon',
+ anonymous => 't',
+ state => 'confirmed',
+ confirmed => $dt,
+ lang => 'en-gb',
+ service => '',
+ cobrand => 'default',
+ cobrand_data => '',
+ send_questionnaire => 't',
+ latitude => '51.4129',
+ longitude => '0.007831',
+ user => $user,
+ photo => $photo_data,
+ });
+}
+
+
+subtest 'Photoset with photo inline in DB' => sub {
+ my $report = make_report( $image_path->slurp );
+ my $photoset = $report->get_photoset($c);
+ is $photoset->num_images, 1, 'Found just 1 image';
+};
+
+$image_path->copy( path( $UPLOAD_DIR, '0123456789012345678901234567890123456789.jpeg' ) );
+subtest 'Photoset with 1 referenced photo' => sub {
+ my $report = make_report( '0123456789012345678901234567890123456789' );
+ my $photoset = $report->get_photoset($c);
+ is $photoset->num_images, 1, 'Found just 1 image';
+};
+
+subtest 'Photoset with 1 referenced photo' => sub {
+ my $report = make_report( '0123456789012345678901234567890123456789,0123456789012345678901234567890123456789,0123456789012345678901234567890123456789' );
+ my $photoset = $report->get_photoset($c);
+ is $photoset->num_images, 3, 'Found 3 images';
+};
+
+$db->txn_rollback;
+
+done_testing();
diff --git a/t/app/model/problem.t b/t/app/model/problem.t
index ad82a62a5..82569d72a 100644
--- a/t/app/model/problem.t
+++ b/t/app/model/problem.t
@@ -457,7 +457,8 @@ foreach my $test ( {
email_count => 1,
to => qr'Gloucestershire County Council" <2226@example',
dear => qr'Dear Gloucestershire County Council,',
- body => $body_ids{2226} . '|' . $body_ids{2649},
+ body => $body_ids{2226},
+ body_missing => $body_ids{2649},
missing => qr'problem might be the responsibility of Fife.*Council'ms,
}, {
%common,
@@ -524,14 +525,15 @@ foreach my $test ( {
{
whensent => undef
}
- )->update( { whensent => \'ms_current_timestamp()' } );
+ )->update( { whensent => \'current_timestamp' } );
$problem->discard_changes;
$problem->update( {
bodies_str => $test->{ body },
+ bodies_missing => $test->{ body_missing },
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
- whensent => $test->{ unset_whendef } ? undef : \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
+ whensent => $test->{ unset_whendef } ? undef : \'current_timestamp',
category => $test->{ category } || 'potholes',
name => $test->{ name },
cobrand => $test->{ cobrand } || 'fixmystreet',
@@ -598,13 +600,13 @@ subtest 'check can set mutiple emails as a single contact' => sub {
{
whensent => undef
}
- )->update( { whensent => \'ms_current_timestamp()' } );
+ )->update( { whensent => \'current_timestamp' } );
$problem->discard_changes;
$problem->update( {
bodies_str => $contact->{ body_id },
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
whensent => undef,
category => 'trees',
name => 'Test User',
@@ -632,13 +634,13 @@ subtest 'check can turn on report sent email alerts' => sub {
{
whensent => undef
}
- )->update( { whensent => \'ms_current_timestamp()' } );
+ )->update( { whensent => \'current_timestamp' } );
$problem->discard_changes;
$problem->update( {
bodies_str => $body_ids{2651},
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
whensent => undef,
category => 'potholes',
name => 'Test User',
@@ -677,14 +679,14 @@ subtest 'check iOS app store test reports not sent' => sub {
{
whensent => undef
}
- )->update( { whensent => \'ms_current_timestamp()' } );
+ )->update( { whensent => \'current_timestamp' } );
$problem->discard_changes;
$problem->update( {
bodies_str => $body_ids{2651},
title => 'App store test',
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
whensent => undef,
category => 'potholes',
send_fail_count => 0,
@@ -706,14 +708,14 @@ subtest 'check reports from abuser not sent' => sub {
{
whensent => undef
}
- )->update( { whensent => \'ms_current_timestamp()' } );
+ )->update( { whensent => \'current_timestamp' } );
$problem->discard_changes;
$problem->update( {
bodies_str => $body_ids{2651},
title => 'Report',
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
whensent => undef,
category => 'potholes',
send_fail_count => 0,
@@ -728,7 +730,7 @@ subtest 'check reports from abuser not sent' => sub {
$problem->update( {
state => 'confirmed',
- confirmed => \'ms_current_timestamp()',
+ confirmed => \'current_timestamp',
whensent => undef,
} );
diff --git a/t/app/model/questionnaire.t b/t/app/model/questionnaire.t
index be5b433c1..240d6d050 100644
--- a/t/app/model/questionnaire.t
+++ b/t/app/model/questionnaire.t
@@ -25,8 +25,8 @@ my $problem = FixMyStreet::App->model('DB::Problem')->create(
service => '',
cobrand => 'default',
cobrand_data => '',
- confirmed => \"ms_current_timestamp() - '5 weeks'::interval",
- whensent => \"ms_current_timestamp() - '5 weeks'::interval",
+ confirmed => \"current_timestamp - '5 weeks'::interval",
+ whensent => \"current_timestamp - '5 weeks'::interval",
user => $user,
anonymous => 0,
}
diff --git a/t/app/model/token.t b/t/app/model/token.t
index 637477fa3..d72574bb1 100644
--- a/t/app/model/token.t
+++ b/t/app/model/token.t
@@ -7,17 +7,6 @@ use Test::More;
use FixMyStreet;
use FixMyStreet::App;
-use mySociety::AuthToken;
-use mySociety::DBHandle 'dbh';
-
-# set things up so that code using mySociety::DBHandle is happy
-FixMyStreet->configure_mysociety_dbhandle();
-
-# NOTE - remember that you need to explicitly dbh()->commit after making
-# database changes with the mySociety::* modules.
-
-# create a token using DBIC and check we can read it using AuthToken, and vice
-# versa
my %tests = (
nested_hash => { foo => 'bar', and => [ 'baz', 'bundy' ] },
@@ -27,76 +16,31 @@ my %tests = (
my $token_rs = FixMyStreet::App->model('DB::Token');
-# create using DBIC
foreach my $test_data_name ( sort keys %tests ) {
my $test_data = $tests{$test_data_name};
- pass "--- testing DBIC create using '$test_data_name'";
+ pass "--- testing token creation using '$test_data_name'";
my $dbic_token =
$token_rs->create( { scope => 'testing', data => $test_data } );
my $token = $dbic_token->token;
ok $token, "stored token '$token'";
- is_deeply $dbic_token->data, $test_data, "data stored correctly using DBIC";
+ is_deeply $dbic_token->data, $test_data, "data stored correctly";
- # read back using DBIC
+ # read back from database
is_deeply $token_rs->find( { token => $token, scope => 'testing' } )->data,
$test_data,
- "data read back correctly with DBIC";
-
- # read back using mySociety::AuthToken
- is_deeply mySociety::AuthToken::retrieve( 'testing', $token ),
- $test_data, "data read back correctly with m::AT";
+ "data read back correctly";
# delete token
ok $dbic_token->delete, "delete token";
is $token_rs->find( { token => $token, scope => 'testing' } ),
undef,
- "token gone for DBIC";
-
- # read back using mySociety::AuthToken
- is mySociety::AuthToken::retrieve( 'testing', $token ),
- undef, "token gone with m::AT";
-
-}
-
-# create using m::AT
-foreach my $test_data_name ( sort keys %tests ) {
- my $test_data = $tests{$test_data_name};
-
- pass "--- testing m::AT create using '$test_data_name'";
-
- my $token = mySociety::AuthToken::store( 'testing', $test_data );
- dbh->commit();
- ok $token, "stored token '$token'";
-
- # read back using DBIC
- is_deeply $token_rs->find( { token => $token, scope => 'testing' } )->data,
- $test_data,
- "data read back correctly with DBIC";
-
- # read back using mySociety::AuthToken
- is_deeply mySociety::AuthToken::retrieve( 'testing', $token ),
- $test_data, "data read back correctly with m::AT";
-
- # delete token
- ok mySociety::AuthToken::destroy( 'testing', $token ), "destroy token";
- dbh->commit();
-
- is $token_rs->find( { token => $token, scope => 'testing' } ),
- undef,
- "token gone for DBIC";
-
- # read back using mySociety::AuthToken
- is mySociety::AuthToken::retrieve( 'testing', $token ),
- undef, "token gone with m::AT";
-
+ "token gone";
}
-
-
# Test that the inflation and deflation works as expected
{
my $token =
diff --git a/t/cobrand/fixamingata.t b/t/cobrand/fixamingata.t
index 3c818474d..d181d3890 100644
--- a/t/cobrand/fixamingata.t
+++ b/t/cobrand/fixamingata.t
@@ -71,7 +71,7 @@ my $comment = FixMyStreet::App->model('DB::Comment')->find_or_create({
state => 'confirmed',
anonymous => 'f',
});
-$comment->confirmed( \"ms_current_timestamp() - '3 days'::interval" );
+$comment->confirmed( \"current_timestamp - '3 days'::interval" );
$comment->update;
my $alert = FixMyStreet::App->model('DB::Alert')->find_or_create({
diff --git a/t/cobrand/two_tier.t b/t/cobrand/two_tier.t
index ad664aabd..b3d6ca7db 100644
--- a/t/cobrand/two_tier.t
+++ b/t/cobrand/two_tier.t
@@ -6,11 +6,11 @@ use FixMyStreet;
use FixMyStreet::Cobrand;
my @cobrands = (
- [ hart => '%2333%' ],
- [ oxfordshire => '%2237%' ],
- [ eastsussex => '%2224%' ],
- [ stevenage => '%2347%' ],
- [ warwickshire => '%2243%' ],
+ [ hart => 2333 ],
+ [ oxfordshire => 2237 ],
+ [ eastsussex => 2224 ],
+ [ stevenage => 2347 ],
+ [ warwickshire => 2243 ],
);
FixMyStreet::override_config {
@@ -18,11 +18,10 @@ FixMyStreet::override_config {
}, sub {
for my $c (@cobrands) {
- my ($m, $like) = @$c;
+ my ($m, $id) = @$c;
my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($m);
- my $problems_clause = $cobrand->problems_clause;
- is_deeply $problems_clause,
- { bodies_str => { like => $like } }, "problems_clause for $m";
+ my $body_restriction = $cobrand->body_restriction;
+ is $body_restriction, $id, "body_restriction for $m";
}
};
diff --git a/t/cobrand/zurich-logo_portal.x.jpg b/t/cobrand/zurich-logo_portal.x.jpg
new file mode 100644
index 000000000..c0cfef240
--- /dev/null
+++ b/t/cobrand/zurich-logo_portal.x.jpg
Binary files differ
diff --git a/t/cobrand/zurich.t b/t/cobrand/zurich.t
index 90a92fb44..721ee547c 100644
--- a/t/cobrand/zurich.t
+++ b/t/cobrand/zurich.t
@@ -5,7 +5,9 @@ use strict;
use warnings;
use DateTime;
use Test::More;
+use Test::LongString;
use JSON;
+use Path::Tiny;
# Check that you have the required locale installed - the following
# should return a line with de_CH.utf8 in. If not install that locale.
@@ -21,10 +23,19 @@ my $c = FixMyStreet::App->new();
my $cobrand = FixMyStreet::Cobrand::Zurich->new({ c => $c });
$c->stash->{cobrand} = $cobrand;
+my $sample_file = path(__FILE__)->parent->parent->child("app/controller/sample.jpg");
+ok $sample_file->exists, "sample file $sample_file exists";
+my $sample_photo = $sample_file->slurp_raw;
+
# This is a helper method that will send the reports but with the config
-# correctly set - notably SEND_REPORTS_ON_STAGING needs to be true.
+# correctly set - notably SEND_REPORTS_ON_STAGING needs to be true, and
+# zurich must be allowed cobrand if we want to be able to call cobrand
+# methods on it.
sub send_reports_for_zurich {
- FixMyStreet::override_config { SEND_REPORTS_ON_STAGING => 1 }, sub {
+ FixMyStreet::override_config {
+ SEND_REPORTS_ON_STAGING => 1,
+ ALLOWED_COBRANDS => ['zurich']
+ }, sub {
# Actually send the report
$c->model('DB::Problem')->send_reports('zurich');
};
@@ -32,15 +43,14 @@ sub send_reports_for_zurich {
sub reset_report_state {
my ($report, $created) = @_;
$report->discard_changes;
- my $extra = $report->extra;
- delete $extra->{moderated_overdue};
- delete $extra->{subdiv_overdue};
- delete $extra->{closed_overdue};
- $report->update({
- extra => { %$extra },
- state => 'unconfirmed',
- $created ? ( created => $created ) : (),
- });
+ $report->unset_extra_metadata('moderated_overdue');
+ $report->unset_extra_metadata('subdiv_overdue');
+ $report->unset_extra_metadata('closed_overdue');
+ $report->unset_extra_metadata('closure_status');
+ $report->whensent(undef);
+ $report->state('unconfirmed');
+ $report->created($created) if $created;
+ $report->update;
}
use FixMyStreet::TestMech;
@@ -64,6 +74,7 @@ $division->parent( $zurich->id );
$division->send_method( 'Zurich' );
$division->endpoint( 'division@example.org' );
$division->update;
+$division->body_areas->find_or_create({ area_id => 274456 });
my $subdivision = $mech->create_body_ok( 3, 'Subdivision A' );
$subdivision->parent( $division->id );
$subdivision->send_method( 'Zurich' );
@@ -103,15 +114,18 @@ my @reports = $mech->create_problems_for_body( 1, $division->id, 'Test', {
state => 'unconfirmed',
confirmed => undef,
cobrand => 'zurich',
+ photo => $sample_photo,
});
my $report = $reports[0];
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->get_ok( '/report/' . $report->id );
};
-$mech->content_contains('&Uuml;berpr&uuml;fung ausstehend');
+$mech->content_contains('&Uuml;berpr&uuml;fung ausstehend')
+ or die $mech->content;
# Check logging in to deal with this report
FixMyStreet::override_config {
@@ -136,7 +150,6 @@ $mech->content_contains( 'report_edit/' . $report->id );
$mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
$mech->content_contains( 'Erfasst' );
-
subtest "changing of categories" => sub {
# create a few categories (which are actually contacts)
foreach my $name ( qw/Cat1 Cat2/ ) {
@@ -147,6 +160,9 @@ subtest "changing of categories" => sub {
);
}
+ # full Categories dropdown is hidden for unconfirmed reports
+ $report->update({ state => 'confirmed' });
+
# put report into known category
my $original_category = $report->category;
$report->update({ category => 'Cat1' });
@@ -159,6 +175,7 @@ subtest "changing of categories" => sub {
# change the category via the web interface
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { category => 'Cat2' } } );
@@ -202,107 +219,112 @@ sub get_moderated_count {
subtest "report_edit" => sub {
- ok ( ! exists ${$report->extra}{moderated_overdue}, 'Report currently unmoderated' );
-
- is get_moderated_count(), 0;
-
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
+
+ reset_report_state($report);
+ ok ( ! $report->get_extra_metadata('moderated_overdue'), 'Report currently unmoderated' );
+ is get_moderated_count(), 0;
+
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->content_contains( 'Unbest&auml;tigt' ); # Unconfirmed email
$mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
$mech->get_ok( '/report/' . $report->id );
- };
- $mech->content_contains('Aufgenommen');
- $mech->content_contains('Test Test');
- $mech->content_lacks('photo/' . $report->id . '.jpeg');
- $mech->email_count_is(0);
+ $report->discard_changes();
- $report->discard_changes;
+ $mech->content_contains('Aufgenommen');
+ $mech->content_contains('Test Test');
+ $mech->content_lacks('photo/' . $report->id . '.0.jpeg');
+ $mech->email_count_is(0);
- is ( $report->extra->{moderated_overdue}, 0, 'Report now marked moderated' );
- is get_moderated_count(), 1;
+ $report->discard_changes;
+ is ( $report->get_extra_metadata('moderated_overdue'), 0, 'Report now marked moderated' );
+ is get_moderated_count(), 1;
- # Set state back to 10 days ago so that report is overdue
- my $created = $report->created;
- reset_report_state($report, $created->clone->subtract(days => 10));
+ # Set state back to 10 days ago so that report is overdue
+ my $created = $report->created;
+ reset_report_state($report, $created->clone->subtract(days => 10));
- is get_moderated_count(), 0;
+ is get_moderated_count(), 0;
- FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
- }, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
$mech->get_ok( '/report/' . $report->id );
- };
- $report->discard_changes;
- is ( $report->extra->{moderated_overdue}, 1, 'moderated_overdue set correctly when overdue' );
- is get_moderated_count(), 0, 'Moderated count not increased when overdue';
- reset_report_state($report, $created);
+ $report->discard_changes;
+ is ( $report->get_extra_metadata('moderated_overdue'), 1, 'moderated_overdue set correctly when overdue' );
+ is get_moderated_count(), 0, 'Moderated count not increased when overdue';
+
+ reset_report_state($report, $created);
- FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
- }, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
$mech->get_ok( '/report/' . $report->id );
- };
- $report->discard_changes;
- is ( $report->extra->{moderated_overdue}, 0, 'Marking confirmed sets moderated_overdue' );
- is ( $report->extra->{closed_overdue}, undef, 'Marking confirmed does NOT set closed_overdue' );
- is get_moderated_count(), 1;
+ $report->discard_changes;
+ is ( $report->get_extra_metadata('moderated_overdue'), 0, 'Marking confirmed sets moderated_overdue' );
+ is ( $report->get_extra_metadata('closed_overdue'), undef, 'Marking confirmed does NOT set closed_overdue' );
+ is get_moderated_count(), 1;
- FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
- }, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { state => 'hidden' } } );
$mech->get_ok( '/admin/report_edit/' . $report->id );
- };
- $report->discard_changes;
- is ( $report->extra->{moderated_overdue}, 0, 'Still marked moderated_overdue' );
- is ( $report->extra->{closed_overdue}, 0, 'Marking hidden also set closed_overdue' );
- is get_moderated_count(), 1, 'Check still counted moderated'
- or diag $report->get_column('extra');
- reset_report_state($report);
+ $report->discard_changes;
+ is ( $report->get_extra_metadata('moderated_overdue'), 0, 'Still marked moderated_overdue' );
+ is ( $report->get_extra_metadata('closed_overdue'), undef, "Marking hidden doesn't set closed_overdue..." );
+ is ( $report->state, 'planned', 'Marking hidden actually sets state to planned');
+ is ( $report->get_extra_metadata('closure_status'), 'hidden', 'Marking hidden sets closure_status to hidden');
+ is get_moderated_count(), 1, 'Check still counted moderated'
+ or diag $report->get_column('extra');
+
+ # publishing actually sets hidden
+ $mech->form_with_fields( 'status_update' );
+ $mech->submit_form_ok( { button => 'publish_response' } );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $report->discard_changes;
- is ( $report->extra->{moderated_overdue}, undef, 'Sanity check' );
- is get_moderated_count(), 0;
+ is ( $report->get_extra_metadata('closed_overdue'), 0, "Closing as hidden sets closed_overdue..." );
+ is ( $report->state, 'hidden', 'Closing as hidden sets state to hidden');
+ is ( $report->get_extra_metadata('closure_status'), undef, 'Closing as hidden unsets closure_status');
- # Check that setting to 'hidden' also triggers moderation
- FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
- }, sub {
+
+ reset_report_state($report);
+ is ( $report->get_extra_metadata('moderated_overdue'), undef, 'Sanity check' );
+ is get_moderated_count(), 0;
+
+ # Check that setting to 'hidden' also triggers moderation
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { state => 'hidden' } } );
$mech->get_ok( '/admin/report_edit/' . $report->id );
- };
- $report->discard_changes;
- is ( $report->extra->{moderated_overdue}, 0, 'Marking hidden from scratch sets moderated_overdue' );
- is ( $report->extra->{closed_overdue}, 0, 'Marking hidden from scratch also set closed_overdue' );
- is get_moderated_count(), 1;
+ $mech->form_with_fields( 'status_update' );
+ $mech->submit_form_ok( { button => 'publish_response' } );
- is ($cobrand->get_or_check_overdue($report), 0, 'sanity check');
- $report->update({ created => $created->clone->subtract(days => 10) });
- is ($cobrand->get_or_check_overdue($report), 0, 'overdue call not increased');
+ $report->discard_changes;
+ is ( $report->get_extra_metadata('moderated_overdue'), 0, 'Marking hidden from scratch sets moderated_overdue' );
+ is ( $report->get_extra_metadata('closed_overdue'), 0, 'Marking hidden from scratch also set closed_overdue' );
+ is get_moderated_count(), 1;
- reset_report_state($report, $created);
+ is ($cobrand->get_or_check_overdue($report), 0, 'sanity check');
+ $report->update({ created => $created->clone->subtract(days => 10) });
+ is ($cobrand->get_or_check_overdue($report), 0, 'overdue call not increased');
+
+ reset_report_state($report, $created);
+ }
};
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
# Photo publishing
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { state => 'confirmed', publish_photo => 1 } } );
$mech->get_ok( '/report/' . $report->id );
- $mech->content_contains('photo/' . $report->id . '.jpeg');
+ $mech->content_contains('photo/' . $report->id . '.0.jpeg');
# Internal notes
$mech->get_ok( '/admin/report_edit/' . $report->id );
@@ -317,7 +339,7 @@ FixMyStreet::override_config {
$mech->content_contains( 'Originaltext: &ldquo;Test Test 1 for ' . $division->id . ' Detail&rdquo;' );
$mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->submit_form_ok( { with_fields => { body_subdivision => $subdivision->id, send_rejected_email => 1 } } );
+ $mech->submit_form_ok( { with_fields => { body_subdivision => $subdivision->id } } );
$mech->get_ok( '/report/' . $report->id );
$mech->content_contains('In Bearbeitung');
@@ -332,74 +354,109 @@ $mech->clear_emails_ok;
$mech->log_out_ok;
-my $user = $mech->log_in_ok( 'sdm1@example.org') ;
-$user->update({ from_body => undef });
-FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
-}, sub {
- $mech->get_ok( '/admin' );
-};
-is $mech->uri->path, '/my', "got sent to /my";
-$user->from_body( $subdivision->id );
-$user->update;
+subtest 'SDM' => sub {
+ my $user = $mech->log_in_ok( 'sdm1@example.org') ;
+ $user->update({ from_body => undef });
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin' );
+ };
+ is $mech->uri->path, '/my', "got sent to /my";
+ $user->from_body( $subdivision->id );
+ $user->update;
-FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
-}, sub {
- $mech->get_ok( '/admin' );
-};
-is $mech->uri->path, '/admin', "am logged in";
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ }, sub {
+ $mech->get_ok( '/admin' );
+ };
+ is $mech->uri->path, '/admin', "am logged in";
-$mech->content_contains( 'report_edit/' . $report->id );
-$mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
-$mech->content_contains( 'In Bearbeitung' );
+ $mech->content_contains( 'report_edit/' . $report->id );
+ $mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
+ $mech->content_contains( 'In Bearbeitung' );
-FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
-}, sub {
- $mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->content_contains( 'Initial internal note' );
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->content_contains( 'Initial internal note' );
- $mech->submit_form_ok( { with_fields => { status_update => 'This is an update.' } } );
- is $mech->uri->path, '/admin/report_edit/' . $report->id, "still on edit page";
- $mech->content_contains('This is an update');
- ok $mech->form_with_fields( 'status_update' );
- $mech->submit_form_ok( { button => 'no_more_updates' } );
- is $mech->uri->path, '/admin/summary', "redirected now finished with report.";
+ $mech->submit_form_ok( { with_fields => { status_update => 'This is an update.' } } );
+ is $mech->uri->path, '/admin/report_edit/' . $report->id, "still on edit page";
+ $mech->content_contains('This is an update');
+ ok $mech->form_with_fields( 'status_update' );
+ $mech->submit_form_ok( { button => 'no_more_updates' } );
+ is $mech->uri->path, '/admin/summary', "redirected now finished with report.";
- $mech->get_ok( '/report/' . $report->id );
- $mech->content_contains('In Bearbeitung');
- $mech->content_contains('Test Test');
-};
+ $mech->get_ok( '/report/' . $report->id );
+ $mech->content_contains('In Bearbeitung');
+ $mech->content_contains('Test Test');
+ };
-send_reports_for_zurich();
-$email = $mech->get_email;
-like $email->header('Subject'), qr/Feedback/, 'subject looks okay';
-like $email->header('To'), qr/division\@example.org/, 'to line looks correct';
-$mech->clear_emails_ok;
+ send_reports_for_zurich();
+ $email = $mech->get_email;
+ like $email->header('Subject'), qr/Feedback/, 'subject looks okay';
+ like $email->header('To'), qr/division\@example.org/, 'to line looks correct';
+ $mech->clear_emails_ok;
-$report->discard_changes;
-is $report->state, 'planned', 'Report now in planned state';
+ $report->discard_changes;
+ is $report->state, 'planned', 'Report now in planned state';
+
+ subtest 'send_back' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ $report->update({ bodies_str => $subdivision->id, state => 'in progress' });
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { form_number => 2, button => 'send_back' } );
+ $report->discard_changes;
+ is $report->state, 'confirmed', 'Report sent back to confirmed state';
+ is $report->bodies_str, $division->id, 'Report sent back to division';
+ };
+ };
-$mech->log_out_ok;
-$user = $mech->log_in_ok( 'dm1@example.org') ;
+ subtest 'not contactable' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ $report->update({ bodies_str => $subdivision->id, state => 'in progress' });
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { button => 'not_contactable', form_number => 2 } );
+ $report->discard_changes;
+ is $report->state, 'planned', 'Report sent back to Rueckmeldung ausstehend state';
+ is $report->get_extra_metadata('closure_status'), 'partial', 'Report sent back to partial (not_contactable) state';
+ is $report->bodies_str, $division->id, 'Report sent back to division';
+ };
+ };
+
+ $mech->log_out_ok;
+};
+
+my $user = $mech->log_in_ok( 'dm1@example.org') ;
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
}, sub {
$mech->get_ok( '/admin' );
};
+reset_report_state($report);
+$report->update({ state => 'planned' });
+
$mech->content_contains( 'report_edit/' . $report->id );
$mech->content_contains( DateTime->now->strftime("%d.%m.%Y") );
# User confirms their email address
-my $extra = $report->extra;
-$extra->{email_confirmed} = 1;
-$report->extra ( { %$extra } );
+$report->set_extra_metadata(email_confirmed => 1);
$report->update;
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->content_lacks( 'Unbest&auml;tigt' ); # Confirmed email
@@ -419,18 +476,22 @@ like $email->header('From'), qr/division\@example.org/, 'from line looks correct
like $email->body, qr/FINAL UPDATE/, 'body looks correct';
$mech->clear_emails_ok;
-# Assign directly to planned, don't confirm email
+# Assign planned (via confirmed), don't confirm email
@reports = $mech->create_problems_for_body( 1, $division->id, 'Second', {
state => 'unconfirmed',
confirmed => undef,
cobrand => 'zurich',
+ photo => $sample_photo,
});
$report = $reports[0];
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->submit_form_ok( { with_fields => { state => 'confirmed' } } );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->submit_form_ok( { with_fields => { state => 'planned' } } );
$mech->get_ok( '/report/' . $report->id );
};
@@ -439,9 +500,12 @@ $mech->content_contains('Second Test');
FixMyStreet::override_config {
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->get_ok( '/admin/report_edit/' . $report->id );
$mech->content_contains( 'Unbest&auml;tigt' );
+ $report->discard_changes;
+ $mech->form_with_fields( 'status_update' );
$mech->submit_form_ok( { button => 'publish_response', with_fields => { status_update => 'FINAL UPDATE' } } );
$mech->get_ok( '/report/' . $report->id );
@@ -458,52 +522,155 @@ $mech->email_count_is(0);
state => 'unconfirmed',
confirmed => undef,
cobrand => 'zurich',
+ photo => $sample_photo,
});
$report = $reports[0];
-FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
-}, sub {
- $mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->submit_form_ok( { with_fields => { body_external => $external_body->id } } );
- $mech->get_ok( '/report/' . $report->id );
-};
-$mech->content_contains('Beantwortet');
-$mech->content_contains('Third Test');
-$mech->content_contains('Wir haben Ihr Anliegen an External Body weitergeleitet');
-send_reports_for_zurich();
-$email = $mech->get_email;
-like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
-like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
-like $email->body, qr/External Body/, 'body has right name';
-unlike $email->body, qr/test\@example.com/, 'body does not contain email address';
-$mech->clear_emails_ok;
+subtest "external report triggers email" => sub {
+ my $EXTERNAL_MESSAGE = 'Look Ma, no hands!';
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
-# Test calling back, and third_personal boolean setting
-FixMyStreet::override_config {
- ALLOWED_COBRANDS => [ 'zurich' ],
-}, sub {
- $mech->get_ok( '/admin' );
- is $mech->uri->path, '/admin', "am logged in";
- $mech->content_contains( 'report_edit/' . $report->id );
- $mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->submit_form_ok( { with_fields => { state => 'unconfirmed' } } );
- $mech->submit_form_ok( { with_fields => { body_external => $external_body->id, third_personal => 1 } } );
- $mech->get_ok( '/report/' . $report->id );
+ # required to see body_external field
+ $report->state('planned');
+ $report->set_extra_metadata('closure_status' => 'closed');
+ # Set the public_response manually here because the default one will have line breaks that get escaped as HTML, causing the comparison to fail.
+ $report->set_extra_metadata('public_response' => 'Freundliche Gruesse Ihre Stadt Zuerich');
+ $report->update;
+
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->form_with_fields( 'publish_response' );
+ $mech->submit_form_ok( {
+ button => 'publish_response',
+ with_fields => {
+ body_external => $external_body->id,
+ external_message => $EXTERNAL_MESSAGE,
+ } });
+ $report->discard_changes;
+ $mech->get_ok( '/report/' . $report->id );
+ };
+ is ($report->state, 'closed', 'Report was closed correctly');
+ $mech->content_contains('Extern')
+ or die $mech->content;
+ $mech->content_contains('Third Test');
+ $mech->content_contains($report->get_extra_metadata('public_response')) or die $mech->content;
+ send_reports_for_zurich();
+ $email = $mech->get_email;
+ like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
+ like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
+ like $email->body, qr/External Body/, 'body has right name';
+ like $email->body, qr/$EXTERNAL_MESSAGE/, 'external_message was passed on';
+ unlike $email->body, qr/test\@example.com/, 'body does not contain email address';
+ $mech->clear_emails_ok;
+
+ subtest "Test third_personal boolean setting" => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ $mech->get_ok( '/admin' );
+ # required to see body_external field
+ $report->state('planned');
+ $report->set_extra_metadata('closure_status' => 'closed');
+ $report->set_extra_metadata('public_response' => 'Freundliche Gruesse Ihre Stadt Zuerich');
+ $report->update;
+
+ is $mech->uri->path, '/admin', "am logged in";
+ $mech->content_contains( 'report_edit/' . $report->id );
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->form_with_fields( 'publish_response' );
+ $mech->submit_form_ok( {
+ button => 'publish_response',
+ with_fields => {
+ body_external => $external_body->id,
+ third_personal => 1,
+ } });
+ $mech->get_ok( '/report/' . $report->id );
+ };
+ $mech->content_contains('Extern');
+ $mech->content_contains('Third Test');
+ $mech->content_contains($report->get_extra_metadata('public_response'));
+ send_reports_for_zurich();
+ $email = $mech->get_email;
+ like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
+ like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
+ like $email->body, qr/External Body/, 'body has right name';
+ like $email->body, qr/test\@example.com/, 'body does contain email address';
+ $mech->clear_emails_ok;
+ };
+
+ subtest "Test external wish sending" => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ # set as wish
+ $report->discard_changes;
+ $report->state('planned');
+ $report->set_extra_metadata('closure_status' => 'investigating');
+ $report->update;
+ is ($report->state, 'planned', 'Sanity check') or die;
+
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+
+ $mech->form_with_fields( 'publish_response' );
+ $mech->submit_form_ok( {
+ button => 'publish_response',
+ with_fields => {
+ body_external => $external_body->id,
+ external_message => $EXTERNAL_MESSAGE,
+ } });
+ };
+ send_reports_for_zurich();
+ $email = $mech->get_email;
+ like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
+ like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
+ like $email->body, qr/External Body/, 'body has right name';
+ like $email->body, qr/$EXTERNAL_MESSAGE/, 'external_message was passed on';
+ like $email->body, qr/test\@example.com/, 'body contains email address';
+ $mech->clear_emails_ok;
+ };
+
+ subtest "Closure email includes public response" => sub {
+ my $PUBLIC_RESPONSE = "This is the public response to your report. Freundliche Gruesse.";
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ # set as extern
+ reset_report_state($report);
+ $report->state('planned');
+ $report->set_extra_metadata('closure_status' => 'closed');
+ $report->set_extra_metadata('email_confirmed' => 1);
+ $report->unset_extra_metadata('public_response');
+ $report->update;
+ is ($report->state, 'planned', 'Sanity check') or die;
+
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+
+ $mech->form_with_fields( 'publish_response' );
+ $mech->submit_form_ok( {
+ button => 'publish_response',
+ with_fields => {
+ body_external => $external_body->id,
+ external_message => $EXTERNAL_MESSAGE,
+ status_update => $PUBLIC_RESPONSE,
+ } });
+ };
+ $email = $mech->get_email;
+ my $report_id = $report->id;
+ like $email->header('Subject'), qr/Meldung #$report_id/, 'subject looks okay';
+ like $email->header('To'), qr/test\@example.com/, 'to line looks correct';
+ like $email->body, qr/$PUBLIC_RESPONSE/, 'public_response was passed on' or die $email->body;
+ $mech->clear_emails_ok;
+ };
+ $report->comments->delete; # delete the comments, as they confuse later tests
};
-$mech->content_contains('Beantwortet');
-$mech->content_contains('Third Test');
-$mech->content_contains('Wir haben Ihr Anliegen an External Body weitergeleitet');
-send_reports_for_zurich();
-$email = $mech->get_email;
-like $email->header('Subject'), qr/Weitergeleitete Meldung/, 'subject looks okay';
-like $email->header('To'), qr/external_body\@example.org/, 'to line looks correct';
-like $email->body, qr/External Body/, 'body has right name';
-like $email->body, qr/test\@example.com/, 'body does contain email address';
-$mech->clear_emails_ok;
-$mech->log_out_ok;
-subtest "only superuser can see stats" => sub {
+subtest "superuser and dm can see stats" => sub {
+ $mech->log_out_ok;
$user = $mech->log_in_ok( 'super@example.org' );
FixMyStreet::override_config {
@@ -520,7 +687,7 @@ subtest "only superuser can see stats" => sub {
}, sub {
$mech->get( '/admin/stats' );
};
- is $mech->res->code, 404, "only superuser should be able to see stats page";
+ is $mech->res->code, 200, "dm can now also see stats page";
$mech->log_out_ok;
};
@@ -556,6 +723,7 @@ subtest "phone number is mandatory" => sub {
ALLOWED_COBRANDS => [ 'zurich' ],
MAPIT_ID_WHITELIST => [ 274456 ],
MAPIT_GENERATION => 2,
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$user = $mech->log_in_ok( 'dm1@example.org' );
$mech->get_ok( '/report/new?lat=47.381817&lon=8.529156' );
@@ -572,6 +740,7 @@ subtest "phone number is not mandatory for reports from mobile apps" => sub {
ALLOWED_COBRANDS => [ 'zurich' ],
MAPIT_ID_WHITELIST => [ 423017 ],
MAPIT_GENERATION => 4,
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->post_ok( '/report/new/mobile?lat=47.381817&lon=8.529156' , {
service => 'iPhone',
@@ -602,35 +771,56 @@ subtest "problems can't be assigned to deleted bodies" => sub {
MAPIT_URL => 'http://global.mapit.mysociety.org/',
MAPIT_TYPES => [ 'O08' ],
MAPIT_ID_WHITELIST => [ 423017 ],
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
$mech->get_ok( '/admin/body/' . $external_body->id );
$mech->submit_form_ok( { with_fields => { deleted => 1 } } );
$mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->content_lacks( $external_body->name );
+ $mech->content_lacks( $external_body->name )
+ or do {
+ diag $mech->content;
+ diag $external_body->name;
+ die;
+ };
};
$user->from_body( $division->id );
$user->update;
$mech->log_out_ok;
};
-subtest "hidden report email are only sent when requested" => sub {
- $user = $mech->log_in_ok( 'dm1@example.org') ;
- $extra = $report->extra;
- $extra->{email_confirmed} = 1;
- $report->extra ( { %$extra } );
- $report->update;
+subtest "photo must be supplied for categories that require it" => sub {
+ FixMyStreet::App->model('DB::Contact')->find_or_create({
+ body => $division,
+ category => "Graffiti - photo required",
+ email => "graffiti\@example.org",
+ confirmed => 1,
+ deleted => 0,
+ editor => "editor",
+ whenedited => DateTime->now(),
+ note => "note for graffiti",
+ extra => { photo_required => 1 }
+ });
FixMyStreet::override_config {
+ MAPIT_TYPES => [ 'O08' ],
+ MAPIT_URL => 'http://global.mapit.mysociety.org/',
ALLOWED_COBRANDS => [ 'zurich' ],
+ MAPIT_ID_WHITELIST => [ 274456 ],
+ MAPIT_GENERATION => 2,
+ MAP_TYPE => 'Zurich,OSM',
}, sub {
- $mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->submit_form_ok( { with_fields => { state => 'hidden', send_rejected_email => 1 } } );
- $mech->email_count_is(1);
- $mech->clear_emails_ok;
- $mech->get_ok( '/admin/report_edit/' . $report->id );
- $mech->submit_form_ok( { with_fields => { state => 'hidden', send_rejected_email => undef } } );
- $mech->email_count_is(0);
- $mech->clear_emails_ok;
- $mech->log_out_ok;
+ $mech->post_ok( '/report/new', {
+ detail => 'Problem-Bericht',
+ lat => 47.381817,
+ lon => 8.529156,
+ email => 'user@example.org',
+ pc => '',
+ name => '',
+ category => 'Graffiti - photo required',
+ photo => '',
+ submit_problem => 1,
+ });
+ is $mech->res->code, 200, "missing photo shouldn't return anything but 200";
+ $mech->content_contains(_("Photo is required."), 'response should contain photo error message');
};
};
@@ -643,7 +833,7 @@ subtest "test stats" => sub {
$mech->get_ok( '/admin/stats' );
is $mech->res->code, 200, "superuser should be able to see stats page";
- $mech->content_contains('Innerhalb eines Arbeitstages moderiert: 2'); # now including hidden
+ $mech->content_contains('Innerhalb eines Arbeitstages moderiert: 3');
$mech->content_contains('Innerhalb von f&uuml;nf Arbeitstagen abgeschlossen: 3');
# my @data = $mech->content =~ /(?:moderiert|abgeschlossen): \d+/g;
# diag Dumper(\@data); use Data::Dumper;
@@ -652,10 +842,7 @@ subtest "test stats" => sub {
if (defined $export_count) {
is $export_count - $EXISTING_REPORT_COUNT, 3, 'Correct number of reports';
$mech->content_contains('fixed - council');
- $mech->content_contains(',hidden,');
}
-
- $mech->log_out_ok;
};
};
@@ -665,10 +852,118 @@ subtest "test admin_log" => sub {
object_type => 'problem',
object_id => $report->id,
});
- is scalar @entries, 4, 'State changes logged';
- is $entries[-1]->action, 'state change to hidden', 'State change logged as expected';
+
+ # XXX: following is dependent on all of test up till now, rewrite to explicitly
+ # test which things need to be logged!
+ is scalar @entries, 4, 'State changes logged';
+ is $entries[-1]->action, 'state change to closed', 'State change logged as expected';
};
+subtest 'email images to external partners' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ reset_report_state($report);
+
+ my $photo = path(__FILE__)->parent->child('zurich-logo_portal.x.jpg')->slurp_raw;
+ my $photoset = FixMyStreet::App::Model::PhotoSet->new({
+ c => $c,
+ data_items => [ $photo ],
+ });
+ my $fileid = $photoset->data;
+
+ $report->set_extra_metadata('publish_photo' => 1);
+ # The below email comparison must not have an external message.
+ $report->unset_extra_metadata('external_message');
+ $report->update({
+ state => 'closed',
+ photo => $fileid,
+ external_body => $external_body->id,
+ });
+
+ $mech->clear_emails_ok;
+ send_reports_for_zurich();
+
+ my @emails = $mech->get_email;
+ my $email_as_string = $mech->get_first_email(@emails);
+ my ($boundary) = $email_as_string =~ /boundary="([A-Za-z0-9.]*)"/ms;
+ my $changes = $email_as_string =~ s{$boundary}{}g;
+ is $changes, 4, '4 boundaries'; # header + 3 around the 2x parts (text + 1 image)
+
+ my $expected_email_content = path(__FILE__)->parent->child('zurich_attachments.txt')->slurp;
+
+ my $REPORT_ID = $report->id;
+ $expected_email_content =~ s{REPORT_ID}{$REPORT_ID}g;
+
+ is_string $email_as_string, $expected_email_content, 'MIME email text ok'
+ or do {
+ (my $test_name = $0) =~ s{/}{_}g;
+ my $path = path("test-output-$test_name.tmp");
+ $path->spew($email_as_string);
+ diag "Saved output in $path";
+ };
+ };
+};
+
+subtest 'Status update shown as appropriate' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ # ALL closed states must hide the public_response edit, and public ones
+ # must show the answer in blue.
+ for (['planned', 1, 0, 0],
+ ['fixed - council', 0, 1, 0],
+ ['closed', 0, 1, 0],
+ ['hidden', 0, 0, 1])
+ {
+ my ($state, $update, $public, $user_response) = @$_;
+ $report->update({ state => $state });
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ contains_or_lacks($mech, $update, "<textarea name='status_update'");
+ contains_or_lacks($mech, $public || $user_response, '<div class="admin-official-answer">');
+
+ if ($public) {
+ $mech->get_ok( '/report/' . $report->id );
+ $mech->content_contains('Antwort</h4>');
+ }
+ }
+ };
+};
+
+# TODO refactor into FixMyStreet::TestMech;
+sub contains_or_lacks {
+ my ($mech, $contains, $text) = @_;
+ if ($contains) {
+ $mech->content_contains($text);
+ }
+ else {
+ $mech->content_lacks($text);
+ }
+}
+
+subtest 'time_spent' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'zurich' ],
+ MAP_TYPE => 'Zurich,OSM',
+ }, sub {
+ my $report = $reports[0];
+
+ is $report->get_time_spent, 0, '0 minutes spent';
+ $report->update({ state => 'in progress' });
+ $mech->get_ok( '/admin/report_edit/' . $report->id );
+ $mech->form_with_fields( 'time_spent' );
+ $mech->submit_form_ok( {
+ with_fields => {
+ time_spent => 10,
+ } });
+ is $report->get_time_spent, 10, '10 minutes spent';
+ };
+};
+
+$mech->log_out_ok;
+
END {
$mech->delete_body($subdivision);
$mech->delete_body($division);
@@ -679,3 +974,5 @@ END {
ok $mech->host("www.fixmystreet.com"), "change host back";
done_testing();
}
+
+1;
diff --git a/t/cobrand/zurich_attachments.txt b/t/cobrand/zurich_attachments.txt
new file mode 100644
index 000000000..1c989c4d9
--- /dev/null
+++ b/t/cobrand/zurich_attachments.txt
@@ -0,0 +1,40 @@
+MIME-Version: 1.0
+Subject: =?iso-8859-1?Q?Z=FCri?= wie neu: Weitergeleitete Meldung #REPORT_ID
+Content-Type: multipart/mixed; boundary=""
+To: "External Body" <external_body@example.org>
+Content-Transfer-Encoding: 7bit
+From: FixMyStreet <division@example.org>
+
+
+--
+MIME-Version: 1.0
+Subject: =?iso-8859-1?Q?Z=FCri?= wie neu: Weitergeleitete Meldung #REPORT_ID
+Content-Type: text/plain; charset="iso-8859-1"
+To: "External Body" <external_body@example.org>
+Content-Transfer-Encoding: quoted-printable
+From: FixMyStreet <division@example.org>
+
+Gr=FCezi External Body,
+
+=D6ffentliche URL: http://www.example.org/report/REPORT_ID
+
+Bei Fragen zu "Z=FCri wie neu" wenden Sie sich bitte an
+gis-zentrum@zuerich.ch.=
+
+
+
+--
+MIME-Version: 1.0
+Content-Type: image/jpeg; name="REPORT_ID.0.jpeg"
+Content-Disposition: inline; filename="REPORT_ID.0.jpeg"
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP
+ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e
+Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABTAAEDAREA
+AhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIIB//EAB8QAQAABAcAAAAAAAAAAAAAAAADBAbT
+BxcYVVaUpf/EABcBAQEBAQAAAAAAAAAAAAAAAAAFBgT/xAAgEQEAAAQHAQAAAAAAAAAAAAAAAwQV
+UgECFlNhodGx/9oADAMBAAIRAxEAPwCywAIozyxS5R58tbbujSW33j6zFRj3fGbKbjAGAgAACs9N
+FCbtUfYg2mO1BM25e/V+lQeW3ISo/9k=
+
+----
diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t
index dac10d69b..0ab5b232d 100644
--- a/t/open311/getservicerequestupdates.t
+++ b/t/open311/getservicerequestupdates.t
@@ -18,6 +18,11 @@ my $user = FixMyStreet::App->model('DB::User')->find_or_create(
}
);
+my %bodies = (
+ 2482 => FixMyStreet::App->model("DB::Body")->new({ id => 2482 }),
+ 2651 => FixMyStreet::App->model("DB::Body")->new({ id => 2651 }),
+);
+
my $requests_xml = qq{<?xml version="1.0" encoding="utf-8"?>
<service_requests_updates>
<request_update>
@@ -342,9 +347,8 @@ for my $test (
$problem->state( $test->{start_state} );
$problem->update;
- my $council_details = { areas => { 2482 => 1 } };
my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
is $problem->comments->count, 1, 'comment count';
$problem->discard_changes;
@@ -382,9 +386,8 @@ foreach my $test (
$problem->comments->delete;
- my $council_details = { areas => { 2482 => 1 } };
my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
my $comment = $problem->comments->first;
is $comment->created, $dt, 'created date set to date from XML';
@@ -451,9 +454,8 @@ for my $test (
my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
- my $council_details = { areas => { $test->{area_id} => 1 } };
my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{$test->{area_id}} );
is $problem->comments->count, $test->{p1_comments}, 'comment count for first problem';
is $problem2->comments->count, $test->{p2_comments}, 'comment count for second problem';
@@ -491,8 +493,7 @@ subtest 'using start and end date' => sub {
end_date => $end_dt,
);
- my $council_details = { areas => { 2482 => 1 } };
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
my $start = $start_dt . '';
my $end = $end_dt . '';
@@ -551,18 +552,17 @@ subtest 'check that existing comments are not duplicated' => sub {
system_user => $user,
);
- my $council_details = { areas => { 2482 => 1 } };
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
$problem->discard_changes;
is $problem->comments->count, 2, 'two comments after fetching updates';
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
$problem->discard_changes;
is $problem->comments->count, 2, 're-fetching updates does not add comments';
$problem->comments->delete;
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
$problem->discard_changes;
is $problem->comments->count, 2, 'if comments are deleted then they are added';
};
@@ -612,8 +612,7 @@ foreach my $test ( {
system_user => $user,
);
- my $council_details = { areas => { 2482 => 1 } };
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
$problem->discard_changes;
is $problem->comments->count, 2, 'two comments after fetching updates';
@@ -678,8 +677,7 @@ foreach my $test ( {
suppress_alerts => $test->{suppress_alerts},
);
- my $council_details = { areas => { 2482 => 1 } };
- $update->update_comments( $o, $council_details );
+ $update->update_comments( $o, $bodies{2482} );
$problem->discard_changes;
my $alerts_sent = FixMyStreet::App->model('DB::AlertSent')->search(
diff --git a/t/open311/populate-service-list.t b/t/open311/populate-service-list.t
index 99663030a..1574732fb 100644
--- a/t/open311/populate-service-list.t
+++ b/t/open311/populate-service-list.t
@@ -55,7 +55,7 @@ subtest 'check non open311 contacts marked as deleted' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -84,7 +84,7 @@ subtest 'check email changed if matching category' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -117,7 +117,7 @@ subtest 'check category name changed if updated' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -151,7 +151,7 @@ subtest 'check conflicting contacts not changed' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -166,7 +166,7 @@ subtest 'check conflicting contacts not changed' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -223,7 +223,7 @@ subtest 'check meta data population' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -403,7 +403,7 @@ for my $test (
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -478,7 +478,7 @@ subtest 'check attribute ordering' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
@@ -580,7 +580,7 @@ subtest 'check bromely skip code' => sub {
confirmed => 1,
deleted => 0,
editor => $0,
- whenedited => \'ms_current_timestamp()',
+ whenedited => \'current_timestamp',
note => 'test contact',
}
);
diff --git a/templates/email/default/problem-confirm-not-sending.txt b/templates/email/default/problem-confirm-not-sending.txt
new file mode 100644
index 000000000..2443805bb
--- /dev/null
+++ b/templates/email/default/problem-confirm-not-sending.txt
@@ -0,0 +1,32 @@
+Subject: Confirm your report on [% INCLUDE 'site-name.txt' | trim %]
+
+Hello [% report.name %],
+
+Please click on the link below to confirm that you want your report to appear
+on [% INCLUDE 'site-name.txt' | trim %], despite not being sent to the
+council:
+
+[% token_url %]
+
+If your email program does not let you click on this link, copy and paste it
+into your web browser and press return.
+
+Your problem had the title:
+
+[% report.title %]
+
+And details:
+
+[% report.detail %]
+
+If you no longer wish your report to be displayed on the site, please take no
+further action.
+
+Thank you for supporting [% INCLUDE 'site-name.txt' | trim %].
+
+
+
+[% INCLUDE 'signature.txt' %]
+
+This email was sent automatically, from an unmonitored email account - so
+please do not reply to it.
diff --git a/templates/email/default/test.txt b/templates/email/default/test.txt
index bfa2c1dd3..1acd4b6ca 100644
--- a/templates/email/default/test.txt
+++ b/templates/email/default/test.txt
@@ -1,5 +1,4 @@
Subject: test email ☺
-From: bad-sender@duff.com
Hello,
diff --git a/templates/email/fixamingata/test.txt b/templates/email/fixamingata/test.txt
deleted file mode 100644
index bfa2c1dd3..000000000
--- a/templates/email/fixamingata/test.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Subject: test email ☺
-From: bad-sender@duff.com
-
-Hello,
-
-This is a test email where foo: [% foo %].
-
-utf8: 我们应该能够无ç¼å¤„ç†UTF8ç¼–ç 
-
- indented_text
-
-long line: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-Yours,
-FixMyStreet.
diff --git a/templates/email/zurich/problem-closed.txt b/templates/email/zurich/problem-closed.txt
index 392004504..b469e74c6 100644
--- a/templates/email/zurich/problem-closed.txt
+++ b/templates/email/zurich/problem-closed.txt
@@ -16,10 +16,6 @@ Ihre Meldung lautet:
-Freundliche Grüsse
-
-Ihre Stadt Zürich
-
Dieses E-Mail wurde automatisch generiert. Bitte antworten Sie nicht darauf.
diff --git a/templates/email/zurich/problem-confirm.txt b/templates/email/zurich/problem-confirm.txt
index b945c6d59..d64d54e8c 100644
--- a/templates/email/zurich/problem-confirm.txt
+++ b/templates/email/zurich/problem-confirm.txt
@@ -2,7 +2,7 @@ Subject: Züri wie neu: Meldung #[% report.id %]
Grüezi [% report.name %]
-Besten Dank für Ihre Meldung auf <<Züri wie neu>>. Klicken Sie bitte auf diesen Link, um Ihre E-Mail-Adresse zu bestätigen und über den Status der Meldung informiert zu bleiben. Falls der Link nicht funktioniert, kopieren Sie ihn in Ihren Browser:
+Besten Dank für Ihre Meldung auf <<Züri wie neu>>. Klicken Sie bitte auf diesen Link, um[% UNLESS email_confirmed %] Ihre E-Mail-Adresse zu bestätigen und[% END %] über den Status der Meldung informiert zu bleiben. Falls der Link nicht funktioniert, kopieren Sie ihn in Ihren Browser:
[% token_url %]
@@ -20,4 +20,6 @@ Freundliche Grüsse
Ihre Stadt Zürich
+
+
Dieses E-Mail wurde automatisch generiert. Bitte antworten Sie nicht darauf.
diff --git a/templates/email/zurich/problem-external.txt b/templates/email/zurich/problem-external.txt
index 09cc9c7ca..5645b0e1e 100644
--- a/templates/email/zurich/problem-external.txt
+++ b/templates/email/zurich/problem-external.txt
@@ -2,8 +2,7 @@ Subject: Züri wie neu: Meldung #[% problem.id %]
Grüezi [% problem.name %]
-Besten Dank für Ihre Meldung auf <<Züri wie neu>>. Wir haben Ihr Anliegen an [% problem.body(c).name %]
-weitergeleitet, da es nicht in den Zuständigkeitsbereich der beteiligten Fachbereiche fällt.
+[% problem.extra.public_response %]
Unter:
[% url %]
@@ -16,11 +15,6 @@ Ihre Meldung lautet:
-Freundliche Grüsse
-
-Ihre Stadt Zürich
-
-
Dieses E-Mail wurde automatisch generiert. Bitte antworten Sie nicht darauf.
diff --git a/templates/email/zurich/problem-rejected.txt b/templates/email/zurich/problem-rejected.txt
index c3d375747..ac02ea19a 100644
--- a/templates/email/zurich/problem-rejected.txt
+++ b/templates/email/zurich/problem-rejected.txt
@@ -2,16 +2,7 @@ Subject: Züri wie neu: Meldung #[% problem.id %]
Grüezi [% problem.name %]
-Ihre Meldung wurde aufgrund des Inhalts zurückgewiesen.
-Dies kann verschiedene Gründe haben wie zum Beispiel unzureichenden, nicht nachvollziehbaren oder diskriminierenden Inhalt.
-
-Bitte geben Sie die Meldung nochmals, mit möglichst detaillierten, sachlichen Informationen ein.
-
-Besten Dank für Ihr Verständnis.
-
-Freundliche Grüsse
-
-Ihre Stadt Zürich
+[% problem.extra.public_response %]
Ihre Meldung lautet:
@@ -19,11 +10,6 @@ Ihre Meldung lautet:
-Freundliche Grüsse
-
-Ihre Stadt Zürich
-
-
Dieses E-Mail wurde automatisch generiert. Bitte antworten Sie nicht darauf.
diff --git a/templates/email/zurich/problem-wish.txt b/templates/email/zurich/problem-wish.txt
new file mode 100644
index 000000000..b7508c316
--- /dev/null
+++ b/templates/email/zurich/problem-wish.txt
@@ -0,0 +1,16 @@
+Subject: Züri wie neu: Meldung #[% problem.id %]
+
+Grüezi [% problem.name %]
+
+[% problem.extra.public_response %]
+
+
+Ihre Meldung lautet:
+
+[% problem.detail %]
+
+
+
+
+Dieses E-Mail wurde automatisch generiert. Bitte antworten Sie nicht darauf.
+
diff --git a/templates/email/zurich/reply-autoresponse.txt b/templates/email/zurich/reply-autoresponse.txt
index 1e79549b3..884ea6dea 100644
--- a/templates/email/zurich/reply-autoresponse.txt
+++ b/templates/email/zurich/reply-autoresponse.txt
@@ -7,4 +7,5 @@ Dies ist eine automatische Antwort auf Ihr E-Mail. Ihr E-Mail wurde nicht überm
Falls Sie eine Meldung erfassen möchten, tun Sie das bitte über die Hauptseite:
[%# link to FMZ %]
+
Falls Sie Fragen zu <<Züri wie neu>> haben, senden Sie ein E-Mail an gis-zentrum@zuerich.ch
diff --git a/templates/email/zurich/submit-external-personal.txt b/templates/email/zurich/submit-external-personal.txt
index 5e0823871..593d047c9 100644
--- a/templates/email/zurich/submit-external-personal.txt
+++ b/templates/email/zurich/submit-external-personal.txt
@@ -2,7 +2,8 @@ Subject: Züri wie neu: Weitergeleitete Meldung #<?=$values['id']?>
Grüezi <?=$values['bodies_name']?>,
-Die folgende Meldung wurde auf http://www.stadt-zuerich.ch/zueriwieneu erfasst:
+<?=$values['external_message']?>
+
Öffentliche URL: <?=$values['url']?>
@@ -12,15 +13,5 @@ Email des Meldenden: <?=$values['email']?>
Telefonnummer des Meldenden: <?=$values['phone']?>
-"Züri wie neu" ist ein Pilotprojekt der Stadt Zürich zum Thema
-Bürgerbeteiligung. Auf dieser Plattform kann die Bevölkerung auf Schäden und
-Mängel an der städtischen Infrastruktur hinweisen. Diese Meldung wurde Ihnen
-von der Stadt Zürich gesendet, da es Ihr Zuständigkeitsgebiet betreffen könnte.
-
-Bei Fragen zum Pilotprojekt "Züri wie neu" wenden Sie sich bitte an
-gis-zentrum@zuerich.ch.
-
-
-Freundliche Grüsse
-Ihre Stadt Zürich
+Bei Fragen zu "Züri wie neu" wenden Sie sich bitte an gis-zentrum@zuerich.ch. \ No newline at end of file
diff --git a/templates/email/zurich/submit-external-wish.txt b/templates/email/zurich/submit-external-wish.txt
new file mode 100644
index 000000000..ec472f95f
--- /dev/null
+++ b/templates/email/zurich/submit-external-wish.txt
@@ -0,0 +1,20 @@
+Subject: Züri wie neu: Weitergeleitete Meldung #<?=$values['id']?>
+
+Grüezi <?=$values['bodies_name']?>,
+
+<?=$values['external_message']?>
+
+
+Name des Meldenden: <?=$values['name']?>
+
+Email des Meldenden: <?=$values['email']?>
+
+Telefonnummer des Meldenden: <?=$values['phone']?>
+
+Meldung: <?=$values['detail']?>
+
+Standort in AV-Online anzeigen:
+http://webgis.intra.stzh.ch/AV_Online/Direct.asp?Map=AV&Search=Koord&West=<?=$values['west']?>&Nord=<?=$values['nord']?>&B=300
+
+
+Bei Fragen zu "Züri wie neu" wenden Sie sich bitte an gis-zentrum@zuerich.ch.
diff --git a/templates/email/zurich/submit-external.txt b/templates/email/zurich/submit-external.txt
index bf409dccc..d85c2f84f 100644
--- a/templates/email/zurich/submit-external.txt
+++ b/templates/email/zurich/submit-external.txt
@@ -2,19 +2,10 @@ Subject: Züri wie neu: Weitergeleitete Meldung #<?=$values['id']?>
Grüezi <?=$values['bodies_name']?>,
-Die folgende Meldung wurde auf http://www.stadt-zuerich.ch/zueriwieneu erfasst:
+<?=$values['external_message']?>
-Öffentliche URL: <?=$values['url']?>
-
-"Züri wie neu" ist eine Dienstleistung der Stadt Zürich zum Thema
-Bürgerbeteiligung. Auf dieser Plattform kann die Bevölkerung auf Schäden und
-Mängel an der städtischen Infrastruktur hinweisen.
-Diese Meldung wurde Ihnen von der Stadt Zürich gesendet, da es Ihr
-Zuständigkeitsgebiet betreffen könnte.
-
-Bei Fragen zu "Züri wie neu" wenden Sie sich bitte an gis-zentrum@zuerich.ch.
+Öffentliche URL: <?=$values['url']?>
-Freundliche Grüsse
-Ihre Stadt Zürich
+Bei Fragen zu "Züri wie neu" wenden Sie sich bitte an gis-zentrum@zuerich.ch. \ No newline at end of file
diff --git a/templates/web/arreglamibarrio/faq/faq-es.html b/templates/web/arreglamibarrio/faq/faq-es.html
index 3d5397380..b9ab9842e 100644
--- a/templates/web/arreglamibarrio/faq/faq-es.html
+++ b/templates/web/arreglamibarrio/faq/faq-es.html
@@ -4,18 +4,18 @@
<ul class="plain-list">
<li><strong>Preguntas frecuentes</strong></li>
<li><a href="/privacy">Privacidad y cookies</a></li>
-<li><a href="/contact">Contacto [% PROCESS 'site-name.html' -%]</a></li>
+<li><a href="/contact">Contacto [% site_name %]</a></li>
</ul>
</aside>
</div>
<h1><a name="faq"></a>Preguntas frecuentes</h1>
<dl>
<dt>&iquest;Qu&eacute; es este sitio?</dt>
-<dd>[% PROCESS 'site-name.html' -%] es un sitio para ayudar a las personas a informar a su Administraci&oacute;n local sobre aver&iacute;as o mal estado de nuestro espacio urgano, simplemente localizandolo en un mapa.</dd>
-<dt>&iquest;Como puedo ponerme en contacto con [% PROCESS 'site-name.html' -%]?</dt>
+<dd>[% site_name %] es un sitio para ayudar a las personas a informar a su Administraci&oacute;n local sobre aver&iacute;as o mal estado de nuestro espacio urgano, simplemente localizandolo en un mapa.</dd>
+<dt>&iquest;Como puedo ponerme en contacto con [% site_name %]?</dt>
<dd>Esta es nuestra <a href="/contact">pagina de contacto</a>.</dd>
-<dt>&iquest;Que tipo de problemas puedo notificar con [% PROCESS 'site-name.html' -%]?</dt>
-<dd>Esto depende de la finalidad de [% PROCESS 'site-name.html' -%];
+<dt>&iquest;Que tipo de problemas puedo notificar con [% site_name %]?</dt>
+<dd>Esto depende de la finalidad de [% site_name %];
en el Reino Unido, FixMyStreet es principalmente para informar cosas que est&aacute;n rotas o sucias o da&ntilde;adas o desechadas y hay que arreglar, de limpieza o de compensaci&oacute;n, tales como:
<dl>
<dt>- veh&iacute;culos abandonados<br>
@@ -29,9 +29,9 @@
<dd></dd>
</dl>
</dd>
-<dt>&iquest;Para que NO es [% PROCESS 'site-name.html' -%] ?</dt>
+<dt>&iquest;Para que NO es [% site_name %] ?</dt>
<dd>&nbsp;</dd>
-<dd>[% PROCESS 'site-name.html' -%] no debe usarse para ponerse en contacto con el Ayuntamiento para todas las incidencias - por favor utilice este sitio s&oacute;lo para problemas como los anteriores. A menudo los informes de problemas siguen una burocracia y utilizar este sitio para asuntos urgentes pueden retrasarse en llegar al departamento correcto. Usted tendr&aacute; que ponerse en contacto con su autoridad directamente ante problemas como:
+<dd>[% site_name %] no debe usarse para ponerse en contacto con el Ayuntamiento para todas las incidencias - por favor utilice este sitio s&oacute;lo para problemas como los anteriores. A menudo los informes de problemas siguen una burocracia y utilizar este sitio para asuntos urgentes pueden retrasarse en llegar al departamento correcto. Usted tendr&aacute; que ponerse en contacto con su autoridad directamente ante problemas como:
<ul>
<li>Comportamientos anti-sociales.
<li>Cualquier problema de urgencia o emergencias
@@ -51,25 +51,25 @@
<dd>Seg&uacute;n los informes, se env&iacute;a un correo electr&oacute;nico al departamento pertinente. A partir de ese momento puede resolver el problema como normalmente lo har&iacute;a. Alternativamente, se puede discutir el problema en el sitio web con los dem&aacute;s, y luego juntos requerir al Ayuntamiento que lo arregle, o fijarlo directamente en la web.</dd>
<dt>&iquest;Es gr&aacute;tis? </dt>
<dd>Efectivamente el sitio es de uso gratuito. La plataforma arreglamibarrio.org es mantenido por la Asociaci&oacute;n Observatorio Ciudadano Municipal de Alcantarilla, asociaci&oacute;n sin &aacute;nimo de lucro registrada, as&iacute; que si usted desea hacer una contribuci&oacute;n puede hacerla.</dd>
-<dt>&iquest;Puedo usar [% PROCESS 'site-name.html' -%] con mi m&oacute;vil?</dt>
+<dt>&iquest;Puedo usar [% site_name %] con mi m&oacute;vil?</dt>
<dd>
-<p> [% PROCESS 'site-name.html' -%] la web funciona en su tel&eacute;fono m&oacute;vil, tiene un dise&ntilde;o &quot;responsive&quot; que se adapta al tama&ntilde;o de su pantalla de forma autom&aacute;tica.</p>
+<p> [% site_name %] la web funciona en su tel&eacute;fono m&oacute;vil, tiene un dise&ntilde;o &quot;responsive&quot; que se adapta al tama&ntilde;o de su pantalla de forma autom&aacute;tica.</p>
</dd>
</dl>
<h2><a name="practical"></a>Cuestiones pr&aacute;cticas </h2>
<dl>
<dt>Pertenezco a un Ayuntamiento, &iquest;d&oacute;nde env&iacute;an sus incidencias?</dt>
<dd>Usted puede crear una incidencia de prueba o contactarnos para saber d&oacute;nde van los informes. Puede contactar con nosotros para actualizar la direcci&oacute;n o direcciones que utilizamos.</dd>
-<dt>Pertenezco a un Ayuntamiento, &iquest;podr&iacute;amos tener [% PROCESS 'site-name.html' -%]
+<dt>Pertenezco a un Ayuntamiento, &iquest;podr&iacute;amos tener [% site_name %]
en nuestra web?</dt>
<dd>Es posible, pongase en contacto con nosotros y lo estudiaremos </dd>
<dt>&iquest;Eliminan contenido ilegal u ofensivo? </dt>
-<dd>[% PROCESS 'site-name.html' -%] no es responsable de el contenido o exactitud del material presentado por sus usuarios. Nos reservamos el derecho de editar o eliminar cualquier problema o actualizaciones que consideremos inadecuadas.</dd>
+<dd>[% site_name %] no es responsable de el contenido o exactitud del material presentado por sus usuarios. Nos reservamos el derecho de editar o eliminar cualquier problema o actualizaciones que consideremos inadecuadas.</dd>
<dt>&iquest;Porque no puedo alejar m&aacute;s el zoom del mapa?</dt>
-<dd>Intentamos mantener a [% PROCESS 'site-name.html' -%] centrado en la localidad, por lo que restringimos el movimiento a las zonas cubiertas. El mapa le permitir&aacute; ver todos los informes que ha realizado, est&eacute;n donde est&eacute;n. Si usted es del Ayuntamiento, el correo electr&oacute;nico de la incidencia tambi&eacute;n podr&iacute;a contener la ruta m&aacute;s cercana al pin en el mapa.</dd>
+<dd>Intentamos mantener a [% site_name %] centrado en la localidad, por lo que restringimos el movimiento a las zonas cubiertas. El mapa le permitir&aacute; ver todos los informes que ha realizado, est&eacute;n donde est&eacute;n. Si usted es del Ayuntamiento, el correo electr&oacute;nico de la incidencia tambi&eacute;n podr&iacute;a contener la ruta m&aacute;s cercana al pin en el mapa.</dd>
<h2><a name="organisation"></a>Preguntas a la organizaci&oacute;n </h2>
<dl>
-<dt>&iquest;Qui&eacute;n hizo [% PROCESS 'site-name.html' -%]?</dt>
+<dt>&iquest;Qui&eacute;n hizo [% site_name %]?</dt>
<dd>La plataforma fue creada por mysociety.
<dt>&iquest;Necesita ayuda con el proyecto? </dt>
<dd>S&iacute;, toda ayuda, t&eacute;cnica o no t&eacute;cnica ser&aacute; bienvenida. Por favor, consulte nuestra p&aacute;gina de participaci&oacute;n.</dd>
diff --git a/templates/web/barnet/footer.html b/templates/web/barnet/footer.html
index 60d834d5f..e5f8739b4 100644
--- a/templates/web/barnet/footer.html
+++ b/templates/web/barnet/footer.html
@@ -8,10 +8,10 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a href="https://www.fixmystreet.com/council">Powered by <img src="/cobrands/barnet/img/fms-logo.png" style="height:20px;"></a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/barnet/header.html b/templates/web/barnet/header.html
index 101d444a7..bb89483cb 100644
--- a/templates/web/barnet/header.html
+++ b/templates/web/barnet/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/base/admin/category_edit.html b/templates/web/base/admin/category_edit.html
index b827a4b6d..c0bd43ef5 100644
--- a/templates/web/base/admin/category_edit.html
+++ b/templates/web/base/admin/category_edit.html
@@ -43,6 +43,9 @@
[% IF c.cobrand.moniker != 'zurich' %]
<input type="checkbox" name="non_public" value="1" id="non_public"[% ' checked' IF contact.non_public %]>
<label class="inline" for="non_public">[% loc('Private') %]</label>
+ [% ELSE %]
+ <input type="checkbox" name="photo_required" value="1" id="photo_required"[% ' checked' IF contact.get_extra_metadata('photo_required') %]>
+ <label class="inline" for="photo_required">[% loc('Photo required') %]</label>
[% END %]
</p>
diff --git a/templates/web/base/admin/config_page.html b/templates/web/base/admin/config_page.html
index 7c9b5e317..71c524fb3 100644
--- a/templates/web/base/admin/config_page.html
+++ b/templates/web/base/admin/config_page.html
@@ -42,7 +42,7 @@ running version <strong>[% git_version || 'unknown' %]</strong>.
[% INCLUDE subsection heading="Display" %]
<tr>
<td>Site title</td>
- <td colspan=2>[% PROCESS 'site-name.html' -%]</td>
+ <td colspan=2>[% site_name %]</td>
</tr>
[% allowed_conf = FOR k IN c.config.ALLOWED_COBRANDS %]
[% IF k.keys %][% k.items.join(':') %][% ELSE %][% k %][% END %]
diff --git a/templates/web/base/admin/footer.html b/templates/web/base/admin/footer.html
index 4c891c4ff..59ef6a32c 100644
--- a/templates/web/base/admin/footer.html
+++ b/templates/web/base/admin/footer.html
@@ -1 +1 @@
-[% INCLUDE 'footer.html' %]
+[% INCLUDE 'footer.html' admin = 1 %]
diff --git a/templates/web/base/admin/header.html b/templates/web/base/admin/header.html
index 6282bf383..145bb986d 100644
--- a/templates/web/base/admin/header.html
+++ b/templates/web/base/admin/header.html
@@ -7,7 +7,7 @@ dd { margin-left: 8em; }
select { width: auto; }
</style>
- <p><strong>[% loc('FixMyStreet admin:') %]</strong>
+ <p><strong>[% tprintf(loc('%s admin:', "%s here is the site name"), site_name) %]</strong>
[%- FOREACH link IN allowed_links %]
<a href="[% c.uri_for( link ) %]">[% allowed_pages.$link.0 %]</a>
[% IF NOT loop.last %]|[% END %]
diff --git a/templates/web/base/admin/index.html b/templates/web/base/admin/index.html
index c9d2b8deb..dde6523a3 100644
--- a/templates/web/base/admin/index.html
+++ b/templates/web/base/admin/index.html
@@ -1,7 +1,8 @@
[% INCLUDE 'admin/header.html' title=loc('Summary') -%]
+[% PROCESS 'admin/report_blocks.html' %]
<div class="fms-admin-info fms-admin-floated">
-This is the administration interface for [% PROCESS 'site-name.html' -%]. If you
+This is the administration interface for [% site_name %]. If you
need any help or guidance, there is <a href="http://fixmystreet.org/">plenty of
online documentation</a>. The FixMyStreet Platform is
<a href="https://github.com/mysociety/fixmystreet">actively supported</a> by
@@ -20,11 +21,9 @@ and to receive notices of updates.
[% END %]
[%- BLOCK states -%]
-<h2>[% title %]</h2>
-
-[%- FOREACH state IN object.keys.sort %]
+[%- FOREACH state IN list %]
[%- '<ul>' IF loop.first %]
- <li>[% object.$state %] [% state %]</li>
+ <li>[% object.$state %] [% state_pretty.$state %]</li>
[%- "\n</ul>" IF loop.last %]
[%- END %]
[% END -%]
@@ -44,18 +43,28 @@ and to receive notices of updates.
</p>
[% END -%]
-[% PROCESS states title=loc('Problem breakdown by state') object=problems %]
+<h2>[% loc('Problem breakdown by state') %]</h2>
+[% FOREACH group IN state_groups %]
+[%- '<ul>' IF loop.first %]
+ <li><strong>[% group.0 %]</strong>
+ [% PROCESS states object=problems list=group.1 %]
+ </li>
+[%- "\n</ul>" IF loop.last %]
+[%- END %]
-[% PROCESS states title=loc('Update breakdown by state') object=comments %]
+<h2>[% loc('Update breakdown by state') %]</h2>
+[% PROCESS states object=comments list=comments.keys.sort %]
-[% FOREACH category IN categories %]
- [% IF loop.first %]
- <h2>[% loc('Category fix rate for problems > 4 weeks old') %]</h2>
+[% IF categories.size %]
+ <h2 id="category-fix-rate">[% loc('Category fix rate for problems > 4 weeks old') %]</h2>
<table>
<tr><th>[% loc('Category') %]</th><th>[% loc('Total') %]</th><th>[% loc('Fixed') %]</th></tr>
- [% END %]
+[% FOREACH category IN categories %]
<tr><td>[% category.key %]</td><td>[% category.value.total %]</td><td>[% category.value.fixed / category.value.total * 100 | format('%.1f') %]%</td></tr>
- [% '</table>' IF loop.last %]
+[% END %]
+ </table>
+[% ELSE %]
+<p><a href="?show_categories=1#category-fix-rate">[% loc('Category fix rate for problems > 4 weeks old') %]</a></p>
[% END %]
[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/base/admin/list_updates.html b/templates/web/base/admin/list_updates.html
index d3701bc1e..35f7adf66 100644
--- a/templates/web/base/admin/list_updates.html
+++ b/templates/web/base/admin/list_updates.html
@@ -34,7 +34,7 @@
<td>[% IF update.user.id == update.problem.user_id %][% loc('Yes') %][% ELSE %][% loc('No') %][% END %]</td>
<td>[% IF update.user.belongs_to_body( update.problem.bodies_str ) %][% loc('Yes') %][% ELSE %][% loc('No') %][% END %]</td>
<td>[% update.cobrand %]<br>[% update.cobrand_data | html %]</td>
- <td>[% update.state %]<br><small>
+ <td>[% state_pretty.${update.state} %]<br><small>
[% loc('Created:') %] [% PROCESS format_time time=update.created %]
<br>[% loc('Confirmed:') %] [% PROCESS format_time time=update.confirmed %]
</small></td>
diff --git a/templates/web/base/admin/problem_row.html b/templates/web/base/admin/problem_row.html
index 2413a6062..577e36992 100644
--- a/templates/web/base/admin/problem_row.html
+++ b/templates/web/base/admin/problem_row.html
@@ -30,7 +30,7 @@
[%- END -%]
<br>[% problem.cobrand %]<br>[% problem.cobrand_data | html %]
</td>
- <td>[% problem.state %]<br><small>
+ <td>[% state_pretty.${problem.state} %]<br><small>
[% loc('Created') %]:&nbsp;[% PROCESS format_time time=problem.created %]
<br>[% loc('When sent') %]:&nbsp;[% PROCESS format_time time=problem.whensent %]
[%- IF problem.is_visible %]<br>[% loc('Confirmed:' ) %]&nbsp;[% PROCESS format_time time=problem.confirmed %][% END -%]
diff --git a/templates/web/base/admin/report_blocks.html b/templates/web/base/admin/report_blocks.html
index c2cffc352..941bff821 100644
--- a/templates/web/base/admin/report_blocks.html
+++ b/templates/web/base/admin/report_blocks.html
@@ -1,3 +1,33 @@
+[%
+
+SET state_pretty = {
+ 'confirmed' = loc('Open')
+ 'investigating' = loc('Investigating')
+ 'planned' = loc('Planned')
+ 'in progress' = loc('In progress')
+ 'action scheduled' = loc('Action Scheduled')
+ 'fixed' = loc('Fixed')
+ 'fixed - user' = loc('Fixed - User')
+ 'fixed - council' = loc('Fixed - Council')
+ 'unable to fix' = loc('Unable to fix')
+ 'not responsible' = loc('Not Responsible')
+ 'duplicate' = loc('Duplicate')
+ 'closed' = loc('Closed')
+ 'internal referral' = loc('Internal referral')
+ 'hidden' = loc('Hidden')
+ 'partial' = loc('Partial')
+ 'unconfirmed' = loc('Unconfirmed')
+};
+
+SET state_groups = [
+ [ loc('Open'), [ 'confirmed', 'investigating', 'planned', 'in progress', 'action scheduled' ] ],
+ [ loc('Fixed'), [ 'fixed', 'fixed - user', 'fixed - council' ] ],
+ [ loc('Closed'), [ 'unable to fix', 'not responsible', 'duplicate', 'closed', 'internal referral' ] ],
+ [ loc('Hidden'), [ 'hidden', 'partial', 'unconfirmed' ] ]
+];
+
+%]
+
[% BLOCK value_or_nbsp -%]
[%- IF value %][% value | html %][% ELSE %]&nbsp;[% END %]
[%- END %]
diff --git a/templates/web/base/admin/report_edit.html b/templates/web/base/admin/report_edit.html
index d488dcadc..d04a1a82b 100644
--- a/templates/web/base/admin/report_edit.html
+++ b/templates/web/base/admin/report_edit.html
@@ -45,28 +45,10 @@ class="admin-offsite-link">[% problem.latitude %], [% problem.longitude %]</a>
<li>[% loc('Property address:') %] [% problem.extra.address | html %]</li>
[% END %]
<li><label class="inline" for="state">[% loc('State:') %]</label> <select name="state" id="state">
-[% FOREACH group IN [
- [ loc('Open'), [
- [ 'confirmed', loc('Open') ], [ 'investigating', loc('Investigating') ],
- [ 'planned', loc('Planned') ], [ 'in progress', loc('In progress') ],
- [ 'action scheduled', loc('Action Scheduled') ],
- ] ],
- [ loc('Fixed'), [
- [ 'fixed', loc('Fixed') ], [ 'fixed - user', loc('Fixed - User') ],
- [ 'fixed - council', loc('Fixed - Council') ]
- ] ],
- [ loc('Closed'), [
- [ 'unable to fix', loc('Unable to fix') ], [ 'not responsible', loc('Not Responsible') ],
- [ 'duplicate', loc('Duplicate') ], [ 'closed', loc('Closed') ],
- [ 'internal referral', loc('Internal referral') ],
- ] ],
- [ loc('Hidden'), [
- [ 'hidden', loc('Hidden') ], [ 'partial', loc('Partial') ], [ 'unconfirmed',loc('Unconfirmed') ]
- ] ]
-] %]
+[% FOREACH group IN state_groups %]
<optgroup label="[% group.0 %]">
[% FOREACH state IN group.1 %]
- <option [% 'selected ' IF state.0 == problem.state %] value="[% state.0 %]">[% state.1 %]</option>
+ <option [% 'selected ' IF state == problem.state %] value="[% state %]">[% state_pretty.$state %]</option>
[% END %]
</optgroup>
[% END %]
diff --git a/templates/web/base/alert/_list.html b/templates/web/base/alert/_list.html
index 2ffcfae39..395948248 100644
--- a/templates/web/base/alert/_list.html
+++ b/templates/web/base/alert/_list.html
@@ -1,11 +1,13 @@
<input type="hidden" name="type" value="local">
<input type="hidden" name="pc" value="[% pc | html %]">
+ <input type="hidden" name="latitude" value="[% latitude | html %]">
+ <input type="hidden" name="longitude" value="[% longitude | html %]">
<p>
[% IF pretty_pc %]
[% tprintf( loc('Here are the types of local problem alerts for &lsquo;%s&rsquo;.'), pretty_pc ) %]
[% END %]
- [% loc('Select which type of alert you\'d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert.') %]
+ [% loc('Select which type of alert you’d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert.') %]
</p>
[% INCLUDE 'errors.html' %]
@@ -16,14 +18,15 @@
<p id="rss_local">
<input type="radio" name="feed" id="[% rss_feed_id %]" value="[% rss_feed_id %]"[% IF rss_feed_id == selected_feed || selected_feed == '' %] checked[% END %]>
- <label for="[% rss_feed_id %]">[% tprintf( loc('Problems within %.1fkm of this location'), population_radius ) %]</label>
- [% loc('(a default distance which covers roughly 200,000 people)') %] <a href='[% rss_feed_uri %]'>
- <img src='/i/feed.png' width='16' height='16' title='[% loc('RSS feed of nearby problems') %]' alt='[% loc('RSS feed') %]' border='0'></a>
+ <label class="inline" for="[% rss_feed_id %]">[% tprintf( loc('Problems within %.1fkm of this location'), population_radius ) %]</label>
+ <a href='[% rss_feed_uri %]'><img src='/i/feed.png' width='16' height='16' title='[% loc('RSS feed of nearby problems') %]' alt='[% loc('RSS feed') %]' border='0'></a>
+ <br />
+ [% loc('(a default distance which covers roughly 200,000 people)') %]
</p>
<p id="rss_local_alt">
- [% loc('(alternatively the RSS feed can be customised, within') %]
- <a href="[% rss_feed_2k %]">2km</a> / <a href="[% rss_feed_5k %]">5km</a> / <a href="[% rss_feed_10k %]">10km</a> / <a href="[% rss_feed_20k %]">20km</a>)
+ [% SET distance_options = '<a href="' _ rss_feed_2k _ ' ">2km</a> / <a href="' _ rss_feed_5k _ ' ">5km</a> / <a href="' _ rss_feed_10k _ '">10km</a> / <a href="' _ rss_feed_20k _ '">20km</a>' %]
+ [% tprintf(loc('(alternatively the RSS feed can be customised, within %s)', "%s is a list of distance links, e.g. [2km] / [5km] / [10km] / [20km]"), distance_options) %]
</p>
<p>
@@ -35,21 +38,20 @@
</p>
[% IF reported_to_options %]
- <div id="rss_list">
<p><strong>
[% loc('Problems within the boundary of:') %]
</strong></p>
<ul class="plain-list">
[% ELSE %]
- <div><ul id="rss_feed">
+ <ul id="rss_feed" class="plain-list">
[% END %]
[% FOREACH option IN options %]
<li[% IF ! (loop.count % 2) %] class="a"[% END %]>
<input type="radio" name="feed" id="[% option.id %]" value="[% option.id %]"[% IF option.id == selected_feed %] checked[% END %]>
- <label class="inline" for="[% option.id %]">[% option.text %]</label>
<a href="[% option.uri %]"><img src="/i/feed.png" width="16" height="16"
title="[% option.rss_text %]" alt="RSS feed" border="0"></a>
+ <label class="inline" for="[% option.id %]">[% option.text %]</label>
</li>
[% END %]
</ul>
@@ -61,40 +63,31 @@ title="[% option.rss_text %]" alt="RSS feed" border="0"></a>
[% FOREACH option IN reported_to_options %]
<li[% IF ! (loop.count % 2) %] class="a"[% END %]>
<input type="radio" name="feed" id="[% option.id %]" value="[% option.id %]"[% IF option.id == selected_feed %] checked[% END %]>
- <label class="inline" for="[% option.id %]">[% option.text %]</label>
<a href="[% option.uri %]"><img src="/i/feed.png" width="16" height="16"
title="[% option.rss_text %]" alt="RSS feed" border="0"></a>
+ <label class="inline" for="[% option.id %]">[% option.text %]</label>
</li>
[% END %]
</ul>
<p><small>
- [% loc( 'FixMyStreet sends different categories of problem
+ [% tprintf(loc('%s sends different categories of problem
to the appropriate council, so problems within the boundary of a particular council
might not match the problems sent to that council. For example, a graffiti report
will be sent to the district council, so will appear in both of the district
council&rsquo;s alerts, but will only appear in the "Within the boundary" alert
-for the county council.' ) %]
+for the county council.', "%s is the site name"), site_name) %]
</small></p>
-</div>
-<div id="rss_buttons">
[% END %]
- <p>
- <input type="submit" name="rss" value="[% loc('Give me an RSS feed') %]">
- <p>
+ <input id="alert_rss_button" class="green-btn" type="submit" name="rss" value="[% loc('Give me an RSS feed') %]">
<p id="alert_or">
[% loc('or') %]
</p>
[% UNLESS c.user_exists %]
- <p>
- [% loc('Your email:') %] <input type="text" id="rznvy" name="rznvy" value="[% rznvy | html %]" size="30">
- </p>
+ <label for="rznvy">[% loc('Your email') %]</label>
+ <input type="text" id="rznvy" name="rznvy" value="[% rznvy | html %]">
[% END %]
-
- <p>
- <input type="submit" name="alert" value="[% loc('Subscribe me to an email alert') %]">
- </p>
- </div> <!-- ???? -->
+ <input id="alert_email_button" style="margin-top:1em;" class="green-btn" type="submit" name="alert" value="[% loc('Subscribe me to an email alert') %]">
diff --git a/templates/web/base/alert/index.html b/templates/web/base/alert/index.html
index 314008846..2b12182df 100644
--- a/templates/web/base/alert/index.html
+++ b/templates/web/base/alert/index.html
@@ -4,13 +4,13 @@
<p>
[% IF c.cobrand.is_council %]
-FixMyStreet has a variety of RSS feeds and email alerts for local problems, including
-alerts for all problems within a particular ward, or all problems
-within a certain distance of a particular location.
+[% tprintf(loc('%s has a variety of RSS feeds and email alerts for local
+problems, including alerts for all problems within a particular ward, or all
+problems within a certain distance of a particular location.', "%s is the site name"), site_name) %]
[% ELSE %]
-[% loc('FixMyStreet has a variety of RSS feeds and email alerts for local problems, including
+[% tprintf(loc('%s has a variety of RSS feeds and email alerts for local problems, including
alerts for all problems within a particular ward or council, or all problems
-within a certain distance of a particular location.') %]
+within a certain distance of a particular location.', "%s is the site name"), site_name) %]
[% END %]
</p>
@@ -22,12 +22,12 @@ within a certain distance of a particular location.') %]
<p>
[% IF c.cobrand.is_council %]
-To find out what local alerts we have for you, please enter your [% c.cobrand.council_area %] postcode or street name and area:
+[% tprintf(loc('To find out what local alerts we have for you, please enter your %s postcode or street name and area:'), c.cobrand.council_area) %]
[% ELSE %]
[% loc('To find out what local alerts we have for you, please enter your postcode or street name and area' ) %]
[% END %]
</p>
-<form method="get" action="/alert/list" class="full-width">
+<form method="get" action="/alert/list" class="form-box">
<fieldset>
<div class="form-txt-submit-box">
<input type="text" name="pc" value="[% pc | html %]" placeholder="[% tprintf(loc('e.g. ‘%s’ or ‘%s’'), c.cobrand.example_places) %]">
diff --git a/templates/web/fixmystreet/around/around_index.html b/templates/web/base/around/_error_multiple.html
index 2cd51da17..15089ba6b 100644
--- a/templates/web/fixmystreet/around/around_index.html
+++ b/templates/web/base/around/_error_multiple.html
@@ -1,14 +1,3 @@
-[% pre_container_extra = INCLUDE 'around/postcode_form.html' %]
-[% INCLUDE 'header.html', title = loc('Reporting a problem'), bodyclass = 'frontpage fullwidthpage' %]
-
-[%
- # NOTE ON PARTIAL REPORTS:
- #
- # partial reports get a bit of extra text added, the form goes to
- # '/report/new' and the partial hidden field is added to the form.
-%]
-
-<div class="tablewrapper">
[% IF location_error %]
[% INCLUDE 'around/location_error.html' %]
[% END %]
@@ -28,6 +17,3 @@
[% loc("Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box above&nbsp;:") %]
</p>
[% END %]
-</div>
-
-[% INCLUDE 'footer.html' %]
diff --git a/templates/web/base/around/_main.html b/templates/web/base/around/_main.html
new file mode 100644
index 000000000..1b832cb49
--- /dev/null
+++ b/templates/web/base/around/_main.html
@@ -0,0 +1,8 @@
+<form action="[% c.uri_for('/around') %]" method="get" name="mapForm" id="mapForm">
+ <div id="side-form">
+ <div id="report-a-problem-main">
+ [% pre_container_extra %]
+ [% INCLUDE 'around/_error_multiple.html' %]
+ </div>
+ </div>
+</form>
diff --git a/templates/web/base/around/_report_banner.html b/templates/web/base/around/_report_banner.html
index 024fe08d9..9fcfe3640 100755
--- a/templates/web/base/around/_report_banner.html
+++ b/templates/web/base/around/_report_banner.html
@@ -1,10 +1,6 @@
-<p id="text_map" class="banner">
- [% loc( 'To <strong>report a problem</strong>, click on the map at the correct location.' ) %]
- [%
- tprintf(
- loc("<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"),
- url_skip
- )
- %]
- <span id="text_map_arrow"></span>
-</p>
+<h1 class="big-green-banner">
+ [% loc( 'Click map to report a problem' ) %]
+</h1>
+<a id="skip-this-step" href="[% url_skip %]" rel="nofollow">
+ [% loc("Can't see the map? <em>Skip this step</em>") %]
+</a>
diff --git a/templates/web/base/around/around_index.html b/templates/web/base/around/around_index.html
deleted file mode 100644
index 3b2714643..000000000
--- a/templates/web/base/around/around_index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-[%
- SET bodyclass = 'mappage';
- INCLUDE 'header.html', title => loc('Reporting a problem')
-%]
-
-<form action="[% c.uri_for('/around') %]" method="get" name="mapForm" id="mapForm">
- <div id="side-form">
- <div id="report-a-problem-main">
- [% INCLUDE 'around/postcode_form.html' %]
-
- [% IF location_error %]
- [% INCLUDE 'around/location_error.html' %]
- [% END %]
-
- [% IF possible_location_matches %]
- <p>[% loc('We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here.') %]</p>
- <ul class="pc_alternatives">
- [% FOREACH match IN possible_location_matches %]
- <li><a href="/around?latitude=[% match.latitude | uri %];longitude=[% match.longitude | uri %]">[% match.address | html %]</a></li>
- [% END %]
- </ul>
- [% END %]
- </div>
- </div>
-</form>
-
-[% INCLUDE 'footer.html' %]
diff --git a/templates/web/base/around/around_map_list_items.html b/templates/web/base/around/around_map_list_items.html
deleted file mode 100644
index da75561b5..000000000
--- a/templates/web/base/around/around_map_list_items.html
+++ /dev/null
@@ -1,18 +0,0 @@
-[% IF around_map.size %]
- [% FOREACH p IN around_map %]
-
- [% dist = tprintf("%.1f", (p.distance || 0) ) %]
-
- <li>
- <a href="[% c.uri_for('/report', p.problem.id ) %]">[% p.problem.title | html %]</a>
- <small>[% prettify_dt( p.problem.confirmed, 1 ) %], [% dist %]km</small>
- [% IF p.problem.is_fixed %]
- <small>[% loc('(fixed)') %]</small>
- [% ELSIF p.problem.is_closed %]
- <small>[% loc('(closed)') %]</small>
- [% END %]
- </li>
- [% END %]
-[% ELSE %]
- <li>[% loc('No problems found.') %]</li>
-[% END %]
diff --git a/templates/web/base/around/display_location.html b/templates/web/base/around/display_location.html
index 3f4ec8881..d38ae6754 100755
--- a/templates/web/base/around/display_location.html
+++ b/templates/web/base/around/display_location.html
@@ -30,7 +30,7 @@
PROCESS "maps/${map.type}.html" around_page = 1;
SET bodyclass = 'mappage';
- SET rss = [ loc('Recent local problems, FixMyStreet'), rss_url ] IF c.cobrand.moniker != 'emptyhomes';
+ SET rss = [ tprintf(loc('Recent local problems, %s', "%s is the site name"), site_name), rss_url ] IF c.cobrand.moniker != 'emptyhomes';
INCLUDE 'header.html',
title => loc('Viewing a location')
robots => 'noindex,nofollow';
diff --git a/templates/web/base/around/index.html b/templates/web/base/around/index.html
new file mode 100644
index 000000000..f2be5575c
--- /dev/null
+++ b/templates/web/base/around/index.html
@@ -0,0 +1,13 @@
+[% pre_container_extra = INCLUDE 'around/postcode_form.html' %]
+[% INCLUDE 'header.html', title = loc('Reporting a problem'), bodyclass = 'frontpage fullwidthpage' %]
+
+[%
+ # NOTE ON PARTIAL REPORTS:
+ #
+ # partial reports get a bit of extra text added, the form goes to
+ # '/report/new' and the partial hidden field is added to the form.
+%]
+
+[% INCLUDE 'around/_main.html' %]
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmystreet/around/intro.html b/templates/web/base/around/intro.html
index d71dad1d5..d71dad1d5 100644
--- a/templates/web/fixmystreet/around/intro.html
+++ b/templates/web/base/around/intro.html
diff --git a/templates/web/base/around/location_error.html b/templates/web/base/around/location_error.html
index 9b907b64b..fc9b2b8ce 100644
--- a/templates/web/base/around/location_error.html
+++ b/templates/web/base/around/location_error.html
@@ -1 +1 @@
-<p class="error">[% location_error %]</p>
+<p class="form-error">[% location_error %]</p>
diff --git a/templates/web/base/around/on_map_list_items.html b/templates/web/base/around/on_map_list_items.html
index 70a071406..b7257030d 100644
--- a/templates/web/base/around/on_map_list_items.html
+++ b/templates/web/base/around/on_map_list_items.html
@@ -1,15 +1,14 @@
-[% IF on_map.size %]
- [% FOREACH p IN on_map %]
- <li>
- <a href="[% c.uri_for('/report', p.id ) %]">[% p.title | html %]</a>
- <small>[% prettify_dt( p.confirmed, 1 ) %]</small>
- [% IF p.is_fixed %]
- <small>[% loc('(fixed)') %]</small>
- [% ELSIF p.is_closed %]
- <small>[% loc('(closed)') %]</small>
- [% END %]
- </li>
+[% all_reports = on_map.merge(around_map) %]
+[% IF all_reports.size %]
+ [% FOREACH problem IN all_reports %]
+ [% UNLESS problem.title;
+ dist = tprintf("%.1f", (problem.distance || 0) );
+ problem = problem.problem;
+ END %]
+ [% INCLUDE 'reports/_list-entry.html' %]
[% END %]
[% ELSE %]
- <li>[% loc('No problems have been reported yet.') %]</li>
+ <li class="item-list__item item-list__item--empty">
+ <p>[% loc('There are no reports to show.') %]</p>
+ </li>
[% END %]
diff --git a/templates/web/base/around/postcode_form.html b/templates/web/base/around/postcode_form.html
index f58d7285d..601f0ee9e 100644
--- a/templates/web/base/around/postcode_form.html
+++ b/templates/web/base/around/postcode_form.html
@@ -1,13 +1,26 @@
-[%
- question = c.cobrand.enter_postcode_text || loc('Enter a nearby street name and area');
-%]
-
-<form action="[% c.uri_for('/around') %]" method="get" name="postcodeForm" id="postcodeForm">
- <label for="pc">[% question %]:</label>
- <span><input type="text" name="pc" value="[% pc | html %]" id="pc" size="10" maxlength="200">
- <input type="submit" value="[% loc('Go') %]" id="sub">
- </span>
- [% IF partial_token %]
- <input type="hidden" name="partial" value="[% partial_token.token %]">
- [% END %]
-</form>
+<div id="front-main">
+ <div id="front-main-container">
+ [% INCLUDE 'around/intro.html' %]
+
+ [%
+ question = c.cobrand.enter_postcode_text || loc('Enter a nearby street name and area');
+ %]
+
+ [% IF c.cobrand.moniker == 'fixmybarangay' %]
+ [% INCLUDE '_barangay_buttons.html' %]
+ [% ELSE %]
+ <form action="[% c.uri_for('/around') %]" method="get" name="postcodeForm" id="postcodeForm">
+ <label for="pc">[% question %]:</label>
+ <div>
+ <input type="text" name="pc" value="[% pc | html %]" id="pc" size="10" maxlength="200" placeholder="[% tprintf(loc('e.g. ‘%s’ or ‘%s’'), c.cobrand.example_places) %]">
+ <input type="submit" value="[% loc('Go') %]" id="sub">
+ </div>
+
+ [% IF partial_token %]
+ <input type="hidden" name="partial" value="[% partial_token.token %]">
+ [% END %]
+
+ </form>
+ [% END %]
+ </div>
+</div>
diff --git a/templates/web/base/around/tabbed_lists.html b/templates/web/base/around/tabbed_lists.html
index 4ad7b35fc..b0d46444d 100755
--- a/templates/web/base/around/tabbed_lists.html
+++ b/templates/web/base/around/tabbed_lists.html
@@ -1,23 +1,5 @@
-<div id="nearby_lists">
-
- <h2>[% loc('Reports on and around the map') %]</h2>
-
- <ul id="current">
- [% INCLUDE "around/on_map_list_items.html" %]
- </ul>
-
- <h2>
- [%
- tprintf(
- loc( 'Closest nearby problems <small>(within&nbsp;%skm)</small>' ),
- distance
- )
- %]
- </h2>
-
- <ul id="current_near">
- [% INCLUDE "around/around_map_list_items.html" %]
- </ul>
-
-</div>
+[% INCLUDE "reports/_list-filters.html" %]
+<ul id="current" class="item-list item-list--reports">
+ [% INCLUDE "around/on_map_list_items.html" %]
+</ul>
diff --git a/templates/web/base/auth/general.html b/templates/web/base/auth/general.html
index f5e2e423f..6e1db86fe 100644
--- a/templates/web/base/auth/general.html
+++ b/templates/web/base/auth/general.html
@@ -1,83 +1,70 @@
-[% INCLUDE 'header.html', title = loc('Sign in or create an account') %]
+[% INCLUDE 'header.html', bodyclass='authpage', title = loc('Sign in or create an account') %]
<h1>[% loc('Sign in') %]</h1>
<form action="[% c.uri_for() %]" method="post" name="general_auth" class="validate">
-<input type="hidden" name="r" value="[% c.req.params.r | html %]">
-
- [% IF email_error;
-
- # other keys include fqdn, mxcheck if you'd like to write a custom error message
-
- errors = {
- missing => loc('Please enter your email'),
- other => loc('Please check your email address is correct')
- };
-
- loc_email_error = errors.$email_error || errors.other;
- END %]
-
- [% IF loc_email_error %]
+ <fieldset>
+
+ <input type="hidden" name="r" value="[% c.req.params.r | html %]">
+
+ [% IF email_error;
+
+ # other keys include fqdn, mxcheck if you'd like to write a custom error message
+
+ errors = {
+ missing => loc('Please enter your email'),
+ other => loc('Please check your email address is correct')
+ };
+
+ loc_email_error = errors.$email_error || errors.other;
+ END %]
+
+ <label class="n" for="email">[% loc('Email') %]</label>
+ [% IF loc_email_error %]
<div class="form-error">[% loc_email_error %]</div>
- [% ELSIF sign_in_error %]
+ [% ELSIF sign_in_error %]
<div class="form-error">[% loc('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form.') %]</div>
- [% END %]
-
- <div class="form-field">
- <label class="n" for="email">[% loc('Your email address:') %]</label>
- <input type="email" class="required email" size="30" id="email" name="email" value="[% email | html %]">
- </div>
-
-<div id="form_sign_in">
- <h3>[% loc("Do you have a FixMyStreet password?") %]</h3>
-
- <div id="form_sign_in_yes">
-
- <p>
- <label class="n" for="password_sign_in">[% loc('<strong>Yes</strong> I have a password') %]</label>
- <input type="password" name="password_sign_in" id="password_sign_in" value="">
- </p>
-
- <p>
- <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
- <label class="n" for="remember_me">
- [% loc('Keep me signed in on this computer') %]
- </label>
- </p>
-
- <p>
- <input type="submit" name="sign_in" value="[% loc('Sign in') %]">
- </p>
-
- </div>
- <div id="form_sign_in_no">
-
- <p>[% loc('<strong>No</strong>, I do not, let me sign in by email:') %]</p>
-
- <div class="fieldset">
- <div class="form-field">
- <label for="name">[% loc('Your name:') %]</label>
- <input type="text" name="name" value="">
- </div>
+ [% END %]
+ <input type="email" class="required email" id="email" name="email" value="[% email | html %]" placeholder="[% loc('Your email address') %]" autofocus>
+
+ <div id="form_sign_in">
+ <h3>[% tprintf(loc("Do you have a %s password?", "%s is the site name"), site_name) %]</h3>
+
+ <div id="form_sign_in_yes" class="form-box">
+ <h5>[% loc('<strong>Yes</strong> I have a password') %]</h5>
+
+ <label class="hidden-js n" for="password_sign_in">[% loc('Password:') %]</label>
+
+ <div class="form-txt-submit-box">
+ <input type="password" name="password_sign_in" id="password_sign_in" value="" placeholder="[% loc('Your password') %]">
+ <input class="green-btn" type="submit" name="sign_in" value="[% loc('Sign in') %]">
+ </div>
+
+ <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
+ <label class="inline n" for="remember_me">[% loc('Keep me signed in on this computer') %]</label>
- <div class="form-field">
- <label for="password_register">[% loc('Enter a new password:') %]</label>
- <input type="password" name="password_register" id="password_register" value="">
</div>
- </div>
+ <div id="form_sign_in_no" class="form-box">
+ <h5>[% loc('<strong>No</strong> let me sign in by email') %]</h5>
- <p><small>Providing a name and password is optional, but doing so
- will allow you to more easily report problems, leave updates and
- manage your reports.</small></p>
+ <label for="name">[% loc('Name') %]</label>
+ <input type="text" name="name" value="" placeholder="[% loc('Your name') %]">
- <p>
- <input type="submit" name="email_sign_in" value="[% loc('Sign in by email') %]">
- </p>
+ <label for="password_register">[% loc('Password (optional)') %]</label>
- </div>
+ <div class="general-notes">
+ <p>[% loc('Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</p>
+ </div>
+
+ <div class="form-txt-submit-box">
+ <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]">
+ <input class="green-btn" type="submit" name="email_sign_in" value="[% loc('Sign in') %]">
+ </div>
+ </div>
+
+ </div>
-</div>
-
+ </fieldset>
</form>
diff --git a/templates/web/base/auth/token.html b/templates/web/base/auth/token.html
index 361d4fbd5..a4dedcec3 100644
--- a/templates/web/base/auth/token.html
+++ b/templates/web/base/auth/token.html
@@ -1,25 +1,27 @@
-[% INCLUDE 'header.html', title => loc('Confirm account') %]
+[% INCLUDE 'header.html', bodyclass = 'fullwidthpage', title = loc('Confirm account') %]
[% IF token_not_found %]
+[%# Shown whenever there's an invalid token, eg while confirming a report or logging in without a password %]
-<h1>[% loc('Error') %]</h1>
+ <div class="confirmation-header confirmation-header--failure">
-<p>
- [% loc('We have not been able to confirm your account - sorry.') %]
- [% loc('This may be because the link is too old or already used, or the address was not copied correctly.') %]
-</p>
+ <h1>[% loc('Sorry, that wasn&rsquo;t a valid link') %]</h1>
+ <p>[% loc('The link might have expired, or maybe you didn&rsquo;t quite copy and paste it correctly.') %]</p>
+
+ </div>
[% ELSE %]
-<h1>[% loc('Please check your email') %]</h1>
+ <div class="confirmation-header confirmation-header--inbox">
-<p>[% loc("We have sent you an email containing a link to confirm your account.") %]</p>
+ <h1>[% loc("Nearly done! Now check your email&hellip;") %]</h1>
+ <p>[% loc("Click the link in our confirmation email to sign in.") %]</p>
-[% IF c.cobrand.moniker != 'zurich' %]
-<p>[% loc("The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient.") %]</p>
-[% END %]
+ <p>
+ [% loc("Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time.") %]
+ </p>
-<p>[% loc("If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way.") %]</p>
+ </div>
[% END %]
diff --git a/templates/web/base/common_header_tags.html b/templates/web/base/common_header_tags.html
index 16098b7f5..0ad3ffb5f 100644
--- a/templates/web/base/common_header_tags.html
+++ b/templates/web/base/common_header_tags.html
@@ -42,5 +42,5 @@
<title>
[% "$title :: " | html IF title %]
- [% PROCESS 'site-name.html' -%]
+ [% site_name -%]
</title>
diff --git a/templates/web/base/contact/blurb.html b/templates/web/base/contact/blurb.html
index 22c9a3cef..463813449 100644
--- a/templates/web/base/contact/blurb.html
+++ b/templates/web/base/contact/blurb.html
@@ -1,6 +1,6 @@
<p>
[% loc('Please do <strong>not</strong> report problems through this form; messages go to
-the team behind FixMyStreet, not a council. To report a problem,
+the team behind this site, not a council. To report a problem,
please <a href="/">go to the front page</a> and follow the instructions.') %]
</p>
diff --git a/templates/web/base/email_sent.html b/templates/web/base/email_sent.html
index 8d7b35a58..7d38f9d67 100644
--- a/templates/web/base/email_sent.html
+++ b/templates/web/base/email_sent.html
@@ -1,34 +1,23 @@
-[% INCLUDE 'header.html', bodyclass = 'twothirdswidthpage', title = loc('Create a report') %]
+[% INCLUDE 'header.html', bodyclass = 'fullwidthpage', title = loc('Create a report') %]
-<h1>[% loc("Nearly Done! Now check your email...") %]</h1>
+<div class="confirmation-header confirmation-header--inbox">
-[% IF c.cobrand.moniker != 'zurich' %]
- <p>[% loc("The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient.") %]</p>
-[% END %]
+ <h1>[% loc("Nearly done! Now check your email&hellip;") %]</h1>
-<p>[% loc("If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way.") %]</p>
-
-[% IF c.cobrand.moniker != 'zurich' %]
<p>
- [% loc("You must now click the link in the email we've just sent you.") %]
[% IF email_type == 'problem' %]
- [% loc("If you do not, your problem will not be posted.") %]
+ [% loc("Click the link in our confirmation email to publish your problem.") %]
[% ELSIF email_type == 'update' %]
- [% loc("If you do not, your update will not be posted.") %]
+ [% loc("Click the link in our confirmation email to publish your update.") %]
[% ELSIF email_type == 'alert' %]
- [% loc("If you do not, your alert will not be activated.") %]
+ [% loc("Click the link in our confirmation email to activate your alert.") %]
[% END %]
</p>
<p>
- [% IF email_type == 'problem' %]
- [% loc("(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)") %]
- [% ELSIF email_type == 'update' %]
- [% loc("(Don't worry &mdash; we'll hang on to your update while you're checking your email.)") %]
- [% ELSIF email_type == 'alert' %]
- [% loc("(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)") %]
- [% END %]
+ [% loc("Can&rsquo;t find our email? Check your spam folder&nbsp;&ndash; that&rsquo;s the solution 99% of the time.") %]
</p>
-[% END %]
+
+</div>
[% INCLUDE 'footer.html' %]
diff --git a/templates/web/base/faq/faq-en-gb.html b/templates/web/base/faq/faq-en-gb.html
index e1e07a8d7..b60f1102a 100755
--- a/templates/web/base/faq/faq-en-gb.html
+++ b/templates/web/base/faq/faq-en-gb.html
@@ -3,27 +3,27 @@
<div class="sticky-sidebar">
<aside>
<ul class="plain-list">
- <li><strong>Frequently Asked Questions</strong></li>
- <li><a href="/privacy">Privacy and cookies</a></li>
- <li><a href="/contact">Contact [% PROCESS 'site-name.html' -%]</a></li>
+ <li><strong>[% loc('Frequently Asked Questions') %]</strong></li>
+ <li><a href="/privacy">[% loc('Privacy and cookies') %]</a></li>
+ <li><a href="/contact">[% tprintf(loc("Contact %s", "%s is the site name"), site_name) %]</a></li>
</ul>
</aside>
</div>
-<h1><a name="faq"></a>Frequently Asked Questions</h1>
+<h1><a name="faq"></a>[% loc('Frequently Asked Questions') %]</h1>
<dl>
<dt>What is this site?</dt>
- <dd>[% PROCESS 'site-name.html' -%] is a site to help people report to their
+ <dd>[% site_name %] is a site to help people report to their
local authority, view, or discuss local issues they&rsquo;ve found, by
simply locating them on a map.</dd>
- <dt>How do I get in touch with [% PROCESS 'site-name.html' -%]?</dt>
+ <dt>How do I get in touch with [% site_name %]?</dt>
<dd>Here&rsquo;s our <a href="/contact">contact page</a>.</dd>
- <dt>What sort of problems should I report with [% PROCESS 'site-name.html' -%]?</dt>
- <dd>This depends upon the precise purpose of [% PROCESS 'site-name.html' -%];
+ <dt>What sort of problems should I report with [% site_name %]?</dt>
+ <dd>This depends upon the precise purpose of [% site_name %];
in the UK, FixMyStreet is primarily for reporting things which are
<strong>broken or dirty or damaged or dumped, and need fixing, cleaning
or clearing</strong>, such as:
@@ -38,8 +38,8 @@
</ul>
</dd>
- <dt>What isn&rsquo;t [% PROCESS 'site-name.html' -%] for?</dt>
- <dd>[% PROCESS 'site-name.html' -%] is not a way of getting in touch with your
+ <dt>What isn&rsquo;t [% site_name %] for?</dt>
+ <dd>[% site_name %] is not a way of getting in touch with your
authority for all issues &ndash; please use this site only for problems
such as the above. We often route problem reports via cleansing services or
highways and so using this site for other matters may result in a delay in
@@ -75,9 +75,9 @@
a registered charity, so if you want to make a contribution,
<a href="https://www.mysociety.org/donate/">please do</a>.</dd>
- <dt>Can I use [% PROCESS 'site-name.html' -%] on my mobile?</dt>
+ <dt>Can I use [% site_name %] on my mobile?</dt>
<dd>
- <p>The [% PROCESS 'site-name.html' -%] website will already work on your mobile
+ <p>The [% site_name %] website will already work on your mobile
phone, adapting to the size of your screen automatically.</p>
</dd>
</dl>
@@ -90,18 +90,18 @@
to find out where reports go at the moment. Also <a href="/contact">contact us</a>
to update the address or addresses we use.</dd>
- <dt>I&rsquo;m from an authority, can we have [% PROCESS 'site-name.html' -%]
+ <dt>I&rsquo;m from an authority, can we have [% site_name %]
on our website?</dt>
<dd>Quite possibly &ndash; contact the people who run this site.</dd>
<dt>Do you remove silly or illegal content?</dt>
- <dd>[% PROCESS 'site-name.html' -%] is not responsible for the content and
+ <dd>[% site_name %] is not responsible for the content and
accuracy of material submitted by its users. We reserve the right to
edit or remove any problems or updates which we consider to be
inappropriate upon being informed by a user of the site.</dd>
<dt>Why can&rsquo;t I zoom out more on the reporting map?</dt>
- <dd>We want to keep [% PROCESS 'site-name.html' -%] locally focused, so restrict
+ <dd>We want to keep [% site_name %] locally focused, so restrict
the ability to move radically between areas. The map on Your Reports will
let you see all the reports you&rsquo;ve made, wherever they are. If
you&rsquo;re from the authority then the emailed version of the problem
@@ -111,7 +111,7 @@ to update the address or addresses we use.</dd>
<h2><a name="organisation"></a>Organisation Questions</h2>
<dl>
- <dt>Who built [% PROCESS 'site-name.html' -%]?</dt>
+ <dt>Who built [% site_name %]?</dt>
<dd>This will depend upon the installation of the FixMyStreet Platform,
who should create their own <code>faq/</code> template in their cobrand
directory to replace this default one. The FixMyStreet Platform was
diff --git a/templates/web/base/footer.html b/templates/web/base/footer.html
index a58a3e696..3f4e5b551 100644
--- a/templates/web/base/footer.html
+++ b/templates/web/base/footer.html
@@ -21,11 +21,9 @@
<div id="footer">
- <p><a href="/contact">[% loc("Contact FixMyStreet") | replace(' ', '&nbsp;') %]</a></p>
+ <p><a href="/contact">[% tprintf(loc("Contact %s", "%s is the site name"), site_name) | replace(' ', '&nbsp;') %]</a></p>
- <p>[% loc('Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?') %]
- [% loc('Our code is open source and <a href="http://github.com/mysociety/fixmystreet">available on GitHub</a>.') %]
- </p>
+ [% INCLUDE 'front/footer-marketing.html' %]
</div>
diff --git a/templates/web/base/front/_list-entry.html b/templates/web/base/front/_list-entry.html
new file mode 100755
index 000000000..2fcf5f296
--- /dev/null
+++ b/templates/web/base/front/_list-entry.html
@@ -0,0 +1 @@
+[% INCLUDE 'report/_item.html' no_fixed = 1 %]
diff --git a/templates/web/fixmystreet/front/footer-marketing.html b/templates/web/base/front/footer-marketing.html
index 249dbca8d..c0c9b4168 100644
--- a/templates/web/fixmystreet/front/footer-marketing.html
+++ b/templates/web/base/front/footer-marketing.html
@@ -9,7 +9,7 @@
<div id="footer-help">
<p>
- Powered by <a class="platform-logo" href="http://fixmystreet.org/">FixMyStreet Platform</a>
+ [% loc('Powered by <a class="platform-logo" href="http://fixmystreet.org/">FixMyStreet Platform</a>') %]
</p>
<ul>
<li>
diff --git a/templates/web/fixmystreet/front/javascript.html b/templates/web/base/front/javascript.html
index 13aa5216c..13aa5216c 100644
--- a/templates/web/fixmystreet/front/javascript.html
+++ b/templates/web/base/front/javascript.html
diff --git a/templates/web/base/front/recent.html b/templates/web/base/front/recent.html
new file mode 100644
index 000000000..cb83c51b8
--- /dev/null
+++ b/templates/web/base/front/recent.html
@@ -0,0 +1,23 @@
+[%
+ recent_photos = c.cobrand.recent_photos('front', 5);
+%]
+
+[% IF recent_photos.size %]
+<div id="front-recently">
+ <h2>
+ [%- IF c.cobrand.moniker == 'hart' %]
+ Recently reported
+ [% ELSE %]
+ [% loc('Recently reported problems') %]
+ [% END -%]
+ </h2>
+
+ <section class="full-width">
+ <ul class="item-list item-list--reports item-list--front-page">
+ [% FOREACH problem IN recent_photos %]
+ [% INCLUDE 'front/_list-entry.html' %]
+ [% END %]
+ </ul>
+ </section>
+</div>
+[% END %]
diff --git a/templates/web/base/header.html b/templates/web/base/header.html
index e6362a449..1d7960661 100644
--- a/templates/web/base/header.html
+++ b/templates/web/base/header.html
@@ -1,7 +1,7 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 8]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
@@ -11,6 +11,8 @@
<meta name="HandHeldFriendly" content="true">
<meta name="mobileoptimized" content="0">
+ [% INCLUDE 'header_opengraph.html' %]
+
<link rel="stylesheet" href="[% version('/css/core.css') %]">
[% INCLUDE 'common_header_tags.html' %]
@@ -24,14 +26,16 @@
%][% loc('FixMyStreet') %]
[%- IF NOT title AND NOT c.req.path %]</h1>[% ELSE %]</a></div>[% END %]
- <ul id="meta">
- [% IF c.user_exists %]
- <li>[% tprintf(loc('Signed in as %s'), c.user.name || c.user.email) %]
- <li class="last"><a href="/auth/sign_out">[% loc('Sign out') %]</a></li>
- [% ELSE %]
- <li>&nbsp;</li>
- [% END %]
- </ul>
+ [% IF c.user_exists %]
+ <div id="user-meta">
+ <p>
+ [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
+ <a href="/auth/sign_out">[% loc('sign out') %]</a>
+ </p>
+ </div>
+ [% END %]
+
+ [% pre_container_extra %]
<div id="mysociety" class="container" role="main">
diff --git a/templates/web/base/header_opengraph.html b/templates/web/base/header_opengraph.html
index e69de29bb..f728d083f 100644
--- a/templates/web/base/header_opengraph.html
+++ b/templates/web/base/header_opengraph.html
@@ -0,0 +1,6 @@
+ <meta property="og:url" content="[% c.cobrand.base_url %][% c.req.uri.path %]">
+ <meta property="og:title" content="[% title || site_name %]">
+ <meta property="og:site_name" content="[% site_name %]">
+ [% IF c.req.uri.path == '/' %]<meta property="og:description" content="Report, view, and discuss local street-related problems.">[% END %]
+ <meta property="og:type" content="website">
+ [% INCLUDE 'header_opengraph_image.html' %]
diff --git a/templates/web/base/header_opengraph_image.html b/templates/web/base/header_opengraph_image.html
new file mode 100644
index 000000000..7ec1aabb0
--- /dev/null
+++ b/templates/web/base/header_opengraph_image.html
@@ -0,0 +1,4 @@
+ <meta property="og:image" content="[% c.cobrand.base_url %]/cobrands/fixmystreet/images/fms-og_image.jpg">
+ <meta property="og:image:type" content="image/jpeg">
+ <meta property="og:image:width" content="1200">
+ <meta property="og:image:height" content="630">
diff --git a/templates/web/base/index.html b/templates/web/base/index.html
index cea0f832a..0441b3efb 100644
--- a/templates/web/base/index.html
+++ b/templates/web/base/index.html
@@ -1,55 +1,20 @@
-[% INCLUDE 'header.html', title = '' %]
+[% map_js = PROCESS 'front/javascript.html' %]
+
+[% pre_container_extra = PROCESS 'around/postcode_form.html' %]
+[% INCLUDE 'header.html', title = '', bodyclass = 'frontpage fullwidthpage' %]
[% IF error %]
- <p class="error">[% error %]</p>
+ <p class="form-error">[% error %]</p>
[% END %]
-<p id="expl">
- [%
- subhead = loc('(like graffiti, fly tipping, broken paving slabs, or street lighting)');
- %]
- <strong>[% loc('Report, view, or discuss local problems') %]</strong>
- [% IF subhead != ' ' %]
- <small>[% subhead %]</small>
- [% END %]
-</p>
-
-[% PROCESS 'around/postcode_form.html' %]
-
-<div id="front_intro">
- [% INCLUDE 'index-steps.html' %]
-</div>
-
-[%
- recent_photos = c.cobrand.recent_photos('front', 3);
- probs = c.cobrand.recent();
-%]
+[% TRY %][% PROCESS 'front/pre-steps.html' %][% CATCH file %][% END %]
-[% IF probs.size || recent_photos.size %]
-<div id="front_recent">
- <h2>[% loc('Recently reported problems') %]</h2>
- [% IF recent_photos.size %]
- <p id="front_photos">
- [% FOREACH p IN recent_photos;
- photo = p.get_photo_params;
- %]
- <a href="/report/[% p.id %]"><img border="0" height="100"
- src="[% photo.url_tn %]" alt="[% p.title | html %]" title="[% p.title | html %]"></a>
- [% END %]
- </p>
- [% END %]
+<div class="tablewrapper">
+ <div id="front-howto">
+ [% INCLUDE 'index-steps.html' %]
+ </div>
- [% IF probs.size %]
- <ul id="nearby_lists">
- [% FOREACH p IN probs %]
- <li>
- <a href="/report/[% p.id %]">[% p.title | html %]</a>
- <small>[% prettify_dt( p.confirmed, 1 ) %]</small>
- </li>
- [% END %]
- </ul>
- [% END %]
+ [% INCLUDE 'front/recent.html' %]
</div>
-[% END %]
-[% INCLUDE 'footer.html' %]
+[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/base/maps/google-ol.html b/templates/web/base/maps/google-ol.html
index ce22fc94c..021570df1 100644
--- a/templates/web/base/maps/google-ol.html
+++ b/templates/web/base/maps/google-ol.html
@@ -1,5 +1,5 @@
[% map_js = BLOCK %]
-<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
+<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.20"></script>
<script type="text/javascript" src="[% version('/js/OpenLayers.fixmystreet.google.js') %]"></script>
<script type="text/javascript" src="[% version('/js/map-OpenLayers.js') %]"></script>
<script type="text/javascript" src="[% version('/js/map-google-ol.js') %]"></script>
@@ -10,7 +10,7 @@
[% END %]
[% map_sub_links = BLOCK %]
-<a class="hidden-nojs" id="map_layer_toggle" href="">[% loc('Map') %]</a>
+<a class="hidden-nojs" id="map_layer_toggle" href="">[% loc('Satellite') %]</a>
[% END %]
[% map_html = BLOCK %]
diff --git a/templates/web/base/maps/noscript_map.html b/templates/web/base/maps/noscript_map.html
new file mode 100644
index 000000000..aaaa217c9
--- /dev/null
+++ b/templates/web/base/maps/noscript_map.html
@@ -0,0 +1,64 @@
+<div class="noscript">
+ <div id="[% nsm_prefix %]drag">
+ <[% map.img_type %]
+ alt="NW map tile" id="[% nsm_prefix %]t2.2"
+ name="tile_[% map.x_tile - 1 %].[% map.y_tile - 1 %]"
+ src="[% map.tiles.0 %]"
+ style="top:0; left:0;">
+ <[% map.img_type %]
+ alt="NE map tile" id="[% nsm_prefix %]t2.3"
+ name="tile_[% map.x_tile %].[% map.y_tile - 1 %]"
+ src="[% map.tiles.1 %]"
+ style="top:0px; left:256px;">
+ <br>
+ <[% map.img_type %]
+ alt="SW map tile" id="[% nsm_prefix %]t3.2"
+ name="tile_[% map.x_tile - 1 %].[% map.y_tile %]"
+ src="[% map.tiles.2 %]"
+ style="top:256px; left:0;">
+ <[% map.img_type %]
+ alt="SE map tile" id="[% nsm_prefix %]t3.3"
+ name="tile_[% map.x_tile %].[% map.y_tile %]"
+ src="[% map.tiles.3 %]"
+ style="top:256px; left:256px;">
+ </div>
+ <div id="[% nsm_prefix %]pins">[% FOR pin IN map.pins %][% INCLUDE pin %][% END %]</div>
+ [% INCLUDE compass %]
+</div>
+
+[% BLOCK compass %]
+[%
+ north = c.uri_with( { lat = map.compass.north.0, lon = map.compass.north.1, zoom = map.zoom } )
+ south = c.uri_with( { lat = map.compass.south.0, lon = map.compass.south.1, zoom = map.zoom } )
+ east = c.uri_with( { lat = map.compass.east.0, lon = map.compass.east.1, zoom = map.zoom } )
+ west = c.uri_with( { lat = map.compass.west.0, lon = map.compass.west.1, zoom = map.zoom } )
+ world = c.uri_with( { zoom = 0 } );
+ SET zoom_in = c.uri_with( { lat = map.latitude, lon = map.longitude, zoom = map.zoom + 1 } ) IF map.zoom < map.numZoomLevels - 1;
+ SET zoom_out = c.uri_with( { lat = map.latitude, lon = map.longitude, zoom = map.zoom - 1 } ) IF map.zoom > 0;
+ SET zoom_in = '#' IF map.zoom >= map.numZoomLevels - 1;
+ SET zoom_out = '#' IF map.zoom <= 0;
+%]
+<div style="position: absolute; left: 4px; top: 4px;" class="olControlPanZoom olControlNoSelect" unselectable="on">
+ <div style="position: absolute; left: 13px; top: 4px; width: 18px; height: 18px;"><a rel="nofollow" href="[% north %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/north-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 4px; top: 22px; width: 18px; height: 18px;"><a rel="nofollow" href="[% west %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/west-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 22px; top: 22px; width: 18px; height: 18px;"><a rel="nofollow" href="[% east %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/east-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 40px; width: 18px; height: 18px;"><a rel="nofollow" href="[% south %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/south-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 63px; width: 18px; height: 18px;"><a rel="nofollow" href="[% zoom_in %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-plus-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 81px; width: 18px; height: 18px;"><a rel="nofollow" href="[% world %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-world-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 99px; width: 18px; height: 18px;"><a rel="nofollow" href="[% zoom_out %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-minus-mini.png" border="0"></a></div>
+</div>
+[% END %]
+
+
+[% BLOCK pin %]
+
+[% IF pin.id %]
+<a title="[% pin.title | html %]" href="[% c.uri_for('/report/' _ pin.id) %]">
+[%- END -%]
+<img border="0" class="pin" src="[% c.uri_for( c.cobrand.path_to_pin_icons _ 'pin-' _ pin.colour _ '.png') %]"
+ alt="[% loc('Problem') %]" style="top:[% pin.py - 64 %]px; left:[% pin.px - 24 %]px; position: absolute;">
+[%- IF pin.id -%]
+</a>
+[% END %]
+
+[% END %]
diff --git a/templates/web/base/maps/openlayers.html b/templates/web/base/maps/openlayers.html
index 27c71f42f..1e7ae5ce8 100644
--- a/templates/web/base/maps/openlayers.html
+++ b/templates/web/base/maps/openlayers.html
@@ -28,67 +28,12 @@ var fixmystreet = {
'pins': [% INCLUDE maps/pins_js.html %]
}
</script>
-<div id="map_box">
+<div id="map_box" aria-hidden="true">
[% pre_map %]
- <div id="map"><noscript>
- <div id="drag"><[% map.img_type %]
- alt="NW map tile" id="t2.2"
- name="tile_[% map.x_tile - 1 %].[% map.y_tile - 1 %]"
- src="[% map.tiles.0 %]"
- style="top:0; left:0;"><[% map.img_type %]
- alt="NE map tile" id="t2.3"
- name="tile_[% map.x_tile %].[% map.y_tile - 1 %]"
- src="[% map.tiles.1 %]"
- style="top:0px; left:256px;"><br><[% map.img_type %]
- alt="SW map tile" id="t3.2"
- name="tile_[% map.x_tile - 1 %].[% map.y_tile %]"
- src="[% map.tiles.2 %]"
- style="top:256px; left:0;"><[% map.img_type %]
- alt="SE map tile" id="t3.3"
- name="tile_[% map.x_tile %].[% map.y_tile %]"
- src="[% map.tiles.3 %]"
- style="top:256px; left:256px;"></div>
- <div id="pins">[% FOR pin IN map.pins %][% INCLUDE pin %][% END %]</div>
- [% INCLUDE compass %]
- </noscript></div>
+ <div id="map">
+ [% INCLUDE 'maps/noscript_map.html' %]
+ </div>
[% IF map.copyright %]
<div class="olControlAttribution" style="position: absolute;">[% map.copyright %]</div>
[% END %]
-
-[% BLOCK compass %]
-[%
- north = c.uri_with( { lat = map.compass.north.0, lon = map.compass.north.1, zoom = map.zoom } )
- south = c.uri_with( { lat = map.compass.south.0, lon = map.compass.south.1, zoom = map.zoom } )
- east = c.uri_with( { lat = map.compass.east.0, lon = map.compass.east.1, zoom = map.zoom } )
- west = c.uri_with( { lat = map.compass.west.0, lon = map.compass.west.1, zoom = map.zoom } )
- world = c.uri_with( { zoom = 0 } );
- SET zoom_in = c.uri_with( { lat = map.latitude, lon = map.longitude, zoom = map.zoom + 1 } ) IF map.zoom < map.numZoomLevels - 1;
- SET zoom_out = c.uri_with( { lat = map.latitude, lon = map.longitude, zoom = map.zoom - 1 } ) IF map.zoom > 0;
- SET zoom_in = '#' IF map.zoom >= map.numZoomLevels - 1;
- SET zoom_out = '#' IF map.zoom <= 0;
-%]
-<div style="position: absolute; left: 4px; top: 4px;" class="olControlPanZoom olControlNoSelect" unselectable="on">
- <div style="position: absolute; left: 13px; top: 4px; width: 18px; height: 18px;"><a rel="nofollow" href="[% north %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/north-mini.png" border="0"></a></div>
- <div style="position: absolute; left: 4px; top: 22px; width: 18px; height: 18px;"><a rel="nofollow" href="[% west %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/west-mini.png" border="0"></a></div>
- <div style="position: absolute; left: 22px; top: 22px; width: 18px; height: 18px;"><a rel="nofollow" href="[% east %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/east-mini.png" border="0"></a></div>
- <div style="position: absolute; left: 13px; top: 40px; width: 18px; height: 18px;"><a rel="nofollow" href="[% south %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/south-mini.png" border="0"></a></div>
- <div style="position: absolute; left: 13px; top: 63px; width: 18px; height: 18px;"><a rel="nofollow" href="[% zoom_in %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-plus-mini.png" border="0"></a></div>
- <div style="position: absolute; left: 13px; top: 81px; width: 18px; height: 18px;"><a rel="nofollow" href="[% world %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-world-mini.png" border="0"></a></div>
- <div style="position: absolute; left: 13px; top: 99px; width: 18px; height: 18px;"><a rel="nofollow" href="[% zoom_out %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-minus-mini.png" border="0"></a></div>
-</div>
-[% END %]
-
-
-[% BLOCK pin %]
-
-[% IF pin.id %]
-<a title="[% pin.title | html %]" href="[% c.uri_for('/report/' _ pin.id) %]">
-[%- END -%]
-<img border="0" class="pin" src="[% c.uri_for( c.cobrand.path_to_pin_icons _ 'pin-' _ pin.colour _ '.png') %]"
- alt="[% loc('Problem') %]" style="top:[% pin.py - 64 %]px; left:[% pin.px - 24 %]px; position: absolute;">
-[%- IF pin.id -%]
-</a>
-[% END %]
-
-[% END %]
diff --git a/templates/web/greenwich/my/_problem-list.html b/templates/web/base/my/_problem-list.html
index 1ff69f9fb..e74dd25ec 100644
--- a/templates/web/greenwich/my/_problem-list.html
+++ b/templates/web/base/my/_problem-list.html
@@ -1,10 +1,10 @@
-<ul class='issue-list-a full-width'>
- [% IF problems.all %]
- [% FOREACH p = problems.all %]
- [% INCLUDE 'reports/_list-entry.html', problem = p, no_fixed =1 %]
+<ul class='item-list item-list--reports full-width'>
+ [% IF problems.size %]
+ [% FOREACH problem = problems %]
+ [% INCLUDE 'reports/_list-entry.html' no_fixed = 1 %]
[% END %]
[% ELSE %]
- <li class="empty">
+ <li class="item-list__item item-list__item--empty">
<p>[% loc('There are no reports to show.') %]</p>
</li>
[% END %]
diff --git a/templates/web/base/my/my.html b/templates/web/base/my/my.html
index f3ad3f2fe..9be4edfca 100644
--- a/templates/web/base/my/my.html
+++ b/templates/web/base/my/my.html
@@ -21,32 +21,20 @@
c.uri_for('/') ) %]
[% END %]
+[% IF c.cobrand.moniker == 'fixmybarangay' %]
+ [% INCLUDE '_barangay_buttons.html' %]
+[% ELSIF c.cobrand.moniker == 'hart' %]
+ [% INCLUDE '_hart_hants_note.html' %]
+[% END %]
+
+[% INCLUDE "reports/_list-filters.html", use_section_wrapper = 1 %]
+
[% INCLUDE 'pagination.html',
pager = problems_pager,
param = 'p'
%]
-[% FOREACH p = problems.confirmed %]
- [% IF loop.first %]<h2>[% loc('Open reports') %]</h2>[% END %]
- [% INCLUDE problem %]
-[% END %]
-
-[% FOREACH p = problems.fixed %]
- [% IF loop.first %]<h2>[% loc('Fixed reports') %]</h2>[% END %]
- [% INCLUDE problem %]
-[% END %]
-
-[% FOREACH p = problems.closed %]
- [% IF loop.first %]<h2>[% loc('Closed reports') %]</h2>[% END %]
- [% INCLUDE problem %]
-[% END %]
-
-[%# FOREACH p = problems.unconfirmed;
- IF loop.first;
- '<h2>' _ loc('Unconfirmed reports') _ '</h2>';
- END;
- INCLUDE problem;
-END %]
+[% INCLUDE 'my/_problem-list.html' %]
[% FOREACH u IN updates %]
[% IF loop.first %]
@@ -55,14 +43,14 @@ END %]
pager = updates_pager,
param = 'u'
%]
- <ul class="issue-list full-width">
+ <ul class="item-list item-list--updates full-width">
[% END %]
<li>&ldquo;[% u.text | html %]&rdquo;
&ndash; <a href="[% c.uri_for( '/report', u.problem_id ) %]#update_[% u.id %]">[% u.problem.title | html %]</a>.
- <em class="council_sent_info">
+ <p><small class="council_sent_info">
[% tprintf( loc("Added %s"), prettify_dt( u.confirmed, 'date' ) ) %]
- </em>
+ </small></p>
</li>
[% "</ul>" IF loop.last %]
[% END %]
@@ -70,20 +58,3 @@ END %]
</div>
[% INCLUDE 'footer.html' %]
-
-[% BLOCK problem %]
- [% "<ul class='issue-list-a full-width'>" IF loop.first %]
-
- <li><a href="[% c.uri_for( '/report', p.id ) %]">[% p.title | html %]</a>
- <em class="council_sent_info"> &ndash;
- [% IF p.whensent %]
- [% tprintf( loc("Reported %s, to %s"), prettify_dt( p.confirmed, 'date' ), p.body(c) ) %]
- [% ELSE %]
- [% tprintf( loc("Reported %s"), prettify_dt( p.confirmed, 'date' ) ) %]
- [% END %]
- </em>
- </li>
-
- [% "</ul>" IF loop.last %]
-[% END %]
-
diff --git a/templates/web/base/open311/index.html b/templates/web/base/open311/index.html
index 502b1a69a..d42cc2106 100644
--- a/templates/web/base/open311/index.html
+++ b/templates/web/base/open311/index.html
@@ -3,9 +3,9 @@
<div class="sticky-sidebar">
<aside>
<ul class="plain-list">
- <li><a href="/faq">Frequently Asked Questions</a></li>
- <li><a href="/privacy">Privacy and cookies</a></li>
- <li><a href="/contact">Contact FixMyStreet</a></li>
+ <li><a href="/faq">[% loc('Frequently Asked Questions') %]</a></li>
+ <li><a href="/privacy">[% loc('Privacy and cookies') %]</a></li>
+ <li><a href="/contact">[% tprintf(loc("Contact %s", "%s is the site name"), site_name) %]</a></li>
</ul>
</aside>
</div>
diff --git a/templates/web/base/questionnaire/index.html b/templates/web/base/questionnaire/index.html
index 2daaaab3a..ab3bde9ad 100644
--- a/templates/web/base/questionnaire/index.html
+++ b/templates/web/base/questionnaire/index.html
@@ -1,18 +1,32 @@
[%
- pre_map = INCLUDE 'report/_main.html';
+ SET bodyclass = 'mappage';
+ PROCESS "report/photo-js.html";
PROCESS "maps/${map.type}.html";
- INCLUDE 'header.html', title = loc('Questionnaire')
+ INCLUDE 'header.html', title = loc('Questionnaire');
%]
[% map_html %]
-[% INCLUDE 'report/updates.html' %]
-
</div>
-<div id="side">
<h1>[% loc('Questionnaire') %]</h1>
+<h2 class="questionnaire-report-header">Your report</h2>
+<div class="questionnaire-report-reminder">
+ [% INCLUDE 'report/photo.html' object=problem %]
+ <h3 class="questionnaire-report-reminder__report-title">
+ <a href="/report/[% problem.id %]">[% problem.title | html %]</a>
+ </h3>
+ <p class="questionnaire-report-reminder__report-meta">[% problem.meta_line(c) | html %]</p>
+ [% IF updates.size %]
+ <p class="questionnaire-report-reminder__last-update-header">
+ <strong>Last update</strong>
+ <a href="/report/[% problem.id %]">Show all updates</a>
+ </p>
+ <p class="questionnaire-report-reminder__last-update">&ldquo;[% add_links( updates.last.text ) %]&rdquo;</p>
+ [% END %]
+</div>
+
<form method="post" action="/questionnaire/submit" id="questionnaire"
[%- IF c.cobrand.allow_photo_upload -%]
enctype="multipart/form-data"
@@ -21,13 +35,8 @@
<input type="hidden" name="token" value="[% token | html %]">
-<p>
-[% loc('The details of your problem are available on the right hand side of this page.') %]
-[% loc('Please take a look at the updates that have been left.') IF updates %]
-</p>
-
[% IF errors %]
-<ul class="error">
+<ul class="error questionnaire-errors">
<li>[% errors.join("</li>\n<li>") %]</li>
</ul>
[% END %]
@@ -37,50 +46,50 @@
[% loc('Has this problem been fixed?') %]
</p>
-<p>
-<input type="radio" name="been_fixed" id="been_fixed_yes" value="Yes"[% ' checked' IF been_fixed == 'Yes' %]>
-<label for="been_fixed_yes">[% loc('Yes') %]</label>
-<input type="radio" name="been_fixed" id="been_fixed_no" value="No"[% ' checked' IF been_fixed == 'No' %]>
-<label for="been_fixed_no">[% loc('No') %]</label>
-<input type="radio" name="been_fixed" id="been_fixed_unknown" value="Unknown"[% ' checked' IF been_fixed == 'Unknown' %]>
-<label for="been_fixed_unknown">[% loc('Don&rsquo;t know') %]</label>
+<p class="radio-segmented-control">
+ <input type="radio" name="been_fixed" id="been_fixed_yes" value="Yes"[% ' checked' IF been_fixed == 'Yes' %]>
+ <label class="inline" for="been_fixed_yes">[% loc('Yes') %]</label>
+ <input type="radio" name="been_fixed" id="been_fixed_no" value="No"[% ' checked' IF been_fixed == 'No' %]>
+ <label class="inline" for="been_fixed_no">[% loc('No') %]</label>
+ <input type="radio" name="been_fixed" id="been_fixed_unknown" value="Unknown"[% ' checked' IF been_fixed == 'Unknown' %]>
+ <label class="inline" for="been_fixed_unknown">[% loc('Don&rsquo;t know') %]</label>
</p>
[% UNLESS answered_ever_reported %]
<p>[% loc('Have you ever reported a problem to a council before, or is this your first time?') %]</p>
-<p>
-<input type="radio" name="reported" id="reported_yes" value="Yes"[% ' checked' IF reported == 'Yes' %]>
-<label for="reported_yes">[% loc('Reported before') %]</label>
-<input type="radio" name="reported" id="reported_no" value="No"[% ' checked' IF reported == 'No' %]>
-<label for="reported_no">[% loc('First time') %]</label>
+<p class="radio-segmented-control">
+ <input type="radio" name="reported" id="reported_yes" value="Yes"[% ' checked' IF reported == 'Yes' %]>
+ <label class="inline" for="reported_yes">[% loc('Reported before') %]</label>
+ <input type="radio" name="reported" id="reported_no" value="No"[% ' checked' IF reported == 'No' %]>
+ <label class="inline" for="reported_no">[% loc('First time') %]</label>
</p>
[% END %]
<p>[% loc('If you wish to leave a public update on the problem, please enter it here
-(please note it will not be sent to the council). For example, what was
-your experience of getting the problem fixed?') %]</p>
+(please note it will not be sent to the council).') %]</p>
-<p><textarea name="update" style="max-width:90%" rows="7" cols="30">[% update | html %]</textarea></p>
+<p><textarea name="update" rows="7" cols="30" placeholder="[% loc('What was your experience of getting the problem fixed?') %]">[% update | html %]</textarea></p>
[% IF c.cobrand.allow_photo_upload %]
-<div id="fileupload_normalUI">
+<p id="fileupload_normalUI">
[% IF upload_fileid %]
+ <img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
<p>[% loc('You have already attached a photo to this report, attaching another one will replace it.') %]</p>
<input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
[% END %]
<label for="form_photo">[% loc('Photo:') %]</label>
<input type="file" name="photo" id="form_photo">
-</div>
+</p>
[% END %]
[% IF c.cobrand.moniker != 'emptyhomes' %]
-<div id="another_qn">
+<div class="js-another-questionnaire">
<p>[% loc('Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?') %]</p>
- <p>
+ <p class="radio-segmented-control">
<input type="radio" name="another" id="another_yes" value="Yes"[% ' checked' IF another == 'Yes' %]>
- <label for="another_yes">[% loc('Yes') %]</label>
+ <label class="inline" for="another_yes">[% loc('Yes') %]</label>
<input type="radio" name="another" id="another_no" value="No"[% ' checked' IF another == 'No' %]>
- <label for="another_no">[% loc('No') %]</label>
+ <label class="inline" for="another_no">[% loc('No') %]</label>
</p>
</div>
[% END %]
@@ -89,7 +98,4 @@ your experience of getting the problem fixed?') %]</p>
</form>
-</div>
-
[% INCLUDE 'footer.html' %]
-
diff --git a/templates/web/fixmystreet/report/_item.html b/templates/web/base/report/_item.html
index 8e2e73a8d..d79a4e9f3 100644
--- a/templates/web/fixmystreet/report/_item.html
+++ b/templates/web/base/report/_item.html
@@ -1,5 +1,5 @@
-<li>
-<a class="text" href="[% c.uri_for('/report', problem.id ) %]">
+<li class="item-list__item item-list--reports__item [% item_extra_class %]">
+<a href="[% c.uri_for('/report', problem.id ) %]">
[% IF problem.photo;
photo = problem.get_photo_params
%]
@@ -7,16 +7,16 @@
[% END %]
<h4>[% problem.title | html %]</h4>
<small>
- [% IF c.cobrand.moniker != 'fixamingata' %] [%# Default: %]
+ [%- IF c.cobrand.moniker != 'fixamingata' %] [%# Default: %]
[%- prettify_dt( problem.confirmed, 1 ) %]
- [% ELSE %] [%# Swedish cobrand fixamingata: %]
+ [%- ELSE %] [%# Swedish cobrand fixamingata: %]
[%- prettify_dt( problem.confirmed) %]
- [% END %]
+ [%- END %]
[%- IF dist %], [% dist %]km[% END %]
- [%- IF include_lastupdate AND problem.confirmed != problem.lastupdate AND problem.whensent != problem.lastupdate %],
+ [%- IF problem.confirmed != problem.lastupdate AND problem.whensent != problem.lastupdate %],
[% tprintf(loc('last updated %s'), prettify_dt( problem.lastupdate, 1 ) ) %]
[%- END %]
- [% IF include_lastupdate %]
+ [% IF include_sentinfo %]
[% IF problem.bodies_str_ids.size > 1 %] [% loc('(sent to both)') %]
[% ELSIF problem.bodies_str_ids.size == 0 %] [% loc('(not sent to council)') %]
[% END %]
diff --git a/templates/web/base/report/display.html b/templates/web/base/report/display.html
index 0731d9f0e..329614488 100644
--- a/templates/web/base/report/display.html
+++ b/templates/web/base/report/display.html
@@ -2,7 +2,7 @@
PROCESS "maps/${map.type}.html";
problem_title = problem.title_safe _ ' - ' _ loc('Viewing a problem');
- SET rss = [ loc('Updates to this problem, FixMyStreet'), "/rss/$problem.id" ] IF c.cobrand.moniker != 'emptyhomes';
+ SET rss = [ tprintf(loc('Updates to this problem, %s', "%s is the site name"), site_name), "/rss/$problem.id" ] IF c.cobrand.moniker != 'emptyhomes';
SET robots = 'index, nofollow';
SET robots = 'noindex, nofollow' IF c.cobrand.moniker == 'emptyhomes';
INCLUDE 'header.html'
diff --git a/templates/web/base/report/new/category_extras.html b/templates/web/base/report/new/category_extras.html
index c0f6a7bae..12ef1486f 100644
--- a/templates/web/base/report/new/category_extras.html
+++ b/templates/web/base/report/new/category_extras.html
@@ -6,7 +6,7 @@
[%- END %]
[%- IF report_meta %]
- <h4>Additional Information</h4>
+ <h4>[% loc('Additional Information') %]</h4>
[%- FOR meta IN category_extras.$category %]
[%- meta_name = meta.code -%]
diff --git a/templates/web/base/report/new/fill_in_details_form.html b/templates/web/base/report/new/fill_in_details_form.html
index d1431ffd3..ee219d563 100644
--- a/templates/web/base/report/new/fill_in_details_form.html
+++ b/templates/web/base/report/new/fill_in_details_form.html
@@ -110,7 +110,8 @@
[% INCLUDE 'report/new/notes.html' %]
<div id="form_sign_in">
- <h3>[% loc("Now to submit your report&hellip; do you have a FixMyStreet password?") %]</h3>
+ <h3>[% loc("Now to submit your report&hellip;") %]</h3>
+ <h2>[% tprintf(loc("Do you have a %s password?", "%s is the site name"), site_name) %]</h2>
<div id="form_sign_in_yes">
diff --git a/templates/web/fixmystreet/report/photo-js.html b/templates/web/base/report/photo-js.html
index 9075ce005..9075ce005 100644
--- a/templates/web/fixmystreet/report/photo-js.html
+++ b/templates/web/base/report/photo-js.html
diff --git a/templates/web/base/report/photo.html b/templates/web/base/report/photo.html
index c463c34c4..094f677d8 100644
--- a/templates/web/base/report/photo.html
+++ b/templates/web/base/report/photo.html
@@ -1,8 +1,21 @@
[% IF c.cobrand.allow_photo_display(object) && object.photo %]
-[% photo = object.get_photo_params %]
-<div class="update-img">
- [% IF photo.url_full %]<a href="[% photo.url_full %]" rel="fancy">[% END
- %]<img alt="Photo of this report" [% IF photo.height %]height="[% photo.height %]" width="[% photo.width %]"[% END %] src="[% photo.url %]">
- [%- IF photo.url_full %]<span>zoom</span></a>[% END %]
-</div>
+ [% IF object.can('get_photoset') %]
+ [% FOR photo IN object.get_photoset(c).images %]
+ <div class="update-img">
+ <a href="[% c.cobrand.base_url %]/photo/[% object.id %].[% loop.index %].full.jpeg?[% photo.0 %]" rel="fancy">
+ <img alt="Photo of this report" src="[% c.cobrand.base_url %]/photo/[% object.id %].[% loop.index %].jpeg?[% photo.0 %]">
+ <span>zoom</span></a>
+ </div>
+ [% END %]
+ [% ELSE %]
+ [%# e.g. comments %]
+ [% photo = object.get_photo_params %]
+ <div class="update-img">
+ [% IF photo.url_full %]<a href="[% photo.url_full %]" rel="fancy">[% END %]
+ <img alt="Photo of this report"
+ [%- IF photo.height %]height="[% photo.height %]" width="[% photo.width %]"[% END -%]
+ src="[% photo.url %]">
+ [%- IF photo.url_full %]<span>zoom</span></a>[% END %]
+ </div>
+ [% END %]
[% END %]
diff --git a/templates/web/base/report/update-form.html b/templates/web/base/report/update-form.html
index 4e762a9a5..3115855d3 100644
--- a/templates/web/base/report/update-form.html
+++ b/templates/web/base/report/update-form.html
@@ -83,7 +83,8 @@
</div>
<div id="form_sign_in">
- <h3>[% loc("Now to submit your update&hellip; do you have a FixMyStreet password?") %]</h3>
+ <h3>[% loc("Now to submit your update&hellip;") %]</h3>
+ <h2>[% tprintf(loc("Do you have a %s password?", "%s is the site name"), site_name) %]</h2>
<div id="form_sign_in_yes">
diff --git a/templates/web/base/reports/_list-entry.html b/templates/web/base/reports/_list-entry.html
index 445a5315f..dbf0a576e 100755
--- a/templates/web/base/reports/_list-entry.html
+++ b/templates/web/base/reports/_list-entry.html
@@ -1,6 +1 @@
-<li><a href="[% c.uri_for('/report/' _ problem.id) %]">[% problem.title | html %]</a>
- [% IF problem.bodies_str_ids.size > 1 %] <small>[% loc('(sent to both)') %]</small> [% END %]
- [% IF c.cobrand.moniker != 'emptyhomes' %]
- [% IF problem.bodies_str_ids.size == 0 %] <small>[% loc('(not sent to council)') %]</small> [% END %]
- [% END %]
-</li>
+[% INCLUDE 'report/_item.html' %]
diff --git a/templates/web/base/reports/_list-filters.html b/templates/web/base/reports/_list-filters.html
index e69de29bb..4dd270dc6 100644
--- a/templates/web/base/reports/_list-filters.html
+++ b/templates/web/base/reports/_list-filters.html
@@ -0,0 +1,34 @@
+[% select_status = BLOCK %]
+ <select name="status" id="statuses">
+ <option value="all"[% ' selected' IF filter_status == 'all' %]>[% loc('all reports') %]</option>
+ <option value="open"[% ' selected' IF filter_status == 'open' %]>[% loc('unfixed reports') %]</option>
+ <option value="closed"[% ' selected' IF filter_status == 'closed' %]>[% loc('closed reports') %]</option>
+ <option value="fixed"[% ' selected' IF filter_status == 'fixed' %]>[% loc('fixed reports') %]</option>
+ </select>
+[% END %]
+
+[% select_category = BLOCK %]
+ <select name="filter_category" id="filter_categories">
+ <option value="">[% loc('Everything') %]</option>
+ [% FOR category IN filter_categories %]
+ <option value="[% category | html %]"[% ' selected' IF filter_category == category %]>
+ [% category | html %]
+ </option>
+ [% END %]
+ </select>
+[% END %]
+
+[% IF use_section_wrapper %]
+<section class="full-width">
+ <form method="get" action="">
+[% END %]
+
+ <p class="report-list-filters">
+ [% tprintf(loc('<label>Show %s</label> <label>about %s</label>', 'The first %s is a dropdown of all/fixed/etc, the second is a dropdown of categories'), select_status, select_category) %]
+ <input type="submit" value="[% loc('Go') %]">
+ </p>
+
+[% IF use_section_wrapper %]
+ </form>
+</section>
+[% END %]
diff --git a/templates/web/base/reports/_problem-list.html b/templates/web/base/reports/_problem-list.html
index 45746e309..4da9e1bb6 100644
--- a/templates/web/base/reports/_problem-list.html
+++ b/templates/web/base/reports/_problem-list.html
@@ -5,13 +5,13 @@
</section>
[% BLOCK column %]
- <ul class="issue-list-a">
+ <ul class="item-list item-list--reports">
[% IF problems %]
[% FOREACH problem IN problems %]
- [% INCLUDE 'reports/_list-entry.html' %]
+ [% INCLUDE 'reports/_list-entry.html' include_sentinfo = 1 include_lastupdate = 1 %]
[% END %]
[% ELSE %]
- <li class="empty">
+ <li class="item-list__item item-list__item--empty">
<p>[% loc('There are no reports to show.') %]</p>
</li>
[% END %]
diff --git a/templates/web/base/reports/body.html b/templates/web/base/reports/body.html
index b98c5bec6..dfaa98d6a 100755
--- a/templates/web/base/reports/body.html
+++ b/templates/web/base/reports/body.html
@@ -21,7 +21,7 @@
SET bodyclass = 'mappage';
INCLUDE 'header.html',
title = tprintf(loc('%s - Summary reports'), name)
- rss = [ tprintf(loc('Problems within %s, FixMyStreet'), name), rss_url ]
+ rss = [ tprintf(loc('Problems within %s, %s', "First %s is the body name, second %s the site name"), name, site_name), rss_url ]
%]
[% map_html %]
@@ -43,8 +43,8 @@
[% INCLUDE '_hart_hants_note.html' %]
[% END %]
-[% IF NOT body.areas.size AND c.cobrand.moniker == 'fixmystreet' %]
- [% INCLUDE 'reports/_body_gone.html' %]
+[% IF NOT body.areas.size %]
+ [% TRY %][% INCLUDE 'reports/_body_gone.html' %][% CATCH file %][% END %]
[% ELSE %]
[% INCLUDE 'reports/_rss.html' %]
[% END %]
diff --git a/templates/web/base/static/privacy.html b/templates/web/base/static/privacy.html
index 36720207b..11ab65311 100755
--- a/templates/web/base/static/privacy.html
+++ b/templates/web/base/static/privacy.html
@@ -1,13 +1,13 @@
[% INCLUDE 'header.html',
- title = loc('Frequently Asked Questions'),
+ title = loc('Privacy and cookies'),
bodyclass = 'twothirdswidthpage' %]
<div class="sticky-sidebar">
<aside>
<ul class="plain-list">
- <li><a href="/faq">Frequently Asked Questions</a></li>
- <li><strong>Privacy and cookies</strong></li>
- <li><a href="/contact">Contact [% PROCESS 'site-name.html' -%]</a></li>
+ <li><a href="/faq">[% loc('Frequently Asked Questions') %]</a></li>
+ <li><a href="/privacy">[% loc('Privacy and cookies') %]</a></li>
+ <li><a href="/contact">[% tprintf(loc("Contact %s", "%s is the site name"), site_name) %]</a></li>
</ul>
</aside>
</div>
diff --git a/templates/web/base/status/index.html b/templates/web/base/status/index.html
new file mode 100644
index 000000000..9ed4292b7
--- /dev/null
+++ b/templates/web/base/status/index.html
@@ -0,0 +1,19 @@
+[% INCLUDE 'header.html' title=loc('Summary') bodyclass='fullwidthpage' %]
+
+<h1>[% loc('Summary') %]</h1>
+
+<dl>
+ <dt>Version</dt>
+ <dd>[% git_version || 'unknown' %]</dd>
+</dl>
+
+<ul>
+ <li>[% tprintf( loc('<strong>%d</strong> live problems'), total_problems_live ) %]</li>
+ <li>[% tprintf( loc('%d live updates'), comments.confirmed || 0 ) %]</li>
+ <li>[% tprintf( loc('%d confirmed alerts, %d unconfirmed'), alerts.1, alerts.0) %]</li>
+ <li>[% tprintf( loc('%d questionnaires sent &ndash; %d answered (%s%%)'), questionnaires.total, questionnaires.1, questionnaires_pc) %]</li>
+ <li>[% tprintf( '%d bodies', total_bodies) %],
+ [% tprintf( loc('%d council contacts &ndash; %d confirmed, %d unconfirmed'), contacts.total, contacts.1, contacts.0) %]</li>
+</ul>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmystreet/around/_report_banner.html b/templates/web/bromley/around/_report_banner.html
index 5ec7300d6..52a869262 100755..100644
--- a/templates/web/fixmystreet/around/_report_banner.html
+++ b/templates/web/bromley/around/_report_banner.html
@@ -1,9 +1,10 @@
<h1 class="big-green-banner">
[% loc( 'Click map to report a problem' ) %]
- [% IF c.cobrand.moniker == 'bromley' %]
- <span>Yellow pins show existing reports</span>
- [% END %]
</h1>
+<div class="click-the-map">
+ <h2>[% loc( 'Have you found a problem here?' ) %]</h2>
+ <p>Click on the map to report it</p>
+</div>
<a id="skip-this-step" href="[% url_skip %]" rel="nofollow">
[% loc("Can't see the map? <em>Skip this step</em>") %]
</a>
diff --git a/templates/web/bromley/around/intro.html b/templates/web/bromley/around/intro.html
index ee4685b9c..7b7c24726 100644
--- a/templates/web/bromley/around/intro.html
+++ b/templates/web/bromley/around/intro.html
@@ -1 +1 @@
- <h1 class="main mob-only">Reporting a problem in Bromley&rsquo;s streets or parks</h1>
+ <h1 class="main">Reporting a problem in Bromley&rsquo;s streets or parks</h1>
diff --git a/templates/web/bromley/faq/faq-en-gb.html b/templates/web/bromley/faq/faq-en-gb.html
index 93576ef20..47b8c05f7 100755
--- a/templates/web/bromley/faq/faq-en-gb.html
+++ b/templates/web/bromley/faq/faq-en-gb.html
@@ -1,5 +1,7 @@
[% INCLUDE 'header.html', title = 'Help', bodyclass = 'fullwidthpage' %]
+<h1> Frequently Asked Questions </h1>
+
<p>These pages are for reporting things which are broken, dirty, damaged or dumped, and need fixing, cleaning or clearing, such as:</p>
<ul><li>abandoned vehicles
<li>graffiti
@@ -24,7 +26,7 @@
<li>complaining or commenting about the council
</ul>
- <p>Note, the council does not maintain responsibility for problems on private land or TFL roads (A21 and part of the A232, West Wickham to Locksbottom). TFL road enquiries should be directed to <a href="http://reportit.tfl.gov.uk/">http://reportit.tfl.gov.uk/</a>.
+ <p>Note, the council does not maintain responsibility for problems on private land or TFL roads (A21 and part of the A232, West Wickham to Locksbottom). TFL road enquiries should be directed to <a href="http://reportit.tfl.gov.uk/">http://reportit.tfl.gov.uk/</a>.
</dd>
@@ -66,9 +68,9 @@ the problem.</dd>
<dd>Yes, if you enter a postcode or address outside the borough you will be re-directed to the main FixMyStreet site that will enable you to report problems elsewhere. FixMyStreet will forward these on to the relevant council.</dd>
<dt>The site is powered by FixMyStreet, who are they?</dt>
- <dd>FixMyStreet was built by <a href="http://www.mysociety.org/">mySociety</a>, in conjunction with the <a href="http://www.youngfoundation.org.uk/">Young Foundation</a>.
+ <dd>FixMyStreet was built by <a href="http://www.mysociety.org/">mySociety</a>, in conjunction with the <a href="http://www.youngfoundation.org.uk/">Young Foundation</a>.
mySociety is the project of a registered charity which has grown out of the community of
-volunteers who built sites like <a href="http://www.theyworkforyou.com/">TheyWorkForYou</a>.
+volunteers who built sites like <a href="http://www.theyworkforyou.com/">TheyWorkForYou</a>.
mySociety&rsquo;s primary mission is to build Internet projects which give people simple, tangible
benefits in the civic and community aspects of their lives.
The charity is called UK Citizens Online Democracy and is charity number 1076346. mySociety
diff --git a/templates/web/bromley/footer.html b/templates/web/bromley/footer.html
index 88b91cb72..689871fff 100644
--- a/templates/web/bromley/footer.html
+++ b/templates/web/bromley/footer.html
@@ -1,23 +1,24 @@
+ [% IF pagefooter %]
+ <footer role="contentinfo">
+ [% INCLUDE 'front/footer-marketing.html' %]
+ </footer>
+ [% END %]
</div><!-- .content role=main -->
- <p id="bromley-powered-by" class="desk-only">
- <a href="https://www.fixmystreet.com/council">Powered by <img src="/cobrands/bromley/fms-logo.png" alt="FixMyStreet" style="height:20px;"></a>
- </p>
-
</div><!-- .container -->
+ [% IF c.cobrand.moniker == 'fixmystreet' AND bodyclass != 'mappage' %]
+ [% INCLUDE 'footer-nav.html' %]
+ [% END %]
</div><!-- .table-cell -->
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
- <li><a href="https://www.fixmystreet.com/council">Powered by <img src="/cobrands/bromley/fms-logo.png" alt="FixMyStreet" style="height:20px;"></a></li>
- </ul>
- <ul id="main-menu">
- <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
- >[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ <ul class="nav-menu nav-menu--main">
+ <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END
+ %]>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
%]>[% loc("Your reports") %]</[% c.req.uri.path == '/my' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/reports/Bromley' %]span[% ELSE %]a href="/reports/Bromley"[% END
+ %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END
%]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
%]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
@@ -30,20 +31,7 @@
</div> <!-- .wrapper -->
-<div id="bromley-footer" class="desk-only">
- <p class="copy">&copy; 2012 London Borough of Bromley</p>
-
- <a href="http://www.direct.gov.uk/"><img src="https://www.bromley.gov.uk/site/images/directgov.jpg" alt="Directgov website link - Public services all in one place" /></a>
-
- <ul class="footer-nav">
- <li><a href="#bromley-header">To the top</a></li>
- <li><a href="http://www.bromley.gov.uk/terms">Disclaimer</a></li>
- <li><a href="http://www.bromley.gov.uk/privacy" rel="nofollow">Privacy and cookies</a></li>
- <li><a href="http://www.bromley.gov.uk/accesstoinfo">Access to information</a></li>
- </ul>
-
-</div>
+ [% TRY %][% PROCESS 'footer_extra.html' %][% CATCH file %][% END %]
- </div></div>
</body>
</html>
diff --git a/templates/web/bromley/footer_extra.html b/templates/web/bromley/footer_extra.html
new file mode 100644
index 000000000..176b14f63
--- /dev/null
+++ b/templates/web/bromley/footer_extra.html
@@ -0,0 +1,41 @@
+<footer class="site-footer">
+ <div class="footer-container">
+ <div class="column span-12">
+ <div class="additional-links footer-list1">
+ <h5>Get in touch</h5>
+ <ul>
+ <li class="border first-child"><a href="/contact">Contact Us</a></li>
+ <li class="border"><a href="http://www.bromley.gov.uk/feedback">Feedback</a></li>
+ </ul>
+ </div><!--additional-links-->
+ <div class="additional-links footer-list2">
+ <h5>Our website</h5>
+ <ul>
+ <li class="first-child"><a href="http://www.bromley.gov.uk/accessibility">Accessibility</a></li>
+ <li><a href="javascript:void(0);" onclick="window.print()" rel="nofollow">Print</a></li>
+ <li><a href="javascript:bookmark('http://www.bromley.gov.uk', 'London Borough of Bromley')">Bookmark this page</a></li>
+ <li><a href="http://www.bromley.gov.uk/privacy">Privacy and cookies</a></li>
+ <li><a href="http://www.bromley.gov.uk/terms">Disclaimer</a></li>
+ <li><a href="http://www.bromley.gov.uk/press/article/977/community_library_management_proposals_invited#mast">To the top</a></li>
+ </ul>
+ </div><!--additional-links-->
+ <div class="additional-links">
+ <h5>Social</h5>
+ <div class="social">
+ <ul class="inline-list small-size width">
+ <li class="first-child"><a href="http://www.facebook.com/LBBromley" title="Facebook"><img src="/cobrands/bromley/facebook.png" alt="Facebook"></a></li>
+ <li><a href="http://twitter.com/LBofBromley" title="Twitter"><img src="/cobrands/bromley/twitter.png" alt="twitter"></a></li>
+ <li><a href="http://www.youtube.com/LBBromley" title="Youtube"><img src="/cobrands/bromley/youtube.png" alt="youtube"></a></li>
+ <li><a href="http://www.flickr.com/photos/lbofbromley/" title="flickr"><img src="/cobrands/bromley/flickr.png" alt="flickr"></a></li>
+ <li><a href="http://www.bromley.gov.uk/rss/press" title="RSS"><img src="/cobrands/bromley/rss.png" alt="RSS"></a></li>
+ </ul>
+ </div><!--social-->
+ </div><!--additional-links-->
+ </div>
+ <div class="column span-12">
+ <div class="copyright">
+ <p class="first-child">© 2015 London Borough of Bromley</p>
+ </div><!--copyright-->
+ </div><!--column-->
+ </div><!--footer-container-->
+</footer> \ No newline at end of file
diff --git a/templates/web/bromley/front/_list-entry.html b/templates/web/bromley/front/_list-entry.html
new file mode 100755
index 000000000..046c3b97f
--- /dev/null
+++ b/templates/web/bromley/front/_list-entry.html
@@ -0,0 +1 @@
+[% INCLUDE 'report/_item.html' no_fixed = 1 item_extra_class = 'item-list__item--with-pin' %]
diff --git a/templates/web/bromley/front/footer-marketing.html b/templates/web/bromley/front/footer-marketing.html
new file mode 100644
index 000000000..bdbe16dfb
--- /dev/null
+++ b/templates/web/bromley/front/footer-marketing.html
@@ -0,0 +1,18 @@
+<div class="tablewrapper">
+ <div id="footer-mobileapps">
+ <p>
+ <a href="https://itunes.apple.com/gb/app/fixmystreet/id297456545">
+ <img alt="FixMyStreet app on the App Store" src="/cobrands/fixmystreet/images/itunes_store_logo.png" />
+ </a>
+ <a href="https://play.google.com/store/apps/details?id=org.mysociety.FixMyStreet">
+ <img alt="FixMyStreet Android app on Google Play" src="/cobrands/fixmystreet/images/google_play_logo.png" />
+ </a>
+ </p>
+ </div>
+
+ <div id="footer-help">
+ <p>
+ Powered by <a class="platform-logo" href="https://fixmystreet.com/council">FixMyStreet Platform</a>
+ </p>
+ </div>
+</div> \ No newline at end of file
diff --git a/templates/web/bromley/header.html b/templates/web/bromley/header.html
deleted file mode 100644
index 9559592ff..000000000
--- a/templates/web/bromley/header.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
- <head>
- <meta name="viewport" content="initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
- <meta name="HandHeldFriendly" content="true">
- <meta name="mobileoptimized" content="0">
-
- <link rel="stylesheet" href="[% version('/cobrands/bromley/base.css') %]">
- <link rel="stylesheet" href="[% version('/cobrands/bromley/layout.css') %]" media="(min-width:48em)">
- <link rel="stylesheet" href="[% version('/cobrands/bromley/bromley.css') %]">
- [% extra_css %]
- <!--[if (lt IE 9) & (!IEMobile)]>
- <link rel="stylesheet" href="[% version('/cobrands/bromley/layout.css') %]">
- <![endif]-->
-
- <script src="[% version('/js/modernizr.custom.js') %]" charset="utf-8"></script>
- <script src="[% version('/cobrands/bromley/position_map.js') %]" charset="utf-8"></script>
- [% INCLUDE 'common_header_tags.html', js_override = '/cobrands/fixmystreet/fixmystreet.js' %]
- <script type="text/javascript">
-
-   var _gaq = _gaq || [];
-   _gaq.push(['_setAccount', 'UA-12543967-1']);
-   _gaq.push(['_setDomainName', 'bromley.gov.uk']);
-   _gaq.push(['_trackPageview']);
-
-   (function() {
-     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-   })();
-
- </script>
-
- [% extra_js %]
-
- <link rel="Shortcut Icon" type="image/x-icon" href="/cobrands/bromley/favicon.ico">
-
- [% PROCESS 'header_extra.html' %]
-
- </head>
- <body class="[% bodyclass | html IF bodyclass %]">
- [%# ie_wrapper is to prevent a horizontal scrollbar in IE7, it appears (from Bromley site) %]
- <div id="bromley-wrapper"><div id="bromley-ie_wrapper">
-
-<div id="bromley-header" class="desk-only">
- <ul class="header-nav">
- <li><a href="http://www.bromley.gov.uk/accessibility">Accessibility</a></li>
- <li><a class="skiplink" href="http://www.bromley.gov.uk/#user-meta" rel="nofollow">Skip to content</a></li>
- <!-- <li><a rel="nofollow" href="http://www.bromley.gov.uk/a_to_z?previewstyle=generic/print.css">Printer friendly</a></li> -->
- <!-- <li><a href="http://www.bromley.gov.uk/accessibility/settings">Text size: AAA</a></li> -->
- <li><div id="google_translate_element"></div></li>
- </ul>
-
- <div class="logo">
- <a href="http://www.bromley.gov.uk"><img src="/cobrands/bromley/bromley-logo.jpg" alt="London Borough of Bromley logo" width="159" height="114" style="width:159px; height:114px;" /></a>
- </div>
-
- <div class="sign-in">
- [% IF c.user_exists %]
- <p>
- [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
- <a href="/auth/sign_out">[% loc('sign out') %]</a>
- </p>
- [% END %]
- </div>
-
- <div class="main-menu">
- <ul>
- <li class="home"><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
- >[% "Report" %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/my' OR ( c.req.uri.path == '/auth' AND c.req.params.r == 'my' ) %]span[% ELSE %]a href="/my"[% END
- %]>[% loc("Your reports") %]</[% ( c.req.uri.path == '/my' OR ( c.req.uri.path == '/auth' AND c.req.params.r == 'my' ) ) ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/reports/Bromley' %]span[% ELSE %]a href="/reports/Bromley"[% END
- %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
- %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
- %]<li class="last"><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
- %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
- </ul>
- </div>
-
-</div>
-
- <div class="wrapper">
- <div class="table-cell">
- <div id="site-header" role="banner">
- <div class="container">
- <a href="/" id="site-logo">FixMyStreet</a>
- <a href="#main-nav" id="nav-link">Main Navigation</a>
- </div>
- </div>
-
- [% IF c.user_exists %]
- <div id="user-meta">
- <p>
- [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
- <a href="/auth/sign_out">[% loc('sign out') %]</a>
- </p>
- </div>
- [% END %]
-
- <h1 class="main desk-only">Reporting a problem in Bromley&rsquo;s streets or parks</h1>
-
- [% pre_container_extra %]
-
- <div class="container">
- <div class="content[% " $mainclass" | html IF mainclass %]" role="main">
-
-
diff --git a/templates/web/bromley/header_extra.html b/templates/web/bromley/header_extra.html
new file mode 100644
index 000000000..c7fe5f3e3
--- /dev/null
+++ b/templates/web/bromley/header_extra.html
@@ -0,0 +1 @@
+<script src="[% start %][% version('/cobrands/bromley/a-z-nav.js') %]" charset="utf-8"></script> \ No newline at end of file
diff --git a/templates/web/bromley/header_logo.html b/templates/web/bromley/header_logo.html
new file mode 100644
index 000000000..92ff771f9
--- /dev/null
+++ b/templates/web/bromley/header_logo.html
@@ -0,0 +1,62 @@
+ <div class="bromley-header cf">
+ <a href="http://www.bromley.gov.uk/" id="site-logo">[% site_name %]</a>
+
+ <ul class="linear-links subtext float-right top-links">
+ <li class="first-child"><i class="fa fa-home"></i><a href="http://www.bromley.gov.uk">Home</a></li>
+ <li><i class="fa fa-sitemap"></i><a href="http://www.bromley.gov.uk/site_map">Sitemap</a></li>
+ <li><i class="fa fa-user"></i><a href="https://www.bromley.gov.uk/SiteLogin">Register/Sign in</a></li>
+ </ul>
+
+ <form action="http://www.bromley.gov.uk/site/scripts/google_results.aspx" method="get" id="search" class="main-search" role="search">
+ <label for="SearchSite" class="hidden">Search this site</label>
+ <input type="text" size="18" class="main-search-input field" name="q" id="SearchSite" value="" placeholder="Search the website">
+ <input value="Search" type="submit" class="button__primary">
+ </form>
+ </div>
+</div>
+<div class="container main-menu-container">
+ <div class="a-z-container ">
+ <nav class="main-a-z custom-side-nav">
+ <ul class="drop-down-nav">
+ <li class="first-child">
+ <a href="#" class="main-nav-title">A-Z</a>
+ <ul class="nav-hover-item nav-hover-item-active a-z">
+ <li class="first-child"><a href="http://www.bromley.gov.uk/a_to_z/A">a</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/B">b</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/C">c</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/D">d</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/E">e</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/F">f</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/G">g</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/H">h</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/I">i</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/J">j</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/K">k</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/L">l</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/M">m</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/N">n</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/O">o</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/P">p</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/Q">q</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/R">r</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/S">s</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/T">t</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/U">u</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/V">v</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/W">w</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/X">x</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/Y">y</a></li>
+ <li><a href="http://www.bromley.gov.uk/a_to_z/Z">z</a></li>
+ </ul>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ <div class="breadcrumb">
+ <!-- Breadcrumb --><!-- googleoff:all -->
+ <ul>
+ <li class="first-child"><a href="http://www.bromley.gov.uk">Home</a></li>
+ <li class="current"><span>FixMyStreet</span></li>
+ </ul>
+ <!-- END Breadcrumb --><!-- googleon:all -->
+ </div>
diff --git a/templates/web/bromley/report/_item.html b/templates/web/bromley/report/_item.html
index cd3fbc18c..3bd8a8686 100644
--- a/templates/web/bromley/report/_item.html
+++ b/templates/web/bromley/report/_item.html
@@ -1,5 +1,5 @@
-<li>
-<a class="text" href="[% c.uri_for('/report', problem.id ) %]">
+<li class="item-list__item item-list--reports__item item-list__item--with-pin [% c.cobrand.pin_colour(problem) %]">
+<a class="[% problem.category %]" href="[% c.uri_for('/report', problem.id ) %]">
[% IF problem.photo;
photo = problem.get_photo_params
%]
@@ -11,7 +11,7 @@
[%- IF include_lastupdate AND problem.confirmed != problem.lastupdate AND problem.whensent != problem.lastupdate %],
[% tprintf(loc('last updated %s'), prettify_dt( problem.lastupdate, 1 ) ) %]
[%- END %]
- [% IF include_lastupdate %]
+ [% IF include_sentinfo %]
[% IF problem.bodies_str_ids.size > 1 %] [% loc('(sent to both)') %]
[% ELSIF problem.bodies_str_ids.size == 0 %] [% loc('(not sent to council)') %]
[% END %]
diff --git a/templates/web/eastsussex/email_sent.html b/templates/web/eastsussex/email_sent.html
deleted file mode 100644
index f64a3cd64..000000000
--- a/templates/web/eastsussex/email_sent.html
+++ /dev/null
@@ -1,34 +0,0 @@
-[% INCLUDE 'header.html', bodyclass = 'twothirdswidthpage', title = loc('Create a report') %]
-
-<h1>[% loc("Nearly done! Now check your email&hellip;") %]</h1>
-
-[% IF c.cobrand.moniker != 'zurich' %]
- <p>[% loc("The confirmation email <strong>may</strong> take a few minutes to arrive &mdash; <em>please</em> be patient.") %]</p>
-[% END %]
-
-<p>[% loc("If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way.") %]</p>
-
-[% IF c.cobrand.moniker != 'zurich' %]
- <p>
- [% loc("You must now click the link in the email we've just sent you.") %]
- [% IF email_type == 'problem' %]
- [% loc("If you do not, your problem will not be posted.") %]
- [% ELSIF email_type == 'update' %]
- [% loc("If you do not, your update will not be posted.") %]
- [% ELSIF email_type == 'alert' %]
- [% loc("If you do not, your alert will not be activated.") %]
- [% END %]
- </p>
-
- <p>
- [% IF email_type == 'problem' %]
- [% loc("(Don't worry &mdash; we'll hang on to your problem report while you're checking your email.)") %]
- [% ELSIF email_type == 'update' %]
- [% loc("(Don't worry &mdash; we'll hang on to your update while you're checking your email.)") %]
- [% ELSIF email_type == 'alert' %]
- [% loc("(Don't worry &mdash; we'll hang on to your alert while you're checking your email.)") %]
- [% END %]
- </p>
-[% END %]
-
-[% INCLUDE 'footer.html' %]
diff --git a/templates/web/emptyhomes/header.html b/templates/web/emptyhomes/header.html
index de1ecec7b..0f6d1b3b8 100644
--- a/templates/web/emptyhomes/header.html
+++ b/templates/web/emptyhomes/header.html
@@ -1,7 +1,7 @@
<!doctype html>
-<!--[if lt IE 7]><html class="ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="ie8 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="ie6" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="ie7" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="ie8" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 8]><!--><html lang="[% lang_code %]"><!--<![endif]-->
<head>
diff --git a/templates/web/fiksgatami/footer.html b/templates/web/fiksgatami/footer.html
index e9fbeb716..f5088bcb4 100644
--- a/templates/web/fiksgatami/footer.html
+++ b/templates/web/fiksgatami/footer.html
@@ -10,11 +10,11 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a href="http://www.nuug.no/">Foreningen NUUG</a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/fiksgatami/header.html b/templates/web/fiksgatami/header.html
index 3cdc093cb..ac607be8a 100644
--- a/templates/web/fiksgatami/header.html
+++ b/templates/web/fiksgatami/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/fiksgatami/nn/footer.html b/templates/web/fiksgatami/nn/footer.html
index cfef66bc9..d7703388a 100644
--- a/templates/web/fiksgatami/nn/footer.html
+++ b/templates/web/fiksgatami/nn/footer.html
@@ -10,11 +10,11 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a href="http://www.nuug.no/">Foreininga NUUG</a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/fixamingata/footer.html b/templates/web/fixamingata/footer.html
index c6f49cb79..376d79ff4 100644
--- a/templates/web/fixamingata/footer.html
+++ b/templates/web/fixamingata/footer.html
@@ -10,7 +10,7 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/fixamingata/front/recent.html b/templates/web/fixamingata/front/recent.html
index bfe35832e..255882f41 100644
--- a/templates/web/fixamingata/front/recent.html
+++ b/templates/web/fixamingata/front/recent.html
@@ -20,7 +20,7 @@
</h2>
<section class="full-width">
- <ul class="issue-list-a">
+ <ul class="item-list item-list--reports">
[% FOREACH problem IN recent_photos %]
[% INCLUDE 'report/_item.html', no_fixed = 1 %]
[% END %]
diff --git a/templates/web/fixmindelo/footer.html b/templates/web/fixmindelo/footer.html
index e11b81827..afd8984c7 100644
--- a/templates/web/fixmindelo/footer.html
+++ b/templates/web/fixmindelo/footer.html
@@ -28,11 +28,11 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a id="mysoc-logo" href="http://www.mysociety.org/">mySociety</a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/fixmindelo/static/privacy.html b/templates/web/fixmindelo/static/privacy.html
index fd75f65e2..79817af4b 100644
--- a/templates/web/fixmindelo/static/privacy.html
+++ b/templates/web/fixmindelo/static/privacy.html
@@ -85,10 +85,9 @@ bloquear o Google Analytics.</a>.
<table cellpadding=5>
<tr align="left"><th scope="col">Nome</th><th scope="col">conteúdo típico </th><th scope="col">Expira</th></tr>
-<tr><td>__utma</td><td>anônimo único ID</td><td>2&nbsp;anos</td></tr>
-<tr><td>__utmb</td><td>única sessão anônima ID </td><td>30&nbsp;minutos</td></tr>
-<tr><td>__utmz</td><td>IInformações sobre como o site foi alcançado (eg direta ou através de um link / search / propaganda)</td><td>6&nbsp;meses</td></tr>
-<tr><td>__utmx</td><td>Que variação de uma página que você está vendo se estamos testando versões diferentes para ver qual é o melhor </td><td>2&nbsp;anos</td></tr>
+<tr><td>_ga</td><td>anônimo único ID</td><td>2&nbsp;anos</td></tr>
+<tr><td>_gat</td><td>única sessão anônima ID </td><td>30&nbsp;minutos</td></tr>
+<tr><td>__utmx / __utmxx</td><td>Que variação de uma página que você está vendo se estamos testando versões diferentes para ver qual é o melhor </td><td>2&nbsp;anos</td></tr>
</table>
<h4>Declaração oficial sobre dados do Google Analytics</h4>
diff --git a/templates/web/fixmybarangay/around/intro.html b/templates/web/fixmybarangay/around/intro.html
new file mode 100644
index 000000000..b876de453
--- /dev/null
+++ b/templates/web/fixmybarangay/around/intro.html
@@ -0,0 +1,2 @@
+ <h1>View local problems</h1>
+ <h2>(potholes or street lighting)</h2>
diff --git a/templates/web/fixmybarangay/around/tabbed_lists.html b/templates/web/fixmybarangay/around/tabbed_lists.html
index 342b03f0e..f2f257b03 100644
--- a/templates/web/fixmybarangay/around/tabbed_lists.html
+++ b/templates/web/fixmybarangay/around/tabbed_lists.html
@@ -9,7 +9,7 @@ IF allow_creation %]
</menu>
[% END %]
-<ul id="current" class="issue-list-a tab">
+<ul id="current" class="item-list item-list--reports tab">
[% INCLUDE "around/on_map_list_items.html" %]
</ul>
diff --git a/templates/web/fixmybarangay/footer.html b/templates/web/fixmybarangay/footer.html
index 5bac32e98..d1f9203f2 100644
--- a/templates/web/fixmybarangay/footer.html
+++ b/templates/web/fixmybarangay/footer.html
@@ -5,13 +5,11 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
- <li><a id="mysoc-logo" href="http://www.mysociety.org/">mySociety</a></li>[%
- %]<!--<li><a href="http://mysociety.org/donate/">Donate</a></li>[%
- %]<li><a href="http://www.mysociety.org/projects/">Our Sites</a></li>-->
+ <ul class="nav-menu nav-menu--mysoc">
+ <li><a id="mysoc-logo" href="http://www.mysociety.org/">mySociety</a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><a href="/around?latitude=10.322;longitude=123.907" class="fmb-bgy-btn">Luz</a></li>
<li><a href="/around?latitude=10.288;longitude=123.870" class="fmb-bgy-btn">BSN</a></li>
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
diff --git a/templates/web/fixmybarangay/header.html b/templates/web/fixmybarangay/header.html
index 18388649b..739f4c761 100644
--- a/templates/web/fixmybarangay/header.html
+++ b/templates/web/fixmybarangay/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/fixmybarangay/report/_message_manager.html b/templates/web/fixmybarangay/report/_message_manager.html
index 3845feeef..e937066ff 100644
--- a/templates/web/fixmybarangay/report/_message_manager.html
+++ b/templates/web/fixmybarangay/report/_message_manager.html
@@ -16,7 +16,7 @@
</div>
[% END %]
-<ul id="message_manager" class="issue-list-a tab" style="display: none">
+<ul id="message_manager" class="item-list item-list--reports tab" style="display: none">
<li id="mm-admin-buttons">
[% IF problem.id %]
<a style="float:left" id="mm-link-to-toggle-archive" href="#" title="show the message(s) associated with this report">show message for <b>this</b> report</a>
diff --git a/templates/web/fixmystreet-uk-councils/report/_item-with-pin.html b/templates/web/fixmystreet-uk-councils/report/_item-with-pin.html
new file mode 100644
index 000000000..b36dac3b6
--- /dev/null
+++ b/templates/web/fixmystreet-uk-councils/report/_item-with-pin.html
@@ -0,0 +1,6 @@
+<li class="item-list__item item-list__item--with-pin [% c.cobrand.pin_colour(problem) %]">
+ <a href="[% c.uri_for('/report', problem.id ) %]" class="[% problem.category %]">
+ <h3>[% problem.title | html %]</h3>
+ <p>Reported [%- prettify_dt( problem.confirmed, 1 ) %]</p>
+ </a>
+</li>
diff --git a/templates/web/fixmystreet-uk-councils/static/privacy.html b/templates/web/fixmystreet-uk-councils/static/privacy.html
index ba1745978..3b077d29e 100644
--- a/templates/web/fixmystreet-uk-councils/static/privacy.html
+++ b/templates/web/fixmystreet-uk-councils/static/privacy.html
@@ -46,6 +46,13 @@ available).</dd>
problem you&rsquo;ve reported, and send you a questionnaire email four weeks
after you submit a problem, asking for a status update; we&rsquo;ll only ever
send you emails in relation to your problem.</dd>
+
+ <dt>How do I stop receiving emails from you?</dt>
+ <dd>Every alert email we send contains an unsubscribe link at the
+bottom for you to stop receiving that alert. After the first questionnaire
+email on a report, mentioned above, you have to opt in to receive any further
+questionnaire on that report.</dd>
+
</dl>
<h2>Cookies</h2>
@@ -92,10 +99,9 @@ plugin for blocking Google Analytics</a>.
<table cellpadding=5>
<tr align="left"><th scope="col">Name</th><th scope="col">Typical Content</th><th scope="col">Expires</th></tr>
-<tr><td>__utma</td><td>Unique anonymous visitor ID</td><td>2&nbsp;years</td></tr>
-<tr><td>__utmb</td><td>Unique anonymous session ID</td><td>30&nbsp;minutes</td></tr>
-<tr><td>__utmz</td><td>Information on how the site was reached (e.g. direct or via a link/search/advertisement)</td><td>6&nbsp;months</td></tr>
-<tr><td>__utmx</td><td>Which variation of a page you are seeing if we are testing different versions to see which is best</td><td>2&nbsp;years</td></tr>
+<tr><td>_ga</td><td>Used to distinguish users</td><td>2 years</td></tr>
+<tr><td>_gat</td><d>Used to throtle request rate</td><td>10 minutes</td></tr>
+<tr><td>__utmx / __utmxx</td><td>Which variation of a page you are seeing if we are testing different versions to see which is best</td><td>2&nbsp;years</td></tr>
</table>
<h4>Google’s Official Statement about Analytics Data</h4>
diff --git a/templates/web/fixmystreet.com/contact/address.html b/templates/web/fixmystreet.com/contact/address.html
new file mode 100644
index 000000000..2cea59684
--- /dev/null
+++ b/templates/web/fixmystreet.com/contact/address.html
@@ -0,0 +1,7 @@
+<hr>
+
+<p>FixMyStreet is a service provided by mySociety, which is the project of a
+registered charity, UK Citizens Online Democracy, charity number 1076346.</p>
+
+<p>If you wish to contact us by post, our address is
+<address>mySociety, 483 Green Lanes, London, N13 4BS, UK.</address></p>
diff --git a/templates/web/fixmystreet.com/footer_extra.html b/templates/web/fixmystreet.com/footer_extra.html
deleted file mode 100644
index ba32a5534..000000000
--- a/templates/web/fixmystreet.com/footer_extra.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<script type="text/javascript">
- (function(){var e=0.6;var t=null;var n=document.cookie.split(";");for(var r=0;r<n.length;r++){var i=n[r];while(i.charAt(0)==" "){i=i.substring(1,i.length)}if(i.indexOf("ms_srv_t=")==0){var t=i.substring("ms_srv_t=".length,i.length)}if(i.indexOf("ms_srv_r=")==0){var s=i.substring("ms_srv_r=".length,i.length)}}if(t==null){if(Math.random()<e){var o=Math.round((new Date).getTime()/1e3);document.cookie="ms_srv_t="+o+"; path=/";document.cookie="ms_srv_r="+document.referrer+"; path=/";t=o;s=document.referrer}else{document.cookie="ms_srv_t=X; path=/";t="X"}}if(t!="X"&&!!document.getElementById("ms_srv_wrapper")){var u=Math.round((new Date).getTime()/1e3)-t;var a=!!document.getElementById("user-meta");var f=document.getElementById("ms_srv_link");data={ms_time:u,ms_referrer:s||null,ms_registered:a,ms_transaction:f.getAttribute("data-transaction")};var l=[];for(var c in data){l.push(encodeURIComponent(c)+"="+encodeURIComponent(data[c]))}f.href=f.href+"?"+l.join("&");document.getElementById("ms_srv_wrapper").style.display=""}})()
-</script>
diff --git a/templates/web/fixmystreet.com/research/survey_link.html b/templates/web/fixmystreet.com/research/survey_link.html
deleted file mode 100644
index 7357249d8..000000000
--- a/templates/web/fixmystreet.com/research/survey_link.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<div id="ms_srv_wrapper" style="display:none">
- <p><a href="https://www.surveygizmo.co.uk/s3/1907419/FMS-2014" id="ms_srv_link" data-transaction="report">We&rsquo;re running a short survey to help us understand how well FixMyStreet works. If you&rsquo;d like to take it, click here.</a></p>
-</div>
diff --git a/templates/web/fixmystreet.com/static/privacy.html b/templates/web/fixmystreet.com/static/privacy.html
index ba1745978..3b077d29e 100755
--- a/templates/web/fixmystreet.com/static/privacy.html
+++ b/templates/web/fixmystreet.com/static/privacy.html
@@ -46,6 +46,13 @@ available).</dd>
problem you&rsquo;ve reported, and send you a questionnaire email four weeks
after you submit a problem, asking for a status update; we&rsquo;ll only ever
send you emails in relation to your problem.</dd>
+
+ <dt>How do I stop receiving emails from you?</dt>
+ <dd>Every alert email we send contains an unsubscribe link at the
+bottom for you to stop receiving that alert. After the first questionnaire
+email on a report, mentioned above, you have to opt in to receive any further
+questionnaire on that report.</dd>
+
</dl>
<h2>Cookies</h2>
@@ -92,10 +99,9 @@ plugin for blocking Google Analytics</a>.
<table cellpadding=5>
<tr align="left"><th scope="col">Name</th><th scope="col">Typical Content</th><th scope="col">Expires</th></tr>
-<tr><td>__utma</td><td>Unique anonymous visitor ID</td><td>2&nbsp;years</td></tr>
-<tr><td>__utmb</td><td>Unique anonymous session ID</td><td>30&nbsp;minutes</td></tr>
-<tr><td>__utmz</td><td>Information on how the site was reached (e.g. direct or via a link/search/advertisement)</td><td>6&nbsp;months</td></tr>
-<tr><td>__utmx</td><td>Which variation of a page you are seeing if we are testing different versions to see which is best</td><td>2&nbsp;years</td></tr>
+<tr><td>_ga</td><td>Used to distinguish users</td><td>2 years</td></tr>
+<tr><td>_gat</td><d>Used to throtle request rate</td><td>10 minutes</td></tr>
+<tr><td>__utmx / __utmxx</td><td>Which variation of a page you are seeing if we are testing different versions to see which is best</td><td>2&nbsp;years</td></tr>
</table>
<h4>Google’s Official Statement about Analytics Data</h4>
diff --git a/templates/web/fixmystreet.com/tokens/_extras_confirm.html b/templates/web/fixmystreet.com/tokens/_extras_confirm.html
deleted file mode 100644
index c27383f42..000000000
--- a/templates/web/fixmystreet.com/tokens/_extras_confirm.html
+++ /dev/null
@@ -1 +0,0 @@
-[% INCLUDE 'research/survey_link.html' %]
diff --git a/templates/web/fixmystreet/alert/_list.html b/templates/web/fixmystreet/alert/_list.html
deleted file mode 100644
index f376e3c66..000000000
--- a/templates/web/fixmystreet/alert/_list.html
+++ /dev/null
@@ -1,93 +0,0 @@
- <input type="hidden" name="type" value="local">
- <input type="hidden" name="pc" value="[% pc | html %]">
- <input type="hidden" name="latitude" value="[% latitude | html %]">
- <input type="hidden" name="longitude" value="[% longitude | html %]">
-
- <p>
- [% IF pretty_pc %]
- [% tprintf( loc('Here are the types of local problem alerts for &lsquo;%s&rsquo;.'), pretty_pc ) %]
- [% END %]
- [% loc('Select which type of alert you\'d like and click the button for an RSS feed, or enter your email address to subscribe to an email alert.') %]
- </p>
-
- [% INCLUDE 'errors.html' %]
-
- <p>
- [% loc('The simplest alert is our geographic one:') %]
- </p>
-
- <p id="rss_local">
- <input type="radio" name="feed" id="[% rss_feed_id %]" value="[% rss_feed_id %]"[% IF rss_feed_id == selected_feed || selected_feed == '' %] checked[% END %]>
- <label class="inline" for="[% rss_feed_id %]">[% tprintf( loc('Problems within %.1fkm of this location'), population_radius ) %]</label>
- <a href='[% rss_feed_uri %]'><img src='/i/feed.png' width='16' height='16' title='[% loc('RSS feed of nearby problems') %]' alt='[% loc('RSS feed') %]' border='0'></a>
- <br />
- [% loc('(a default distance which covers roughly 200,000 people)') %]
- </p>
-
- <p id="rss_local_alt">
- [% loc('(alternatively the RSS feed can be customised, within') %]
- <a href="[% rss_feed_2k %]">2km</a> / <a href="[% rss_feed_5k %]">5km</a> / <a href="[% rss_feed_10k %]">10km</a> / <a href="[% rss_feed_20k %]">20km</a>)
- </p>
-
- <p>
- [% IF c.cobrand.is_council %]
- Or you can subscribe to an alert for all council problems or one based upon what ward you&rsquo;re in:
- [% ELSE %]
- [% loc("Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:") %]
- [% END %]
- </p>
-
- [% IF reported_to_options %]
- <p><strong>
- [% loc('Problems within the boundary of:') %]
- </strong></p>
- <ul class="plain-list">
- [% ELSE %]
- <ul id="rss_feed" class="plain-list">
- [% END %]
-
- [% FOREACH option IN options %]
- <li[% IF ! (loop.count % 2) %] class="a"[% END %]>
- <input type="radio" name="feed" id="[% option.id %]" value="[% option.id %]"[% IF option.id == selected_feed %] checked[% END %]>
- <a href="[% option.uri %]"><img src="/i/feed.png" width="16" height="16"
-title="[% option.rss_text %]" alt="RSS feed" border="0"></a>
- <label class="inline" for="[% option.id %]">[% option.text %]</label>
- </li>
- [% END %]
-</ul>
- [% IF reported_to_options %]
- <p><strong>
- [% loc('Or problems reported to:') %]
- </strong></p>
- <ul class="plain-list">
- [% FOREACH option IN reported_to_options %]
- <li[% IF ! (loop.count % 2) %] class="a"[% END %]>
- <input type="radio" name="feed" id="[% option.id %]" value="[% option.id %]"[% IF option.id == selected_feed %] checked[% END %]>
- <a href="[% option.uri %]"><img src="/i/feed.png" width="16" height="16"
- title="[% option.rss_text %]" alt="RSS feed" border="0"></a>
- <label class="inline" for="[% option.id %]">[% option.text %]</label>
- </li>
- [% END %]
- </ul>
- <p><small>
- [% loc( 'FixMyStreet sends different categories of problem
-to the appropriate council, so problems within the boundary of a particular council
-might not match the problems sent to that council. For example, a graffiti report
-will be sent to the district council, so will appear in both of the district
-council&rsquo;s alerts, but will only appear in the "Within the boundary" alert
-for the county council.' ) %]
- </small></p>
- [% END %]
-
- <input id="alert_rss_button" class="green-btn" type="submit" name="rss" value="[% loc('Give me an RSS feed') %]">
-
- <p id="alert_or">
- [% loc('or') %]
- </p>
-
- [% UNLESS c.user_exists %]
- <label for="rznvy">[% loc('Your email') %]</label>
- <input type="text" id="rznvy" name="rznvy" value="[% rznvy | html %]">
- [% END %]
- <input id="alert_email_button" style="margin-top:1em;" class="green-btn" type="submit" name="alert" value="[% loc('Subscribe me to an email alert') %]">
-
diff --git a/templates/web/fixmystreet/around/_main.html b/templates/web/fixmystreet/around/_main.html
new file mode 100644
index 000000000..900dcb6aa
--- /dev/null
+++ b/templates/web/fixmystreet/around/_main.html
@@ -0,0 +1,3 @@
+<div class="tablewrapper">
+ [% INCLUDE 'around/_error_multiple.html' %]
+</div>
diff --git a/templates/web/fixmystreet/around/around_map_list_items.html b/templates/web/fixmystreet/around/around_map_list_items.html
deleted file mode 100644
index 612b37d00..000000000
--- a/templates/web/fixmystreet/around/around_map_list_items.html
+++ /dev/null
@@ -1,9 +0,0 @@
-[% IF around_map.size %]
- [% FOREACH p IN around_map %]
- [% INCLUDE 'report/_item.html'
- problem = p.problem,
- dist = tprintf("%.1f", (p.distance || 0) ) %]
- [% END %]
-[% ELSE %]
- <li><p>[% loc('No problems found.') %]</p></li>
-[% END %]
diff --git a/templates/web/fixmystreet/around/location_error.html b/templates/web/fixmystreet/around/location_error.html
deleted file mode 100644
index fc9b2b8ce..000000000
--- a/templates/web/fixmystreet/around/location_error.html
+++ /dev/null
@@ -1 +0,0 @@
-<p class="form-error">[% location_error %]</p>
diff --git a/templates/web/fixmystreet/around/on_map_list_items.html b/templates/web/fixmystreet/around/on_map_list_items.html
deleted file mode 100644
index 7b66d4267..000000000
--- a/templates/web/fixmystreet/around/on_map_list_items.html
+++ /dev/null
@@ -1,7 +0,0 @@
-[% IF on_map.size %]
- [% FOREACH problem IN on_map %]
- [% INCLUDE 'report/_item.html' %]
- [% END %]
-[% ELSE %]
- <li><p>[% loc('No problems have been reported yet.') %]</p></li>
-[% END %]
diff --git a/templates/web/fixmystreet/around/postcode_form.html b/templates/web/fixmystreet/around/postcode_form.html
deleted file mode 100644
index ed5d700f0..000000000
--- a/templates/web/fixmystreet/around/postcode_form.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<div id="front-main">
- <div id="front-main-container">
- [% IF c.cobrand.moniker == 'fixmybarangay' %]
- <h1>View local problems</h1>
- <h2>(potholes or street lighting)</h2>
- [% ELSE %]
- [% INCLUDE 'around/intro.html' %]
- [% END %]
-
- [%
- question = c.cobrand.enter_postcode_text || loc('Enter a nearby street name and area');
- %]
-
- [% IF c.cobrand.moniker == 'fixmybarangay' %]
- [% INCLUDE '_barangay_buttons.html' %]
- [% ELSE %]
- <form action="[% c.uri_for('/around') %]" method="get" name="postcodeForm" id="postcodeForm">
- <label for="pc">[% question %]:</label>
- <div>
- <input type="text" name="pc" value="[% pc | html %]" id="pc" size="10" maxlength="200" placeholder="[% tprintf(loc('e.g. ‘%s’ or ‘%s’'), c.cobrand.example_places) %]">
- <input type="submit" value="[% loc('Go') %]" id="sub">
- </div>
-
- [% IF partial_token %]
- <input type="hidden" name="partial" value="[% partial_token.token %]">
- [% END %]
-
- </form>
- [% END %]
- </div>
-</div>
diff --git a/templates/web/fixmystreet/around/tabbed_lists.html b/templates/web/fixmystreet/around/tabbed_lists.html
deleted file mode 100644
index 77c5a521b..000000000
--- a/templates/web/fixmystreet/around/tabbed_lists.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<menu id="problems-nav" class="tab-nav">
- <ul>
- <li><a href="#current">[% loc('Problems on the map') %]</a></li>
- <li><a href="#current_near">[% loc( 'Problems nearby' ) %]</a></li>
- </ul>
-</menu>
-
-<ul id="current" class="issue-list-a tab">
- [% INCLUDE "around/on_map_list_items.html" %]
-</ul>
-
-<ul id="current_near" class="issue-list-a tab">
- [% INCLUDE "around/around_map_list_items.html" %]
-</ul>
diff --git a/templates/web/fixmystreet/auth/general.html b/templates/web/fixmystreet/auth/general.html
deleted file mode 100644
index 45239073d..000000000
--- a/templates/web/fixmystreet/auth/general.html
+++ /dev/null
@@ -1,73 +0,0 @@
-[% INCLUDE 'header.html', bodyclass='authpage', title = loc('Sign in or create an account') %]
-[%# should bodyclass='twothirdspage' instead? Need override for Harrogate %]
-
-<h1>[% loc('Sign in') %]</h1>
-
-<form action="[% c.uri_for() %]" method="post" name="general_auth" class="validate">
- <fieldset>
- <input type="hidden" name="r" value="[% c.req.params.r | html %]">
-
- [% IF email_error;
-
- # other keys include fqdn, mxcheck if you'd like to write a custom error message
-
- errors = {
- missing => loc('Please enter your email'),
- other => loc('Please check your email address is correct')
- };
-
- loc_email_error = errors.$email_error || errors.other;
- END %]
- <label class="n" for="email">[% loc('Email') %]</label>
- [% IF loc_email_error %]
- <div class="form-error">[% loc_email_error %]</div>
- [% ELSIF sign_in_error %]
- <div class="form-error">[% loc('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form.') %]</div>
- [% END %]
- <input type="email" class="required email" id="email" name="email" value="[% email | html %]" placeholder="[% loc('Your email address') %]">
-
- <div id="form_sign_in">
- [% IF c.cobrand.moniker == 'fixmybarangay' %]
- <h3>[% loc("Do you have a FixMyBarangay password?") %]</h3>
- [% ELSE %]
- <h3>[% loc("Do you have a FixMyStreet password?") %]</h3>
- [% END %]
-
- <div id="form_sign_in_yes" class="form-box">
- <h5>[% loc('<strong>Yes</strong> I have a password') %]</h5>
-
- <label class="hidden-js n" for="password_sign_in">[% loc('<strong>Yes</strong> I have a password') %]</label>
-
- <div class="form-txt-submit-box">
- <input type="password" name="password_sign_in" id="password_sign_in" value="" placeholder="[% loc('Your password') %]">
- <input class="green-btn" type="submit" name="sign_in" value="[% loc('Sign in') %]">
- </div>
-
- <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
- <label class="inline n" for="remember_me">[% loc('Keep me signed in on this computer') %]</label>
-
- </div>
- <div id="form_sign_in_no" class="form-box">
- <h5>[% loc('<strong>No</strong> let me sign in by email') %]</h5>
-
- <label for="name">[% loc('Name') %]</label>
- <input type="text" name="name" value="" placeholder="[% loc('Your name') %]">
-
- <label for="password_register">[% loc('Password (optional)') %]</label>
-
- <div class="general-notes">
- <p>[% loc('Providing a name and password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</p>
- </div>
-
- <div class="form-txt-submit-box">
- <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]">
- <input class="green-btn" type="submit" name="email_sign_in" value="[% loc('Sign in') %]">
- </div>
- </div>
-
- </div>
- </fieldset>
-</form>
-
-
-[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmystreet/contact/blurb.html b/templates/web/fixmystreet/contact/blurb.html
index 21a4ae715..3f9e88ed0 100644
--- a/templates/web/fixmystreet/contact/blurb.html
+++ b/templates/web/fixmystreet/contact/blurb.html
@@ -10,6 +10,6 @@
<p>
[% loc('Please do <strong>not</strong> report problems through this form; messages go to
-the team behind FixMyStreet, not a council. To report a problem,
+the team behind this site, not a council. To report a problem,
please <a href="/">go to the front page</a> and follow the instructions.') %]
</p>
diff --git a/templates/web/fixmystreet/contact/index.html b/templates/web/fixmystreet/contact/index.html
index 92f2451ef..96ff7643d 100644
--- a/templates/web/fixmystreet/contact/index.html
+++ b/templates/web/fixmystreet/contact/index.html
@@ -7,9 +7,9 @@
<div class="sticky-sidebar">
<aside>
<ul class="plain-list">
- <li><a href="/faq">Frequently Asked Questions</a></li>
- <li><a href="/privacy">Privacy and cookies</a></li>
- <li><strong>Contact FixMyStreet</strong></li>
+ <li><a href="/faq">[% loc('Frequently Asked Questions') %]</a></li>
+ <li><a href="/privacy">[% loc('Privacy and cookies') %]</a></li>
+ <li><strong>[% tprintf(loc("Contact %s", "%s is the site name"), site_name) %]</strong></li>
</ul>
</aside>
</div>
diff --git a/templates/web/fixmystreet/footer.html b/templates/web/fixmystreet/footer.html
index 810708919..7626736a0 100644
--- a/templates/web/fixmystreet/footer.html
+++ b/templates/web/fixmystreet/footer.html
@@ -13,22 +13,31 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a id="mysoc-logo" href="https://www.mysociety.org/">mySociety</a></li>
</ul>
-
- <ul id="main-menu">
- <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
+[%
+ SET base = "";
+ SET base = c.cobrand.base_url IF admin;
+%]
+ <ul class="nav-menu nav-menu--main">
+ <li><[% IF c.req.uri.path == '/'
+ %]span[% ELSE %]a href="[% base %]/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
+ %]<li><[% IF c.req.uri.path == '/my'
+ %]span[% ELSE %]a href="[% base %]/my"[% END
%]>[% loc("Your reports") %]</[% c.req.uri.path == '/my' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END
+ %]<li><[% IF c.req.uri.path == '/reports'
+ %]span[% ELSE %]a href="[% base %]/reports"[% END
%]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
+ %]<li><[% IF c.req.uri.path == '/alert'
+ %]span[% ELSE %]a href="[% base %]/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
%]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
- %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]<li><[% IF c.req.uri.path == '/faq'
+ %]span[% ELSE %]a href="[% base %]/faq"[% END
%]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>[%
- %]<li id="top-nav-privacy"><[% IF c.req.uri.path == '/privacy' %]span[% ELSE %]a href="/privacy"[% END
+ %]<li class="nav-menu__item--privacy"><[% IF c.req.uri.path == '/privacy'
+ %]span[% ELSE %]a href="[% base %]/privacy"[% END
%]>[% loc("Privacy") %]</[% c.req.uri.path == '/privacy' ? 'span' : 'a' %]></li>
</ul>
</div>
diff --git a/templates/web/fixmystreet/front/recent.html b/templates/web/fixmystreet/front/recent.html
deleted file mode 100644
index 4cb575489..000000000
--- a/templates/web/fixmystreet/front/recent.html
+++ /dev/null
@@ -1,24 +0,0 @@
- [%
- recent_photos = c.cobrand.recent_photos('front', 5);
- %]
-
- [% IF recent_photos.size %]
- <div id="front-recently">
- <h2>
- [% IF c.cobrand.moniker == 'hart' %]
- Recently reported
- [% ELSE %]
- [% loc('Recently reported problems') %]
- [% END %]
- </h2>
-
- <section class="full-width">
- <ul class="issue-list-a">
- [% FOREACH problem IN recent_photos %]
- [% INCLUDE 'report/_item.html', no_fixed = 1 %]
- [% END %]
- </ul>
- </section>
-
- </div>
- [% END %]
diff --git a/templates/web/fixmystreet/header.html b/templates/web/fixmystreet/header.html
index 4fde56e94..bc9e16af8 100644
--- a/templates/web/fixmystreet/header.html
+++ b/templates/web/fixmystreet/header.html
@@ -1,9 +1,14 @@
+[%
+ SET html_att = ' lang="' _ lang_code _ '"';
+ # For a right-to-left language, use the following line in your own header:
+ # SET html_att = html_att _ ' dir="rtl"';
+-%]
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8"[% html_att %]><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8"[% html_att %]><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8"[% html_att %]><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9"[% html_att %]><![endif]-->
+<!--[if gt IE 9]><!--><html class="no-js"[% html_att %]><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/fixmystreet/header_logo.html b/templates/web/fixmystreet/header_logo.html
index 3ae706730..66378235a 100644
--- a/templates/web/fixmystreet/header_logo.html
+++ b/templates/web/fixmystreet/header_logo.html
@@ -1,2 +1,2 @@
- <a href="/" id="site-logo">[%- PROCESS 'site-name.html' -%]</a>
- <a href="/" id="report-cta" title="[%- loc('Report a problem') -%]">[%- loc('Report') -%]</a>
+ <a href="[% c.cobrand.base_url IF admin %]/" id="site-logo">[% site_name %]</a>
+ <a href="[% c.cobrand.base_url IF admin %]/" id="report-cta" title="[%- loc('Report a problem') -%]">[%- loc('Report') -%]</a>
diff --git a/templates/web/fixmystreet/header_opengraph.html b/templates/web/fixmystreet/header_opengraph.html
deleted file mode 100644
index d0cd31261..000000000
--- a/templates/web/fixmystreet/header_opengraph.html
+++ /dev/null
@@ -1,9 +0,0 @@
- <meta property="og:url" content="[% c.cobrand.base_url %][% c.req.uri.path %]">
- <meta property="og:title" content="[% title || 'FixMyStreet' %]">
- <meta property="og:site_name" content="[%- PROCESS 'site-name.html' -%]">
- [% IF c.req.uri.path == '/' %]<meta property="og:description" content="Report, view, and discuss local street-related problems.">[% END %]
- <meta property="og:type" content="website">
- <meta property="og:image" content="[% c.cobrand.base_url %]/cobrands/fixmystreet/fms-og_image.png">
- <meta property="og:image:type" content="image/png">
- <meta property="og:image:width" content="500">
- <meta property="og:image:height" content="500">
diff --git a/templates/web/fixmystreet/index.html b/templates/web/fixmystreet/index.html
deleted file mode 100644
index 0441b3efb..000000000
--- a/templates/web/fixmystreet/index.html
+++ /dev/null
@@ -1,20 +0,0 @@
-[% map_js = PROCESS 'front/javascript.html' %]
-
-[% pre_container_extra = PROCESS 'around/postcode_form.html' %]
-[% INCLUDE 'header.html', title = '', bodyclass = 'frontpage fullwidthpage' %]
-
-[% IF error %]
- <p class="form-error">[% error %]</p>
-[% END %]
-
-[% TRY %][% PROCESS 'front/pre-steps.html' %][% CATCH file %][% END %]
-
-<div class="tablewrapper">
- <div id="front-howto">
- [% INCLUDE 'index-steps.html' %]
- </div>
-
- [% INCLUDE 'front/recent.html' %]
-</div>
-
-[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/fixmystreet/my/_problem-list.html b/templates/web/fixmystreet/my/_problem-list.html
deleted file mode 100644
index 1a891de80..000000000
--- a/templates/web/fixmystreet/my/_problem-list.html
+++ /dev/null
@@ -1,27 +0,0 @@
-[% FOREACH p = problems.confirmed %]
- [% IF loop.first %]<h2>[% loc('Open reports') %]</h2>[% END %]
- [% INCLUDE problem %]
-[% END %]
-
-[% FOREACH p = problems.fixed %]
- [% IF loop.first %]<h2>[% loc('Fixed reports') %]</h2>[% END %]
- [% INCLUDE problem %]
-[% END %]
-
-[% FOREACH p = problems.closed %]
- [% IF loop.first %]<h2>[% loc('Closed reports') %]</h2>[% END %]
- [% INCLUDE problem %]
-[% END %]
-
-[%# FOREACH p = problems.unconfirmed;
- IF loop.first;
- '<h2>' _ loc('Unconfirmed reports') _ '</h2>';
- END;
- INCLUDE problem;
-END %]
-
-[% BLOCK problem %]
- [% "<ul class='issue-list-a full-width'>" IF loop.first %]
- [% INCLUDE 'report/_item.html', problem = p, no_fixed =1 %]
- [% "</ul>" IF loop.last %]
-[% END %]
diff --git a/templates/web/fixmystreet/my/my.html b/templates/web/fixmystreet/my/my.html
deleted file mode 100644
index 16779e503..000000000
--- a/templates/web/fixmystreet/my/my.html
+++ /dev/null
@@ -1,60 +0,0 @@
-[%
- SET bodyclass = 'mappage';
- PROCESS "maps/${map.type}.html" IF problems.size;
- INCLUDE 'header.html', title = loc('Your Reports');
-%]
-
-[% IF problems.size %]
- [% map_html %]
- </div>
- <div id="side">
-[% ELSE %]
- <div id="skipped-map">
-[% END %]
-
-<h1>[% loc('Your Reports') %]</h1>
-
-<p><a href="/auth/change_password">[% loc('Change password') %]</a></p>
-
-[% IF ! has_content %]
-[% tprintf( loc('You haven&rsquo;t created any reports yet. <a href="%s">Report a problem now.</a>'),
- c.uri_for('/') ) %]
-[% END %]
-
-[% IF c.cobrand.moniker == 'fixmybarangay' %]
- [% INCLUDE '_barangay_buttons.html' %]
-[% ELSIF c.cobrand.moniker == 'hart' %]
- [% INCLUDE '_hart_hants_note.html' %]
-[% END %]
-
-[% INCLUDE "reports/_list-filters.html", use_section_wrapper = 1 %]
-
-[% INCLUDE 'pagination.html',
- pager = problems_pager,
- param = 'p'
-%]
-
-[% INCLUDE 'my/_problem-list.html' %]
-
-[% FOREACH u IN updates %]
- [% IF loop.first %]
- <h2>[% loc('Your updates') %]</h2>
- [% INCLUDE 'pagination.html',
- pager = updates_pager,
- param = 'u'
- %]
- <ul class="issue-list full-width">
- [% END %]
-
- <li>&ldquo;[% u.text | html %]&rdquo;
- &ndash; <a href="[% c.uri_for( '/report', u.problem_id ) %]#update_[% u.id %]">[% u.problem.title | html %]</a>.
- <p><small class="council_sent_info">
- [% tprintf( loc("Added %s"), prettify_dt( u.confirmed, 'date' ) ) %]
- </small></p>
- </li>
- [% "</ul>" IF loop.last %]
-[% END %]
-
-</div>
-
-[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmystreet/questionnaire/index.html b/templates/web/fixmystreet/questionnaire/index.html
deleted file mode 100644
index 69381dc03..000000000
--- a/templates/web/fixmystreet/questionnaire/index.html
+++ /dev/null
@@ -1,110 +0,0 @@
-[%
- SET bodyclass = 'mappage';
- PROCESS "report/photo-js.html";
- PROCESS "maps/${map.type}.html";
- INCLUDE 'header.html', title = loc('Questionnaire');
-%]
-
-[% map_html %]
-
-</div>
-<div id="side">
-
- <menu id="problems-nav" class="tab-nav">
- <ul>
- <li><a id="questionnaire_tab" href="#questionnaire">[% loc('Questionnaire') %]</a></li>
- <li><a id="report_tab" href="#report">[% loc( 'Your report' ) %]</a></li>
- </ul>
- </menu>
-
- <div id="questionnaire" class="issue-list-a tab">
- [% INCLUDE questionnaire_form %]
- </div>
-
- <div id="report" class="issue-list-a tab">
- [% INCLUDE 'report/_main.html' %]
- [% INCLUDE 'report/updates.html' %]
- </div>
-</div>
-
-[% INCLUDE 'footer.html' %]
-
-[% BLOCK questionnaire_form %]
-<h1>[% loc('Questionnaire') %]</h1>
-
-<form method="post" action="/questionnaire/submit" id="questionnaire"
-[%- IF c.cobrand.allow_photo_upload -%]
- enctype="multipart/form-data"
-[%- END -%]
->
-
-<input type="hidden" name="token" value="[% token | html %]">
-
-<p>
-[% loc('The details of your problem are available from the other tab above.') %]
-[% loc('Please <a class="tab_link" href="#report">take a look</a> at the updates that have been left.') IF updates %]
-</p>
-
-[% IF errors %]
-<ul class="error">
-<li>[% errors.join("</li>\n<li>") %]</li>
-</ul>
-[% END %]
-
-<p>
-[% loc('An update marked this problem as fixed.') IF problem.is_fixed %]
-[% loc('Has this problem been fixed?') %]
-</p>
-
-<p>
-<input type="radio" name="been_fixed" id="been_fixed_yes" value="Yes"[% ' checked' IF been_fixed == 'Yes' %]>
-<label class="inline" for="been_fixed_yes">[% loc('Yes') %]</label>
-<input type="radio" name="been_fixed" id="been_fixed_no" value="No"[% ' checked' IF been_fixed == 'No' %]>
-<label class="inline" for="been_fixed_no">[% loc('No') %]</label>
-<input type="radio" name="been_fixed" id="been_fixed_unknown" value="Unknown"[% ' checked' IF been_fixed == 'Unknown' %]>
-<label class="inline" for="been_fixed_unknown">[% loc('Don&rsquo;t know') %]</label>
-</p>
-
-[% UNLESS answered_ever_reported %]
-<p>[% loc('Have you ever reported a problem to a council before, or is this your first time?') %]</p>
-<p>
-<input type="radio" name="reported" id="reported_yes" value="Yes"[% ' checked' IF reported == 'Yes' %]>
-<label class="inline" for="reported_yes">[% loc('Reported before') %]</label>
-<input type="radio" name="reported" id="reported_no" value="No"[% ' checked' IF reported == 'No' %]>
-<label class="inline" for="reported_no">[% loc('First time') %]</label>
-</p>
-[% END %]
-
-<p>[% loc('If you wish to leave a public update on the problem, please enter it here
-(please note it will not be sent to the council). For example, what was
-your experience of getting the problem fixed?') %]</p>
-
-<p><textarea name="update" style="max-width:90%" rows="7" cols="30">[% update | html %]</textarea></p>
-
-[% IF c.cobrand.allow_photo_upload %]
-<div id="fileupload_normalUI">
- [% IF upload_fileid %]
- <img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
- <p>[% loc('You have already attached a photo to this report, attaching another one will replace it.') %]</p>
- <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
- [% END %]
- <label for="form_photo">[% loc('Photo:') %]</label>
- <input type="file" name="photo" id="form_photo">
-</div>
-[% END %]
-
-<div id="another_qn">
- <p>[% loc('Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?') %]</p>
- <p>
- <input type="radio" name="another" id="another_yes" value="Yes"[% ' checked' IF another == 'Yes' %]>
- <label class="inline" for="another_yes">[% loc('Yes') %]</label>
- <input type="radio" name="another" id="another_no" value="No"[% ' checked' IF another == 'No' %]>
- <label class="inline" for="another_no">[% loc('No') %]</label>
- </p>
-</div>
-
-<p><input type="submit" name="submit" value="[% loc('Submit questionnaire') %]"></p>
-
-</form>
-[% END %]
-
diff --git a/templates/web/fixmystreet/report/display.html b/templates/web/fixmystreet/report/display.html
index 0006241c3..5f499dd6e 100644
--- a/templates/web/fixmystreet/report/display.html
+++ b/templates/web/fixmystreet/report/display.html
@@ -6,7 +6,7 @@
problem_title = problem.title_safe _ ' - ' _ loc('Viewing a problem');
INCLUDE 'header.html'
title = problem_title
- rss = [ loc('Updates to this problem, FixMyStreet'), "/rss/$problem.id" ]
+ rss = [ tprintf(loc('Updates to this problem, %s', "%s is the site name"), site_name), "/rss/$problem.id" ]
robots = 'index, nofollow';
%]
diff --git a/templates/web/fixmystreet/report/new/form_user_loggedout.html b/templates/web/fixmystreet/report/new/form_user_loggedout.html
index 31cccd44e..c5a58e8a9 100644
--- a/templates/web/fixmystreet/report/new/form_user_loggedout.html
+++ b/templates/web/fixmystreet/report/new/form_user_loggedout.html
@@ -8,7 +8,7 @@
<div id="form_sign_in">
<h3>[% loc("Now to submit your report&hellip;") %]</h3>
- <h2>[% loc("Do you have a FixMyStreet password?") %]</h2>
+ <h2>[% tprintf(loc("Do you have a %s password?", "%s is the site name"), site_name) %]</h2>
<div id="form_sign_in_yes" class="form-box">
diff --git a/templates/web/fixmystreet/report/update-form.html b/templates/web/fixmystreet/report/update-form.html
index f5dca4669..a69b793b7 100644
--- a/templates/web/fixmystreet/report/update-form.html
+++ b/templates/web/fixmystreet/report/update-form.html
@@ -83,7 +83,7 @@
<div id="form_sign_in">
<h3>[% loc("Now to submit your update&hellip;") %]</h3>
- <h2>[% loc("Do you have a FixMyStreet password?") %]</h2>
+ <h2>[% tprintf(loc("Do you have a %s password?", "%s is the site name"), site_name) %]</h2>
<div id="form_sign_in_yes" class="form-box">
<h5>[% loc('<strong>Yes</strong> I have a password') %]</h5>
diff --git a/templates/web/fixmystreet/report/update.html b/templates/web/fixmystreet/report/update.html
index 847277dfd..66e698606 100644
--- a/templates/web/fixmystreet/report/update.html
+++ b/templates/web/fixmystreet/report/update.html
@@ -3,9 +3,9 @@
[% IF loop.first %]
<section class="full-width">
<h4 class="static-with-rule">[% loc('Updates') %]</h4>
- <ul class="issue-list">
+ <ul class="item-list item-list--updates">
[% END %]
- <li class="issue">
+ <li class="item-list__item item-list__item--updates">
[% IF moderating; original_update = update.moderation_original_data %]
<form method="post" action="/moderate/report/[% problem.id %]/update/[% update.id %]">
<input type="button" class="btn moderate moderate-display" value="moderate">
@@ -22,14 +22,14 @@
[% END %]
</div>
[% END %]
- <div class="update-wrap">
+ <div class="item-list__update-wrap">
[% IF update.whenanswered %]
- <div class="update-text">
+ <div class="item-list__update-text">
<p class="meta-2"> [% INCLUDE meta_line %] </p>
</div>
[% ELSE %]
[% INCLUDE 'report/photo.html' object=update %]
- <div class="update-text">
+ <div class="item-list__update-text">
<div class="moderate-display">
[% add_links( update.text ) | html_para %]
</div>
diff --git a/templates/web/fixmystreet/reports/_list-entry.html b/templates/web/fixmystreet/reports/_list-entry.html
deleted file mode 100755
index 8509df376..000000000
--- a/templates/web/fixmystreet/reports/_list-entry.html
+++ /dev/null
@@ -1 +0,0 @@
-[% INCLUDE 'report/_item.html', include_lastupdate = 1 %]
diff --git a/templates/web/fixmystreet/reports/_ward-list.html b/templates/web/fixmystreet/reports/_ward-list.html
index 5e82a93cc..b7e19ffc2 100755
--- a/templates/web/fixmystreet/reports/_ward-list.html
+++ b/templates/web/fixmystreet/reports/_ward-list.html
@@ -2,10 +2,12 @@
<section id="council_wards" class="hidden-js">
<h2>[% ward_text %]</h2>
<p>[% loc('Follow a ward link to view only reports within that ward.') %]</p>
- <ul class="issue-list-a full-width">
- [% FOR child IN children.values.sort('name') %]
- <li><a href="[% child.url %]"><span class="text">[% child.name %]</span></a></li>
- [% END %]
+ <ul class="item-list item-list--wards full-width">
+ [% FOR child IN children.values.sort('name') %]
+ <li class="item-list__item item-list--wards__item">
+ <a href="[% child.url %]">[% child.name %]</a>
+ </li>
+ [% END %]
</ul>
</section>
[% END %]
diff --git a/templates/web/greenwich/around/around_map_list_items.html b/templates/web/greenwich/around/around_map_list_items.html
deleted file mode 100644
index e69de29bb..000000000
--- a/templates/web/greenwich/around/around_map_list_items.html
+++ /dev/null
diff --git a/templates/web/greenwich/around/on_map_list_items.html b/templates/web/greenwich/around/on_map_list_items.html
deleted file mode 100644
index 893f5c698..000000000
--- a/templates/web/greenwich/around/on_map_list_items.html
+++ /dev/null
@@ -1,11 +0,0 @@
-[% all_reports = on_map.merge(around_map) %]
-[% IF all_reports.size %]
- [% FOREACH problem IN all_reports %]
- [% UNLESS problem.title; problem = problem.problem; END %]
- [% INCLUDE "reports/_list-entry.html" %]
- [% END %]
-[% ELSE %]
- <li class="empty">
- <p>[% loc('There are no reports to show.') %]</p>
- </li>
-[% END %]
diff --git a/templates/web/greenwich/around/tabbed_lists.html b/templates/web/greenwich/around/tabbed_lists.html
deleted file mode 100644
index 0d7dfddfc..000000000
--- a/templates/web/greenwich/around/tabbed_lists.html
+++ /dev/null
@@ -1,5 +0,0 @@
-[% INCLUDE "reports/_list-filters.html" %]
-
-<ul class="report-list" id="current">
- [% INCLUDE "around/on_map_list_items.html" %]
-</ul>
diff --git a/templates/web/greenwich/footer.html b/templates/web/greenwich/footer.html
index 31ab35f52..fe905acb1 100644
--- a/templates/web/greenwich/footer.html
+++ b/templates/web/greenwich/footer.html
@@ -13,11 +13,7 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
- <li><a id="mysoc-logo" href="https://www.mysociety.org/">mySociety</a></li>
- </ul>
-
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
@@ -28,14 +24,13 @@
%]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
%]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>[%
- %]<li id="top-nav-privacy"><[% IF c.req.uri.path == '/privacy' %]span[% ELSE %]a href="/privacy"[% END
+ %]<li class="nav-menu__item--privacy"><[% IF c.req.uri.path == '/privacy' %]span[% ELSE %]a href="/privacy"[% END
%]>[% loc("Privacy") %]</[% c.req.uri.path == '/privacy' ? 'span' : 'a' %]></li>
</ul>
</div>
</div>
</div>
-<!-- [% INCLUDE 'debug_footer.html' %] -->
</div> <!-- .wrapper -->
[% TRY %][% PROCESS 'footer_extra.html' %][% CATCH file %][% END %]
diff --git a/templates/web/greenwich/front/_list-entry.html b/templates/web/greenwich/front/_list-entry.html
new file mode 100755
index 000000000..046c3b97f
--- /dev/null
+++ b/templates/web/greenwich/front/_list-entry.html
@@ -0,0 +1 @@
+[% INCLUDE 'report/_item.html' no_fixed = 1 item_extra_class = 'item-list__item--with-pin' %]
diff --git a/templates/web/greenwich/header_logo.html b/templates/web/greenwich/header_logo.html
index fa279bdc4..d788de6f8 100644
--- a/templates/web/greenwich/header_logo.html
+++ b/templates/web/greenwich/header_logo.html
@@ -1,4 +1,4 @@
- <a href="http://www.royalgreenwich.gov.uk/" id="site-logo">[%- PROCESS 'site-name.html' -%]</a>
+ <a href="http://www.royalgreenwich.gov.uk/" id="site-logo">[% site_name %]</a>
</div>
<div class="container main-menu-container">
<ul id="greenwich-menu-desktop">
diff --git a/templates/web/greenwich/reports/_list-entry.html b/templates/web/greenwich/reports/_list-entry.html
index cd70410d3..b24ef2260 100644
--- a/templates/web/greenwich/reports/_list-entry.html
+++ b/templates/web/greenwich/reports/_list-entry.html
@@ -1,6 +1 @@
-<li class="[% c.cobrand.pin_colour(problem) %]">
- <a href="[% c.uri_for('/report', problem.id ) %]" class="[% problem.category %]">
- <h3>[% problem.title | html %]</h3>
- <p>Reported [%- prettify_dt( problem.confirmed, 1 ) %]</p>
- </a>
-</li>
+[% INCLUDE 'report/_item-with-pin.html' %]
diff --git a/templates/web/greenwich/reports/_list-filters.html b/templates/web/greenwich/reports/_list-filters.html
deleted file mode 100644
index 5d610261b..000000000
--- a/templates/web/greenwich/reports/_list-filters.html
+++ /dev/null
@@ -1,32 +0,0 @@
-[% IF use_section_wrapper %]
-<section class="full-width">
- <form method="get" action="">
-[% END %]
-
- <p class="report-list-filters">
- <label>
- Show
- <select name="status" id="statuses">
- <option value="all"[% ' selected' IF filter_status == 'all' %]>all reports</option>
- <option value="open"[% ' selected' IF filter_status == 'open' %]>unfixed reports</option>
- <option value="fixed"[% ' selected' IF filter_status == 'fixed' %]>fixed reports</option>
- </select>
- </label>
- <label>
- about
- <select name="filter_category" id="filter_categories">
- <option value="">Everything</option>
- [% FOR category IN filter_categories %]
- <option value="[% category | html %]"[% ' selected' IF filter_category == category %]>
- [% category | html %]
- </option>
- [% END %]
- </select>
- </label>
- <input type=submit value="Go" />
- </p>
-
-[% IF use_section_wrapper %]
- </form>
-</section>
-[% END %]
diff --git a/templates/web/greenwich/reports/_problem-list.html b/templates/web/greenwich/reports/_problem-list.html
deleted file mode 100644
index 45746e309..000000000
--- a/templates/web/greenwich/reports/_problem-list.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<section class="full-width">
- [% INCLUDE column
- problems = problems.${body.id}
- %]
-</section>
-
-[% BLOCK column %]
- <ul class="issue-list-a">
- [% IF problems %]
- [% FOREACH problem IN problems %]
- [% INCLUDE 'reports/_list-entry.html' %]
- [% END %]
- [% ELSE %]
- <li class="empty">
- <p>[% loc('There are no reports to show.') %]</p>
- </li>
- [% END %]
- </ul>
-[% END %]
diff --git a/templates/web/harrogate/footer.html b/templates/web/harrogate/footer.html
index 4558b2381..f262f6156 100644
--- a/templates/web/harrogate/footer.html
+++ b/templates/web/harrogate/footer.html
@@ -14,34 +14,33 @@
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
[% selected = c.req.uri.path == '/' %]
- <li [% selected ? 'class="menu-item-selected"' : '' %]>
- <[% IF selected %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn">
+ <li><[% IF selected %]span[% ELSE %]a href="/"[% END %]>
[% loc("Report a problem") %]</[% selected == '/' ? 'span' : 'a' %]></li>
[% selected = c.req.uri.path == '/my' %]
- <li [% selected ? 'class="menu-item-selected"' : '' %]>
+ <li>
<[% IF selected %]span[% ELSE %]a href="/my"[% END %]>
[% loc("Your reports") %]</[% selected ? 'span' : 'a' %]></li>
[% selected = c.req.uri.path == '/reports/Harrogate' %]
- <li [% selected ? 'class="menu-item-selected"' : '' %]>
+ <li>
<[% IF selected %]span[% ELSE %]a href="/reports"[% END %]>
[% loc("All reports") %]</[% selected ? 'span' : 'a' %]></li>
[% selected = c.req.uri.path == '/alert' %]
- <li [% selected ? 'class="menu-item-selected"' : '' %]>
+ <li>
<[% IF selected %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END %]>
[% loc("Local alerts") %]</[% selected ? 'span' : 'a' %]></li>
[% selected = c.req.uri.path == '/faq' %]
- <li [% selected ? 'class="menu-item-selected"' : '' %]>
+ <li>
<[% IF selected %]span[% ELSE %]a href="/faq"[% END %]>
[% loc("Help") %]</[% selected ? 'span' : 'a' %]></li>
[% selected = c.req.uri.path == '/privacy' %]
- <li id="top-nav-privacy" [% selected ? 'class="menu-item-selected"' : '' %]>
+ <li class="nav-menu__item--privacy">
<[% IF selected %]span[% ELSE %]a href="/privacy"[% END %]>
[% loc("Privacy") %]</[% selected ? 'span' : 'a' %]></li>
</ul>
diff --git a/templates/web/harrogate/header.html b/templates/web/harrogate/header.html
index e40a38d94..bd319e250 100644
--- a/templates/web/harrogate/header.html
+++ b/templates/web/harrogate/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/harrogate/static/privacy.html b/templates/web/harrogate/static/privacy.html
index 7f0f090e4..767f80fbf 100755
--- a/templates/web/harrogate/static/privacy.html
+++ b/templates/web/harrogate/static/privacy.html
@@ -7,7 +7,7 @@
<ul class="plain-list">
<li><a href="/faq">Frequently Asked Questions</a></li>
<li><strong>Privacy and cookies</strong></li>
- <li><a href="/contact">Contact [%- PROCESS 'site-name.html' -%]</a></li>
+ <li><a href="/contact">Contact [% site_name %]</a></li>
</ul>
</aside>
</div>
diff --git a/templates/web/hart/footer.html b/templates/web/hart/footer.html
index 14adf983d..312f63ff4 100644
--- a/templates/web/hart/footer.html
+++ b/templates/web/hart/footer.html
@@ -23,7 +23,7 @@
</div>
<div class="nav-wrapper-2 clearfix">
<div id="main-nav" class="clearfix" role="navigation">
- <ul>
+ <ul class="nav-menu">
<li>
<a href="http://www.hart.gov.uk/home">Home</a>
</li>
diff --git a/templates/web/hart/header.html b/templates/web/hart/header.html
index c2d363010..b7b4fefcc 100644
--- a/templates/web/hart/header.html
+++ b/templates/web/hart/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/oxfordshire/around/around_map_list_items.html b/templates/web/oxfordshire/around/around_map_list_items.html
deleted file mode 100644
index e69de29bb..000000000
--- a/templates/web/oxfordshire/around/around_map_list_items.html
+++ /dev/null
diff --git a/templates/web/oxfordshire/around/on_map_list_items.html b/templates/web/oxfordshire/around/on_map_list_items.html
deleted file mode 100644
index 893f5c698..000000000
--- a/templates/web/oxfordshire/around/on_map_list_items.html
+++ /dev/null
@@ -1,11 +0,0 @@
-[% all_reports = on_map.merge(around_map) %]
-[% IF all_reports.size %]
- [% FOREACH problem IN all_reports %]
- [% UNLESS problem.title; problem = problem.problem; END %]
- [% INCLUDE "reports/_list-entry.html" %]
- [% END %]
-[% ELSE %]
- <li class="empty">
- <p>[% loc('There are no reports to show.') %]</p>
- </li>
-[% END %]
diff --git a/templates/web/oxfordshire/around/tabbed_lists.html b/templates/web/oxfordshire/around/tabbed_lists.html
deleted file mode 100644
index 0d7dfddfc..000000000
--- a/templates/web/oxfordshire/around/tabbed_lists.html
+++ /dev/null
@@ -1,5 +0,0 @@
-[% INCLUDE "reports/_list-filters.html" %]
-
-<ul class="report-list" id="current">
- [% INCLUDE "around/on_map_list_items.html" %]
-</ul>
diff --git a/templates/web/oxfordshire/footer.html b/templates/web/oxfordshire/footer.html
index ed84c0ad6..3153125fd 100644
--- a/templates/web/oxfordshire/footer.html
+++ b/templates/web/oxfordshire/footer.html
@@ -10,11 +10,11 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a id="mysoc-logo" href="https://www.fixmystreet.com/council">Powered by <img src="/cobrands/oxfordshire/images/fms-logo-105x20.png" alt="FixMyStreet"></a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/oxfordshire/front/_list-entry.html b/templates/web/oxfordshire/front/_list-entry.html
new file mode 100755
index 000000000..046c3b97f
--- /dev/null
+++ b/templates/web/oxfordshire/front/_list-entry.html
@@ -0,0 +1 @@
+[% INCLUDE 'report/_item.html' no_fixed = 1 item_extra_class = 'item-list__item--with-pin' %]
diff --git a/templates/web/oxfordshire/header.html b/templates/web/oxfordshire/header.html
index bc52a0720..b4244a51b 100644
--- a/templates/web/oxfordshire/header.html
+++ b/templates/web/oxfordshire/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/oxfordshire/my/_problem-list.html b/templates/web/oxfordshire/my/_problem-list.html
deleted file mode 100644
index 1ff69f9fb..000000000
--- a/templates/web/oxfordshire/my/_problem-list.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<ul class='issue-list-a full-width'>
- [% IF problems.all %]
- [% FOREACH p = problems.all %]
- [% INCLUDE 'reports/_list-entry.html', problem = p, no_fixed =1 %]
- [% END %]
- [% ELSE %]
- <li class="empty">
- <p>[% loc('There are no reports to show.') %]</p>
- </li>
- [% END %]
-</ul>
-
-[% IF ! problems.size %]
-<!-- Preserve behaviour of map filters despite map not being shown -->
-<script type="text/javascript">
- (function($) {
- $(function() {
- $(".report-list-filters [type=submit]").hide();
- $(".report-list-filters select").change(function() {
- $(this).closest("form").submit();
- });
- })
- })(window.jQuery);
-</script>
-[% END %]
diff --git a/templates/web/oxfordshire/reports/_list-entry.html b/templates/web/oxfordshire/reports/_list-entry.html
index cd70410d3..b24ef2260 100644
--- a/templates/web/oxfordshire/reports/_list-entry.html
+++ b/templates/web/oxfordshire/reports/_list-entry.html
@@ -1,6 +1 @@
-<li class="[% c.cobrand.pin_colour(problem) %]">
- <a href="[% c.uri_for('/report', problem.id ) %]" class="[% problem.category %]">
- <h3>[% problem.title | html %]</h3>
- <p>Reported [%- prettify_dt( problem.confirmed, 1 ) %]</p>
- </a>
-</li>
+[% INCLUDE 'report/_item-with-pin.html' %]
diff --git a/templates/web/oxfordshire/reports/_list-filters.html b/templates/web/oxfordshire/reports/_list-filters.html
deleted file mode 100644
index 5d610261b..000000000
--- a/templates/web/oxfordshire/reports/_list-filters.html
+++ /dev/null
@@ -1,32 +0,0 @@
-[% IF use_section_wrapper %]
-<section class="full-width">
- <form method="get" action="">
-[% END %]
-
- <p class="report-list-filters">
- <label>
- Show
- <select name="status" id="statuses">
- <option value="all"[% ' selected' IF filter_status == 'all' %]>all reports</option>
- <option value="open"[% ' selected' IF filter_status == 'open' %]>unfixed reports</option>
- <option value="fixed"[% ' selected' IF filter_status == 'fixed' %]>fixed reports</option>
- </select>
- </label>
- <label>
- about
- <select name="filter_category" id="filter_categories">
- <option value="">Everything</option>
- [% FOR category IN filter_categories %]
- <option value="[% category | html %]"[% ' selected' IF filter_category == category %]>
- [% category | html %]
- </option>
- [% END %]
- </select>
- </label>
- <input type=submit value="Go" />
- </p>
-
-[% IF use_section_wrapper %]
- </form>
-</section>
-[% END %]
diff --git a/templates/web/seesomething/around/around_index.html b/templates/web/seesomething/around/index.html
index a143e90a2..a143e90a2 100644
--- a/templates/web/seesomething/around/around_index.html
+++ b/templates/web/seesomething/around/index.html
diff --git a/templates/web/seesomething/footer.html b/templates/web/seesomething/footer.html
index 95297f33d..c29f222d2 100644
--- a/templates/web/seesomething/footer.html
+++ b/templates/web/seesomething/footer.html
@@ -6,7 +6,7 @@
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
diff --git a/templates/web/stevenage/faq/faq-en-gb.html b/templates/web/stevenage/faq/faq-en-gb.html
new file mode 100644
index 000000000..43284a463
--- /dev/null
+++ b/templates/web/stevenage/faq/faq-en-gb.html
@@ -0,0 +1,125 @@
+[% INCLUDE 'header.html', title = 'Help', bodyclass = 'twothirdswidthpage' %]
+
+<div class="sticky-sidebar">
+ <aside>
+ <ul class="plain-list">
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ <li><a href="/privacy">Privacy and cookies</a></li>
+ <li><a href="/contact">Contact FixMyStreet</a></li>
+ </ul>
+ </aside>
+</div>
+
+<h1> Frequently Asked Questions </h1>
+
+<p>These pages are for reporting things which are broken, dirty, damaged or
+dumped, and need fixing, cleaning or clearing: </p>
+<ul>
+ <li>graffiti
+ <li>flytipping
+ <li>broken playground equipment
+ <li>street lighting
+ <li>potholes
+</ul>
+<dl>
+ <dt><a name="emergencies"></a>Reporting emergencies (Out of Hours)</dt>
+ <dd>
+ <p> Please do not report problems which present an immediate risk to life,
+ for example missing manhole covers or a fallen lamp column. </p>
+ <p> Issues reported via the website are only actioned during office hours.
+ If you require an Out of Hours service please ring (01438) 314963. </p>
+ </dd>
+
+ <dt>How do I report a problem here?</dt>
+ <dd>After entering a postcode or location, you are shown
+a map of that area. You can view problems already reported in that area,
+or report ones of your own by clicking on the map at the location of
+the problem.</dd>
+ <dt>How are the problems solved?</dt>
+ <dd>They are reported directly to us so we can then resolve the problem.
+ You can also discuss the problem on the website with others if you wish.</dd>
+
+ <dt>Do you remove silly or illegal content?</dt>
+ <dd>Stevenage Borough Council and FixMyStreet are not responsible for the content and accuracy
+of material submitted by its users. We reserve the right to edit or remove any
+problems or updates which we consider to be inappropriate upon being informed
+by a user of the site.</dd>
+
+ <dt>Can I use FixMyStreet on my mobile?</dt>
+ <dd>
+ <p>The FixMyStreet website will already work on your mobile phone, adapting to
+ the size of your screen automatically. Using an app has some advantages, though
+ &mdash; for example, you can create a report even when you have no network
+ connection.
+ <ul>
+ <li>
+ <a href="https://itunes.apple.com/gb/app/fixmystreet/id297456545">FixMyStreet app for iPhone</a>
+ <li>
+ <a href="https://play.google.com/store/apps/details?id=org.mysociety.FixMyStreet">FixMyStreet app for Android</a>
+ <li><em>Nokia:</em> A volunteer, Thomas Forth, has written an app available from the
+ <a href="http://store.ovi.com/content/107557">Ovi Store</a>.
+ </ul>
+ </dd>
+
+ <dt>Can I use these pages to report problems outside of Stevenage?</dd>
+ <dd>Yes, if you enter a postcode or address outside the borough you will be re-directed to the main FixMyStreet site that will enable you to report problems elsewhere. FixMyStreet will forward these on to the relevant council.</dd>
+
+ <dt>The site is powered by FixMyStreet, who are they?</dt>
+ <dd>FixMyStreet was built by <a href="http://www.mysociety.org/">mySociety</a>, in conjunction with the <a href="http://www.youngfoundation.org.uk/">Young Foundation</a>.
+mySociety is the project of a registered charity which has grown out of the community of
+volunteers who built sites like <a href="http://www.theyworkforyou.com/">TheyWorkForYou</a>.
+mySociety&rsquo;s primary mission is to build Internet projects which give people simple, tangible
+benefits in the civic and community aspects of their lives.
+The charity is called UK Citizens Online Democracy and is charity number 1076346. mySociety
+can be contacted by email at <a href="mailto:hello&#64;mysociety.org">hello&#64;mysociety.org</a>,
+or by post at mySociety, 483 Green Lanes, London, N13 4BS.</dd>
+
+ <dt>Why does the site use kilometres for measurements?</dt>
+ <dd>The British national
+ grid reference system, devised by Ordnance Survey (the British national
+ mapping agency) around the time of the second world war, uses eastings and
+ northings measured in metres and kilometres; the maps we use are from
+ Ordnance Survey and so this is what we use to display distances.
+ There you have it: not everything British is in miles!</dd>
+
+ <dt>Why can&rsquo;t I zoom out more on the reporting map?</dt>
+ <dd>We want to keep reports locally focused, so we restrict the ability to
+ move radically between areas. The map on <a href="/my">Your Reports</a> will let you see all
+ the reports you&rsquo;ve made, wherever they are.</dd>
+
+ <dt>I&rsquo;d like a site like this for my own location/ where&rsquo;s the "source code" to this site?</dt>
+ <dd>
+The mySociety software behind this site is open source, and available
+under the GNU Affero GPL software license. You can <a
+href="https://github.com/mysociety/fixmystreet">download the
+source code</a> and help mySociety develop it.
+You&rsquo;re welcome to use it in your own projects, although you must also
+make available the source code to any such projects.
+<a href="http://www.fiksgatami.no/">Fiksgatami</a> is an example of our code
+being used in a Norwegian version of this site.
+</dd>
+
+</dl>
+
+ <h2><a name="privacy"></a>Privacy Questions</h2>
+
+ <dl>
+ <dt>Who gets to see my email address?</dt>
+ <dd>
+<p>If you submit a problem, your details, and details of the problem, will be
+submitted to Stevenage Borough Council. Other than the council, only people we authorise to view the
+FixMyStreet administration interface will be able to see your email address and
+they will never use it for anything other than to help administer
+FixMyStreet.</p>
+<p>We will never give or sell your email address to anyone else, unless we are
+obliged to by law. Your name will not be published anywhere unless you let us.</p>
+</dd>
+
+ <dt>What emails will you send to me?</dt>
+ <dd>We will email you when we have received your report, and when it has
+ been investigated and actioned. We will only send you emails that
+ relate to an issue you have reported.</dd>
+
+ </dl>
+
+[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/stevenage/footer.html b/templates/web/stevenage/footer.html
index 454da2bd9..f9bf63fb6 100644
--- a/templates/web/stevenage/footer.html
+++ b/templates/web/stevenage/footer.html
@@ -34,7 +34,7 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/stevenage/header.html b/templates/web/stevenage/header.html
index 155b35b64..87fb0d90d 100644
--- a/templates/web/stevenage/header.html
+++ b/templates/web/stevenage/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
diff --git a/templates/web/trinidadtobago/footer.html b/templates/web/trinidadtobago/footer.html
index 4ef368c0d..bace22e71 100644
--- a/templates/web/trinidadtobago/footer.html
+++ b/templates/web/trinidadtobago/footer.html
@@ -10,13 +10,13 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="mysoc-menu">
+ <ul class="nav-menu nav-menu--mysoc">
<li><a id="mysoc-logo" href="http://www.mysociety.org/">mySociety</a></li>[%
%]<li><a href="http://mysociety.org/donate/">Donate</a></li>[%
%]<li><a href="http://www.mysociety.org/projects/">Our Sites</a></li>
</ul>
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
diff --git a/templates/web/trinidadtobago/header_logo.html b/templates/web/trinidadtobago/header_logo.html
index d5da7e6b2..afc37c252 100644
--- a/templates/web/trinidadtobago/header_logo.html
+++ b/templates/web/trinidadtobago/header_logo.html
@@ -1 +1 @@
- <a href="[% c.config.BASE_URL %]/" id="site-logo">[% PROCESS 'site-name.html' -%]</a>
+ <a href="[% c.config.BASE_URL %]/" id="site-logo">[% site_name %]</a>
diff --git a/templates/web/warwickshire/header.html b/templates/web/warwickshire/header.html
index 274a78ce7..35baeacd7 100644
--- a/templates/web/warwickshire/header.html
+++ b/templates/web/warwickshire/header.html
@@ -1,8 +1,8 @@
<!DOCTYPE html><!-- 3P header begins -->
-<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7 ie6 oldie" lang="[% lang_code %]"> <![endif]-->
-<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8 oldie" ie7 lang="[% lang_code %]"> <![endif]-->
-<!--[if IE 8]> <html class="no-js lt-ie9 ie8 oldie" lang="[% lang_code %]"> <![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]> <html class="no-js iel8 lt-ie9 lt-ie8 lt-ie7 ie6" lang="[% lang_code %]"> <![endif]-->
+<!--[if IE 7]> <html class="no-js iel8 lt-ie9 lt-ie8" ie7 lang="[% lang_code %]"> <![endif]-->
+<!--[if IE 8]> <html class="no-js iel8 lt-ie9 ie8" lang="[% lang_code %]"> <![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--> <html class="no-js" lang="[% lang_code %]"> <!--<![endif]-->
<head>
@@ -195,7 +195,7 @@
%]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
%]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>[%
- %]<li id="top-nav-privacy"><[% IF c.req.uri.path == '/privacy' %]span[% ELSE %]a href="/privacy"[% END
+ %]<li class="nav-menu__item--privacy"><[% IF c.req.uri.path == '/privacy' %]span[% ELSE %]a href="/privacy"[% END
%]>[% loc("Privacy") %]</[% c.req.uri.path == '/privacy' ? 'span' : 'a' %]></li>
</ul>
</div>
diff --git a/templates/web/zerotb/around/around_map_list_items.html b/templates/web/zerotb/around/around_map_list_items.html
deleted file mode 100644
index 225ddde6e..000000000
--- a/templates/web/zerotb/around/around_map_list_items.html
+++ /dev/null
@@ -1,9 +0,0 @@
-[% IF around_map.size %]
- [% FOREACH p IN around_map %]
- [% INCLUDE 'report/_item.html'
- problem = p.problem,
- dist = tprintf("%.1f", (p.distance || 0) ) %]
- [% END %]
-[% ELSE %]
- <li><p>[% loc('No clinics found.') %]</p></li>
-[% END %]
diff --git a/templates/web/zerotb/around/on_map_list_items.html b/templates/web/zerotb/around/on_map_list_items.html
index 838e2e9fa..5c7822b48 100644
--- a/templates/web/zerotb/around/on_map_list_items.html
+++ b/templates/web/zerotb/around/on_map_list_items.html
@@ -1,7 +1,14 @@
-[% IF on_map.size %]
- [% FOREACH problem IN on_map %]
+[% all_reports = on_map.merge(around_map) %]
+[% IF all_reports.size %]
+ [% FOREACH problem IN all_reports %]
+ [% UNLESS problem.title;
+ dist = tprintf("%.1f", (problem.distance || 0) );
+ problem = problem.problem;
+ END %]
[% INCLUDE 'report/_item.html' %]
[% END %]
[% ELSE %]
- <li><p>[% loc('No clinics found.') %]</p></li>
+ <li class="item-list__item item-list__item--empty">
+ <p>[% loc('No clinics found.') %]</p>
+ </li>
[% END %]
diff --git a/templates/web/zerotb/around/tabbed_lists.html b/templates/web/zerotb/around/tabbed_lists.html
index 8b8e8753e..090f03be0 100644
--- a/templates/web/zerotb/around/tabbed_lists.html
+++ b/templates/web/zerotb/around/tabbed_lists.html
@@ -1,14 +1,3 @@
-<menu id="problems-nav" class="tab-nav">
- <ul>
- <li><a href="#current">[% loc('Clinics on the map') %]</a></li>
- <li><a href="#current_near">[% loc( 'Clinics nearby' ) %]</a></li>
- </ul>
-</menu>
-
-<ul id="current" class="issue-list-a tab">
+<ul id="current" class="item-list item-list--reports tab">
[% INCLUDE "around/on_map_list_items.html" %]
</ul>
-
-<ul id="current_near" class="issue-list-a tab">
- [% INCLUDE "around/around_map_list_items.html" %]
-</ul>
diff --git a/templates/web/zerotb/footer.html b/templates/web/zerotb/footer.html
index c46a03878..cef009484 100644
--- a/templates/web/zerotb/footer.html
+++ b/templates/web/zerotb/footer.html
@@ -6,7 +6,7 @@
<div class="nav-wrapper">
<div class="nav-wrapper-2">
<div id="main-nav" role="navigation">
- <ul id="main-menu">
+ <ul class="nav-menu nav-menu--main">
<li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
>[% loc("Report a Stockout") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
diff --git a/templates/web/zerotb/report/_item.html b/templates/web/zerotb/report/_item.html
index 92fb8e8d8..e12c9e1fa 100644
--- a/templates/web/zerotb/report/_item.html
+++ b/templates/web/zerotb/report/_item.html
@@ -1,5 +1,5 @@
-<li>
-<a class="text" href="[% c.uri_for('/report', problem.id ) %]">
+<li class="item-list__item item-list--reports__item">
+<a href="[% c.uri_for('/report', problem.id ) %]">
<h4>[% problem.title | html %]</h4>
</a>
</li>
diff --git a/templates/web/zurich/admin/body-form.html b/templates/web/zurich/admin/body-form.html
index a31dffe7c..ac2887159 100644
--- a/templates/web/zurich/admin/body-form.html
+++ b/templates/web/zurich/admin/body-form.html
@@ -48,6 +48,7 @@
<p>
<input type="hidden" name="posted" value="body">
<input type="hidden" name="token" value="[% token %]">
+ <p>
<input type="submit" value="[% body ? loc('Update body') : loc('Add body') %]">
</p>
</form>
diff --git a/templates/web/zurich/admin/header.html b/templates/web/zurich/admin/header.html
index 281b1de23..929df8352 100644
--- a/templates/web/zurich/admin/header.html
+++ b/templates/web/zurich/admin/header.html
@@ -9,16 +9,20 @@
'planned' = loc('Planned'),
'fixed - council' = loc('Closed'),
'hidden' = loc('Hidden'),
- 'closed' = loc('Closed'),
+ 'closed' = loc('Extern'),
+ 'partial' = loc('Not contactable'),
+ 'investigating' = loc('Wish'),
+ 'unable to fix' = loc('Jurisdiction unknown'),
+ 'fixed - council' = loc('Closed'),
}
%]
<style type="text/css">
.adminhidden { color: #666666; }
- .admininternal { background-color: #eeeeff; }
.active { background-color: #ffffee; cursor: pointer; }
.error { color: red; }
.overdue { background-color: #ffcccc; }
select { width: auto; }
+ .admin-report-edit select { max-width: 100%; }
#fms_pan_zoom { top: 13em !important; }
</style>
<script>
diff --git a/templates/web/zurich/admin/list_updates.html b/templates/web/zurich/admin/list_updates.html
index 2b575f27e..bde28567b 100644
--- a/templates/web/zurich/admin/list_updates.html
+++ b/templates/web/zurich/admin/list_updates.html
@@ -1,45 +1,49 @@
[% IF updates.size %]
-<h2>[% loc('Internal notes') %]</h3>
-
-<table cellspacing="0" cellpadding="2" border="1">
- <tr>
- <th>[% loc('ID') %]</th>
- <th>[% loc('Created') %]</th>
- <th>[% loc('User') %]</th>
- <th>[% loc('Text') %]</th>
- </tr>
-[% FOREACH update IN updates -%]
- [% IF update.extra.is_internal_note %]
- <tr class="[% 'admininternal' IF update.extra.is_internal_note %]">
- <td>[% update.id %]</td>
- <td>[% PROCESS format_date this_date=update.created %] [% update.created.hms %]</td>
- <td><a href="mailto:[% update.user.email %]">[% update.user.name || update.user.email %]</a></td>
- <td>[% update.text | html %]</td>
- </tr>
- [% END %]
-[% END -%]
-</table>
-
-<h2>[% loc('Updates') %]</h2>
-
-<table cellspacing="0" cellpadding="2" border="1">
- <tr>
- <th>[% loc('ID') %]</th>
- <th>[% loc('Created') %]</th>
- <th>[% loc('User') %]</th>
- <th>[% loc('Text') %]</th>
- </tr>
-[% FOREACH update IN updates -%]
- [% IF ! update.extra.is_internal_note %]
- <tr class="[% 'adminhidden' IF update.state == 'hidden' || update.problem.state == 'hidden' %]">
- <td>[% update.id %]</td>
- <td>[% PROCESS format_date this_date=update.created %] [% update.created.hms %]</td>
- <td><a href="mailto:[% update.user.email %]">[% update.user.name || update.user.email %]</a></td>
- <td>[% update.text | html %]</td>
- </tr>
- [% END %]
-[% END -%]
-</table>
+[%# We assume internal notes are lowest priority, and thus displayed last.
+ All other updates (eg: "I've done this work, here's what you should tell
+ the citizen") are displayed first. %]
+
+[% internal_updates=[];
+ sdm_notes=[];
+ FOREACH update IN updates;
+ IF NOT update.extra.is_external_message;
+ IF update.extra.is_internal_note;
+ internal_updates.unshift(update);
+ ELSE;
+ sdm_notes.unshift(update);
+ END;
+ END;
+ END
+%]
+
+[% IF sdm_notes.size %]
+ <h2>[% loc('Notes from SDM to DM') %]</h2>
+
+ [% FOREACH update IN sdm_notes -%]
+ <div class="admin-note [% 'adminhidden' IF update.state == 'hidden' || update.problem.state == 'hidden' %]" title="[% loc('ID') %]: [% update.id %]">
+ <p class="admin-note__text">[% update.text | html %]</p>
+ <p class="admin-note__creator">
+ <a href="mailto:[% update.user.email %]">[% update.user.name || update.user.email %]</a>
+ &middot; [% PROCESS format_date this_date=update.created %] [% update.created.hms %]
+ </p>
+ </div>
+ [% END -%]
+[% END %]
+
+[% IF internal_updates.size %]
+ <h2>[% loc('Internal notes') %]</h2>
+
+ [% FOREACH update IN internal_updates -%]
+ <div class="admin-note admininternal" title="[% loc('ID') %]: [% update.id %]">
+ <p class="admin-note__text">[% update.text | html %]</p>
+ <p class="admin-note__creator">
+ <a href="mailto:[% update.user.email %]">[% update.user.name || update.user.email %]</a>
+ &middot; [% PROCESS format_date this_date=update.created %] [% update.created.hms %]
+ </p>
+ </div>
+ [% END -%]
+
+[% END %]
[% END %]
diff --git a/templates/web/zurich/admin/problem_row.html b/templates/web/zurich/admin/problem_row.html
index 9b395a1ac..baa8d3ac7 100644
--- a/templates/web/zurich/admin/problem_row.html
+++ b/templates/web/zurich/admin/problem_row.html
@@ -18,7 +18,9 @@
<td>[% PROCESS value_or_nbsp value=problem.category %]</td>
<td>[% PROCESS format_date this_date=problem.created %]</td>
<td>[% PROCESS format_date this_date=problem.lastupdate %]</td>
- <td>[% states.${problem.state} %]</td>
+ <td> [% states.${problem.state} %][% IF problem.state == 'planned';
+ SET cs=problem.get_extra_metadata('closure_status');
+ IF cs %] ([% states.$cs %]) [% END; END %]</td>
[% IF include_subdiv %]
<td>
@@ -34,7 +36,11 @@
<td>
[% IF problem.photo %]
- <img class="img" height="60" width="90" src="[% c.cobrand.base_url %]/photo/[% problem.photo %].temp.jpeg" alt="">
+ [% FOR photo IN problem.get_photoset(c).images %]
+ <div class="update-img">
+ <img height="60" width="90" alt="" src="[% c.cobrand.base_url %]/photo/[% photo.0 %].temp.jpeg">
+ </div>
+ [% END %]
[% END %]
</td>
diff --git a/templates/web/zurich/admin/report_edit-sdm.html b/templates/web/zurich/admin/report_edit-sdm.html
index 82bbeba23..8e576a718 100644
--- a/templates/web/zurich/admin/report_edit-sdm.html
+++ b/templates/web/zurich/admin/report_edit-sdm.html
@@ -1,4 +1,5 @@
[%
+ PROCESS "report/photo-js.html";
PROCESS "maps/zurich.html";
PROCESS 'admin/header.html'
title = tprintf(loc('Editing problem %d'), problem.id ),
@@ -9,63 +10,141 @@
[% map_html %]
</div>
-[% status_message %]
-
<form method="post" action="[% c.uri_for( 'report_edit', problem.id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
<input type="hidden" name="token" value="[% token %]" >
<input type="hidden" name="submit" value="1" >
-<p align="right"><input type="submit" name="send_back" value="[% loc('Not for my subdivision') %]"></p>
-
-<ul class="no-bullets">
-<li><a href="[% c.uri_for_email( '/report', problem.id ) %]">[% loc('View report on site' )%]</a></li>
-
-<li><a href="http://webgis.intra.stzh.ch/AV_Online/Direct.asp?Map=AV&Search=Koord&West=[% problem.local_coords.0 %]&Nord=[% problem.local_coords.1 %]&B=300" target="_blank">Standort in AV-Online anzeigen</a></li>
-
-<li><span class="mock-label">[% loc('Details:') %]</span> [% problem.detail | html %]
-[% IF problem.extra.original_detail %]
-<br>[%
- SET safe = problem.extra.original_detail | html;
- tprintf( loc('originally entered: &ldquo;%s&rdquo;'), safe )
-%]
-[% END %]
-</li>
-<li><span class="mock-label">[% loc('Co-ordinates:') %]</span> [% problem.local_coords.join(',') %]
- <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% problem.latitude %]">
- <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% problem.longitude %]">
-([%
- SET safe = problem.postcode | html;
- tprintf( loc('originally entered: &ldquo;%s&rdquo;'), safe )
-%],
-[% IF problem.used_map %][% loc('used map') %][% ELSE %][% loc("didn't use map") %][% END %])</li>
-
-<li><span class="mock-label">[% loc('Category:') %]</span> [% problem.category | html %] </li>
-<li><span class="mock-label">[% loc('Name:') %]</span> [% problem.name | html %]
-<li><span class="mock-label">[% loc('Email:') %]</span> [% problem.user.email | html %]
-[% IF NOT problem.extra.email_confirmed %]<span class="error">[% loc('Unconfirmed') %]</span>[% END %]
-<li><span class="mock-label">[% loc('Phone:') %]</span> [% IF problem.user.phone %][% problem.user.phone | html %][% ELSE %]<em>[% loc('None') %]</em>[% END %]</li>
-<li><span class="mock-label">[% loc('Created:') %]</span> [% PROCESS format_date this_date=problem.created %] [% problem.created.hms %]</li>
-
-[% IF problem.photo %]
-<li><img alt="" src="[% c.cobrand.base_url %]/photo/[% problem.photo %].temp.jpeg"></li>
-[% END %]
-
-<li><span class="mock-label">[% loc('State:') %]</span> [% states.${problem.state} %]</li>
-
-<li><label for="new_internal_note">[% loc('New internal note:') %]</label>
-<textarea name='new_internal_note' id='new_internal_note' cols=60 rows=5></textarea></li>
-
-<li><label for="status_update">[% loc('New update:') %]</label>
-<textarea name='status_update' id='status_update' cols=60 rows=5></textarea></li>
+<div class="admin-report-edit admin-report-edit--details">
+
+<dl>
+
+ <dd class="screen-only">&raquo; <a href="[% c.uri_for_email( '/report', problem.id ) %]">[% loc('View report on site' )%]</a></dd>
+
+ <dd class="screen-only">&raquo; <a href="http://webgis.intra.stzh.ch/AV_Online/Direct.asp?Map=AV&amp;Search=Koord&amp;West=[% problem.local_coords.0 %]&amp;Nord=[% problem.local_coords.1 %]&amp;B=300" target="_blank">Standort in AV-Online anzeigen</a></dd>
+
+ <dd class="screen-only">&raquo; <a href="http://webgis.intra.stzh.ch/stapo/GoogleStreetView.asp?lat=[% problem.latitude %]&amp;lon=[% problem.longitude %]" target="_blank">[% loc('Street View') %]</a></dd>
+
+ <dt><span class="mock-label">[% loc('Details:') %]</span></dt>
+ <dd>[% problem.detail | html %]</dd>
+ [% IF problem.extra.original_detail %]
+ <dd>[%
+ SET safe = problem.extra.original_detail | html;
+ tprintf( loc('originally entered: &ldquo;%s&rdquo;'), safe )
+ %]</dd>
+ [% END %]
+
+ <dt class="print-only">[% loc('Reported:') %] <!-- Meldedatum --></dt>
+ <dd class="screen-no-space-after">
+ <strong>[% PROCESS format_date this_date=problem.created %] [% problem.created.hms %]</strong>
+ </dd>
+ <dt class="print-only">[% loc('Coordinates:') %] <!-- Koordinaten --></dt>
+ <dd class="screen-no-space-after print-no-space-after">
+ [% problem.local_coords.join(',') %]
+ <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% problem.latitude %]">
+ <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% problem.longitude %]">
+ </dd>
+ <dd class="screen-no-space-after print-no-space-after">
+ [% IF problem.used_map %]
+ [% loc('Used map') %]
+ [% ELSE %]
+ [% loc("Didn't use map") %]
+ [% END %]
+ </dd>
+ <dd>[%
+ SET safe = problem.postcode | html;
+ tprintf( loc('originally entered: &ldquo;%s&rdquo;'), safe )
+ %]</dd>
+
+ <dt class="print-only">[% loc('Reported by:') %] <!-- Meldende Person --></dt>
+ <dd>
+ <strong>[% IF problem.name %][% problem.name | html %][% ELSE %][% loc('(No name)') %][% END %]</strong>
+ <input type='hidden' name='name' id='name' value='[% problem.name | html %]'>
+ <br>
+ [% problem.user.email | html %]
+ [% IF NOT problem.extra.email_confirmed %]<span class="error">[% loc('Unconfirmed') %]</span>[% END %]
+ <input type='hidden' id='email' name='email' value='[% problem.user.email | html %]'>
+ <br>
+ [% IF problem.user.phone %][% problem.user.phone | html %][% ELSE %]<em>[% loc('(No phone number)') %]</em>[% END %]
+ </dd>
+
+ <dt>[% loc('Category:') %] <!-- Kategorie --></dt>
+ <dd>[% problem.category | html %]</dd>
+
+ <dt class="print-only">[% loc('State:') %] <!-- Status --></dt>
+ <dd class="print-only">[% states.${problem.state} %]</dd>
+
+ <dt>[% loc('Time spent (in minutes):') %]</dt>
+ <dd>[% problem.get_time_spent %]</dd>
+
+ <dd>
+ [% status_message %]
+ </dd>
+
+ [% IF problem.photo %]
+ <dd>
+ [% FOR photo IN problem.get_photoset(c).images %]
+ <div class="update-img">
+ <a href="[% c.cobrand.base_url %]/photo/[% photo.0 %].fulltemp.jpeg" rel="fancy">
+ <img alt="Photo of this report" src="[% c.cobrand.base_url %]/photo/[% photo.0 %].temp.jpeg">
+ <span>zoom</span>
+ </a>
+ </div>
+ [% END %]
+ </dd>
+ [% END %]
+
+</dl>
+
+</div>
+<div class="admin-report-edit admin-report-edit--interact">
+
+<script type="text/javascript">
+ $(function(){
+ $('#map_box .noscript').clone().removeClass('noscript').addClass('map_clone print-only').prependTo('.admin-report-edit--interact');
+ });
+</script>
+
+<p align="right" class="screen-only"><input type="submit" name="send_back" value="[% loc('Not for my subdivision') %]"></p>
+<p align="right" class="screen-only"><input type="submit" name="not_contactable" value="[% loc('Customer not contactable') %]"></p>
+
+<ul class="no-bullets screen-only">
+ <li>
+ <label for="new_internal_note">[% loc('New internal note:') %]</label>
+ <textarea name='new_internal_note' id='new_internal_note' cols=60 rows=4></textarea>
+ </li>
+ <li>
+ <label for="status_update">[% loc('New note to DM:') %]</label>
+ <textarea name='status_update' id='status_update' cols=60 rows=4></textarea>
+ </li>
</ul>
-<p class="cf">
+<p class="screen-only">
+ <label for="time_spent">[% loc('Time spent (in minutes):') %]</label>
+ <input type="text" name="time_spent" id="form_time_spent" style="width: 4em" value="0">
+ <script>
+ $(function () {
+ $('#form_time_spent').spinner({
+ spin: function (e, ui) {
+ if (ui.value < 0) { return false }
+ }
+ });
+ });
+ </script>
+</p>
+
+<p class="cf screen-only">
<input style="float:left" type="submit" name="Submit changes" value="[% loc('Submit changes') %]" >
<input style="float:right" type="submit" name="no_more_updates" value="[% loc('No further updates') %]">
</p>
-</form>
[% INCLUDE 'admin/list_updates.html' %]
+</div>
+</form>
+
+<div id="print_report_map" class="print-only">
+[% INCLUDE 'maps/noscript_map.html' map=print_report_map nsm_prefix="large_" %]
+</div>
+
[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/zurich/admin/report_edit.html b/templates/web/zurich/admin/report_edit.html
index 5376d77f4..64d0950ee 100644
--- a/templates/web/zurich/admin/report_edit.html
+++ b/templates/web/zurich/admin/report_edit.html
@@ -10,160 +10,312 @@
[% map_html %]
</div>
-[% status_message %]
+[% pstate = problem.get_extra_metadata('closure_status') || problem.state %]
-<form method="post" action="[% c.uri_for( 'report_edit', problem.id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
+<form id="report_edit" method="post" action="[% c.uri_for( 'report_edit', problem.id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
<input type="hidden" name="token" value="[% token %]" >
<input type="hidden" name="submit" value="1" >
-<ul class="no-bullets">
-<li><a href="[% c.uri_for_email( '/report', problem.id ) %]">[% loc('View report on site' )%]</a></li>
+<div class="admin-report-edit admin-report-edit--details">
+
+<dl>
+ <dd class="screen-only">&raquo; <a href="[% c.uri_for_email( '/report', problem.id ) %]">[% loc('View report on site' )%]</a></dd>
-<li><a href="http://webgis.intra.stzh.ch/AV_Online/Direct.asp?Map=AV&Search=Koord&West=[% problem.local_coords.0 %]&Nord=[% problem.local_coords.1 %]&B=300" target="_blank">Standort in AV-Online anzeigen</a></li>
+ <dd class="screen-only">&raquo; <a href="http://webgis.intra.stzh.ch/AV_Online/Direct.asp?Map=AV&amp;Search=Koord&amp;West=[% problem.local_coords.0 %]&amp;Nord=[% problem.local_coords.1 %]&amp;B=300" target="_blank">Standort in AV-Online anzeigen</a></dd>
-[% IF problem.state == 'fixed - council' OR problem.state == 'closed' %]
- <li><span class="mock-label">[% loc('Details:') %]</span> [% problem.detail | html %]
+ <dd class="screen-only">&raquo; <a href="http://webgis.intra.stzh.ch/stapo/GoogleStreetView.asp?lat=[% problem.latitude %]&amp;lon=[% problem.longitude %]" target="_blank">[% loc('Street View') %]</a></dd>
+
+ [% IF c.cobrand.problem_is_closed(problem) %]
+ <dt><span class="mock-label">[% loc('Details:') %]</span></dt>
+ <dd>[% problem.detail | html %]</dd>
[% IF problem.extra.original_detail %]
- <br>[%
- SET detail_safe = problem.extra.original_detail | html;
- tprintf( loc('originally entered: &ldquo;%s&rdquo;'), detail_safe )
- %]
+ <dd>[%
+ SET detail_safe = problem.extra.original_detail | html;
+ tprintf( loc('originally entered: &ldquo;%s&rdquo;'), detail_safe )
+ %]</dd>
[% END %]
- </li>
-[% ELSE %]
- <li><label for='title'>[% loc('Subject:') %]</label> <input size=60 type='text' id='title' name='title' value='[% problem.title | html %]'></li>
- <li><label for='detail'>[% loc('Details:') %]</label>
- <textarea name='detail' id='detail' cols=60 rows=5>[% problem.detail | html %]</textarea>
+ [% ELSE %]
+
+ <dt><label for='title'>[% loc('Subject:') %]</label></dt>
+ <dd class="screen-only"><input size=60 type='text' id='title' name='title' value='[% problem.title | html %]'></dd>
+ <dd class="print-only">[% problem.title | html %]</dd>
+
+ <dt><label for='detail'>[% loc('Details:') %]</label></dt>
+ <dd class="screen-only"><textarea name='detail' id='detail' cols=60 rows=4>[% problem.detail | html %]</textarea></dd>
+ <dd class="print-only">[% problem.detail | html %]</dd>
+
[% IF problem.extra.original_detail %]
- [%
- SET detail_safe = problem.extra.original_detail | html;
- tprintf( loc('originally entered: &ldquo;%s&rdquo;'), detail_safe )
- %]
+ <dd>[%
+ SET detail_safe = problem.extra.original_detail | html;
+ tprintf( loc('originally entered: &ldquo;%s&rdquo;'), detail_safe )
+ %]</dd>
[% END %]
- </li>
-[% END %]
+ [% END %]
-<li><span class="mock-label">[% loc('Co-ordinates:') %]</span> [% problem.local_coords.join(',') %]
- <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% problem.latitude %]">
- <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% problem.longitude %]">
-
-([%
- SET safe = problem.postcode | html;
- tprintf( loc('originally entered: &ldquo;%s&rdquo;'), safe )
-%],
-[% IF problem.used_map %][% loc('used map') %][% ELSE %][% loc("didn't use map") %][% END %])</li>
-
-<li><span class="mock-label">[% loc('Name:') %]</span> [% problem.name | html %] <input type='hidden' name='name' id='name' value='[% problem.name | html %]'></li>
-<li><span class="mock-label">[% loc('Email:') %]</span> [% problem.user.email | html %] <input type='hidden' id='email' name='email' value='[% problem.user.email | html %]'>
-[% IF NOT problem.extra.email_confirmed %]<span class="error">[% loc('Unconfirmed') %]</span>[% END %]
-</li>
-<li><span class="mock-label">[% loc('Phone:') %]</span> [% IF problem.user.phone %][% problem.user.phone | html %][% ELSE %]<em>[% loc('None') %]</em>[% END %]</li>
-<li><span class="mock-label">[% loc('Created:') %]</span> [% PROCESS format_date this_date=problem.created %] [% problem.created.hms %]</li>
-
-
-[% IF problem.photo %]
-<li>
-[% photo = problem.get_photo_params %]
-<div class="update-img">
- <a href="[% c.cobrand.base_url %]/photo/[% problem.photo %].fulltemp.jpeg" rel="fancy">
- <img alt="Photo of this report" src="[% c.cobrand.base_url %]/photo/[% problem.photo %].temp.jpeg">
- <span>zoom</span></a>
-</div>
-<br>
-<input type="submit" name="rotate_photo" value="[% loc('Rotate Left') %]">
-<input type="submit" name="rotate_photo" value="[% loc('Rotate Right') %]">
-<br>
-<input type="checkbox" id="publish_photo" name="publish_photo" value="1"[% ' checked' IF problem.extra.publish_photo %]>
-<label class="inline" for="publish_photo">[% loc("Publish photo") %]</label></li>
-[% END %]
-</ul>
+ <dt class="print-only">[% loc('Reported:') %] <!-- Meldedatum --></dt>
+ <dd class="screen-no-space-after">
+ <strong>[% PROCESS format_date this_date=problem.created %] [% problem.created.hms %]</strong>
+ </dd>
+ <dt class="print-only">[% loc('Coordinates:') %] <!-- Koordinaten --></dt>
+ <dd class="screen-no-space-after print-no-space-after">
+ [% problem.local_coords.join(',') %]
+ <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% problem.latitude %]">
+ <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% problem.longitude %]">
+ </dd>
+ <dd class="screen-no-space-after print-no-space-after">
+ [% IF problem.used_map %]
+ [% loc('Used map') %]
+ [% ELSE %]
+ [% loc("Didn't use map") %]
+ [% END %]
+ </dd>
+ <dd>[%
+ SET safe = problem.postcode | html;
+ tprintf( loc('originally entered: &ldquo;%s&rdquo;'), safe )
+ %]</dd>
+
+ [% SET fields = problem.get_extra_fields; IF fields.size %]
+ <dd>
+ [% FOR f IN fields %]
+ <strong>[% f.description %]</strong> [% f.value %]
+ <br>
+ [% END %]
+ </dd>
+ [% END %]
-<p><label for="new_internal_note">[% loc('New internal note:') %]</label>
-<textarea name='new_internal_note' id='new_internal_note' cols=60 rows=5>[% new_internal_note | html %]</textarea></p>
-
-<p><span class="mock-label">[% loc('State:') %]</span> <select name="state" id="state">
- <option value="">--</option>
- [% FOREACH s IN [
- ['unconfirmed', loc('Submitted')]
- ['confirmed', loc('Open')],
- ['planned', loc('Planned')],
- ['hidden', loc('Hidden')],
- ] %]
- <option [% 'selected ' IF s.0 == problem.state %] value="[% s.0 %]">[% s.1 %]</option>
- [% END %]
- [% IF problem.state == 'closed' %]
- <option selected value="closed">[% loc('Closed') %]</option>
- [% ELSIF problem.state == 'fixed - council' %]
- <option selected value="fixed - council">[% loc('Closed') %]</option>
- [% ELSIF problem.state == 'in progress' %]
- <option selected value="in progress">[% loc('In progress') %]</option>
+ <dt class="print-only">[% loc('Reported by:') %] <!-- Meldende Person --></dt>
+ <dd>
+ <strong>[% IF problem.name %][% problem.name | html %][% ELSE %][% loc('(No name)') %][% END %]</strong>
+ <input type='hidden' name='name' id='name' value='[% problem.name | html %]'>
+ <br>
+ [% problem.user.email | html %]
+ [% IF NOT problem.extra.email_confirmed %]<span class="error">[% loc('Unconfirmed') %]</span>[% END %]
+ <input type='hidden' id='email' name='email' value='[% problem.user.email | html %]'>
+ <br>
+ [% IF problem.user.phone %][% problem.user.phone | html %][% ELSE %]<em>[% loc('(No phone number)') %]</em>[% END %]
+ </dd>
+
+ <dt>[% loc('Category:') %] <!-- Kategorie --></dt>
+ <dd>[% problem.category | html %]</dd>
+
+ <dt class="print-only">[% loc('State:') %] <!-- Status --></dt>
+ <dd class="print-only">[% states_trans.${problem.state} %]</dd>
+
+ <dt>[% loc('Time spent (in minutes):') %]</dt>
+ <dd>[% problem.get_time_spent %]</dd>
+
+ [% IF problem.photo %]
+ <dd>
+ [% FOR photo IN problem.get_photoset(c).images %]
+ <div class="update-img">
+ <a href="[% c.cobrand.base_url %]/photo/[% photo.0 %].fulltemp.jpeg" rel="fancy">
+ <img alt="Photo of this report" src="[% c.cobrand.base_url %]/photo/[% photo.0 %].temp.jpeg">
+ <span>zoom</span>
+ </a>
+ </div>
+ <input type="submit" name="rotate_photo_[% loop.index %]" value="[% loc('Rotate Left') %]" class="screen-only">
+ <input type="submit" name="rotate_photo_[% loop.index %]" value="[% loc('Rotate Right') %]" class="screen-only">
+ [% END %]
+ <br>
+ <input type="checkbox" id="publish_photo" name="publish_photo" value="1"[% ' checked' IF problem.extra.publish_photo %] class="screen-only">
+ <label class="inline screen-only" for="publish_photo">[% loc("Publish photo") %]</label></li>
[% END %]
-</select></p>
-<p id="automatic-reply">
- <span class="mock-label">Automatische Antwort</span>
- <input type="checkbox" name="send_rejected_email" id="send_rejected_email" value="1" />
-</p>
+</dl>
+
+</div>
+
+<div class="admin-report-edit admin-report-edit--interact">
+
+[% status_message %]
<script type="text/javascript">
-$(function(){
- // Show or hide the automatic reply field
- $('#state').change(function(){
- if ($(this).val() === 'hidden') {
- $('#automatic-reply').show();
- } else {
- $('#automatic-reply').hide();
- }
- }).change();
-});
+ $(function(){
+ $('#map_box .noscript').clone().removeClass('noscript').addClass('map_clone print-only').prependTo('.admin-report-edit--interact');
+ });
</script>
-[% IF problem.state == 'unconfirmed' OR problem.state == 'confirmed' %]
+<dl [% IF status_message %]class="with-message"[% END %]>
+
+ <dt class="screen-only">
+ <label for="new_internal_note">[% loc('New internal note:') %]</label>
+ </dt>
+ <dd class="screen-only">
+ <textarea name='new_internal_note' id='new_internal_note' cols=60 rows=4>[% new_internal_note | html %]</textarea>
+ </dd>
+
+ <dt class="screen-only">
+ <label for="time_spent">[% loc('Time spent (in minutes):') %]</label>
+ </dt>
+ <dd class="screen-only">
+ <input type="text" name="time_spent" id="form_time_spent" style="width: 4em" value="0">
+ </dd>
+
+ <dt class="screen-only">
+ <span class="mock-label">[% loc('State:') %]</span>
+ </dt>
+ <dd class="screen-only">
+ <select name="state" id="state">
+ <option value="">--</option>
+ [% FOREACH s IN states %]
+ <option [% 'selected ' IF s.state == pstate %] value="[% s.state %]">[% s.trans %]</option>
+ [% END %]
+ </select>
+ </dd>
+
+</dl>
-<ul class="no-bullets">
-[% list = FOR body IN bodies %]
+<ul class="no-bullets screen-only">
+
+[% IF problem.state == 'confirmed' %]
+ <li class="assignation">
+ <div id="assignation__category">
+ <label for="category">[% loc('Assign to different category:') %]</label>
+ <select name="category" id="category">
+ <option value="">--</option>
+ [% FOREACH cat IN categories %]
+ <option value="[% cat %]">[% cat %]</option>
+ [% END %]
+ </select>
+ </div>
+ </li>
+
+ [% list = FOR body IN bodies %]
[%- NEXT UNLESS body.parent.id == c.user.from_body.id %]
<option value="[% body.id %]"[% IF body.id == problem.bodies_str %] selected[% END %]>[% body.name %]</option>
-[% END %]
+ [% END %]
+
[% IF admin_type != 'super' AND list %]
- <li class="assignation">
+ <li class="assignation" id="assignation__subdivision">
<label for="body_subdivision">[% loc('Assign to subdivision:') %]</label>
- <select name="body_subdivision" id="body_subdivision">
+ <select name="body_subdivision" id="body_subdivision" class="assignation__select">
<option value="">--</option>
[% list %]
</select>
</li>
[% END %]
-<li class="assignation">
-<label for="category">
-[% loc('Category:') %] [% problem.category %]<br>
-[% loc('Assign to different category:') %]</label>
- <select name="category" id="category">
- <option value="">--</option>
- [% FOREACH cat IN categories %]
- <option value="[% cat %]">[% cat %]</option>
- [% END %]
- </select></li>
-
-<li class="assignation">
-<label for="body_external">[% loc('Assign to external body:') %]</label>
- <select name="body_external" id="body_external">
- <option value="">--</option>
- [% FOR body IN bodies %]
- [% NEXT IF body.parent OR body.bodies OR body.deleted %]
- <option value="[% body.id %]"[% IF body.id == problem.bodies_str %] selected[% END %]>[% body.name %]</option>
+[% END %]
+</ul>
+
+
+[% IF problem.state == 'planned' %]
+ [%# 3rd party messages sent for Extern/Wunsch states %]
+ [% SWITCH pstate %]
+ [% CASE ['closed','investigating'] %]
+ <ul class="no-bullets screen-only">
+ <li class="assignation" id="assignation__external">
+ <span class="error hidden">[% loc('Please select a body.') %]</span>
+ <label for="body_external">
+ [% IF pstate == 'closed' %]
+ [% loc('Assign to external body:') %]
+ [% ELSE %]
+ [% loc('Assign to competent body:') %]
+ [% END %]
+ </label>
+ <select name="body_external" id="body_external">
+ <option value="">--</option>
+ [% FOR body IN bodies %]
+ [% NEXT IF body.parent OR body.bodies OR body.deleted %]
+ <option value="[% body.id %]"[% IF body.id == problem.external_body %] selected[% END %]>[% body.name %]</option>
+ [% END %]
+ </select>
+ </li>
+ <li>
+ [% IF pstate == 'closed' %]
+ <input type="checkbox" name="third_personal" id="third_personal" value="1"[% ' checked' IF problem.extra.third_personal %]>
+ <label for="third_personal" class="inline">[% loc('Include reporter personal details') %]</label>
+ [% END %]
+ </li>
+ <li>
+ [% INCLUDE 'admin/response_templates_select.html' for='external_body' %]
+ <textarea name='external_message' id='external_body' cols=60 rows=5>[% problem.get_extra_metadata('external_message') | html %]</textarea>
+ </li>
+ </ul>
[% END %]
- </select>
- <br>
- <input type="checkbox" name="third_personal" id="third_personal" value="1"[% ' checked' IF problem.extra.third_personal %]>
- <label for="third_personal" class="inline">[% loc('Include reporter personal details') %]</label>
-</ul>
+ [%# Public response field shown for Ruckmeldung ausstehend states
+ # (e.g. various pstates) %]
+ <ul class="no-bullets screen-only">
+ <li id="status_update_container"><label for="status_update">
+ [% SWITCH pstate %]
+ [% CASE ['hidden', 'investigating', 'partial'] %][%# Hidden/Wish/Not contactable %]
+ [% loc('Reply to user:') %]
+ [% CASE DEFAULT %]
+ [% loc('Public response:') %]
+ [% END %]
+ </label>
+ [% INCLUDE 'admin/response_templates_select.html' for='status_update' %]
+ <textarea name='status_update' id='status_update' cols=60 rows=5>
+ [%- problem.extra.public_response || default_public_response | html -%]
+ </textarea>
+ </li>
+ </ul>
+[% END %]
+
+<p align="right" class="screen-only">
+ [% IF show_publish_response %]
+ [%# While we call this 'publish_response', the response will not actually
+ # be "published" for these cases: Wish / Hidden / Not contactable (for these,
+ # only a private email will be sent to the user. However, in all cases,
+ # this is the end of processing, so we mark this with the same text used
+ # for 'No further updates %]
+ <input type="submit" name="publish_response" value="[% loc('No further updates') %]">
+ [% END %]
+
+ [%# This button simply saves changes, but does NOT close the report (though
+ # it may trigger other workflow %]
+ <input type="submit" name="Submit changes" value="[% loc('Submit changes') %]" >
+</p>
+
+[% IF c.cobrand.problem_has_public_response(problem) || c.cobrand.problem_has_user_response(problem) %]
+ <h2>[% loc('Public response:') %]</h2>
+ <div class="admin-official-answer">
+ [% problem.extra.public_response | html_para %]
+ </div>
+[% END %]
+
+[% SWITCH problem.state %]
+ [% CASE ['closed','investigating'] %]
+ <h2>
+ [% IF problem.state == 'closed' %]
+ [% loc('Message to external body:') %]
+ [% ELSE %]
+ [% loc('Message to competent body:') %]
+ [% END %]
+ </h2>
+ <div class="admin-external-message">
+ [% problem.extra.external_message | html_para %]
+ </div>
+[% END %]
+
+
+[% INCLUDE 'admin/list_updates.html' %]
+
+</div>
+
+</form>
<script type="text/javascript">
$(function(){
- $('.assignation select').change(function(){
+ var form_fields_changed = false;
+
+ $('#form_time_spent').spinner({
+ spin: function (e, ui) {
+ if (ui.value < 0) { return false }
+ form_fields_changed = true;
+ }
+ });
+
+ setTimeout(function(){
+ $('.message-updated').fadeOut(250, function(){
+ $(this).remove();
+ });
+ }, 5000);
+
+ // When the user changes a select box, this bit of code
+ // makes the labels for the other two select boxes grey.
+ $('.assignation__select, .assignation select').change(function(){
if (this.value == "") {
$('.assignation').css('color', '#000');
} else {
@@ -172,57 +324,82 @@ $(function(){
$('.assignation').not(a).css('color', '#999');
}
});
-});
-</script>
-
-[% ELSIF problem.state == 'planned' %]
-
-<ul class="no-bullets">
-[% list = FOR body IN bodies %]
- [%- NEXT UNLESS body.parent.id == c.user.from_body.id %]
- <option value="[% body.id %]">[% body.name %]</option>
-[% END %]
- [% IF admin_type != 'super' AND list %]
- <li class="assignation">
- <label for="body_subdivision">[% loc('Assign to subdivision:') %]</label>
- <select name="body_subdivision" id="body_subdivision">
- <option value="" selected>--</option>
- [% list %]
- </select>
- </li>
- [% END %]
-
- <li><label for="status_update">[% loc('Public response:') %]</label>
-
- <textarea name='status_update' id='status_update' cols=60 rows=5>
- [%- IF problem.extra.public_response -%]
- [%- problem.extra.public_response | html -%]
- [%- ELSE -%]
-
-Freundliche Grüsse
-
-Ihre Stadt Zürich
- [%- END %]</textarea>
- </li>
-</ul>
-[% ELSIF problem.state == 'fixed - council' %]
+ $('#state').change(function(){
+ // Show or hide the automatic reply field
+ var state = $(this).val();
+
+ // show or disable assignation, templates, public_response, publish if
+ // same or different state to the one we started on
+ if ((state === '[% pstate %]')) {
+ $('input[name=publish_response]').show();
+ $('.response_templates_select').show();
+ $('#status_update_container').show();
+
+ if (state === 'confirmed') {
+ $('#assignation__category').show();
+ $('#assignation__subdivision').show();
+ }
+ if ((state === 'closed') || (state === 'investigating')) {
+ $('#assignation__external').show();
+ } else {
+ $('#assignation__external').hide();
+ }
+ }
+ else {
+ $('input[name=publish_response]').hide();
+ $('.response_templates_select').hide();
+ $('#status_update_container').hide();
+
+ $('#assignation__category').hide();
+ $('#assignation__subdivision').hide();
+ $('#assignation__category select').val('');
+ $('#assignation__subdivision select').val('');
+
+ $('#assignation__external select').val('');
+ $('#assignation__external').hide();
+ $('#external_body').hide();
+ $('#third_personal, label[for=third_personal]').hide();
+ }
-<p><span class="mock-label">[% loc('Public response:') %]</span>
-[% problem.extra.public_response | html %]
-</p>
+ }).change();
-[% END %]
+ $("form#report_edit input[type=submit]").click(function() {
+ $("form#report_edit").data("clicked_button", $(this).attr("name"));
+ });
-<p align="right">
-[% IF problem.state == 'planned' %]
-<input type="submit" name="publish_response" value="[% loc('Publish the response') %]">
-[% END %]
-<input type="submit" name="Submit changes" value="[% loc('Submit changes') %]" >
-</p>
+ $("form#report_edit").submit(function() {
+ // Make sure the external body field has a value if it's visible
+ // and the form is submitted as a 'save' action (i.e. not a rotate
+ // photo).
+ var clicked = $(this).data("clicked_button");
+ if (clicked == "publish_response" || clicked == "Submit changes") {
+ var visible = $("select#body_external:visible").length > 0;
+ var val = parseInt($("select#body_external").val());
+ if (visible && isNaN(val)) {
+ $("#assignation__external .error").removeClass("hidden");
+ $("select#body_external").focus().get(0).scrollIntoView();
+ return false;
+ }
+ }
+ // If the user has clicked to rotate a photo and has edited other
+ // fields, ask for confirmation before submitting the form
+ if (/rotate_photo/.test(clicked) && form_fields_changed) {
+ var message = "[% loc('Rotating this photo will discard unsaved changes to the report.') %]";
+ if (!confirm(message)) {
+ return false;
+ }
+ }
+ });
-</form>
+ $("form#report_edit").find("input, select, textarea").change(function() {
+ form_fields_changed = true;
+ });
+});
+</script>
-[% INCLUDE 'admin/list_updates.html' %]
+<div id="print_report_map" class="print-only">
+[% INCLUDE 'maps/noscript_map.html' map=print_report_map nsm_prefix="large_" %]
+</div>
[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/zurich/admin/response_templates_select.html b/templates/web/zurich/admin/response_templates_select.html
new file mode 100644
index 000000000..c0f4104c8
--- /dev/null
+++ b/templates/web/zurich/admin/response_templates_select.html
@@ -0,0 +1,25 @@
+[% template_name="templates_for_${for}" %]
+
+[% response_templates = problem.response_templates %]
+<div class="response_templates_select">
+<select id="[% template_name %]">
+ <option value="">[% loc('Choose a template') %]</option>
+[% FOR t IN response_templates %]
+ <option value="[% t.id %]"> [% t.title | html %] </option>
+[% END %]
+</select>
+</div>
+<script>
+ $(function () {
+ var response_template_texts = {
+ [% FOR t IN response_templates %]
+ [% t.id %]: '[% t.text | escape_js %]' [% loop.last ? '' : ',' %]
+ [% END %]
+ };
+ $('#[% template_name %]').change(function () {
+ var val = $(this).val();
+ var text = response_template_texts[val];
+ $('#[% for %]').val( text );
+ });
+ });
+</script>
diff --git a/templates/web/zurich/admin/stats.html b/templates/web/zurich/admin/stats.html
index 52b33ebc4..fa8104496 100644
--- a/templates/web/zurich/admin/stats.html
+++ b/templates/web/zurich/admin/stats.html
@@ -2,7 +2,7 @@
[% PROCESS 'admin/report_blocks.html' %]
[% USE date %]
-<p style="float:right"><a href="[% c.uri_with( { export=1 } ) %]">[% loc('All Reports') %]</a></p>
+<p style="float:right"><a href="[% c.uri_with( { export=1 } ) %]">[% loc('All Reports as CSV') %]</a></p>
[% IF start_date AND end_date %]
<p><strong>[% tprintf( loc( 'All reports between %s and %s' ), start_date.ymd, end_date.ymd ) | html %]</strong></p>
@@ -48,7 +48,7 @@
<table>
<tr><th>[% loc('Category') %]</th><th>[% loc('Count') %]</th></tr>
-[% WHILE ( c = per_category.next ) %]<tr><td>[% c.category %]</td><td>[% c.get_column('c') %]</td></tr>[% END %]
+[% WHILE ( cc = per_category.next ) %]<tr><td>[% cc.category %]</td><td>[% cc.get_column('c') %]</td></tr>[% END %]
</table>
[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/zurich/admin/template_edit.html b/templates/web/zurich/admin/template_edit.html
new file mode 100644
index 000000000..1deda6a77
--- /dev/null
+++ b/templates/web/zurich/admin/template_edit.html
@@ -0,0 +1,38 @@
+[% INCLUDE 'admin/header.html' title=tprintf(loc('Response Templates for %s'), body.name) -%]
+[% rt = response_template %]
+
+<h2> [% tprintf(loc('Response Templates for %s'), body.name) %] </h2>
+
+<h3> [% IF rt.id %]
+ [% tprintf(loc('Template &laquo;%s&raquo;'), rt.title) %]
+ [% ELSE %]
+ [% loc('New template') %]
+ [% END %]
+</h3>
+
+<form method="post"
+ action="[% c.uri_for('templates', body.id, rt.id || 'new' ) %]"
+ enctype="application/x-www-form-urlencoded"
+ accept-charset="utf-8"
+ class="validate">
+
+ <p>
+ <strong>[% loc('Title:') %] </strong>
+ <input type="text" name="title" class="required" size="30" value="[% rt.title| html %]">
+ </p>
+ <p>
+ <strong>[% loc('Text:') %] </strong>
+ <textarea name="text" class="required">[% rt.text |html %]</textarea>
+ </p>
+ <p>
+ <input type="hidden" name="token" value="[% token %]" >
+ <input type="submit" name="Edit templates" value="[% rt.id ? loc('Save changes') : loc('Create template') %]" >
+ </p>
+ [% IF rt.id %]
+ <p>
+ <input class="delete" type="submit" name="delete_template" value="[% loc('Delete template') %]">
+ </p>
+ [% END %]
+</form>
+
+[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/zurich/admin/templates.html b/templates/web/zurich/admin/templates.html
new file mode 100644
index 000000000..d3b334022
--- /dev/null
+++ b/templates/web/zurich/admin/templates.html
@@ -0,0 +1,28 @@
+[% INCLUDE 'admin/header.html' title=tprintf(loc('Response Templates for %s'), body.name) -%]
+
+<h2> [% tprintf(loc('Response Templates for %s'), body.name) %] </h2>
+
+<table>
+ <thead>
+ <tr>
+ <th> [% loc('Title') %] </th>
+ <th> [% loc('Text') %] </th>
+ <th> [% loc('Created') %] </th>
+ <th> &nbsp; </th>
+ </tr>
+ </thead>
+ <tbody>
+[% FOR t IN response_templates %]
+ <tr>
+ <td> [% t.title %] </td>
+ <td> [% t.text %] </td>
+ <td> [% t.created %] </td>
+ <td> <a href="/admin/templates/[% body.id %]/[% t.id %]" class="btn">[% loc('Edit') %]</a> </td>
+ </tr>
+[% END %]
+ </tbody>
+</table>
+
+<a href="[% c.uri_for('templates', body.id, 'new') %]" class="btn">[% loc('New template') %]</a>
+
+[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/zurich/auth/general.html b/templates/web/zurich/auth/general.html
index 11c729fde..fd34b79f8 100644
--- a/templates/web/zurich/auth/general.html
+++ b/templates/web/zurich/auth/general.html
@@ -27,7 +27,7 @@ END %]
[% ELSIF sign_in_error %]
<div class="form-error">[% loc('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form.') %]</div>
[% END %]
- <input type="email" class="required email" id="email" name="email" value="[% email | html %]" placeholder="[% loc('Your email address') %]">
+ <input type="email" class="required email" id="email" name="email" value="[% email | html %]" placeholder="[% loc('Your email address') %]" autofocus>
<label for="password_sign_in">[% loc('Password (optional)') %]</label>
<div class="form-txt-submit-box">
diff --git a/templates/web/zurich/auth/token.html b/templates/web/zurich/auth/token.html
new file mode 100644
index 000000000..e199691e0
--- /dev/null
+++ b/templates/web/zurich/auth/token.html
@@ -0,0 +1,25 @@
+[% INCLUDE 'header.html', bodyclass = 'fullwidthpage', title = loc('Confirm account') %]
+
+[% IF token_not_found %]
+
+ <div class="confirmation-header confirmation-header--failure">
+
+ <h1>[% loc('We have not been able to confirm your account - sorry.') %]</h1>
+ <p>[% loc('This may be because the link is too old or already used, or the address was not copied correctly.') %]</p>
+
+ </div>
+
+[% ELSE %]
+
+ <div class="confirmation-header confirmation-header--inbox">
+
+ <h1>[% loc('Please check your email') %]</h1>
+ <p>[% loc("We have sent you an email containing a link to confirm your account.") %]</p>
+
+ <p>[% loc("If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way.") %]</p>
+
+ </div>
+
+[% END %]
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/zurich/email_sent.html b/templates/web/zurich/email_sent.html
new file mode 100644
index 000000000..90bfcdbda
--- /dev/null
+++ b/templates/web/zurich/email_sent.html
@@ -0,0 +1,11 @@
+[% INCLUDE 'header.html', bodyclass = 'fullwidthpage', title = loc('Create a report') %]
+
+<div class="confirmation-header confirmation-header--inbox">
+
+ <h1>[% loc("Nearly Done! Now check your email...") %]</h1>
+
+ <p>[% loc("If you use web-based email or have 'junk mail' filters, you may wish to check your bulk/spam mail folders: sometimes, our messages are marked that way.") %]</p>
+
+</div>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/zurich/faq/faq-de-ch.html b/templates/web/zurich/faq/faq-de-ch.html
index c7e284194..deda32a1c 100644
--- a/templates/web/zurich/faq/faq-de-ch.html
+++ b/templates/web/zurich/faq/faq-de-ch.html
@@ -2,87 +2,55 @@
<h1><a name="faq"></a>Hilfe</h1>
- <dl>
-
-<dt>Was ist «Züri wie neu»</dt>
-<dd>
-«Züri wie neu» ist eine Online-Plattform, über die die Einwohnerinnen und
-Einwohner der Stadt Zürich auf Mängel und Schäden der städtischen Infrastruktur
-hinweisen können. «Züri wie neu» wird von der Stadtverwaltung moderiert und
-transparent geführt. Die Meldungen werden innerhalb von einem Arbeitstag den zuständigen Fachstellen
-zugewiesen und innert fünf Arbeitstagen abschliessend beantwortet. Fällt eine
-Meldung nicht in den Zuständigkeitsbereich der Stadtverwaltung, wird die
-Meldung anonymisiert der zuständigen dritten Stelle per E-Mail zugestellt.
-</dd>
-
-<dt>Welche Probleme kann ich über «Züri wie neu» melden?</dt>
-<dd>
-<p>Gemeldet werden können sämtliche Schäden an der Infrastruktur der Stadt Zürich.
-Dabei kann es sich um ein Loch im Strassenbelag, ein Graffiti am Stadthaus oder
-eine durch Vandalen beschädigte Parkbank handeln.
-
-<p>Es können Probleme zu folgenden Kategorien gemeldet werden:
+<h3 id="was_ist_zri_wie_neu">Was ist «Züri wie neu»</h3>
+
+<p>«Züri wie neu» ist eine Online-Plattform, über die die Einwohnerinnen und Einwohner die Stadt Zürich auf Schäden an der städtischen Infrastruktur hinweisen können. «Züri wie neu» wird von der Stadtverwaltung moderiert und transparent geführt. Die Meldungen werden innerhalb von einem Arbeitstag den zuständigen Fachstellen zugewiesen und innert fünf Arbeitstagen abschliessend beantwortet. Fällt eine Meldung nicht in den Zuständigkeitsbereich der Stadtverwaltung, wird die Meldung anonymisiert der zuständigen dritten Stelle per E-Mail zugestellt.</p>
+
+<h3 id="welche_probleme_kann_ich_ber_zri_wie_neu_melden">Welche Probleme kann ich über «Züri wie neu» melden?</h3>
+
+<p>Gemeldet werden können sämtliche Schäden an der Infrastruktur der Stadt Zürich in folgenden Kategorien:</p>
<ul>
<li>Abfall / Sammelstellen</li>
-<li>Beleuchtung</li>
+<li>Beleuchtung / Uhren</li>
+<li>Brunnen / Hydranten</li>
<li>Graffiti</li>
-<li>Spielplatz / Sitzbank</li>
+<li>Grünflächen / Spielplätze</li>
<li>Strasse / Trottoir / Platz</li>
-<li>Tiere / Grünflächen</li>
+<li>VBZ / ÖV</li>
</ul>
-</dd>
+<h3 id="was_kann_ich_nicht_ber_zri_wie_neu_melden">Was kann ich nicht über «Züri wie neu» melden?</h3>
-<dt>Was kann ich nicht über «Züri wie neu» melden?</dt>
-<dd>
<ul>
-<li>Mängel die nicht auf Stadtgebiet liegen.</li>
-<li>Melden Sie «Züri wie neu» KEINE Notfälle. Die Notrufnummern lauten:
- <br>Medizinisch - 144 Polizei - 117 Feuer - 118 Allgemein - 112</li>
+<li>Schäden die nicht auf Stadtgebiet liegen</li>
+<li>Melden Sie «Züri wie neu» KEINE Notfälle. Die Notrufnummern lauten: <br />
+Sanität – 144, Polizei – 117, Feuerwehr – 118, Allgemein - 112</li>
<li>Allgemeine Verschönerungs- und Verbesserungsvorschläge</li>
</ul>
-</dd>
-
-<dt>Wie verwende ich die Webseite?</dt>
-<dd>
-<p>
-Geben Sie zuerst eine Adresse an oder lassen Sie Ihren Standort automatisch
-über den entsprechenden Link lokalisieren. Mittels Mausklick in die danach
-angezeigte Karte können Sie den exakten Ort des Mangels angeben. Als letzten
-Schritt füllen Sie die Felder des Formulars aus und schicken die Meldung ab.
-</p>
-<p>
-Weiter können Sie bestehende Meldungen sowie auch die Rückmeldungen der
-Verwaltung betrachten.
-</p>
-</dd>
-
-<dt>Wie werden die Probleme gelöst?</dt>
-<dd>
-Die Meldungen werden innerhalb von einem Arbeitstag den zuständigen Fachstellen
-zugewiesen und innert fünf Arbeitstagen von den dafür zuständigen
-Fachstellen bearbeitet sowie mit einer entsprechenden Rückmeldung versehen.
-</dd>
-
-<dt>Kann ich «Züri wie neu» auf meinem Smartphone nutzen?</dt>
-<dd>
-Ja, sowohl über die für mobile Geräte optimierte Webseite, als auch über die
-<a href="https://itunes.apple.com/ch/app/zuri-wie-neu/id631302236">iOS</a>- und <a href="https://play.google.com/store/apps/details?id=ch.zueriwieneu.zueriwieneu">Android-App</a>.
-</dd>
-
-<dt>Kann ich auch Probleme ausserhalb von Zürich melden?</dt>
-<dd>Nein.</dd>
-
-<dt>Werden meine E-Mail-Adresse, mein Name und meine Telefonnummer vertraulich behandelt?</dt>
-<dd>
-Die Kontaktinformationen werden nur stadtintern für Rückfragen verwendet. Sie
-werden weder im Internet publiziert noch an Dritte weitergegeben.
-</dd>
-
-<dt>Wer hat «Züri wie neu» programmiert?</dt>
-<dd>«Züri wie neu» wurde von <a href="http://www.mysociety.org/">mySociety</a> entwickelt.</dd>
-
-</dl>
+
+<h3 id="wie_melde_ich_einen_schaden">Wie melde ich einen Schaden?</h3>
+
+<p>Geben Sie zuerst eine Adresse an oder lassen Sie Ihren Standort automatisch über den entsprechenden Link lokalisieren. Mittels Mausklick in die danach angezeigte Karte können Sie den exakten Ort des Mangels angeben. Als letzten Schritt füllen Sie die Felder des Formulars aus, machen mindestens ein Foto des Schadens und schicken die Meldung ab.</p>
+
+<h3 id="wie_werden_die_schden_behoben">Wie werden die Schäden behoben?</h3>
+
+<p>Die Meldungen werden innerhalb von einem Arbeitstag den zuständigen Fachstellen zugewiesen und innert fünf Arbeitstagen von den dafür zuständigen Fachstellen bearbeitet sowie mit einer entsprechenden Rückmeldung versehen.</p>
+
+<h3 id="kann_ich_zri_wie_neu_auf_meinem_smartphone_nutzen">Kann ich «Züri wie neu» auf meinem Smartphone nutzen?</h3>
+
+<p>Ja, sowohl über die für mobile Geräte optimierte Webseite, als auch über die <a href="https://itunes.apple.com/ch/app/zuri-wie-neu/id631302236">iOS-</a> und <a href="https://play.google.com/store/apps/details?id=ch.zueriwieneu.zueriwieneu">Android-App</a>.</p>
+
+<h3 id="kann_ich_auch_schden_ausserhalb_von_zrich_melden">Kann ich auch Schäden ausserhalb von Zürich melden?</h3>
+
+<p>Nein, auf «Züri wie neu» können nur Schäden auf Stadtgebiet gemeldet werden.</p>
+
+<h3 id="werden_meine_e_mail_adresse_mein_name_und_meine_telefonnummer_vertraulich_behandelt">Werden meine E-Mail-Adresse, mein Name und meine Telefonnummer vertraulich behandelt?</h3>
+
+<p>Die Kontaktinformationen werden nur stadtintern für Rückfragen verwendet. Sie werden weder im Internet publiziert noch an Dritte weitergegeben.</p>
+
+<h3 id="wer_hat_zri_wie_neu_programmiert">Wer hat «Züri wie neu» programmiert?</h3>
+
+<p>«Züri wie neu» wurde von <a href="https://www.mysociety.org/">mySociety</a> programmiert.</p>
[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/zurich/footer.html b/templates/web/zurich/footer.html
index 2304c048e..11bfa9fcb 100644
--- a/templates/web/zurich/footer.html
+++ b/templates/web/zurich/footer.html
@@ -1,3 +1,4 @@
+[% USE date %]
</div><!-- .content role=main -->
</div><!-- .container -->
</div><!-- .table-cell -->
@@ -12,7 +13,7 @@
</p><p><a href="/admin">[% loc('Summary') %]</a> | <a href="/auth/sign_out">[% loc('sign out') %]</a>
</p>
[% END %]
- <ul id="main-menu" class="mob-only">
+ <ul class="nav-menu nav-menu--main mob-only">
<li><[% IF c.req.uri.path == '/' %]a onclick="$('html, body').animate({scrollTop:0}, 500); return false;" href="#site-header"[% ELSE %]a href="/"[% END %]
>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'a' : 'a' %]></li>[%
%]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END
@@ -30,7 +31,7 @@
<div id="zurich-footer-wrapper" class="desk-only">
<div id="zurich-footer">
- &copy; 2013 Stadt Z&uuml;rich
+ &copy; [% date.format(date.now, '%Y') %] Stadt Z&uuml;rich
<span class="hidden">|</span> <a href="http://www.stadt-zuerich.ch/content/portal/de/index/footer/rechtliche_hinweise.html">Rechtliche Hinweise</a>
<span class="hidden">|</span> <a href="http://www.stadt-zuerich.ch/content/portal/de/index/footer/impressum.html">Impressum</a>
</div>
diff --git a/templates/web/zurich/header.html b/templates/web/zurich/header.html
index ae1b47712..7e88f3f0f 100644
--- a/templates/web/zurich/header.html
+++ b/templates/web/zurich/header.html
@@ -1,8 +1,8 @@
<!doctype html>
-<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
-<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="[% lang_code %]"><![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
<head>
<meta name="viewport" content="initial-scale=1.0">
@@ -14,7 +14,7 @@
[% SET start = c.config.ADMIN_BASE_URL IF admin %]
<link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/base.css') %]">
- <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]" media="(min-width:48em)">
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]" media="screen and (min-width:48em)">
[% extra_css %]
<!--[if (lt IE 9) & (!IEMobile)]>
<link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]">
@@ -68,9 +68,14 @@
<li [% IF pagename == 'users' OR pagename == 'user_edit' %]class="current"[% END %]>
<a href="/admin/users">[% loc('Users') %]</a>
</li>
+ [% END %]
<li [% IF pagename == 'stats' %]class="current"[% END %]>
<a href="/admin/stats">[% loc('Stats') %]</a>
</li>
+ [% IF admin_type == 'dm' %]
+ <li [% IF pagename == 'templates' OR pagename == 'template' %]class="current"[% END %]>
+ <a href="/admin/templates">[% loc('Templates') %]</a>
+ </li>
[% END %]
<li class="search-box">
<form method="get" action="[% c.uri_for('reports') %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
diff --git a/templates/web/zurich/maps/noscript_map.html b/templates/web/zurich/maps/noscript_map.html
new file mode 100644
index 000000000..5c2a2c064
--- /dev/null
+++ b/templates/web/zurich/maps/noscript_map.html
@@ -0,0 +1,70 @@
+<div class="noscript square-map__outer">
+ <div class="square-map__inner">
+ <div id="[% nsm_prefix %]drag">
+ [%- FOR row IN map.tiles -%]
+ [%- FOR tile IN row -%]
+ [%- top_px = tile.row_offset * map.tile_size -%]
+ [%- left_px = tile.col_offset * map.tile_size %]
+ <[% map.img_type %]
+ class="square-map__tile"
+ alt="[% tile.alt %]"
+ id="[% nsm_prefix %]t[% tile.dotted_id %]"
+ name="tile_[% tile.dotted_id %]"
+ src="[% tile.src %]"
+ style="width: [% 100 / map.cols %]%; height: auto; float: left;">
+ [%- END -%]
+ [% END %]
+ </div>
+ <div id="[% nsm_prefix %]pins">[% FOR pin IN map.pins %][% INCLUDE pin %][% END %]</div>
+ [% INCLUDE compass %]
+ </div>
+</div>
+
+[% BLOCK compass %]
+[%
+ north = c.uri_with( { lat = map.compass.north.0, lon = map.compass.north.1, zoom = map.zoom } )
+ south = c.uri_with( { lat = map.compass.south.0, lon = map.compass.south.1, zoom = map.zoom } )
+ east = c.uri_with( { lat = map.compass.east.0, lon = map.compass.east.1, zoom = map.zoom } )
+ west = c.uri_with( { lat = map.compass.west.0, lon = map.compass.west.1, zoom = map.zoom } )
+ world = c.uri_with( { zoom = 0 } );
+ SET zoom_in = c.uri_with( { lat = map.latitude, lon = map.longitude, zoom = map.zoom + 1 } ) IF map.zoom < map.numZoomLevels - 1;
+ SET zoom_out = c.uri_with( { lat = map.latitude, lon = map.longitude, zoom = map.zoom - 1 } ) IF map.zoom > 0;
+ SET zoom_in = '#' IF map.zoom >= map.numZoomLevels - 1;
+ SET zoom_out = '#' IF map.zoom <= 0;
+%]
+<div style="position: absolute; left: 4px; top: 4px;" class="olControlPanZoom olControlNoSelect" unselectable="on">
+ <div style="position: absolute; left: 13px; top: 4px; width: 18px; height: 18px;"><a rel="nofollow" href="[% north %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/north-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 4px; top: 22px; width: 18px; height: 18px;"><a rel="nofollow" href="[% west %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/west-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 22px; top: 22px; width: 18px; height: 18px;"><a rel="nofollow" href="[% east %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/east-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 40px; width: 18px; height: 18px;"><a rel="nofollow" href="[% south %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/south-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 63px; width: 18px; height: 18px;"><a rel="nofollow" href="[% zoom_in %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-plus-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 81px; width: 18px; height: 18px;"><a rel="nofollow" href="[% world %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-world-mini.png" border="0"></a></div>
+ <div style="position: absolute; left: 13px; top: 99px; width: 18px; height: 18px;"><a rel="nofollow" href="[% zoom_out %]"><img style="position: relative; width: 18px; height: 18px;" src="/js/OpenLayers-2.13.1/img/zoom-minus-mini.png" border="0"></a></div>
+</div>
+[% END %]
+
+
+[% BLOCK pin %]
+
+[% IF pin.id %]
+<a title="[% pin.title | html %]" href="[% c.uri_for('/report/' _ pin.id) %]">
+[%- END -%]
+<img
+ data-foo="[% pin.px %],[% pin.py %]/ [% map.tile_size %]*[% map.cols %],[% map.rows %]"
+ border="0"
+ class="pin"
+ src="[% c.uri_for( c.cobrand.path_to_pin_icons _ 'pin-' _ pin.colour _ '.png') %]"
+ alt="[% loc('Problem') %]"
+ style="
+ top: [% pin.py / ( map.tile_size * map.rows ) * 100 %]%;
+ left: [% pin.px / ( map.tile_size * map.cols ) * 100 %]%;
+ position: absolute;
+ margin-left: -24px; /* Half of 48px wide image */
+ margin-top: -64px; /* All of 64px tall image */
+ "
+>
+[%- IF pin.id -%]
+</a>
+[% END %]
+
+[% END %]
diff --git a/templates/web/zurich/report/_item.html b/templates/web/zurich/report/_item.html
index 22b39a2c8..9ba5e6fcb 100644
--- a/templates/web/zurich/report/_item.html
+++ b/templates/web/zurich/report/_item.html
@@ -1,5 +1,5 @@
-<li>
-<a class="text" href="[% c.uri_for('/report', problem.id ) %]">
+<li class="item-list__item item-list--reports__item">
+<a href="[% c.uri_for('/report', problem.id ) %]">
[% IF problem.state != 'unconfirmed' AND problem.photo AND c.cobrand.allow_photo_display(problem);
photo = problem.get_photo_params
%]
diff --git a/templates/web/zurich/report/banner.html b/templates/web/zurich/report/banner.html
index eda70a0de..c10a99ef6 100644
--- a/templates/web/zurich/report/banner.html
+++ b/templates/web/zurich/report/banner.html
@@ -1,17 +1,6 @@
[% USE date %]
-[% BLOCK banner %]
- <div class="banner">
- <p id="[% id %]">[% text %]</p>
- </div>
-[% END %]
-
-[% IF problem.state == 'unconfirmed' %]
- [% INCLUDE banner, id = 'closed', text = loc('Submitted') %]
-[% ELSIF problem.state == 'confirmed' %]
- [% INCLUDE banner, id = 'closed', text = loc('Open') %]
-[% ELSIF problem.is_fixed OR problem.is_closed %]
- [% INCLUDE banner, id = 'fixed', text = loc('Closed') %]
-[% ELSIF problem.state == 'in progress' OR problem.state == 'planned' %]
- [% INCLUDE banner, id = 'progress', text = loc('In progress') %]
-[% END %]
+[% problem_hashref = c.cobrand.problem_as_hashref(problem, c) %]
+<div class="banner">
+ <p id="[% problem_hashref.banner_id %]">[% problem_hashref.state_t %]</p>
+</div>
diff --git a/templates/web/zurich/report/new/fill_in_details_form.html b/templates/web/zurich/report/new/fill_in_details_form.html
index 28d9ebe68..c8c567786 100644
--- a/templates/web/zurich/report/new/fill_in_details_form.html
+++ b/templates/web/zurich/report/new/fill_in_details_form.html
@@ -48,14 +48,17 @@
[% PROCESS "report/new/category_wrapper.html" %]
[% IF c.cobrand.allow_photo_upload %]
- <label for="form_photo">[% loc('Photo') %]</label>
+ <label for="form_photo">
+ [% loc('Photo') %]
+ [% loc('(Defect &amp; location of defect)') %]
+ </label>
[% IF upload_fileid || report.photo %]
[% IF upload_fileid %]
<img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
<input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
[% END %]
- <p>[% loc('You have already attached a photo to this report, attaching another one will replace it.') %]</p>
+ <p>[% loc('You have already attached photos to this report. Note that you can attach a maximum of 3 to this report (if you try to upload more, the oldest will be removed).') %]</p>
[% IF report.photo %]
<img align="right" src="/photo/[% report.id %].jpeg">
@@ -65,7 +68,9 @@
[% IF field_errors.photo %]
<p class='form-error'>[% field_errors.photo %]</p>
[% END %]
- <input type="file" name="photo" id="form_photo">
+ <input type="file" name="photo1" id="form_photo">
+ <input type="file" name="photo2" id="form_photo2">
+ <input type="file" name="photo3" id="form_photo3">
[% END %]
<label for="form_email">[% loc('Your email') %]</label>
@@ -84,7 +89,7 @@
[% IF field_errors.phone %]
<p class='form-error'>[% field_errors.phone %]</p>
[% END %]
- <input type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]">
+ <input type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]" required>
<div class="form-txt-submit-box">
[%# ID of submit_sign_in so name can be option, name of submit_register so it doesn't try and sign us in %]
diff --git a/templates/web/zurich/report/updates.html b/templates/web/zurich/report/updates.html
index 786ecd582..1e835aab7 100644
--- a/templates/web/zurich/report/updates.html
+++ b/templates/web/zurich/report/updates.html
@@ -1,14 +1,14 @@
[% IF problem.state == 'fixed - council' OR problem.state == 'closed' %]
<h4 class="static-with-rule">[% loc('Updates') %]</h4>
- <ul class="issue-list">
+ <ul class="item-list item-list--updates">
<li>
- <div class="update-wrap">
- <div class="update-text">
+ <div class="item-list__update-wrap">
+ <div class="item-list__update-text">
<p class="meta-2">[% prettify_dt( problem.lastupdate, 'zurich' ) %]</p>
- [% IF problem.state == 'fixed - council' %]
+ [%# XXX following should honour zurich_closed_states instead? %]
+ [% IF problem.state == 'fixed - council'
+ || ( problem.external_body AND problem.state == 'closed' ) %]
[% add_links( problem.extra.public_response ) | html_para %]
- [% ELSIF problem.state == 'closed' AND problem.external_body %]
- <p>[% tprintf( loc('Assigned to %s'), problem.body(c).name ) %]</p>
[% END %]
</div>
</div>
diff --git a/templates/web/zurich/reports/index.html b/templates/web/zurich/reports/index.html
index 0ece1ca2c..fd0efcf94 100755
--- a/templates/web/zurich/reports/index.html
+++ b/templates/web/zurich/reports/index.html
@@ -15,7 +15,7 @@
<section class="full-width">
[% IF problems.0 %]
- <ul class="issue-list-a">
+ <ul class="item-list item-list--reports">
[% FOREACH problem IN problems.0 %]
[% INCLUDE 'reports/_list-entry.html' %]
[% END %]
diff --git a/vendor/bin/carton b/vendor/bin/carton
new file mode 100755
index 000000000..b311208a4
--- /dev/null
+++ b/vendor/bin/carton
@@ -0,0 +1,80534 @@
+#!/usr/bin/env perl
+
+# This chunk of stuff was generated by App::FatPacker. To find the original
+# file's code, look for the end of this BEGIN block or the string 'FATPACK'
+BEGIN {
+my %fatpacked;
+
+$fatpacked{"App/cpanminus.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS';
+ package App::cpanminus;
+ our $VERSION = "1.7039";
+
+ =encoding utf8
+
+ =head1 NAME
+
+ App::cpanminus - get, unpack, build and install modules from CPAN
+
+ =head1 SYNOPSIS
+
+ cpanm Module
+
+ Run C<cpanm -h> or C<perldoc cpanm> for more options.
+
+ =head1 DESCRIPTION
+
+ cpanminus is a script to get, unpack, build and install modules from
+ CPAN and does nothing else.
+
+ It's dependency free (can bootstrap itself), requires zero
+ configuration, and stands alone. When running, it requires only 10MB
+ of RAM.
+
+ =head1 INSTALLATION
+
+ There are several ways to install cpanminus to your system.
+
+ =head2 Package management system
+
+ There are Debian packages, RPMs, FreeBSD ports, and packages for other
+ operation systems available. If you want to use the package management system,
+ search for cpanminus and use the appropriate command to install. This makes it
+ easy to install C<cpanm> to your system without thinking about where to
+ install, and later upgrade.
+
+ =head2 Installing to system perl
+
+ You can also use the latest cpanminus to install cpanminus itself:
+
+ curl -L https://cpanmin.us | perl - --sudo App::cpanminus
+
+ This will install C<cpanm> to your bin directory like
+ C</usr/local/bin> and you'll need the C<--sudo> option to write to
+ the directory, unless you configured C<INSTALL_BASE> with L<local::lib>.
+
+ =head2 Installing to local perl (perlbrew, plenv etc.)
+
+ If you have perl in your home directory, which is the case if you use
+ tools like L<perlbrew> or plenv, you don't need the C<--sudo> option, since
+ you're most likely to have a write permission to the perl's library
+ path. You can just do:
+
+ curl -L https://cpanmin.us | perl - App::cpanminus
+
+ to install the C<cpanm> executable to the perl's bin path, like
+ C<~/perl5/perlbrew/bin/cpanm>.
+
+ =head2 Downloading the standalone executable
+
+ You can also copy the standalone executable to whatever location you'd like.
+
+ cd ~/bin
+ curl -L https://cpanmin.us/ -o cpanm
+ chmod +x cpanm
+
+ This just works, but be sure to grab the new version manually when you
+ upgrade because C<--self-upgrade> might not work with this installation setup.
+
+ =head2 Troubleshoot: HTTPS warnings
+
+ When you run C<curl> commands above, you may encounter SSL handshake
+ errors or certification warnings. This is due to your HTTP client
+ (curl) being old, or SSL certificates installed on your system needs
+ to be updated.
+
+ You're recommended to update the software or system if you can. If
+ that is impossible or difficult, use the C<-k> option with curl or an
+ alternative URL, C<https://git.io/cpanm>
+
+ =head1 DEPENDENCIES
+
+ perl 5.8.1 or later.
+
+ =over 4
+
+ =item *
+
+ 'tar' executable (bsdtar or GNU tar version 1.22 are recommended) or Archive::Tar to unpack files.
+
+ =item *
+
+ C compiler, if you want to build XS modules.
+
+ =item *
+
+ make
+
+ =item *
+
+ Module::Build (core in 5.10)
+
+ =back
+
+ =head1 QUESTIONS
+
+ =head2 How does cpanm get/parse/update the CPAN index?
+
+ It queries the CPAN Meta DB site at L<http://cpanmetadb.plackperl.org/>.
+ The site is updated at least every hour to reflect the latest changes
+ from fast syncing mirrors. The script then also falls back to query the
+ module at L<http://metacpan.org/> using its seach API.
+
+ Upon calling these API hosts, cpanm (1.6004 or later) will send the
+ local perl versions to the server in User-Agent string by default. You
+ can turn it off with C<--no-report-perl-version> option. Read more
+ about the option with L<cpanm>, and read more about the privacy policy
+ about this data collection at L<http://cpanmetadb.plackperl.org/#privacy>
+
+ Fetched files are unpacked in C<~/.cpanm> and automatically cleaned up
+ periodically. You can configure the location of this with the
+ C<PERL_CPANM_HOME> environment variable.
+
+ =head2 Where does this install modules to? Do I need root access?
+
+ It installs to wherever ExtUtils::MakeMaker and Module::Build are
+ configured to (via C<PERL_MM_OPT> and C<PERL_MB_OPT>).
+
+ By default, it installs to the site_perl directory that belongs to
+ your perl. You can see the locations for that by running C<perl -V>
+ and it will be likely something under C</opt/local/perl/...> if you're
+ using system perl, or under your home directory if you have built perl
+ yourself using perlbrew or plenv.
+
+ If you've already configured local::lib on your shell, cpanm respects
+ that settings and modules will be installed to your local perl5
+ directory.
+
+ At a boot time, cpanminus checks whether you have already configured
+ local::lib, or have a permission to install modules to the site_perl
+ directory. If neither, i.e. you're using system perl and do not run
+ cpanm as a root, it automatically sets up local::lib compatible
+ installation path in a C<perl5> directory under your home
+ directory.
+
+ To avoid this, run C<cpanm> either as a root user, with C<--sudo>
+ option, or with C<--local-lib> option.
+
+ =head2 cpanminus can't install the module XYZ. Is it a bug?
+
+ It is more likely a problem with the distribution itself. cpanminus
+ doesn't support or may have issues with distributions such as follows:
+
+ =over 4
+
+ =item *
+
+ Tests that require input from STDIN.
+
+ =item *
+
+ Build.PL or Makefile.PL that prompts for input even when
+ C<PERL_MM_USE_DEFAULT> is enabled.
+
+ =item *
+
+ Modules that have invalid numeric values as VERSION (such as C<1.1a>)
+
+ =back
+
+ These failures can be reported back to the author of the module so
+ that they can fix it accordingly, rather than to cpanminus.
+
+ =head2 Does cpanm support the feature XYZ of L<CPAN> and L<CPANPLUS>?
+
+ Most likely not. Here are the things that cpanm doesn't do by
+ itself.
+
+ If you need these features, use L<CPAN>, L<CPANPLUS> or the standalone
+ tools that are mentioned.
+
+ =over 4
+
+ =item *
+
+ CPAN testers reporting. See L<App::cpanminus::reporter>
+
+ =item *
+
+ Building RPM packages from CPAN modules
+
+ =item *
+
+ Listing the outdated modules that needs upgrading. See L<App::cpanoutdated>
+
+ =item *
+
+ Showing the changes of the modules you're about to upgrade. See L<cpan-listchanges>
+
+ =item *
+
+ Patching CPAN modules with distroprefs.
+
+ =back
+
+ See L<cpanm> or C<cpanm -h> to see what cpanminus I<can> do :)
+
+ =head1 COPYRIGHT
+
+ Copyright 2010- Tatsuhiko Miyagawa
+
+ The standalone executable contains the following modules embedded.
+
+ =over 4
+
+ =item L<CPAN::DistnameInfo> Copyright 2003 Graham Barr
+
+ =item L<local::lib> Copyright 2007-2009 Matt S Trout
+
+ =item L<HTTP::Tiny> Copyright 2011 Christian Hansen
+
+ =item L<Module::Metadata> Copyright 2001-2006 Ken Williams. 2010 Matt S Trout
+
+ =item L<version> Copyright 2004-2010 John Peacock
+
+ =item L<JSON::PP> Copyright 2007-2011 by Makamaka Hannyaharamitu
+
+ =item L<CPAN::Meta>, L<CPAN::Meta::Requirements> Copyright (c) 2010 by David Golden and Ricardo Signes
+
+ =item L<CPAN::Meta::YAML> Copyright 2010 Adam Kennedy
+
+ =item L<File::pushd> Copyright 2012 David Golden
+
+ =back
+
+ =head1 LICENSE
+
+ This software is licensed under the same terms as Perl.
+
+ =head1 CREDITS
+
+ =head2 CONTRIBUTORS
+
+ Patches and code improvements were contributed by:
+
+ Goro Fuji, Kazuhiro Osawa, Tokuhiro Matsuno, Kenichi Ishigaki, Ian
+ Wells, Pedro Melo, Masayoshi Sekimura, Matt S Trout (mst), squeeky,
+ horus and Ingy dot Net.
+
+ =head2 ACKNOWLEDGEMENTS
+
+ Bug reports, suggestions and feedbacks were sent by, or general
+ acknowledgement goes to:
+
+ Jesse Vincent, David Golden, Andreas Koenig, Jos Boumans, Chris
+ Williams, Adam Kennedy, Audrey Tang, J. Shirley, Chris Prather, Jesse
+ Luehrs, Marcus Ramberg, Shawn M Moore, chocolateboy, Chirs Nehren,
+ Jonathan Rockway, Leon Brocard, Simon Elliott, Ricardo Signes, AEvar
+ Arnfjord Bjarmason, Eric Wilhelm, Florian Ragwitz and xaicron.
+
+ =head1 COMMUNITY
+
+ =over 4
+
+ =item L<http://github.com/miyagawa/cpanminus> - source code repository, issue tracker
+
+ =item L<irc://irc.perl.org/#toolchain> - discussions about Perl toolchain. I'm there.
+
+ =back
+
+ =head1 NO WARRANTY
+
+ This software is provided "as-is," without any express or implied
+ warranty. In no event shall the author be held liable for any damages
+ arising from the use of the software.
+
+ =head1 SEE ALSO
+
+ L<CPAN> L<CPANPLUS> L<pip>
+
+ =cut
+
+ 1;
+APP_CPANMINUS
+
+$fatpacked{"App/cpanminus/fatscript.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS_FATSCRIPT';
+ package App::cpanminus::fatscript;
+ #
+ # This is a pre-compiled source code for the cpanm (cpanminus) program.
+ # For more details about how to install cpanm, go to the following URL:
+ #
+ # https://github.com/miyagawa/cpanminus
+ #
+ # Quickstart: Run the following command and it will install itself for
+ # you. You might want to run it as a root with sudo if you want to install
+ # to places like /usr/local/bin.
+ #
+ # % curl -L https://cpanmin.us | perl - App::cpanminus
+ #
+ # If you don't have curl but wget, replace `curl -L` with `wget -O -`.
+
+ # DO NOT EDIT -- this is an auto generated file
+
+ # This chunk of stuff was generated by App::FatPacker. To find the original
+ # file's code, look for the end of this BEGIN block or the string 'FATPACK'
+ BEGIN {
+ my %fatpacked;
+
+ $fatpacked{"App/cpanminus.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS';
+ package App::cpanminus;
+ our $VERSION = "1.7039";
+
+ =encoding utf8
+
+ =head1 NAME
+
+ App::cpanminus - get, unpack, build and install modules from CPAN
+
+ =head1 SYNOPSIS
+
+ cpanm Module
+
+ Run C<cpanm -h> or C<perldoc cpanm> for more options.
+
+ =head1 DESCRIPTION
+
+ cpanminus is a script to get, unpack, build and install modules from
+ CPAN and does nothing else.
+
+ It's dependency free (can bootstrap itself), requires zero
+ configuration, and stands alone. When running, it requires only 10MB
+ of RAM.
+
+ =head1 INSTALLATION
+
+ There are several ways to install cpanminus to your system.
+
+ =head2 Package management system
+
+ There are Debian packages, RPMs, FreeBSD ports, and packages for other
+ operation systems available. If you want to use the package management system,
+ search for cpanminus and use the appropriate command to install. This makes it
+ easy to install C<cpanm> to your system without thinking about where to
+ install, and later upgrade.
+
+ =head2 Installing to system perl
+
+ You can also use the latest cpanminus to install cpanminus itself:
+
+ curl -L https://cpanmin.us | perl - --sudo App::cpanminus
+
+ This will install C<cpanm> to your bin directory like
+ C</usr/local/bin> and you'll need the C<--sudo> option to write to
+ the directory, unless you configured C<INSTALL_BASE> with L<local::lib>.
+
+ =head2 Installing to local perl (perlbrew, plenv etc.)
+
+ If you have perl in your home directory, which is the case if you use
+ tools like L<perlbrew> or plenv, you don't need the C<--sudo> option, since
+ you're most likely to have a write permission to the perl's library
+ path. You can just do:
+
+ curl -L https://cpanmin.us | perl - App::cpanminus
+
+ to install the C<cpanm> executable to the perl's bin path, like
+ C<~/perl5/perlbrew/bin/cpanm>.
+
+ =head2 Downloading the standalone executable
+
+ You can also copy the standalone executable to whatever location you'd like.
+
+ cd ~/bin
+ curl -L https://cpanmin.us/ -o cpanm
+ chmod +x cpanm
+
+ This just works, but be sure to grab the new version manually when you
+ upgrade because C<--self-upgrade> might not work with this installation setup.
+
+ =head2 Troubleshoot: HTTPS warnings
+
+ When you run C<curl> commands above, you may encounter SSL handshake
+ errors or certification warnings. This is due to your HTTP client
+ (curl) being old, or SSL certificates installed on your system needs
+ to be updated.
+
+ You're recommended to update the software or system if you can. If
+ that is impossible or difficult, use the C<-k> option with curl or an
+ alternative URL, C<https://git.io/cpanm>
+
+ =head1 DEPENDENCIES
+
+ perl 5.8.1 or later.
+
+ =over 4
+
+ =item *
+
+ 'tar' executable (bsdtar or GNU tar version 1.22 are recommended) or Archive::Tar to unpack files.
+
+ =item *
+
+ C compiler, if you want to build XS modules.
+
+ =item *
+
+ make
+
+ =item *
+
+ Module::Build (core in 5.10)
+
+ =back
+
+ =head1 QUESTIONS
+
+ =head2 How does cpanm get/parse/update the CPAN index?
+
+ It queries the CPAN Meta DB site at L<http://cpanmetadb.plackperl.org/>.
+ The site is updated at least every hour to reflect the latest changes
+ from fast syncing mirrors. The script then also falls back to query the
+ module at L<http://metacpan.org/> using its seach API.
+
+ Upon calling these API hosts, cpanm (1.6004 or later) will send the
+ local perl versions to the server in User-Agent string by default. You
+ can turn it off with C<--no-report-perl-version> option. Read more
+ about the option with L<cpanm>, and read more about the privacy policy
+ about this data collection at L<http://cpanmetadb.plackperl.org/#privacy>
+
+ Fetched files are unpacked in C<~/.cpanm> and automatically cleaned up
+ periodically. You can configure the location of this with the
+ C<PERL_CPANM_HOME> environment variable.
+
+ =head2 Where does this install modules to? Do I need root access?
+
+ It installs to wherever ExtUtils::MakeMaker and Module::Build are
+ configured to (via C<PERL_MM_OPT> and C<PERL_MB_OPT>).
+
+ By default, it installs to the site_perl directory that belongs to
+ your perl. You can see the locations for that by running C<perl -V>
+ and it will be likely something under C</opt/local/perl/...> if you're
+ using system perl, or under your home directory if you have built perl
+ yourself using perlbrew or plenv.
+
+ If you've already configured local::lib on your shell, cpanm respects
+ that settings and modules will be installed to your local perl5
+ directory.
+
+ At a boot time, cpanminus checks whether you have already configured
+ local::lib, or have a permission to install modules to the site_perl
+ directory. If neither, i.e. you're using system perl and do not run
+ cpanm as a root, it automatically sets up local::lib compatible
+ installation path in a C<perl5> directory under your home
+ directory.
+
+ To avoid this, run C<cpanm> either as a root user, with C<--sudo>
+ option, or with C<--local-lib> option.
+
+ =head2 cpanminus can't install the module XYZ. Is it a bug?
+
+ It is more likely a problem with the distribution itself. cpanminus
+ doesn't support or may have issues with distributions such as follows:
+
+ =over 4
+
+ =item *
+
+ Tests that require input from STDIN.
+
+ =item *
+
+ Build.PL or Makefile.PL that prompts for input even when
+ C<PERL_MM_USE_DEFAULT> is enabled.
+
+ =item *
+
+ Modules that have invalid numeric values as VERSION (such as C<1.1a>)
+
+ =back
+
+ These failures can be reported back to the author of the module so
+ that they can fix it accordingly, rather than to cpanminus.
+
+ =head2 Does cpanm support the feature XYZ of L<CPAN> and L<CPANPLUS>?
+
+ Most likely not. Here are the things that cpanm doesn't do by
+ itself.
+
+ If you need these features, use L<CPAN>, L<CPANPLUS> or the standalone
+ tools that are mentioned.
+
+ =over 4
+
+ =item *
+
+ CPAN testers reporting. See L<App::cpanminus::reporter>
+
+ =item *
+
+ Building RPM packages from CPAN modules
+
+ =item *
+
+ Listing the outdated modules that needs upgrading. See L<App::cpanoutdated>
+
+ =item *
+
+ Showing the changes of the modules you're about to upgrade. See L<cpan-listchanges>
+
+ =item *
+
+ Patching CPAN modules with distroprefs.
+
+ =back
+
+ See L<cpanm> or C<cpanm -h> to see what cpanminus I<can> do :)
+
+ =head1 COPYRIGHT
+
+ Copyright 2010- Tatsuhiko Miyagawa
+
+ The standalone executable contains the following modules embedded.
+
+ =over 4
+
+ =item L<CPAN::DistnameInfo> Copyright 2003 Graham Barr
+
+ =item L<local::lib> Copyright 2007-2009 Matt S Trout
+
+ =item L<HTTP::Tiny> Copyright 2011 Christian Hansen
+
+ =item L<Module::Metadata> Copyright 2001-2006 Ken Williams. 2010 Matt S Trout
+
+ =item L<version> Copyright 2004-2010 John Peacock
+
+ =item L<JSON::PP> Copyright 2007-2011 by Makamaka Hannyaharamitu
+
+ =item L<CPAN::Meta>, L<CPAN::Meta::Requirements> Copyright (c) 2010 by David Golden and Ricardo Signes
+
+ =item L<CPAN::Meta::YAML> Copyright 2010 Adam Kennedy
+
+ =item L<File::pushd> Copyright 2012 David Golden
+
+ =back
+
+ =head1 LICENSE
+
+ This software is licensed under the same terms as Perl.
+
+ =head1 CREDITS
+
+ =head2 CONTRIBUTORS
+
+ Patches and code improvements were contributed by:
+
+ Goro Fuji, Kazuhiro Osawa, Tokuhiro Matsuno, Kenichi Ishigaki, Ian
+ Wells, Pedro Melo, Masayoshi Sekimura, Matt S Trout (mst), squeeky,
+ horus and Ingy dot Net.
+
+ =head2 ACKNOWLEDGEMENTS
+
+ Bug reports, suggestions and feedbacks were sent by, or general
+ acknowledgement goes to:
+
+ Jesse Vincent, David Golden, Andreas Koenig, Jos Boumans, Chris
+ Williams, Adam Kennedy, Audrey Tang, J. Shirley, Chris Prather, Jesse
+ Luehrs, Marcus Ramberg, Shawn M Moore, chocolateboy, Chirs Nehren,
+ Jonathan Rockway, Leon Brocard, Simon Elliott, Ricardo Signes, AEvar
+ Arnfjord Bjarmason, Eric Wilhelm, Florian Ragwitz and xaicron.
+
+ =head1 COMMUNITY
+
+ =over 4
+
+ =item L<http://github.com/miyagawa/cpanminus> - source code repository, issue tracker
+
+ =item L<irc://irc.perl.org/#toolchain> - discussions about Perl toolchain. I'm there.
+
+ =back
+
+ =head1 NO WARRANTY
+
+ This software is provided "as-is," without any express or implied
+ warranty. In no event shall the author be held liable for any damages
+ arising from the use of the software.
+
+ =head1 SEE ALSO
+
+ L<CPAN> L<CPANPLUS> L<pip>
+
+ =cut
+
+ 1;
+ APP_CPANMINUS
+
+ $fatpacked{"App/cpanminus/Dependency.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS_DEPENDENCY';
+ package App::cpanminus::Dependency;
+ use strict;
+ use CPAN::Meta::Requirements;
+
+ sub from_prereqs {
+ my($class, $prereqs, $phases, $types) = @_;
+
+ my @deps;
+ for my $type (@$types) {
+ push @deps, $class->from_versions(
+ $prereqs->merged_requirements($phases, [$type])->as_string_hash,
+ $type,
+ );
+ }
+
+ return @deps;
+ }
+
+ sub from_versions {
+ my($class, $versions, $type) = @_;
+
+ my @deps;
+ while (my($module, $version) = each %$versions) {
+ push @deps, $class->new($module, $version, $type)
+ }
+
+ @deps;
+ }
+
+ sub merge_with {
+ my($self, $requirements) = @_;
+
+ # save the original requirement
+ $self->{original_version} = $self->version;
+
+ # should it clone? not cloning means we upgrade root $requirements on our way
+ eval {
+ $requirements->add_string_requirement($self->module, $self->version);
+ };
+ if ($@ =~ /illegal requirements/) {
+ # Just give a warning then replace with the root requirements
+ # so that later CPAN::Meta::Check can give a valid error
+ warn sprintf("Can't merge requirements for %s: '%s' and '%s'",
+ $self->module, $self->version,
+ $requirements->requirements_for_module($self->module));
+ }
+
+ $self->{version} = $requirements->requirements_for_module($self->module);
+ }
+
+ sub new {
+ my($class, $module, $version, $type) = @_;
+
+ bless {
+ module => $module,
+ version => $version,
+ type => $type || 'requires',
+ }, $class;
+ }
+
+ sub module { $_[0]->{module} }
+ sub version { $_[0]->{version} }
+ sub type { $_[0]->{type} }
+
+ sub requires_version {
+ my $self = shift;
+
+ # original_version may be 0
+ if (defined $self->{original_version}) {
+ return $self->{original_version};
+ }
+
+ $self->version;
+ }
+
+ sub is_requirement {
+ $_[0]->{type} eq 'requires';
+ }
+
+ 1;
+ APP_CPANMINUS_DEPENDENCY
+
+ $fatpacked{"App/cpanminus/script.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_CPANMINUS_SCRIPT';
+ package App::cpanminus::script;
+ use strict;
+ use Config;
+ use Cwd ();
+ use App::cpanminus;
+ use App::cpanminus::Dependency;
+ use File::Basename ();
+ use File::Find ();
+ use File::Path ();
+ use File::Spec ();
+ use File::Copy ();
+ use File::Temp ();
+ use Getopt::Long ();
+ use Symbol ();
+ use String::ShellQuote ();
+ use version ();
+
+ use constant WIN32 => $^O eq 'MSWin32';
+ use constant BAD_TAR => ($^O eq 'solaris' || $^O eq 'hpux');
+ use constant CAN_SYMLINK => eval { symlink("", ""); 1 };
+
+ our $VERSION = $App::cpanminus::VERSION;
+
+ if ($INC{"App/FatPacker/Trace.pm"}) {
+ require version::vpp;
+ }
+
+ my $quote = WIN32 ? q/"/ : q/'/;
+
+ sub agent {
+ my $self = shift;
+ my $agent = "cpanminus/$VERSION";
+ $agent .= " perl/$]" if $self->{report_perl_version};
+ $agent;
+ }
+
+ sub determine_home {
+ my $class = shift;
+
+ my $homedir = $ENV{HOME}
+ || eval { require File::HomeDir; File::HomeDir->my_home }
+ || join('', @ENV{qw(HOMEDRIVE HOMEPATH)}); # Win32
+
+ if (WIN32) {
+ require Win32; # no fatpack
+ $homedir = Win32::GetShortPathName($homedir);
+ }
+
+ return "$homedir/.cpanm";
+ }
+
+ sub new {
+ my $class = shift;
+
+ bless {
+ home => $class->determine_home,
+ cmd => 'install',
+ seen => {},
+ notest => undef,
+ test_only => undef,
+ installdeps => undef,
+ force => undef,
+ sudo => undef,
+ make => undef,
+ verbose => undef,
+ quiet => undef,
+ interactive => undef,
+ log => undef,
+ mirrors => [],
+ mirror_only => undef,
+ mirror_index => undef,
+ cpanmetadb => "http://cpanmetadb.plackperl.org/v1.0/",
+ perl => $^X,
+ argv => [],
+ local_lib => undef,
+ self_contained => undef,
+ exclude_vendor => undef,
+ prompt_timeout => 0,
+ prompt => undef,
+ configure_timeout => 60,
+ build_timeout => 3600,
+ test_timeout => 1800,
+ try_lwp => 1,
+ try_wget => 1,
+ try_curl => 1,
+ uninstall_shadows => ($] < 5.012),
+ skip_installed => 1,
+ skip_satisfied => 0,
+ auto_cleanup => 7, # days
+ pod2man => 1,
+ installed_dists => 0,
+ install_types => ['requires'],
+ with_develop => 0,
+ showdeps => 0,
+ scandeps => 0,
+ scandeps_tree => [],
+ format => 'tree',
+ save_dists => undef,
+ skip_configure => 0,
+ verify => 0,
+ report_perl_version => !$class->maybe_ci,
+ build_args => {},
+ features => {},
+ pure_perl => 0,
+ cpanfile_path => 'cpanfile',
+ @_,
+ }, $class;
+ }
+
+ sub env {
+ my($self, $key) = @_;
+ $ENV{"PERL_CPANM_" . $key};
+ }
+
+ sub maybe_ci {
+ my $class = shift;
+ grep $ENV{$_}, qw( TRAVIS CI AUTOMATED_TESTING AUTHOR_TESTING );
+ }
+
+ sub install_type_handlers {
+ my $self = shift;
+
+ my @handlers;
+ for my $type (qw( recommends suggests )) {
+ push @handlers, "with-$type" => sub {
+ my %uniq;
+ $self->{install_types} = [ grep !$uniq{$_}++, @{$self->{install_types}}, $type ];
+ };
+ push @handlers, "without-$type" => sub {
+ $self->{install_types} = [ grep $_ ne $type, @{$self->{install_types}} ];
+ };
+ }
+
+ @handlers;
+ }
+
+ sub build_args_handlers {
+ my $self = shift;
+
+ my @handlers;
+ for my $phase (qw( configure build test install )) {
+ push @handlers, "$phase-args=s" => \($self->{build_args}{$phase});
+ }
+
+ @handlers;
+ }
+
+ sub parse_options {
+ my $self = shift;
+
+ local @ARGV = @{$self->{argv}};
+ push @ARGV, grep length, split /\s+/, $self->env('OPT');
+ push @ARGV, @_;
+
+ Getopt::Long::Configure("bundling");
+ Getopt::Long::GetOptions(
+ 'f|force' => sub { $self->{skip_installed} = 0; $self->{force} = 1 },
+ 'n|notest!' => \$self->{notest},
+ 'test-only' => sub { $self->{notest} = 0; $self->{skip_installed} = 0; $self->{test_only} = 1 },
+ 'S|sudo!' => \$self->{sudo},
+ 'v|verbose' => \$self->{verbose},
+ 'verify!' => \$self->{verify},
+ 'q|quiet!' => \$self->{quiet},
+ 'h|help' => sub { $self->{action} = 'show_help' },
+ 'V|version' => sub { $self->{action} = 'show_version' },
+ 'perl=s' => sub {
+ $self->diag("--perl is deprecated since it's known to be fragile in figuring out dependencies. Run `$_[1] -S cpanm` instead.\n", 1);
+ $self->{perl} = $_[1];
+ },
+ 'l|local-lib=s' => sub { $self->{local_lib} = $self->maybe_abs($_[1]) },
+ 'L|local-lib-contained=s' => sub {
+ $self->{local_lib} = $self->maybe_abs($_[1]);
+ $self->{self_contained} = 1;
+ $self->{pod2man} = undef;
+ },
+ 'self-contained!' => \$self->{self_contained},
+ 'exclude-vendor!' => \$self->{exclude_vendor},
+ 'mirror=s@' => $self->{mirrors},
+ 'mirror-only!' => \$self->{mirror_only},
+ 'mirror-index=s' => sub { $self->{mirror_index} = $self->maybe_abs($_[1]) },
+ 'M|from=s' => sub {
+ $self->{mirrors} = [$_[1]];
+ $self->{mirror_only} = 1;
+ },
+ 'cpanmetadb=s' => \$self->{cpanmetadb},
+ 'cascade-search!' => \$self->{cascade_search},
+ 'prompt!' => \$self->{prompt},
+ 'installdeps' => \$self->{installdeps},
+ 'skip-installed!' => \$self->{skip_installed},
+ 'skip-satisfied!' => \$self->{skip_satisfied},
+ 'reinstall' => sub { $self->{skip_installed} = 0 },
+ 'interactive!' => \$self->{interactive},
+ 'i|install' => sub { $self->{cmd} = 'install' },
+ 'info' => sub { $self->{cmd} = 'info' },
+ 'look' => sub { $self->{cmd} = 'look'; $self->{skip_installed} = 0 },
+ 'U|uninstall' => sub { $self->{cmd} = 'uninstall' },
+ 'self-upgrade' => sub { $self->{action} = 'self_upgrade' },
+ 'uninst-shadows!' => \$self->{uninstall_shadows},
+ 'lwp!' => \$self->{try_lwp},
+ 'wget!' => \$self->{try_wget},
+ 'curl!' => \$self->{try_curl},
+ 'auto-cleanup=s' => \$self->{auto_cleanup},
+ 'man-pages!' => \$self->{pod2man},
+ 'scandeps' => \$self->{scandeps},
+ 'showdeps' => sub { $self->{showdeps} = 1; $self->{skip_installed} = 0 },
+ 'format=s' => \$self->{format},
+ 'save-dists=s' => sub {
+ $self->{save_dists} = $self->maybe_abs($_[1]);
+ },
+ 'skip-configure!' => \$self->{skip_configure},
+ 'dev!' => \$self->{dev_release},
+ 'metacpan!' => \$self->{metacpan},
+ 'report-perl-version!' => \$self->{report_perl_version},
+ 'configure-timeout=i' => \$self->{configure_timeout},
+ 'build-timeout=i' => \$self->{build_timeout},
+ 'test-timeout=i' => \$self->{test_timeout},
+ 'with-develop' => \$self->{with_develop},
+ 'without-develop' => sub { $self->{with_develop} = 0 },
+ 'with-feature=s' => sub { $self->{features}{$_[1]} = 1 },
+ 'without-feature=s' => sub { $self->{features}{$_[1]} = 0 },
+ 'with-all-features' => sub { $self->{features}{__all} = 1 },
+ 'pp|pureperl!' => \$self->{pure_perl},
+ "cpanfile=s" => \$self->{cpanfile_path},
+ $self->install_type_handlers,
+ $self->build_args_handlers,
+ );
+
+ if (!@ARGV && $0 ne '-' && !-t STDIN){ # e.g. # cpanm < author/requires.cpanm
+ push @ARGV, $self->load_argv_from_fh(\*STDIN);
+ $self->{load_from_stdin} = 1;
+ }
+
+ $self->{argv} = \@ARGV;
+ }
+
+ sub check_upgrade {
+ my $self = shift;
+ my $install_base = $ENV{PERL_LOCAL_LIB_ROOT} ? $self->local_lib_target($ENV{PERL_LOCAL_LIB_ROOT}) : $Config{installsitebin};
+ if ($0 eq '-') {
+ # run from curl, that's fine
+ return;
+ } elsif ($0 !~ /^$install_base/) {
+ if ($0 =~ m!perlbrew/bin!) {
+ die <<DIE;
+ It appears your cpanm executable was installed via `perlbrew install-cpanm`.
+ cpanm --self-upgrade won't upgrade the version of cpanm you're running.
+
+ Run the following command to get it upgraded.
+
+ perlbrew install-cpanm
+
+ DIE
+ } else {
+ die <<DIE;
+ You are running cpanm from the path where your current perl won't install executables to.
+ Because of that, cpanm --self-upgrade won't upgrade the version of cpanm you're running.
+
+ cpanm path : $0
+ Install path : $Config{installsitebin}
+
+ It means you either installed cpanm globally with system perl, or use distro packages such
+ as rpm or apt-get, and you have to use them again to upgrade cpanm.
+ DIE
+ }
+ }
+ }
+
+ sub check_libs {
+ my $self = shift;
+ return if $self->{_checked}++;
+ $self->bootstrap_local_lib;
+ }
+
+ sub setup_verify {
+ my $self = shift;
+
+ my $has_modules = eval { require Module::Signature; require Digest::SHA; 1 };
+ $self->{cpansign} = $self->which('cpansign');
+
+ unless ($has_modules && $self->{cpansign}) {
+ warn "WARNING: Module::Signature and Digest::SHA is required for distribution verifications.\n";
+ $self->{verify} = 0;
+ }
+ }
+
+ sub parse_module_args {
+ my($self, $module) = @_;
+
+ # Plack@1.2 -> Plack~"==1.2"
+ # BUT don't expand @ in git URLs
+ $module =~ s/^([A-Za-z0-9_:]+)@([v\d\._]+)$/$1~== $2/;
+
+ # Plack~1.20, DBI~"> 1.0, <= 2.0"
+ if ($module =~ /\~[v\d\._,\!<>= ]+$/) {
+ return split /\~/, $module, 2;
+ } else {
+ return $module, undef;
+ }
+ }
+
+ sub doit {
+ my $self = shift;
+
+ my $code;
+ eval {
+ $code = ($self->_doit == 0);
+ }; if (my $e = $@) {
+ warn $e;
+ $code = 1;
+ }
+
+ return $code;
+ }
+
+ sub _doit {
+ my $self = shift;
+
+ $self->setup_home;
+ $self->init_tools;
+ $self->setup_verify if $self->{verify};
+
+ if (my $action = $self->{action}) {
+ $self->$action() and return 1;
+ }
+
+ return $self->show_help(1)
+ unless @{$self->{argv}} or $self->{load_from_stdin};
+
+ $self->configure_mirrors;
+
+ my $cwd = Cwd::cwd;
+
+ my @fail;
+ for my $module (@{$self->{argv}}) {
+ if ($module =~ s/\.pm$//i) {
+ my ($volume, $dirs, $file) = File::Spec->splitpath($module);
+ $module = join '::', grep { $_ } File::Spec->splitdir($dirs), $file;
+ }
+ ($module, my $version) = $self->parse_module_args($module);
+
+ $self->chdir($cwd);
+ if ($self->{cmd} eq 'uninstall') {
+ $self->uninstall_module($module)
+ or push @fail, $module;
+ } else {
+ $self->install_module($module, 0, $version)
+ or push @fail, $module;
+ }
+ }
+
+ if ($self->{base} && $self->{auto_cleanup}) {
+ $self->cleanup_workdirs;
+ }
+
+ if ($self->{installed_dists}) {
+ my $dists = $self->{installed_dists} > 1 ? "distributions" : "distribution";
+ $self->diag("$self->{installed_dists} $dists installed\n", 1);
+ }
+
+ if ($self->{scandeps}) {
+ $self->dump_scandeps();
+ }
+ # Workaround for older File::Temp's
+ # where creating a tempdir with an implicit $PWD
+ # causes tempdir non-cleanup if $PWD changes
+ # as paths are stored internally without being resolved
+ # absolutely.
+ # https://rt.cpan.org/Public/Bug/Display.html?id=44924
+ $self->chdir($cwd);
+
+ return !@fail;
+ }
+
+ sub setup_home {
+ my $self = shift;
+
+ $self->{home} = $self->env('HOME') if $self->env('HOME');
+
+ unless (_writable($self->{home})) {
+ die "Can't write to cpanm home '$self->{home}': You should fix it with chown/chmod first.\n";
+ }
+
+ $self->{base} = "$self->{home}/work/" . time . ".$$";
+ File::Path::mkpath([ $self->{base} ], 0, 0777);
+
+ # native path because we use shell redirect
+ $self->{log} = File::Spec->catfile($self->{base}, "build.log");
+ my $final_log = "$self->{home}/build.log";
+
+ { open my $out, ">$self->{log}" or die "$self->{log}: $!" }
+
+ if (CAN_SYMLINK) {
+ my $build_link = "$self->{home}/latest-build";
+ unlink $build_link;
+ symlink $self->{base}, $build_link;
+
+ unlink $final_log;
+ symlink $self->{log}, $final_log;
+ } else {
+ my $log = $self->{log}; my $home = $self->{home};
+ $self->{at_exit} = sub {
+ my $self = shift;
+ my $temp_log = "$home/build.log." . time . ".$$";
+ File::Copy::copy($log, $temp_log)
+ && unlink($final_log);
+ rename($temp_log, $final_log);
+ }
+ }
+
+ $self->chat("cpanm (App::cpanminus) $VERSION on perl $] built for $Config{archname}\n" .
+ "Work directory is $self->{base}\n");
+ }
+
+ sub package_index_for {
+ my ($self, $mirror) = @_;
+ return $self->source_for($mirror) . "/02packages.details.txt";
+ }
+
+ sub generate_mirror_index {
+ my ($self, $mirror) = @_;
+ my $file = $self->package_index_for($mirror);
+ my $gz_file = $file . '.gz';
+ my $index_mtime = (stat $gz_file)[9];
+
+ unless (-e $file && (stat $file)[9] >= $index_mtime) {
+ $self->chat("Uncompressing index file...\n");
+ if (eval {require Compress::Zlib}) {
+ my $gz = Compress::Zlib::gzopen($gz_file, "rb")
+ or do { $self->diag_fail("$Compress::Zlib::gzerrno opening compressed index"); return};
+ open my $fh, '>', $file
+ or do { $self->diag_fail("$! opening uncompressed index for write"); return };
+ my $buffer;
+ while (my $status = $gz->gzread($buffer)) {
+ if ($status < 0) {
+ $self->diag_fail($gz->gzerror . " reading compressed index");
+ return;
+ }
+ print $fh $buffer;
+ }
+ } else {
+ if (system("gunzip -c $gz_file > $file")) {
+ $self->diag_fail("Cannot uncompress -- please install gunzip or Compress::Zlib");
+ return;
+ }
+ }
+ utime $index_mtime, $index_mtime, $file;
+ }
+ return 1;
+ }
+
+ sub search_mirror_index {
+ my ($self, $mirror, $module, $version) = @_;
+ $self->search_mirror_index_file($self->package_index_for($mirror), $module, $version);
+ }
+
+ sub search_mirror_index_file {
+ my($self, $file, $module, $version) = @_;
+
+ open my $fh, '<', $file or return;
+ my $found;
+ while (<$fh>) {
+ if (m!^\Q$module\E\s+([\w\.]+)\s+(\S*)!m) {
+ $found = $self->cpan_module($module, $2, $1);
+ last;
+ }
+ }
+
+ return $found unless $self->{cascade_search};
+
+ if ($found) {
+ if ($self->satisfy_version($module, $found->{module_version}, $version)) {
+ return $found;
+ } else {
+ $self->chat("Found $module $found->{module_version} which doesn't satisfy $version.\n");
+ }
+ }
+
+ return;
+ }
+
+ sub with_version_range {
+ my($self, $version) = @_;
+ defined($version) && $version =~ /(?:<|!=|==)/;
+ }
+
+ sub encode_json {
+ my($self, $data) = @_;
+ require JSON::PP;
+
+ my $json = JSON::PP::encode_json($data);
+ $json =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
+ $json;
+ }
+
+ # TODO extract this as a module?
+ sub version_to_query {
+ my($self, $module, $version) = @_;
+
+ require CPAN::Meta::Requirements;
+
+ my $requirements = CPAN::Meta::Requirements->new;
+ $requirements->add_string_requirement($module, $version || '0');
+
+ my $req = $requirements->requirements_for_module($module);
+
+ if ($req =~ s/^==\s*//) {
+ return {
+ term => { 'module.version' => $req },
+ };
+ } elsif ($req !~ /\s/) {
+ return {
+ range => { 'module.version_numified' => { 'gte' => $self->numify_ver_metacpan($req) } },
+ };
+ } else {
+ my %ops = qw(< lt <= lte > gt >= gte);
+ my(%range, @exclusion);
+ my @requirements = split /,\s*/, $req;
+ for my $r (@requirements) {
+ if ($r =~ s/^([<>]=?)\s*//) {
+ $range{$ops{$1}} = $self->numify_ver_metacpan($r);
+ } elsif ($r =~ s/\!=\s*//) {
+ push @exclusion, $self->numify_ver_metacpan($r);
+ }
+ }
+
+ my @filters= (
+ { range => { 'module.version_numified' => \%range } },
+ );
+
+ if (@exclusion) {
+ push @filters, {
+ not => { or => [ map { +{ term => { 'module.version_numified' => $self->numify_ver_metacpan($_) } } } @exclusion ] },
+ };
+ }
+
+ return @filters;
+ }
+ }
+
+ # Apparently MetaCPAN numifies devel releases by stripping _ first
+ sub numify_ver_metacpan {
+ my($self, $ver) = @_;
+ $ver =~ s/_//g;
+ version->new($ver)->numify;
+ }
+
+ # version->new("1.00_00")->numify => "1.00_00" :/
+ sub numify_ver {
+ my($self, $ver) = @_;
+ eval version->new($ver)->numify;
+ }
+
+ sub maturity_filter {
+ my($self, $module, $version) = @_;
+
+ if ($version =~ /==/) {
+ # specific version: allow dev release
+ return;
+ } elsif ($self->{dev_release}) {
+ # backpan'ed dev releases are considered cancelled
+ return +{ not => { term => { status => 'backpan' } } };
+ } else {
+ return (
+ { not => { term => { status => 'backpan' } } },
+ { term => { maturity => 'released' } },
+ );
+ }
+ }
+
+ sub by_version {
+ my %s = qw( latest 3 cpan 2 backpan 1 );
+ $b->{_score} <=> $a->{_score} || # version: higher version that satisfies the query
+ $s{ $b->{fields}{status} } <=> $s{ $a->{fields}{status} }; # prefer non-BackPAN dist
+ }
+
+ sub by_first_come {
+ $a->{fields}{date} cmp $b->{fields}{date}; # first one wins, if all are in BackPAN/CPAN
+ }
+
+ sub by_date {
+ $b->{fields}{date} cmp $a->{fields}{date}; # prefer new uploads, when searching for dev
+ }
+
+ sub find_best_match {
+ my($self, $match, $version) = @_;
+ return unless $match && @{$match->{hits}{hits} || []};
+ my @hits = $self->{dev_release}
+ ? sort { by_version || by_date } @{$match->{hits}{hits}}
+ : sort { by_version || by_first_come } @{$match->{hits}{hits}};
+ $hits[0]->{fields};
+ }
+
+ sub search_metacpan {
+ my($self, $module, $version) = @_;
+
+ require JSON::PP;
+
+ $self->chat("Searching $module ($version) on metacpan ...\n");
+
+ my $metacpan_uri = 'http://api.metacpan.org/v0';
+
+ my @filter = $self->maturity_filter($module, $version);
+
+ my $query = { filtered => {
+ (@filter ? (filter => { and => \@filter }) : ()),
+ query => { nested => {
+ score_mode => 'max',
+ path => 'module',
+ query => { custom_score => {
+ metacpan_script => "score_version_numified",
+ query => { constant_score => {
+ filter => { and => [
+ { term => { 'module.authorized' => JSON::PP::true() } },
+ { term => { 'module.indexed' => JSON::PP::true() } },
+ { term => { 'module.name' => $module } },
+ $self->version_to_query($module, $version),
+ ] }
+ } },
+ } },
+ } },
+ } };
+
+ my $module_uri = "$metacpan_uri/file/_search?source=";
+ $module_uri .= $self->encode_json({
+ query => $query,
+ fields => [ 'date', 'release', 'author', 'module', 'status' ],
+ });
+
+ my($release, $author, $module_version);
+
+ my $module_json = $self->get($module_uri);
+ my $module_meta = eval { JSON::PP::decode_json($module_json) };
+ my $match = $self->find_best_match($module_meta);
+ if ($match) {
+ $release = $match->{release};
+ $author = $match->{author};
+ my $module_matched = (grep { $_->{name} eq $module } @{$match->{module}})[0];
+ $module_version = $module_matched->{version};
+ }
+
+ unless ($release) {
+ $self->chat("! Could not find a release matching $module ($version) on MetaCPAN.\n");
+ return;
+ }
+
+ my $dist_uri = "$metacpan_uri/release/_search?source=";
+ $dist_uri .= $self->encode_json({
+ filter => { and => [
+ { term => { 'release.name' => $release } },
+ { term => { 'release.author' => $author } },
+ ]},
+ fields => [ 'download_url', 'stat', 'status' ],
+ });
+
+ my $dist_json = $self->get($dist_uri);
+ my $dist_meta = eval { JSON::PP::decode_json($dist_json) };
+
+ if ($dist_meta) {
+ $dist_meta = $dist_meta->{hits}{hits}[0]{fields};
+ }
+ if ($dist_meta && $dist_meta->{download_url}) {
+ (my $distfile = $dist_meta->{download_url}) =~ s!.+/authors/id/!!;
+ local $self->{mirrors} = $self->{mirrors};
+ if ($dist_meta->{status} eq 'backpan') {
+ $self->{mirrors} = [ 'http://backpan.perl.org' ];
+ } elsif ($dist_meta->{stat}{mtime} > time()-24*60*60) {
+ $self->{mirrors} = [ 'http://cpan.metacpan.org' ];
+ }
+ return $self->cpan_module($module, $distfile, $module_version);
+ }
+
+ $self->diag_fail("Finding $module on metacpan failed.");
+ return;
+ }
+
+ sub search_database {
+ my($self, $module, $version) = @_;
+
+ my $found;
+
+ if ($self->{dev_release} or $self->{metacpan}) {
+ $found = $self->search_metacpan($module, $version) and return $found;
+ $found = $self->search_cpanmetadb($module, $version) and return $found;
+ } else {
+ $found = $self->search_cpanmetadb($module, $version) and return $found;
+ $found = $self->search_metacpan($module, $version) and return $found;
+ }
+ }
+
+ sub search_cpanmetadb {
+ my($self, $module, $version) = @_;
+
+
+ $self->chat("Searching $module ($version) on cpanmetadb ...\n");
+
+ if ($self->with_version_range($version)) {
+ return $self->search_cpanmetadb_history($module, $version);
+ } else {
+ return $self->search_cpanmetadb_package($module, $version);
+ }
+ }
+
+ sub search_cpanmetadb_package {
+ my($self, $module, $version) = @_;
+
+ require CPAN::Meta::YAML;
+
+ (my $uri = $self->{cpanmetadb}) =~ s{/?$}{/package/$module};
+ my $yaml = $self->get($uri);
+ my $meta = eval { CPAN::Meta::YAML::Load($yaml) };
+ if ($meta && $meta->{distfile}) {
+ return $self->cpan_module($module, $meta->{distfile}, $meta->{version});
+ }
+
+ $self->diag_fail("Finding $module on cpanmetadb failed.");
+ return;
+ }
+
+ sub search_cpanmetadb_history {
+ my($self, $module, $version) = @_;
+
+ (my $uri = $self->{cpanmetadb}) =~ s{/?$}{/history/$module};
+ my $content = $self->get($uri) or return;
+
+ my @found;
+ for my $line (split /\r?\n/, $content) {
+ if ($line =~ /^$module\s+(\S+)\s+(\S+)$/) {
+ push @found, {
+ version => $1,
+ version_obj => version::->parse($1),
+ distfile => $2,
+ };
+ }
+ }
+
+ return unless @found;
+
+ $found[-1]->{latest} = 1;
+
+ my $match;
+ for my $try (sort { $b->{version_obj} cmp $a->{version_obj} } @found) {
+ if ($self->satisfy_version($module, $try->{version_obj}, $version)) {
+ local $self->{mirrors} = $self->{mirrors};
+ unshift @{$self->{mirrors}}, 'http://backpan.perl.org'
+ unless $try->{latest};
+ return $self->cpan_module($module, $try->{distfile}, $try->{version});
+ }
+ }
+
+ $self->diag_fail("Finding $module ($version) on cpanmetadb failed.");
+ return;
+ }
+
+
+ sub search_module {
+ my($self, $module, $version) = @_;
+
+ if ($self->{mirror_index}) {
+ $self->mask_output( chat => "Searching $module on mirror index $self->{mirror_index} ...\n" );
+ my $pkg = $self->search_mirror_index_file($self->{mirror_index}, $module, $version);
+ return $pkg if $pkg;
+
+ unless ($self->{cascade_search}) {
+ $self->mask_output( diag_fail => "Finding $module ($version) on mirror index $self->{mirror_index} failed." );
+ return;
+ }
+ }
+
+ unless ($self->{mirror_only}) {
+ my $found = $self->search_database($module, $version);
+ return $found if $found;
+ }
+
+ MIRROR: for my $mirror (@{ $self->{mirrors} }) {
+ $self->mask_output( chat => "Searching $module on mirror $mirror ...\n" );
+ my $name = '02packages.details.txt.gz';
+ my $uri = "$mirror/modules/$name";
+ my $gz_file = $self->package_index_for($mirror) . '.gz';
+
+ unless ($self->{pkgs}{$uri}) {
+ $self->mask_output( chat => "Downloading index file $uri ...\n" );
+ $self->mirror($uri, $gz_file);
+ $self->generate_mirror_index($mirror) or next MIRROR;
+ $self->{pkgs}{$uri} = "!!retrieved!!";
+ }
+
+ my $pkg = $self->search_mirror_index($mirror, $module, $version);
+ return $pkg if $pkg;
+
+ $self->mask_output( diag_fail => "Finding $module ($version) on mirror $mirror failed." );
+ }
+
+ return;
+ }
+
+ sub source_for {
+ my($self, $mirror) = @_;
+ $mirror =~ s/[^\w\.\-]+/%/g;
+
+ my $dir = "$self->{home}/sources/$mirror";
+ File::Path::mkpath([ $dir ], 0, 0777);
+
+ return $dir;
+ }
+
+ sub load_argv_from_fh {
+ my($self, $fh) = @_;
+
+ my @argv;
+ while(defined(my $line = <$fh>)){
+ chomp $line;
+ $line =~ s/#.+$//; # comment
+ $line =~ s/^\s+//; # trim spaces
+ $line =~ s/\s+$//; # trim spaces
+
+ push @argv, split ' ', $line if $line;
+ }
+ return @argv;
+ }
+
+ sub show_version {
+ my $self = shift;
+
+ print "cpanm (App::cpanminus) version $VERSION ($0)\n";
+ print "perl version $] ($^X)\n\n";
+
+ print " \%Config:\n";
+ for my $key (qw( archname installsitelib installsitebin installman1dir installman3dir
+ sitearchexp sitelibexp vendorarch vendorlibexp archlibexp privlibexp )) {
+ print " $key=$Config{$key}\n" if $Config{$key};
+ }
+
+ print " \%ENV:\n";
+ for my $key (grep /^PERL/, sort keys %ENV) {
+ print " $key=$ENV{$key}\n";
+ }
+
+ print " \@INC:\n";
+ for my $inc (@INC) {
+ print " $inc\n" unless ref($inc) eq 'CODE';
+ }
+
+ return 1;
+ }
+
+ sub show_help {
+ my $self = shift;
+
+ if ($_[0]) {
+ print <<USAGE;
+ Usage: cpanm [options] Module [...]
+
+ Try `cpanm --help` or `man cpanm` for more options.
+ USAGE
+ return;
+ }
+
+ print <<HELP;
+ Usage: cpanm [options] Module [...]
+
+ Options:
+ -v,--verbose Turns on chatty output
+ -q,--quiet Turns off the most output
+ --interactive Turns on interactive configure (required for Task:: modules)
+ -f,--force force install
+ -n,--notest Do not run unit tests
+ --test-only Run tests only, do not install
+ -S,--sudo sudo to run install commands
+ --installdeps Only install dependencies
+ --showdeps Only display direct dependencies
+ --reinstall Reinstall the distribution even if you already have the latest version installed
+ --mirror Specify the base URL for the mirror (e.g. http://cpan.cpantesters.org/)
+ --mirror-only Use the mirror's index file instead of the CPAN Meta DB
+ -M,--from Use only this mirror base URL and its index file
+ --prompt Prompt when configure/build/test fails
+ -l,--local-lib Specify the install base to install modules
+ -L,--local-lib-contained Specify the install base to install all non-core modules
+ --self-contained Install all non-core modules, even if they're already installed.
+ --auto-cleanup Number of days that cpanm's work directories expire in. Defaults to 7
+
+ Commands:
+ --self-upgrade upgrades itself
+ --info Displays distribution info on CPAN
+ --look Opens the distribution with your SHELL
+ -U,--uninstall Uninstalls the modules (EXPERIMENTAL)
+ -V,--version Displays software version
+
+ Examples:
+
+ cpanm Test::More # install Test::More
+ cpanm MIYAGAWA/Plack-0.99_05.tar.gz # full distribution path
+ cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz # install from URL
+ cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz # install from a local file
+ cpanm --interactive Task::Kensho # Configure interactively
+ cpanm . # install from local directory
+ cpanm --installdeps . # install all the deps for the current directory
+ cpanm -L extlib Plack # install Plack and all non-core deps into extlib
+ cpanm --mirror http://cpan.cpantesters.org/ DBI # use the fast-syncing mirror
+ cpanm -M https://cpan.metacpan.org App::perlbrew # use only this secure mirror and its index
+
+ You can also specify the default options in PERL_CPANM_OPT environment variable in the shell rc:
+
+ export PERL_CPANM_OPT="--prompt --reinstall -l ~/perl --mirror http://cpan.cpantesters.org"
+
+ Type `man cpanm` or `perldoc cpanm` for the more detailed explanation of the options.
+
+ HELP
+
+ return 1;
+ }
+
+ sub _writable {
+ my $dir = shift;
+ my @dir = File::Spec->splitdir($dir);
+ while (@dir) {
+ $dir = File::Spec->catdir(@dir);
+ if (-e $dir) {
+ return -w _;
+ }
+ pop @dir;
+ }
+
+ return;
+ }
+
+ sub maybe_abs {
+ my($self, $lib) = @_;
+ if ($lib eq '_' or $lib =~ /^~/ or File::Spec->file_name_is_absolute($lib)) {
+ return $lib;
+ } else {
+ return File::Spec->canonpath(File::Spec->catdir(Cwd::cwd(), $lib));
+ }
+ }
+
+ sub local_lib_target {
+ my($self, $root) = @_;
+ # local::lib 1.008025 changed the order of PERL_LOCAL_LIB_ROOT
+ (grep { $_ ne '' } split /\Q$Config{path_sep}/, $root)[0];
+ }
+
+ sub bootstrap_local_lib {
+ my $self = shift;
+
+ # If -l is specified, use that.
+ if ($self->{local_lib}) {
+ return $self->setup_local_lib($self->{local_lib});
+ }
+
+ # PERL_LOCAL_LIB_ROOT is defined. Run as local::lib mode without overwriting ENV
+ if ($ENV{PERL_LOCAL_LIB_ROOT} && $ENV{PERL_MM_OPT}) {
+ return $self->setup_local_lib($self->local_lib_target($ENV{PERL_LOCAL_LIB_ROOT}), 1);
+ }
+
+ # root, locally-installed perl or --sudo: don't care about install_base
+ return if $self->{sudo} or (_writable($Config{installsitelib}) and _writable($Config{installsitebin}));
+
+ # local::lib is configured in the shell -- yay
+ if ($ENV{PERL_MM_OPT} and ($ENV{MODULEBUILDRC} or $ENV{PERL_MB_OPT})) {
+ return;
+ }
+
+ $self->setup_local_lib;
+
+ $self->diag(<<DIAG, 1);
+ !
+ ! Can't write to $Config{installsitelib} and $Config{installsitebin}: Installing modules to $ENV{HOME}/perl5
+ ! To turn off this warning, you have to do one of the following:
+ ! - run me as a root or with --sudo option (to install to $Config{installsitelib} and $Config{installsitebin})
+ ! - Configure local::lib your existing local::lib in this shell to set PERL_MM_OPT etc.
+ ! - Install local::lib by running the following commands
+ !
+ ! cpanm --local-lib=~/perl5 local::lib && eval \$(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
+ !
+ DIAG
+ sleep 2;
+ }
+
+ sub upgrade_toolchain {
+ my($self, $config_deps) = @_;
+
+ my %deps = map { $_->module => $_ } @$config_deps;
+
+ # M::B 0.38 and EUMM 6.58 for MYMETA
+ # EU::Install 1.46 for local::lib
+ my $reqs = CPAN::Meta::Requirements->from_string_hash({
+ 'Module::Build' => '0.38',
+ 'ExtUtils::MakeMaker' => '6.58',
+ 'ExtUtils::Install' => '1.46',
+ });
+
+ if ($deps{"ExtUtils::MakeMaker"}) {
+ $deps{"ExtUtils::MakeMaker"}->merge_with($reqs);
+ } elsif ($deps{"Module::Build"}) {
+ $deps{"Module::Build"}->merge_with($reqs);
+ $deps{"ExtUtils::Install"} ||= App::cpanminus::Dependency->new("ExtUtils::Install", 0, 'configure');
+ $deps{"ExtUtils::Install"}->merge_with($reqs);
+ }
+
+ @$config_deps = values %deps;
+ }
+
+ sub _core_only_inc {
+ my($self, $base) = @_;
+ require local::lib;
+ (
+ local::lib->resolve_path(local::lib->install_base_arch_path($base)),
+ local::lib->resolve_path(local::lib->install_base_perl_path($base)),
+ (!$self->{exclude_vendor} ? grep {$_} @Config{qw(vendorarch vendorlibexp)} : ()),
+ @Config{qw(archlibexp privlibexp)},
+ );
+ }
+
+ sub _diff {
+ my($self, $old, $new) = @_;
+
+ my @diff;
+ my %old = map { $_ => 1 } @$old;
+ for my $n (@$new) {
+ push @diff, $n unless exists $old{$n};
+ }
+
+ @diff;
+ }
+
+ sub _setup_local_lib_env {
+ my($self, $base) = @_;
+
+ $self->diag(<<WARN, 1) if $base =~ /\s/;
+ WARNING: Your lib directory name ($base) contains a space in it. It's known to cause issues with perl builder tools such as local::lib and MakeMaker. You're recommended to rename your directory.
+ WARN
+
+ local $SIG{__WARN__} = sub { }; # catch 'Attempting to write ...'
+ local::lib->setup_env_hash_for($base, 0);
+ }
+
+ sub setup_local_lib {
+ my($self, $base, $no_env) = @_;
+ $base = undef if $base eq '_';
+
+ require local::lib;
+ {
+ local $0 = 'cpanm'; # so curl/wget | perl works
+ $base ||= "~/perl5";
+ $base = local::lib->resolve_path($base);
+ if ($self->{self_contained}) {
+ my @inc = $self->_core_only_inc($base);
+ $self->{search_inc} = [ @inc ];
+ } else {
+ $self->{search_inc} = [
+ local::lib->install_base_arch_path($base),
+ local::lib->install_base_perl_path($base),
+ @INC,
+ ];
+ }
+ $self->_setup_local_lib_env($base) unless $no_env;
+ $self->{local_lib} = $base;
+ }
+ }
+
+ sub prompt_bool {
+ my($self, $mess, $def) = @_;
+
+ my $val = $self->prompt($mess, $def);
+ return lc $val eq 'y';
+ }
+
+ sub prompt {
+ my($self, $mess, $def) = @_;
+
+ my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;
+ my $dispdef = defined $def ? "[$def] " : " ";
+ $def = defined $def ? $def : "";
+
+ if (!$self->{prompt} || (!$isa_tty && eof STDIN)) {
+ return $def;
+ }
+
+ local $|=1;
+ local $\;
+ my $ans;
+ eval {
+ local $SIG{ALRM} = sub { undef $ans; die "alarm\n" };
+ print STDOUT "$mess $dispdef";
+ alarm $self->{prompt_timeout} if $self->{prompt_timeout};
+ $ans = <STDIN>;
+ alarm 0;
+ };
+ if ( defined $ans ) {
+ chomp $ans;
+ } else { # user hit ctrl-D or alarm timeout
+ print STDOUT "\n";
+ }
+
+ return (!defined $ans || $ans eq '') ? $def : $ans;
+ }
+
+ sub diag_ok {
+ my($self, $msg) = @_;
+ chomp $msg;
+ $msg ||= "OK";
+ if ($self->{in_progress}) {
+ $self->_diag("$msg\n");
+ $self->{in_progress} = 0;
+ }
+ $self->log("-> $msg\n");
+ }
+
+ sub diag_fail {
+ my($self, $msg, $always) = @_;
+ chomp $msg;
+ if ($self->{in_progress}) {
+ $self->_diag("FAIL\n");
+ $self->{in_progress} = 0;
+ }
+
+ if ($msg) {
+ $self->_diag("! $msg\n", $always, 1);
+ $self->log("-> FAIL $msg\n");
+ }
+ }
+
+ sub diag_progress {
+ my($self, $msg) = @_;
+ chomp $msg;
+ $self->{in_progress} = 1;
+ $self->_diag("$msg ... ");
+ $self->log("$msg\n");
+ }
+
+ sub _diag {
+ my($self, $msg, $always, $error) = @_;
+ my $fh = $error ? *STDERR : *STDOUT;
+ print {$fh} $msg if $always or $self->{verbose} or !$self->{quiet};
+ }
+
+ sub diag {
+ my($self, $msg, $always) = @_;
+ $self->_diag($msg, $always);
+ $self->log($msg);
+ }
+
+ sub chat {
+ my $self = shift;
+ print STDERR @_ if $self->{verbose};
+ $self->log(@_);
+ }
+
+ sub mask_output {
+ my $self = shift;
+ my $method = shift;
+ $self->$method( $self->mask_uri_passwords(@_) );
+ }
+
+ sub log {
+ my $self = shift;
+ open my $out, ">>$self->{log}";
+ print $out @_;
+ }
+
+ sub run {
+ my($self, $cmd) = @_;
+
+ if (WIN32) {
+ $cmd = $self->shell_quote(@$cmd) if ref $cmd eq 'ARRAY';
+ unless ($self->{verbose}) {
+ $cmd .= " >> " . $self->shell_quote($self->{log}) . " 2>&1";
+ }
+ !system $cmd;
+ } else {
+ my $pid = fork;
+ if ($pid) {
+ waitpid $pid, 0;
+ return !$?;
+ } else {
+ $self->run_exec($cmd);
+ }
+ }
+ }
+
+ sub run_exec {
+ my($self, $cmd) = @_;
+
+ if (ref $cmd eq 'ARRAY') {
+ unless ($self->{verbose}) {
+ open my $logfh, ">>", $self->{log};
+ open STDERR, '>&', $logfh;
+ open STDOUT, '>&', $logfh;
+ close $logfh;
+ }
+ exec @$cmd;
+ } else {
+ unless ($self->{verbose}) {
+ $cmd .= " >> " . $self->shell_quote($self->{log}) . " 2>&1";
+ }
+ exec $cmd;
+ }
+ }
+
+ sub run_timeout {
+ my($self, $cmd, $timeout) = @_;
+ return $self->run($cmd) if WIN32 || $self->{verbose} || !$timeout;
+
+ my $pid = fork;
+ if ($pid) {
+ eval {
+ local $SIG{ALRM} = sub { die "alarm\n" };
+ alarm $timeout;
+ waitpid $pid, 0;
+ alarm 0;
+ };
+ if ($@ && $@ eq "alarm\n") {
+ $self->diag_fail("Timed out (> ${timeout}s). Use --verbose to retry.");
+ local $SIG{TERM} = 'IGNORE';
+ kill TERM => 0;
+ waitpid $pid, 0;
+ return;
+ }
+ return !$?;
+ } elsif ($pid == 0) {
+ $self->run_exec($cmd);
+ } else {
+ $self->chat("! fork failed: falling back to system()\n");
+ $self->run($cmd);
+ }
+ }
+
+ sub append_args {
+ my($self, $cmd, $phase) = @_;
+
+ if (my $args = $self->{build_args}{$phase}) {
+ $cmd = join ' ', $self->shell_quote(@$cmd), $args;
+ }
+
+ $cmd;
+ }
+
+ sub configure {
+ my($self, $cmd, $depth) = @_;
+
+ # trick AutoInstall
+ local $ENV{PERL5_CPAN_IS_RUNNING} = local $ENV{PERL5_CPANPLUS_IS_RUNNING} = $$;
+
+ # e.g. skip CPAN configuration on local::lib
+ local $ENV{PERL5_CPANM_IS_RUNNING} = $$;
+
+ my $use_default = !$self->{interactive};
+ local $ENV{PERL_MM_USE_DEFAULT} = $use_default;
+
+ local $ENV{PERL_MM_OPT} = $ENV{PERL_MM_OPT};
+ local $ENV{PERL_MB_OPT} = $ENV{PERL_MB_OPT};
+
+ # skip man page generation
+ unless ($self->{pod2man}) {
+ $ENV{PERL_MM_OPT} .= " INSTALLMAN1DIR=none INSTALLMAN3DIR=none";
+ $ENV{PERL_MB_OPT} .= " --config installman1dir= --config installsiteman1dir= --config installman3dir= --config installsiteman3dir=";
+ }
+
+ # Lancaster Consensus
+ if ($self->{pure_perl}) {
+ $ENV{PERL_MM_OPT} .= " PUREPERL_ONLY=1";
+ $ENV{PERL_MB_OPT} .= " --pureperl-only";
+ }
+
+ $cmd = $self->append_args($cmd, 'configure') if $depth == 0;
+
+ local $self->{verbose} = $self->{verbose} || $self->{interactive};
+ $self->run_timeout($cmd, $self->{configure_timeout});
+ }
+
+ sub build {
+ my($self, $cmd, $distname, $depth) = @_;
+
+ local $ENV{PERL_MM_USE_DEFAULT} = !$self->{interactive};
+
+ $cmd = $self->append_args($cmd, 'build') if $depth == 0;
+
+ return 1 if $self->run_timeout($cmd, $self->{build_timeout});
+ while (1) {
+ my $ans = lc $self->prompt("Building $distname failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?", "s");
+ return if $ans eq 's';
+ return $self->build($cmd, $distname, $depth) if $ans eq 'r';
+ $self->show_build_log if $ans eq 'e';
+ $self->look if $ans eq 'l';
+ }
+ }
+
+ sub test {
+ my($self, $cmd, $distname, $depth) = @_;
+ return 1 if $self->{notest};
+
+ # https://rt.cpan.org/Ticket/Display.html?id=48965#txn-1013385
+ local $ENV{PERL_MM_USE_DEFAULT} = !$self->{interactive};
+
+ # https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md
+ local $ENV{NONINTERACTIVE_TESTING} = !$self->{interactive};
+
+ $cmd = $self->append_args($cmd, 'test') if $depth == 0;
+
+ return 1 if $self->run_timeout($cmd, $self->{test_timeout});
+ if ($self->{force}) {
+ $self->diag_fail("Testing $distname failed but installing it anyway.");
+ return 1;
+ } else {
+ $self->diag_fail;
+ while (1) {
+ my $ans = lc $self->prompt("Testing $distname failed.\nYou can s)kip, r)etry, f)orce install, e)xamine build log, or l)ook ?", "s");
+ return if $ans eq 's';
+ return $self->test($cmd, $distname, $depth) if $ans eq 'r';
+ return 1 if $ans eq 'f';
+ $self->show_build_log if $ans eq 'e';
+ $self->look if $ans eq 'l';
+ }
+ }
+ }
+
+ sub install {
+ my($self, $cmd, $uninst_opts, $depth) = @_;
+
+ if ($depth == 0 && $self->{test_only}) {
+ return 1;
+ }
+
+ if ($self->{sudo}) {
+ unshift @$cmd, "sudo";
+ }
+
+ if ($self->{uninstall_shadows} && !$ENV{PERL_MM_OPT}) {
+ push @$cmd, @$uninst_opts;
+ }
+
+ $cmd = $self->append_args($cmd, 'install') if $depth == 0;
+
+ $self->run($cmd);
+ }
+
+ sub look {
+ my $self = shift;
+
+ my $shell = $ENV{SHELL};
+ $shell ||= $ENV{COMSPEC} if WIN32;
+ if ($shell) {
+ my $cwd = Cwd::cwd;
+ $self->diag("Entering $cwd with $shell\n");
+ system $shell;
+ } else {
+ $self->diag_fail("You don't seem to have a SHELL :/");
+ }
+ }
+
+ sub show_build_log {
+ my $self = shift;
+
+ my @pagers = (
+ $ENV{PAGER},
+ (WIN32 ? () : ('less')),
+ 'more'
+ );
+ my $pager;
+ while (@pagers) {
+ $pager = shift @pagers;
+ next unless $pager;
+ $pager = $self->which($pager);
+ next unless $pager;
+ last;
+ }
+
+ if ($pager) {
+ # win32 'more' doesn't allow "more build.log", the < is required
+ system("$pager < $self->{log}");
+ }
+ else {
+ $self->diag_fail("You don't seem to have a PAGER :/");
+ }
+ }
+
+ sub chdir {
+ my $self = shift;
+ Cwd::chdir(File::Spec->canonpath($_[0])) or die "$_[0]: $!";
+ }
+
+ sub configure_mirrors {
+ my $self = shift;
+ unless (@{$self->{mirrors}}) {
+ $self->{mirrors} = [ 'http://www.cpan.org' ];
+ }
+ for (@{$self->{mirrors}}) {
+ s!^/!file:///!;
+ s!/$!!;
+ }
+ }
+
+ sub self_upgrade {
+ my $self = shift;
+ $self->check_upgrade;
+ $self->{argv} = [ 'App::cpanminus' ];
+ return; # continue
+ }
+
+ sub install_module {
+ my($self, $module, $depth, $version) = @_;
+
+ $self->check_libs;
+
+ if ($self->{seen}{$module}++) {
+ # TODO: circular dependencies
+ $self->chat("Already tried $module. Skipping.\n");
+ return 1;
+ }
+
+ if ($self->{skip_satisfied}) {
+ my($ok, $local) = $self->check_module($module, $version || 0);
+ if ($ok) {
+ $self->diag("You have $module ($local)\n", 1);
+ return 1;
+ }
+ }
+
+ my $dist = $self->resolve_name($module, $version);
+ unless ($dist) {
+ my $what = $module . ($version ? " ($version)" : "");
+ $self->diag_fail("Couldn't find module or a distribution $what", 1);
+ return;
+ }
+
+ if ($dist->{distvname} && $self->{seen}{$dist->{distvname}}++) {
+ $self->chat("Already tried $dist->{distvname}. Skipping.\n");
+ return 1;
+ }
+
+ if ($self->{cmd} eq 'info') {
+ print $self->format_dist($dist), "\n";
+ return 1;
+ }
+
+ $dist->{depth} = $depth; # ugly hack
+
+ if ($dist->{module}) {
+ unless ($self->satisfy_version($dist->{module}, $dist->{module_version}, $version)) {
+ $self->diag("Found $dist->{module} $dist->{module_version} which doesn't satisfy $version.\n", 1);
+ return;
+ }
+
+ # If a version is requested, it has to be the exact same version, otherwise, check as if
+ # it is the minimum version you need.
+ my $cmp = $version ? "==" : "";
+ my $requirement = $dist->{module_version} ? "$cmp$dist->{module_version}" : 0;
+ my($ok, $local) = $self->check_module($dist->{module}, $requirement);
+ if ($self->{skip_installed} && $ok) {
+ $self->diag("$dist->{module} is up to date. ($local)\n", 1);
+ return 1;
+ }
+ }
+
+ if ($dist->{dist} eq 'perl'){
+ $self->diag("skipping $dist->{pathname}\n");
+ return 1;
+ }
+
+ $self->diag("--> Working on $module\n");
+
+ $dist->{dir} ||= $self->fetch_module($dist);
+
+ unless ($dist->{dir}) {
+ $self->diag_fail("Failed to fetch distribution $dist->{distvname}", 1);
+ return;
+ }
+
+ $self->chat("Entering $dist->{dir}\n");
+ $self->chdir($self->{base});
+ $self->chdir($dist->{dir});
+
+ if ($self->{cmd} eq 'look') {
+ $self->look;
+ return 1;
+ }
+
+ return $self->build_stuff($module, $dist, $depth);
+ }
+
+ sub uninstall_search_path {
+ my $self = shift;
+
+ $self->{local_lib}
+ ? (local::lib->install_base_arch_path($self->{local_lib}),
+ local::lib->install_base_perl_path($self->{local_lib}))
+ : @Config{qw(installsitearch installsitelib)};
+ }
+
+ sub uninstall_module {
+ my ($self, $module) = @_;
+
+ $self->check_libs;
+
+ my @inc = $self->uninstall_search_path;
+
+ my($metadata, $packlist) = $self->packlists_containing($module, \@inc);
+ unless ($packlist) {
+ $self->diag_fail(<<DIAG, 1);
+ $module is not found in the following directories and can't be uninstalled.
+
+ @{[ join(" \n", map " $_", @inc) ]}
+
+ DIAG
+ return;
+ }
+
+ my @uninst_files = $self->uninstall_target($metadata, $packlist);
+
+ $self->ask_permission($module, \@uninst_files) or return;
+ $self->uninstall_files(@uninst_files, $packlist);
+
+ $self->diag("Successfully uninstalled $module\n", 1);
+
+ return 1;
+ }
+
+ sub packlists_containing {
+ my($self, $module, $inc) = @_;
+
+ require Module::Metadata;
+ my $metadata = Module::Metadata->new_from_module($module, inc => $inc)
+ or return;
+
+ my $packlist;
+ my $wanted = sub {
+ return unless $_ eq '.packlist' && -f $_;
+ for my $file ($self->unpack_packlist($File::Find::name)) {
+ $packlist ||= $File::Find::name if $file eq $metadata->filename;
+ }
+ };
+
+ {
+ require File::pushd;
+ my $pushd = File::pushd::pushd();
+ my @search = grep -d $_, map File::Spec->catdir($_, 'auto'), @$inc;
+ File::Find::find($wanted, @search);
+ }
+
+ return $metadata, $packlist;
+ }
+
+ sub uninstall_target {
+ my($self, $metadata, $packlist) = @_;
+
+ # If the module has a shadow install, or uses local::lib, then you can't just remove
+ # all files in .packlist since it might have shadows in there
+ if ($self->has_shadow_install($metadata) or $self->{local_lib}) {
+ grep $self->should_unlink($_), $self->unpack_packlist($packlist);
+ } else {
+ $self->unpack_packlist($packlist);
+ }
+ }
+
+ sub has_shadow_install {
+ my($self, $metadata) = @_;
+
+ # check if you have the module in site_perl *and* perl
+ my @shadow = grep defined, map Module::Metadata->new_from_module($metadata->name, inc => [$_]), @INC;
+ @shadow >= 2;
+ }
+
+ sub should_unlink {
+ my($self, $file) = @_;
+
+ # If local::lib is used, everything under the directory can be safely removed
+ # Otherwise, bin and man files might be shared with the shadows i.e. site_perl vs perl
+ # This is not 100% safe to keep the script there hoping to work with older version of .pm
+ # files in the shadow, but there's nothing you can do about it.
+ if ($self->{local_lib}) {
+ $file =~ /^\Q$self->{local_lib}\E/;
+ } else {
+ !(grep $file =~ /^\Q$_\E/, @Config{qw(installbin installscript installman1dir installman3dir)});
+ }
+ }
+
+ sub ask_permission {
+ my ($self, $module, $files) = @_;
+
+ $self->diag("$module contains the following files:\n\n");
+ for my $file (@$files) {
+ $self->diag(" $file\n");
+ }
+ $self->diag("\n");
+
+ return 'force uninstall' if $self->{force};
+ local $self->{prompt} = 1;
+ return $self->prompt_bool("Are you sure you want to uninstall $module?", 'y');
+ }
+
+ sub unpack_packlist {
+ my ($self, $packlist) = @_;
+ open my $fh, '<', $packlist or die "$packlist: $!";
+ map { chomp; $_ } <$fh>;
+ }
+
+ sub uninstall_files {
+ my ($self, @files) = @_;
+
+ $self->diag("\n");
+
+ for my $file (@files) {
+ $self->diag("Unlink: $file\n");
+ unlink $file or $self->diag_fail("$!: $file");
+ }
+
+ $self->diag("\n");
+
+ return 1;
+ }
+
+ sub format_dist {
+ my($self, $dist) = @_;
+
+ # TODO support --dist-format?
+ return "$dist->{cpanid}/$dist->{filename}";
+ }
+
+ sub trim {
+ local $_ = shift;
+ tr/\n/ /d;
+ s/^\s*|\s*$//g;
+ $_;
+ }
+
+ sub fetch_module {
+ my($self, $dist) = @_;
+
+ $self->chdir($self->{base});
+
+ for my $uri (@{$dist->{uris}}) {
+ $self->mask_output( diag_progress => "Fetching $uri" );
+
+ # Ugh, $dist->{filename} can contain sub directory
+ my $filename = $dist->{filename} || $uri;
+ my $name = File::Basename::basename($filename);
+
+ my $cancelled;
+ my $fetch = sub {
+ my $file;
+ eval {
+ local $SIG{INT} = sub { $cancelled = 1; die "SIGINT\n" };
+ $self->mirror($uri, $name);
+ $file = $name if -e $name;
+ };
+ $self->diag("ERROR: " . trim("$@") . "\n", 1) if $@ && $@ ne "SIGINT\n";
+ return $file;
+ };
+
+ my($try, $file);
+ while ($try++ < 3) {
+ $file = $fetch->();
+ last if $cancelled or $file;
+ $self->mask_output( diag_fail => "Download $uri failed. Retrying ... ");
+ }
+
+ if ($cancelled) {
+ $self->diag_fail("Download cancelled.");
+ return;
+ }
+
+ unless ($file) {
+ $self->mask_output( diag_fail => "Failed to download $uri");
+ next;
+ }
+
+ $self->diag_ok;
+ $dist->{local_path} = File::Spec->rel2abs($name);
+
+ my $dir = $self->unpack($file, $uri, $dist);
+ next unless $dir; # unpack failed
+
+ if (my $save = $self->{save_dists}) {
+ # Only distros retrieved from CPAN have a pathname set
+ my $path = $dist->{pathname} ? "$save/authors/id/$dist->{pathname}"
+ : "$save/vendor/$file";
+ $self->chat("Copying $name to $path\n");
+ File::Path::mkpath([ File::Basename::dirname($path) ], 0, 0777);
+ File::Copy::copy($file, $path) or warn $!;
+ }
+
+ return $dist, $dir;
+ }
+ }
+
+ sub unpack {
+ my($self, $file, $uri, $dist) = @_;
+
+ if ($self->{verify}) {
+ $self->verify_archive($file, $uri, $dist) or return;
+ }
+
+ $self->chat("Unpacking $file\n");
+ my $dir = $file =~ /\.zip/i ? $self->unzip($file) : $self->untar($file);
+ unless ($dir) {
+ $self->diag_fail("Failed to unpack $file: no directory");
+ }
+ return $dir;
+ }
+
+ sub verify_checksums_signature {
+ my($self, $chk_file) = @_;
+
+ require Module::Signature; # no fatpack
+
+ $self->chat("Verifying the signature of CHECKSUMS\n");
+
+ my $rv = eval {
+ local $SIG{__WARN__} = sub {}; # suppress warnings
+ my $v = Module::Signature::_verify($chk_file);
+ $v == Module::Signature::SIGNATURE_OK();
+ };
+ if ($rv) {
+ $self->chat("Verified OK!\n");
+ } else {
+ $self->diag_fail("Verifying CHECKSUMS signature failed: $rv\n");
+ return;
+ }
+
+ return 1;
+ }
+
+ sub verify_archive {
+ my($self, $file, $uri, $dist) = @_;
+
+ unless ($dist->{cpanid}) {
+ $self->chat("Archive '$file' does not seem to be from PAUSE. Skip verification.\n");
+ return 1;
+ }
+
+ (my $mirror = $uri) =~ s!/authors/id.*$!!;
+
+ (my $chksum_uri = $uri) =~ s!/[^/]*$!/CHECKSUMS!;
+ my $chk_file = $self->source_for($mirror) . "/$dist->{cpanid}.CHECKSUMS";
+ $self->mask_output( diag_progress => "Fetching $chksum_uri" );
+ $self->mirror($chksum_uri, $chk_file);
+
+ unless (-e $chk_file) {
+ $self->diag_fail("Fetching $chksum_uri failed.\n");
+ return;
+ }
+
+ $self->diag_ok;
+ $self->verify_checksums_signature($chk_file) or return;
+ $self->verify_checksum($file, $chk_file);
+ }
+
+ sub verify_checksum {
+ my($self, $file, $chk_file) = @_;
+
+ $self->chat("Verifying the SHA1 for $file\n");
+
+ open my $fh, "<$chk_file" or die "$chk_file: $!";
+ my $data = join '', <$fh>;
+ $data =~ s/\015?\012/\n/g;
+
+ require Safe; # no fatpack
+ my $chksum = Safe->new->reval($data);
+
+ if (!ref $chksum or ref $chksum ne 'HASH') {
+ $self->diag_fail("! Checksum file downloaded from $chk_file is broken.\n");
+ return;
+ }
+
+ if (my $sha = $chksum->{$file}{sha256}) {
+ my $hex = $self->sha1_for($file);
+ if ($hex eq $sha) {
+ $self->chat("Checksum for $file: Verified!\n");
+ } else {
+ $self->diag_fail("Checksum mismatch for $file\n");
+ return;
+ }
+ } else {
+ $self->chat("Checksum for $file not found in CHECKSUMS.\n");
+ return;
+ }
+ }
+
+ sub sha1_for {
+ my($self, $file) = @_;
+
+ require Digest::SHA; # no fatpack
+
+ open my $fh, "<", $file or die "$file: $!";
+ my $dg = Digest::SHA->new(256);
+ my($data);
+ while (read($fh, $data, 4096)) {
+ $dg->add($data);
+ }
+
+ return $dg->hexdigest;
+ }
+
+ sub verify_signature {
+ my($self, $dist) = @_;
+
+ $self->diag_progress("Verifying the SIGNATURE file");
+ my $out = `$self->{cpansign} -v --skip 2>&1`;
+ $self->log($out);
+
+ if ($out =~ /Signature verified OK/) {
+ $self->diag_ok("Verified OK");
+ return 1;
+ } else {
+ $self->diag_fail("SIGNATURE verificaion for $dist->{filename} failed\n");
+ return;
+ }
+ }
+
+ sub resolve_name {
+ my($self, $module, $version) = @_;
+
+ # Git
+ if ($module =~ /(?:^git:|\.git(?:@.+)?$)/) {
+ return $self->git_uri($module);
+ }
+
+ # URL
+ if ($module =~ /^(ftp|https?|file):/) {
+ if ($module =~ m!authors/id/(.*)!) {
+ return $self->cpan_dist($1, $module);
+ } else {
+ return { uris => [ $module ] };
+ }
+ }
+
+ # Directory
+ if ($module =~ m!^[\./]! && -d $module) {
+ return {
+ source => 'local',
+ dir => Cwd::abs_path($module),
+ };
+ }
+
+ # File
+ if (-f $module) {
+ return {
+ source => 'local',
+ uris => [ "file://" . Cwd::abs_path($module) ],
+ };
+ }
+
+ # cpan URI
+ if ($module =~ s!^cpan:///distfile/!!) {
+ return $self->cpan_dist($module);
+ }
+
+ # PAUSEID/foo
+ # P/PA/PAUSEID/foo
+ if ($module =~ m!^(?:[A-Z]/[A-Z]{2}/)?([A-Z]{2}[\-A-Z0-9]*/.*)$!) {
+ return $self->cpan_dist($1);
+ }
+
+ # Module name
+ return $self->search_module($module, $version);
+ }
+
+ sub cpan_module {
+ my($self, $module, $dist, $version) = @_;
+
+ my $dist = $self->cpan_dist($dist);
+ $dist->{module} = $module;
+ $dist->{module_version} = $version if $version && $version ne 'undef';
+
+ return $dist;
+ }
+
+ sub cpan_dist {
+ my($self, $dist, $url) = @_;
+
+ $dist =~ s!^([A-Z]{2})!substr($1,0,1)."/".substr($1,0,2)."/".$1!e;
+
+ require CPAN::DistnameInfo;
+ my $d = CPAN::DistnameInfo->new($dist);
+
+ if ($url) {
+ $url = [ $url ] unless ref $url eq 'ARRAY';
+ } else {
+ my $id = $d->cpanid;
+ my $fn = substr($id, 0, 1) . "/" . substr($id, 0, 2) . "/" . $id . "/" . $d->filename;
+
+ my @mirrors = @{$self->{mirrors}};
+ my @urls = map "$_/authors/id/$fn", @mirrors;
+
+ $url = \@urls,
+ }
+
+ return {
+ $d->properties,
+ source => 'cpan',
+ uris => $url,
+ };
+ }
+
+ sub git_uri {
+ my ($self, $uri) = @_;
+
+ # similar to http://www.pip-installer.org/en/latest/logic.html#vcs-support
+ # git URL has to end with .git when you need to use pin @ commit/tag/branch
+
+ ($uri, my $commitish) = split /(?<=\.git)@/i, $uri, 2;
+
+ my $dir = File::Temp::tempdir(CLEANUP => 1);
+
+ $self->mask_output( diag_progress => "Cloning $uri" );
+ $self->run([ 'git', 'clone', $uri, $dir ]);
+
+ unless (-e "$dir/.git") {
+ $self->diag_fail("Failed cloning git repository $uri", 1);
+ return;
+ }
+
+ if ($commitish) {
+ require File::pushd;
+ my $dir = File::pushd::pushd($dir);
+
+ unless ($self->run([ 'git', 'checkout', $commitish ])) {
+ $self->diag_fail("Failed to checkout '$commitish' in git repository $uri\n");
+ return;
+ }
+ }
+
+ $self->diag_ok;
+
+ return {
+ source => 'local',
+ dir => $dir,
+ };
+ }
+
+ sub setup_module_build_patch {
+ my $self = shift;
+
+ open my $out, ">$self->{base}/ModuleBuildSkipMan.pm" or die $!;
+ print $out <<EOF;
+ package ModuleBuildSkipMan;
+ CHECK {
+ if (%Module::Build::) {
+ no warnings 'redefine';
+ *Module::Build::Base::ACTION_manpages = sub {};
+ *Module::Build::Base::ACTION_docs = sub {};
+ }
+ }
+ 1;
+ EOF
+ }
+
+ sub core_version_for {
+ my($self, $module) = @_;
+
+ require Module::CoreList; # no fatpack
+ unless (exists $Module::CoreList::version{$]+0}) {
+ die sprintf("Module::CoreList %s (loaded from %s) doesn't seem to have entries for perl $]. " .
+ "You're strongly recommended to upgrade Module::CoreList from CPAN.\n",
+ $Module::CoreList::VERSION, $INC{"Module/CoreList.pm"});
+ }
+
+ unless (exists $Module::CoreList::version{$]+0}{$module}) {
+ return -1;
+ }
+
+ return $Module::CoreList::version{$]+0}{$module};
+ }
+
+ sub search_inc {
+ my $self = shift;
+ $self->{search_inc} ||= do {
+ # strip lib/ and fatlib/ from search path when booted from dev
+ if (defined $::Bin) {
+ [grep !/^\Q$::Bin\E\/..\/(?:fat)?lib$/, @INC]
+ } else {
+ [@INC]
+ }
+ };
+ }
+
+ sub check_module {
+ my($self, $mod, $want_ver) = @_;
+
+ require Module::Metadata;
+ my $meta = Module::Metadata->new_from_module($mod, inc => $self->search_inc)
+ or return 0, undef;
+
+ my $version = $meta->version;
+
+ # When -L is in use, the version loaded from 'perl' library path
+ # might be newer than (or actually wasn't core at) the version
+ # that is shipped with the current perl
+ if ($self->{self_contained} && $self->loaded_from_perl_lib($meta)) {
+ $version = $self->core_version_for($mod);
+ return 0, undef if $version && $version == -1;
+ }
+
+ $self->{local_versions}{$mod} = $version;
+
+ if ($self->is_deprecated($meta)){
+ return 0, $version;
+ } elsif ($self->satisfy_version($mod, $version, $want_ver)) {
+ return 1, ($version || 'undef');
+ } else {
+ return 0, $version;
+ }
+ }
+
+ sub satisfy_version {
+ my($self, $mod, $version, $want_ver) = @_;
+
+ $want_ver = '0' unless defined($want_ver) && length($want_ver);
+
+ require CPAN::Meta::Requirements;
+ my $requirements = CPAN::Meta::Requirements->new;
+ $requirements->add_string_requirement($mod, $want_ver);
+ $requirements->accepts_module($mod, $version);
+ }
+
+ sub unsatisfy_how {
+ my($self, $ver, $want_ver) = @_;
+
+ if ($want_ver =~ /^[v0-9\.\_]+$/) {
+ return "$ver < $want_ver";
+ } else {
+ return "$ver doesn't satisfy $want_ver";
+ }
+ }
+
+ sub is_deprecated {
+ my($self, $meta) = @_;
+
+ my $deprecated = eval {
+ require Module::CoreList; # no fatpack
+ Module::CoreList::is_deprecated($meta->{module});
+ };
+
+ return $deprecated && $self->loaded_from_perl_lib($meta);
+ }
+
+ sub loaded_from_perl_lib {
+ my($self, $meta) = @_;
+
+ require Config;
+ my @dirs = qw(archlibexp privlibexp);
+ if ($self->{self_contained} && ! $self->{exclude_vendor} && $Config{vendorarch}) {
+ unshift @dirs, qw(vendorarch vendorlibexp);
+ }
+ for my $dir (@dirs) {
+ my $confdir = $Config{$dir};
+ if ($confdir eq substr($meta->filename, 0, length($confdir))) {
+ return 1;
+ }
+ }
+
+ return;
+ }
+
+ sub should_install {
+ my($self, $mod, $ver) = @_;
+
+ $self->chat("Checking if you have $mod $ver ... ");
+ my($ok, $local) = $self->check_module($mod, $ver);
+
+ if ($ok) { $self->chat("Yes ($local)\n") }
+ elsif ($local) { $self->chat("No (" . $self->unsatisfy_how($local, $ver) . ")\n") }
+ else { $self->chat("No\n") }
+
+ return $mod unless $ok;
+ return;
+ }
+
+ sub check_perl_version {
+ my($self, $version) = @_;
+ require CPAN::Meta::Requirements;
+ my $req = CPAN::Meta::Requirements->from_string_hash({ perl => $version });
+ $req->accepts_module(perl => $]);
+ }
+
+ sub install_deps {
+ my($self, $dir, $depth, @deps) = @_;
+
+ my(@install, %seen, @fail);
+ for my $dep (@deps) {
+ next if $seen{$dep->module};
+ if ($dep->module eq 'perl') {
+ if ($dep->is_requirement && !$self->check_perl_version($dep->version)) {
+ $self->diag("Needs perl @{[$dep->version]}, you have $]\n");
+ push @fail, 'perl';
+ }
+ } elsif ($self->should_install($dep->module, $dep->version)) {
+ push @install, $dep;
+ $seen{$dep->module} = 1;
+ }
+ }
+
+ if (@install) {
+ $self->diag("==> Found dependencies: " . join(", ", map $_->module, @install) . "\n");
+ }
+
+ for my $dep (@install) {
+ $self->install_module($dep->module, $depth + 1, $dep->version);
+ }
+
+ $self->chdir($self->{base});
+ $self->chdir($dir) if $dir;
+
+ if ($self->{scandeps}) {
+ return 1; # Don't check if dependencies are installed, since with --scandeps they aren't
+ }
+ my @not_ok = $self->unsatisfied_deps(@deps);
+ if (@not_ok) {
+ return 0, \@not_ok;
+ } else {
+ return 1;
+ }
+ }
+
+ sub unsatisfied_deps {
+ my($self, @deps) = @_;
+
+ require CPAN::Meta::Check;
+ require CPAN::Meta::Requirements;
+
+ my $reqs = CPAN::Meta::Requirements->new;
+ for my $dep (grep $_->is_requirement, @deps) {
+ $reqs->add_string_requirement($dep->module => $dep->requires_version || '0');
+ }
+
+ my $ret = CPAN::Meta::Check::check_requirements($reqs, 'requires', $self->{search_inc});
+ grep defined, values %$ret;
+ }
+
+ sub install_deps_bailout {
+ my($self, $target, $dir, $depth, @deps) = @_;
+
+ my($ok, $fail) = $self->install_deps($dir, $depth, @deps);
+ if (!$ok) {
+ $self->diag_fail("Installing the dependencies failed: " . join(", ", @$fail), 1);
+ unless ($self->prompt_bool("Do you want to continue building $target anyway?", "n")) {
+ $self->diag_fail("Bailing out the installation for $target.", 1);
+ return;
+ }
+ }
+
+ return 1;
+ }
+
+ sub build_stuff {
+ my($self, $stuff, $dist, $depth) = @_;
+
+ if ($self->{verify} && -e 'SIGNATURE') {
+ $self->verify_signature($dist) or return;
+ }
+
+ require CPAN::Meta;
+
+ my($meta_file) = grep -f, qw(META.json META.yml);
+ if ($meta_file) {
+ $self->chat("Checking configure dependencies from $meta_file\n");
+ $dist->{cpanmeta} = eval { CPAN::Meta->load_file($meta_file) };
+ } elsif ($dist->{dist} && $dist->{version}) {
+ $self->chat("META.yml/json not found. Creating skeleton for it.\n");
+ $dist->{cpanmeta} = CPAN::Meta->new({ name => $dist->{dist}, version => $dist->{version} });
+ }
+
+ $dist->{meta} = $dist->{cpanmeta} ? $dist->{cpanmeta}->as_struct : {};
+
+ my @config_deps;
+ if ($dist->{cpanmeta}) {
+ push @config_deps, App::cpanminus::Dependency->from_prereqs(
+ $dist->{cpanmeta}->effective_prereqs, ['configure'], $self->{install_types},
+ );
+ }
+
+ if (-e 'Build.PL' && !$self->should_use_mm($dist->{dist}) && !@config_deps) {
+ push @config_deps, App::cpanminus::Dependency->from_versions(
+ { 'Module::Build' => '0.38' }, 'configure',
+ );
+ }
+
+ $self->upgrade_toolchain(\@config_deps);
+
+ my $target = $dist->{meta}{name} ? "$dist->{meta}{name}-$dist->{meta}{version}" : $dist->{dir};
+ {
+ local $self->{notest} = 1;
+ $self->install_deps_bailout($target, $dist->{dir}, $depth, @config_deps)
+ or return;
+ }
+
+ $self->diag_progress("Configuring $target");
+
+ my $configure_state = $self->configure_this($dist, $depth);
+ $self->diag_ok($configure_state->{configured_ok} ? "OK" : "N/A");
+
+ if ($dist->{cpanmeta} && $dist->{source} eq 'cpan') {
+ $dist->{provides} = $dist->{cpanmeta}{provides} || $self->extract_packages($dist->{cpanmeta}, ".");
+ }
+
+ # install direct 'test' dependencies for --installdeps, even with --notest
+ my $root_target = (($self->{installdeps} or $self->{showdeps}) and $depth == 0);
+ $dist->{want_phases} = $self->{notest} && !$root_target
+ ? [qw( build runtime )] : [qw( build test runtime )];
+
+ push @{$dist->{want_phases}}, 'develop' if $self->{with_develop} && $depth == 0;
+
+ my @deps = $self->find_prereqs($dist);
+ my $module_name = $self->find_module_name($configure_state) || $dist->{meta}{name};
+ $module_name =~ s/-/::/g;
+
+ if ($self->{showdeps}) {
+ for my $dep (@config_deps, @deps) {
+ print $dep->module, ($dep->version ? ("~".$dep->version) : ""), "\n";
+ }
+ return 1;
+ }
+
+ my $distname = $dist->{meta}{name} ? "$dist->{meta}{name}-$dist->{meta}{version}" : $stuff;
+
+ my $walkup;
+ if ($self->{scandeps}) {
+ $walkup = $self->scandeps_append_child($dist);
+ }
+
+ $self->install_deps_bailout($distname, $dist->{dir}, $depth, @deps)
+ or return;
+
+ if ($self->{scandeps}) {
+ unless ($configure_state->{configured_ok}) {
+ my $diag = <<DIAG;
+ ! Configuring $distname failed. See $self->{log} for details.
+ ! You might have to install the following modules first to get --scandeps working correctly.
+ DIAG
+ if (@config_deps) {
+ my @tree = @{$self->{scandeps_tree}};
+ $diag .= "!\n" . join("", map "! * $_->[0]{module}\n", @tree[0..$#tree-1]) if @tree;
+ }
+ $self->diag("!\n$diag!\n", 1);
+ }
+ $walkup->();
+ return 1;
+ }
+
+ if ($self->{installdeps} && $depth == 0) {
+ if ($configure_state->{configured_ok}) {
+ $self->diag("<== Installed dependencies for $stuff. Finishing.\n");
+ return 1;
+ } else {
+ $self->diag("! Configuring $distname failed. See $self->{log} for details.\n", 1);
+ return;
+ }
+ }
+
+ my $installed;
+ if ($configure_state->{use_module_build} && -e 'Build' && -f _) {
+ $self->diag_progress("Building " . ($self->{notest} ? "" : "and testing ") . $distname);
+ $self->build([ $self->{perl}, "./Build" ], $distname, $depth) &&
+ $self->test([ $self->{perl}, "./Build", "test" ], $distname, $depth) &&
+ $self->install([ $self->{perl}, "./Build", "install" ], [ "--uninst", 1 ], $depth) &&
+ $installed++;
+ } elsif ($self->{make} && -e 'Makefile') {
+ $self->diag_progress("Building " . ($self->{notest} ? "" : "and testing ") . $distname);
+ $self->build([ $self->{make} ], $distname, $depth) &&
+ $self->test([ $self->{make}, "test" ], $distname, $depth) &&
+ $self->install([ $self->{make}, "install" ], [ "UNINST=1" ], $depth) &&
+ $installed++;
+ } else {
+ my $why;
+ my $configure_failed = $configure_state->{configured} && !$configure_state->{configured_ok};
+ if ($configure_failed) { $why = "Configure failed for $distname." }
+ elsif ($self->{make}) { $why = "The distribution doesn't have a proper Makefile.PL/Build.PL" }
+ else { $why = "Can't configure the distribution. You probably need to have 'make'." }
+
+ $self->diag_fail("$why See $self->{log} for details.", 1);
+ return;
+ }
+
+ if ($installed && $self->{test_only}) {
+ $self->diag_ok;
+ $self->diag("Successfully tested $distname\n", 1);
+ } elsif ($installed) {
+ my $local = $self->{local_versions}{$dist->{module} || ''};
+ my $version = $dist->{module_version} || $dist->{meta}{version} || $dist->{version};
+ my $reinstall = $local && ($local eq $version);
+ my $action = $local && !$reinstall
+ ? $self->numify_ver($version) < $self->numify_ver($local)
+ ? "downgraded"
+ : "upgraded"
+ : undef;
+
+ my $how = $reinstall ? "reinstalled $distname"
+ : $local ? "installed $distname ($action from $local)"
+ : "installed $distname" ;
+ my $msg = "Successfully $how";
+ $self->diag_ok;
+ $self->diag("$msg\n", 1);
+ $self->{installed_dists}++;
+ $self->save_meta($stuff, $dist, $module_name, \@config_deps, \@deps);
+ return 1;
+ } else {
+ my $what = $self->{test_only} ? "Testing" : "Installing";
+ $self->diag_fail("$what $stuff failed. See $self->{log} for details. Retry with --force to force install it.", 1);
+ return;
+ }
+ }
+
+ sub perl_requirements {
+ my($self, @requires) = @_;
+
+ my @perl;
+ for my $requires (grep defined, @requires) {
+ if (exists $requires->{perl}) {
+ push @perl, App::cpanminus::Dependency->new(perl => $requires->{perl});
+ }
+ }
+
+ return @perl;
+ }
+
+ sub should_use_mm {
+ my($self, $dist) = @_;
+
+ # Module::Build deps should use MakeMaker because that causes circular deps and fail
+ # Otherwise we should prefer Build.PL
+ my %should_use_mm = map { $_ => 1 } qw( version ExtUtils-ParseXS ExtUtils-Install ExtUtils-Manifest );
+
+ $should_use_mm{$dist};
+ }
+
+ sub configure_this {
+ my($self, $dist, $depth) = @_;
+
+ # Short-circuit `cpanm --installdeps .` because it doesn't need to build the current dir
+ if (-e $self->{cpanfile_path} && $self->{installdeps} && $depth == 0) {
+ require Module::CPANfile;
+ $dist->{cpanfile} = eval { Module::CPANfile->load($self->{cpanfile_path}) };
+ $self->diag_fail($@, 1) if $@;
+ return {
+ configured => 1,
+ configured_ok => !!$dist->{cpanfile},
+ use_module_build => 0,
+ };
+ }
+
+ if ($self->{skip_configure}) {
+ my $eumm = -e 'Makefile';
+ my $mb = -e 'Build' && -f _;
+ return {
+ configured => 1,
+ configured_ok => $eumm || $mb,
+ use_module_build => $mb,
+ };
+ }
+
+ my $state = {};
+
+ my $try_eumm = sub {
+ if (-e 'Makefile.PL') {
+ $self->chat("Running Makefile.PL\n");
+
+ # NOTE: according to Devel::CheckLib, most XS modules exit
+ # with 0 even if header files are missing, to avoid receiving
+ # tons of FAIL reports in such cases. So exit code can't be
+ # trusted if it went well.
+ if ($self->configure([ $self->{perl}, "Makefile.PL" ], $depth)) {
+ $state->{configured_ok} = -e 'Makefile';
+ }
+ $state->{configured}++;
+ }
+ };
+
+ my $try_mb = sub {
+ if (-e 'Build.PL') {
+ $self->chat("Running Build.PL\n");
+ if ($self->configure([ $self->{perl}, "Build.PL" ], $depth)) {
+ $state->{configured_ok} = -e 'Build' && -f _;
+ }
+ $state->{use_module_build}++;
+ $state->{configured}++;
+ }
+ };
+
+ my @try;
+ if ($dist->{dist} && $self->should_use_mm($dist->{dist})) {
+ @try = ($try_eumm, $try_mb);
+ } else {
+ @try = ($try_mb, $try_eumm);
+ }
+
+ for my $try (@try) {
+ $try->();
+ last if $state->{configured_ok};
+ }
+
+ unless ($state->{configured_ok}) {
+ while (1) {
+ my $ans = lc $self->prompt("Configuring $dist->{dist} failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?", "s");
+ last if $ans eq 's';
+ return $self->configure_this($dist, $depth) if $ans eq 'r';
+ $self->show_build_log if $ans eq 'e';
+ $self->look if $ans eq 'l';
+ }
+ }
+
+ return $state;
+ }
+
+ sub find_module_name {
+ my($self, $state) = @_;
+
+ return unless $state->{configured_ok};
+
+ if ($state->{use_module_build} &&
+ -e "_build/build_params") {
+ my $params = do { open my $in, "_build/build_params"; $self->safe_eval(join "", <$in>) };
+ return eval { $params->[2]{module_name} } || undef;
+ } elsif (-e "Makefile") {
+ open my $mf, "Makefile";
+ while (<$mf>) {
+ if (/^\#\s+NAME\s+=>\s+(.*)/) {
+ return $self->safe_eval($1);
+ }
+ }
+ }
+
+ return;
+ }
+
+ sub list_files {
+ my $self = shift;
+
+ if (-e 'MANIFEST') {
+ require ExtUtils::Manifest;
+ my $manifest = eval { ExtUtils::Manifest::manifind() } || {};
+ return sort { lc $a cmp lc $b } keys %$manifest;
+ } else {
+ require File::Find;
+ my @files;
+ my $finder = sub {
+ my $name = $File::Find::name;
+ $name =~ s!\.[/\\]!!;
+ push @files, $name;
+ };
+ File::Find::find($finder, ".");
+ return sort { lc $a cmp lc $b } @files;
+ }
+ }
+
+ sub extract_packages {
+ my($self, $meta, $dir) = @_;
+
+ my $try = sub {
+ my $file = shift;
+ return 0 if $file =~ m!^(?:x?t|inc|local|perl5|fatlib|_build)/!;
+ return 1 unless $meta->{no_index};
+ return 0 if grep { $file =~ m!^$_/! } @{$meta->{no_index}{directory} || []};
+ return 0 if grep { $file eq $_ } @{$meta->{no_index}{file} || []};
+ return 1;
+ };
+
+ require Parse::PMFile;
+
+ my @files = grep { /\.pm(?:\.PL)?$/ && $try->($_) } $self->list_files;
+
+ my $provides = { };
+
+ for my $file (@files) {
+ my $parser = Parse::PMFile->new($meta, { UNSAFE => 1, ALLOW_DEV_VERSION => 1 });
+ my $packages = $parser->parse($file);
+
+ while (my($package, $meta) = each %$packages) {
+ $provides->{$package} ||= {
+ file => $meta->{infile},
+ ($meta->{version} eq 'undef') ? () : (version => $meta->{version}),
+ };
+ }
+ }
+
+ return $provides;
+ }
+
+ sub save_meta {
+ my($self, $module, $dist, $module_name, $config_deps, $build_deps) = @_;
+
+ return unless $dist->{distvname} && $dist->{source} eq 'cpan';
+
+ my $base = ($ENV{PERL_MM_OPT} || '') =~ /INSTALL_BASE=/
+ ? ($self->install_base($ENV{PERL_MM_OPT}) . "/lib/perl5") : $Config{sitelibexp};
+
+ my $provides = $dist->{provides};
+
+ File::Path::mkpath("blib/meta", 0, 0777);
+
+ my $local = {
+ name => $module_name,
+ target => $module,
+ version => exists $provides->{$module_name}
+ ? ($provides->{$module_name}{version} || $dist->{version}) : $dist->{version},
+ dist => $dist->{distvname},
+ pathname => $dist->{pathname},
+ provides => $provides,
+ };
+
+ require JSON::PP;
+ open my $fh, ">", "blib/meta/install.json" or die $!;
+ print $fh JSON::PP::encode_json($local);
+
+ # Existence of MYMETA.* Depends on EUMM/M::B versions and CPAN::Meta
+ if (-e "MYMETA.json") {
+ File::Copy::copy("MYMETA.json", "blib/meta/MYMETA.json");
+ }
+
+ my @cmd = (
+ ($self->{sudo} ? 'sudo' : ()),
+ $^X,
+ '-MExtUtils::Install=install',
+ '-e',
+ qq[install({ 'blib/meta' => '$base/$Config{archname}/.meta/$dist->{distvname}' })],
+ );
+ $self->run(\@cmd);
+ }
+
+ sub _merge_hashref {
+ my($self, @hashrefs) = @_;
+
+ my %hash;
+ for my $h (@hashrefs) {
+ %hash = (%hash, %$h);
+ }
+
+ return \%hash;
+ }
+
+ sub install_base {
+ my($self, $mm_opt) = @_;
+ $mm_opt =~ /INSTALL_BASE=(\S+)/ and return $1;
+ die "Your PERL_MM_OPT doesn't contain INSTALL_BASE";
+ }
+
+ sub safe_eval {
+ my($self, $code) = @_;
+ eval $code;
+ }
+
+ sub configure_features {
+ my($self, $dist, @features) = @_;
+ map $_->identifier, grep { $self->effective_feature($dist, $_) } @features;
+ }
+
+ sub effective_feature {
+ my($self, $dist, $feature) = @_;
+
+ if ($dist->{depth} == 0) {
+ my $value = $self->{features}{$feature->identifier};
+ return $value if defined $value;
+ return 1 if $self->{features}{__all};
+ }
+
+ if ($self->{interactive}) {
+ require CPAN::Meta::Requirements;
+
+ $self->diag("[@{[ $feature->description ]}]\n", 1);
+
+ my $req = CPAN::Meta::Requirements->new;
+ for my $phase (@{$dist->{want_phases}}) {
+ for my $type (@{$self->{install_types}}) {
+ $req->add_requirements($feature->prereqs->requirements_for($phase, $type));
+ }
+ }
+
+ my $reqs = $req->as_string_hash;
+ my @missing;
+ for my $module (keys %$reqs) {
+ if ($self->should_install($module, $req->{$module})) {
+ push @missing, $module;
+ }
+ }
+
+ if (@missing) {
+ my $howmany = @missing;
+ $self->diag("==> Found missing dependencies: " . join(", ", @missing) . "\n", 1);
+ local $self->{prompt} = 1;
+ return $self->prompt_bool("Install the $howmany optional module(s)?", "y");
+ }
+ }
+
+ return;
+ }
+
+ sub find_prereqs {
+ my($self, $dist) = @_;
+
+ my @deps = $self->extract_meta_prereqs($dist);
+
+ if ($dist->{module} =~ /^Bundle::/i) {
+ push @deps, $self->bundle_deps($dist);
+ }
+
+ if ($self->{cpanfile_requirements} && !$dist->{cpanfile}) {
+ for my $dep (@deps) {
+ $dep->merge_with($self->{cpanfile_requirements});
+ }
+ }
+
+ return @deps;
+ }
+
+ sub extract_meta_prereqs {
+ my($self, $dist) = @_;
+
+ if ($dist->{cpanfile}) {
+ my @features = $self->configure_features($dist, $dist->{cpanfile}->features);
+ my $prereqs = $dist->{cpanfile}->prereqs_with(@features);
+ # TODO: creating requirements is useful even without cpanfile to detect conflicting prereqs
+ $self->{cpanfile_requirements} = $prereqs->merged_requirements($dist->{want_phases}, ['requires']);
+ return App::cpanminus::Dependency->from_prereqs($prereqs, $dist->{want_phases}, $self->{install_types});
+ }
+
+ require CPAN::Meta;
+
+ my @deps;
+ my($meta_file) = grep -f, qw(MYMETA.json MYMETA.yml);
+ if ($meta_file) {
+ $self->chat("Checking dependencies from $meta_file ...\n");
+ my $mymeta = eval { CPAN::Meta->load_file($meta_file, { lazy_validation => 1 }) };
+ if ($mymeta) {
+ $dist->{meta}{name} = $mymeta->name;
+ $dist->{meta}{version} = $mymeta->version;
+ return $self->extract_prereqs($mymeta, $dist);
+ }
+ }
+
+ if (-e '_build/prereqs') {
+ $self->chat("Checking dependencies from _build/prereqs ...\n");
+ my $prereqs = do { open my $in, "_build/prereqs"; $self->safe_eval(join "", <$in>) };
+ my $meta = CPAN::Meta->new(
+ { name => $dist->{meta}{name}, version => $dist->{meta}{version}, %$prereqs },
+ { lazy_validation => 1 },
+ );
+ @deps = $self->extract_prereqs($meta, $dist);
+ } elsif (-e 'Makefile') {
+ $self->chat("Finding PREREQ from Makefile ...\n");
+ open my $mf, "Makefile";
+ while (<$mf>) {
+ if (/^\#\s+PREREQ_PM => \{\s*(.*?)\s*\}/) {
+ my @all;
+ my @pairs = split ', ', $1;
+ for (@pairs) {
+ my ($pkg, $v) = split '=>', $_;
+ push @all, [ $pkg, $v ];
+ }
+ my $list = join ", ", map { "'$_->[0]' => $_->[1]" } @all;
+ my $prereq = $self->safe_eval("no strict; +{ $list }");
+ push @deps, App::cpanminus::Dependency->from_versions($prereq) if $prereq;
+ last;
+ }
+ }
+ }
+
+ return @deps;
+ }
+
+ sub bundle_deps {
+ my($self, $dist) = @_;
+
+ my @files;
+ File::Find::find({
+ wanted => sub { push @files, File::Spec->rel2abs($_) if /\.pm/i },
+ no_chdir => 1,
+ }, '.');
+
+ my @deps;
+
+ for my $file (@files) {
+ open my $pod, "<", $file or next;
+ my $in_contents;
+ while (<$pod>) {
+ if (/^=head\d\s+CONTENTS/) {
+ $in_contents = 1;
+ } elsif (/^=/) {
+ $in_contents = 0;
+ } elsif ($in_contents) {
+ /^(\S+)\s*(\S+)?/
+ and push @deps, App::cpanminus::Dependency->new($1, $self->maybe_version($2));
+ }
+ }
+ }
+
+ return @deps;
+ }
+
+ sub maybe_version {
+ my($self, $string) = @_;
+ return $string && $string =~ /^\.?\d/ ? $string : undef;
+ }
+
+ sub extract_prereqs {
+ my($self, $meta, $dist) = @_;
+
+ my @features = $self->configure_features($dist, $meta->features);
+ my $prereqs = $self->soften_makemaker_prereqs($meta->effective_prereqs(\@features)->clone);
+
+ return App::cpanminus::Dependency->from_prereqs($prereqs, $dist->{want_phases}, $self->{install_types});
+ }
+
+ # Workaround for Module::Install 1.04 creating a bogus (higher) MakeMaker requirement that it needs in build_requires
+ # Assuming MakeMaker requirement is already satisfied in configure_requires, there's no need to have higher version of
+ # MakeMaker in build/test anyway. https://github.com/miyagawa/cpanminus/issues/463
+ sub soften_makemaker_prereqs {
+ my($self, $prereqs) = @_;
+
+ return $prereqs unless -e "inc/Module/Install.pm";
+
+ for my $phase (qw( build test runtime )) {
+ my $reqs = $prereqs->requirements_for($phase, 'requires');
+ if ($reqs->requirements_for_module('ExtUtils::MakeMaker')) {
+ $reqs->clear_requirement('ExtUtils::MakeMaker');
+ $reqs->add_minimum('ExtUtils::MakeMaker' => 0);
+ }
+ }
+
+ $prereqs;
+ }
+
+ sub cleanup_workdirs {
+ my $self = shift;
+
+ my $expire = time - 24 * 60 * 60 * $self->{auto_cleanup};
+ my @targets;
+
+ opendir my $dh, "$self->{home}/work";
+ while (my $e = readdir $dh) {
+ next if $e !~ /^(\d+)\.\d+$/; # {UNIX time}.{PID}
+ my $time = $1;
+ if ($time < $expire) {
+ push @targets, "$self->{home}/work/$e";
+ }
+ }
+
+ if (@targets) {
+ if (@targets >= 64) {
+ $self->diag("Expiring " . scalar(@targets) . " work directories. This might take a while...\n");
+ } else {
+ $self->chat("Expiring " . scalar(@targets) . " work directories.\n");
+ }
+ File::Path::rmtree(\@targets, 0, 0); # safe = 0, since blib usually doesn't have write bits
+ }
+ }
+
+ sub scandeps_append_child {
+ my($self, $dist) = @_;
+
+ my $new_node = [ $dist, [] ];
+
+ my $curr_node = $self->{scandeps_current} || [ undef, $self->{scandeps_tree} ];
+ push @{$curr_node->[1]}, $new_node;
+
+ $self->{scandeps_current} = $new_node;
+
+ return sub { $self->{scandeps_current} = $curr_node };
+ }
+
+ sub dump_scandeps {
+ my $self = shift;
+
+ if ($self->{format} eq 'tree') {
+ $self->walk_down(sub {
+ my($dist, $depth) = @_;
+ if ($depth == 0) {
+ print "$dist->{distvname}\n";
+ } else {
+ print " " x ($depth - 1);
+ print "\\_ $dist->{distvname}\n";
+ }
+ }, 1);
+ } elsif ($self->{format} =~ /^dists?$/) {
+ $self->walk_down(sub {
+ my($dist, $depth) = @_;
+ print $self->format_dist($dist), "\n";
+ }, 0);
+ } elsif ($self->{format} eq 'json') {
+ require JSON::PP;
+ print JSON::PP::encode_json($self->{scandeps_tree});
+ } elsif ($self->{format} eq 'yaml') {
+ require YAML; # no fatpack
+ print YAML::Dump($self->{scandeps_tree});
+ } else {
+ $self->diag("Unknown format: $self->{format}\n");
+ }
+ }
+
+ sub walk_down {
+ my($self, $cb, $pre) = @_;
+ $self->_do_walk_down($self->{scandeps_tree}, $cb, 0, $pre);
+ }
+
+ sub _do_walk_down {
+ my($self, $children, $cb, $depth, $pre) = @_;
+
+ # DFS - $pre determines when we call the callback
+ for my $node (@$children) {
+ $cb->($node->[0], $depth) if $pre;
+ $self->_do_walk_down($node->[1], $cb, $depth + 1, $pre);
+ $cb->($node->[0], $depth) unless $pre;
+ }
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ $self->{at_exit}->($self) if $self->{at_exit};
+ }
+
+ # Utils
+
+ sub shell_quote {
+ my($self, @stuff) = @_;
+ if (WIN32) {
+ join ' ', map { /^${quote}.+${quote}$/ ? $_ : ($quote . $_ . $quote) } @stuff;
+ } else {
+ String::ShellQuote::shell_quote_best_effort(@stuff);
+ }
+ }
+
+ sub which {
+ my($self, $name) = @_;
+ if (File::Spec->file_name_is_absolute($name)) {
+ if (-x $name && !-d _) {
+ return $name;
+ }
+ }
+ my $exe_ext = $Config{_exe};
+ for my $dir (File::Spec->path) {
+ my $fullpath = File::Spec->catfile($dir, $name);
+ if ((-x $fullpath || -x ($fullpath .= $exe_ext)) && !-d _) {
+ if ($fullpath =~ /\s/) {
+ $fullpath = $self->shell_quote($fullpath);
+ }
+ return $fullpath;
+ }
+ }
+ return;
+ }
+
+ sub get {
+ my($self, $uri) = @_;
+ if ($uri =~ /^file:/) {
+ $self->file_get($uri);
+ } else {
+ $self->{_backends}{get}->(@_);
+ }
+ }
+
+ sub mirror {
+ my($self, $uri, $local) = @_;
+ if ($uri =~ /^file:/) {
+ $self->file_mirror($uri, $local);
+ } else {
+ $self->{_backends}{mirror}->(@_);
+ }
+ }
+
+ sub untar { $_[0]->{_backends}{untar}->(@_) };
+ sub unzip { $_[0]->{_backends}{unzip}->(@_) };
+
+ sub uri_to_file {
+ my($self, $uri) = @_;
+
+ # file:///path/to/file -> /path/to/file
+ # file://C:/path -> C:/path
+ if ($uri =~ s!file:/+!!) {
+ $uri = "/$uri" unless $uri =~ m![a-zA-Z]:!;
+ }
+
+ return $uri;
+ }
+
+ sub file_get {
+ my($self, $uri) = @_;
+ my $file = $self->uri_to_file($uri);
+ open my $fh, "<$file" or return;
+ join '', <$fh>;
+ }
+
+ sub file_mirror {
+ my($self, $uri, $path) = @_;
+ my $file = $self->uri_to_file($uri);
+ File::Copy::copy($file, $path);
+ }
+
+ sub has_working_lwp {
+ my($self, $mirrors) = @_;
+ my $https = grep /^https:/, @$mirrors;
+ eval {
+ require LWP::UserAgent; # no fatpack
+ LWP::UserAgent->VERSION(5.802);
+ require LWP::Protocol::https if $https; # no fatpack
+ 1;
+ };
+ }
+
+ sub init_tools {
+ my $self = shift;
+
+ return if $self->{initialized}++;
+
+ if ($self->{make} = $self->which($Config{make})) {
+ $self->chat("You have make $self->{make}\n");
+ }
+
+ # use --no-lwp if they have a broken LWP, to upgrade LWP
+ if ($self->{try_lwp} && $self->has_working_lwp($self->{mirrors})) {
+ $self->chat("You have LWP $LWP::VERSION\n");
+ my $ua = sub {
+ LWP::UserAgent->new(
+ parse_head => 0,
+ env_proxy => 1,
+ agent => $self->agent,
+ timeout => 30,
+ @_,
+ );
+ };
+ $self->{_backends}{get} = sub {
+ my $self = shift;
+ my $res = $ua->()->request(HTTP::Request->new(GET => $_[0]));
+ return unless $res->is_success;
+ return $res->decoded_content;
+ };
+ $self->{_backends}{mirror} = sub {
+ my $self = shift;
+ my $res = $ua->()->mirror(@_);
+ die $res->content if $res->code == 501;
+ $res->code;
+ };
+ } elsif ($self->{try_wget} and my $wget = $self->which('wget')) {
+ $self->chat("You have $wget\n");
+ my @common = (
+ '--user-agent', $self->agent,
+ '--retry-connrefused',
+ ($self->{verbose} ? () : ('-q')),
+ );
+ $self->{_backends}{get} = sub {
+ my($self, $uri) = @_;
+ $self->safeexec( my $fh, $wget, $uri, @common, '-O', '-' ) or die "wget $uri: $!";
+ local $/;
+ <$fh>;
+ };
+ $self->{_backends}{mirror} = sub {
+ my($self, $uri, $path) = @_;
+ $self->safeexec( my $fh, $wget, $uri, @common, '-O', $path ) or die "wget $uri: $!";
+ local $/;
+ <$fh>;
+ };
+ } elsif ($self->{try_curl} and my $curl = $self->which('curl')) {
+ $self->chat("You have $curl\n");
+ my @common = (
+ '--location',
+ '--user-agent', $self->agent,
+ ($self->{verbose} ? () : '-s'),
+ );
+ $self->{_backends}{get} = sub {
+ my($self, $uri) = @_;
+ $self->safeexec( my $fh, $curl, @common, $uri ) or die "curl $uri: $!";
+ local $/;
+ <$fh>;
+ };
+ $self->{_backends}{mirror} = sub {
+ my($self, $uri, $path) = @_;
+ $self->safeexec( my $fh, $curl, @common, $uri, '-#', '-o', $path ) or die "curl $uri: $!";
+ local $/;
+ <$fh>;
+ };
+ } else {
+ require HTTP::Tiny;
+ $self->chat("Falling back to HTTP::Tiny $HTTP::Tiny::VERSION\n");
+ my %common = (
+ agent => $self->agent,
+ );
+ $self->{_backends}{get} = sub {
+ my $self = shift;
+ my $res = HTTP::Tiny->new(%common)->get($_[0]);
+ return unless $res->{success};
+ return $res->{content};
+ };
+ $self->{_backends}{mirror} = sub {
+ my $self = shift;
+ my $res = HTTP::Tiny->new(%common)->mirror(@_);
+ return $res->{status};
+ };
+ }
+
+ my $tar = $self->which('tar');
+ my $tar_ver;
+ my $maybe_bad_tar = sub { WIN32 || BAD_TAR || (($tar_ver = `$tar --version 2>/dev/null`) =~ /GNU.*1\.13/i) };
+
+ if ($tar && !$maybe_bad_tar->()) {
+ chomp $tar_ver;
+ $self->chat("You have $tar: $tar_ver\n");
+ $self->{_backends}{untar} = sub {
+ my($self, $tarfile) = @_;
+
+ my $xf = ($self->{verbose} ? 'v' : '')."xf";
+ my $ar = $tarfile =~ /bz2$/ ? 'j' : 'z';
+
+ my($root, @others) = `$tar ${ar}tf $tarfile`
+ or return undef;
+
+ FILE: {
+ chomp $root;
+ $root =~ s!^\./!!;
+ $root =~ s{^(.+?)/.*$}{$1};
+
+ if (!length($root)) {
+ # archive had ./ as the first entry, so try again
+ $root = shift(@others);
+ redo FILE if $root;
+ }
+ }
+
+ system "$tar $ar$xf $tarfile";
+ return $root if -d $root;
+
+ $self->diag_fail("Bad archive: $tarfile");
+ return undef;
+ }
+ } elsif ( $tar
+ and my $gzip = $self->which('gzip')
+ and my $bzip2 = $self->which('bzip2')) {
+ $self->chat("You have $tar, $gzip and $bzip2\n");
+ $self->{_backends}{untar} = sub {
+ my($self, $tarfile) = @_;
+
+ my $x = "x" . ($self->{verbose} ? 'v' : '') . "f -";
+ my $ar = $tarfile =~ /bz2$/ ? $bzip2 : $gzip;
+
+ my($root, @others) = `$ar -dc $tarfile | $tar tf -`
+ or return undef;
+
+ FILE: {
+ chomp $root;
+ $root =~ s!^\./!!;
+ $root =~ s{^(.+?)/.*$}{$1};
+
+ if (!length($root)) {
+ # archive had ./ as the first entry, so try again
+ $root = shift(@others);
+ redo FILE if $root;
+ }
+ }
+
+ system "$ar -dc $tarfile | $tar $x";
+ return $root if -d $root;
+
+ $self->diag_fail("Bad archive: $tarfile");
+ return undef;
+ }
+ } elsif (eval { require Archive::Tar }) { # uses too much memory!
+ $self->chat("Falling back to Archive::Tar $Archive::Tar::VERSION\n");
+ $self->{_backends}{untar} = sub {
+ my $self = shift;
+ my $t = Archive::Tar->new($_[0]);
+ my($root, @others) = $t->list_files;
+ FILE: {
+ $root =~ s!^\./!!;
+ $root =~ s{^(.+?)/.*$}{$1};
+
+ if (!length($root)) {
+ # archive had ./ as the first entry, so try again
+ $root = shift(@others);
+ redo FILE if $root;
+ }
+ }
+ $t->extract;
+ return -d $root ? $root : undef;
+ };
+ } else {
+ $self->{_backends}{untar} = sub {
+ die "Failed to extract $_[1] - You need to have tar or Archive::Tar installed.\n";
+ };
+ }
+
+ if (my $unzip = $self->which('unzip')) {
+ $self->chat("You have $unzip\n");
+ $self->{_backends}{unzip} = sub {
+ my($self, $zipfile) = @_;
+
+ my $opt = $self->{verbose} ? '' : '-q';
+ my(undef, $root, @others) = `$unzip -t $zipfile`
+ or return undef;
+
+ chomp $root;
+ $root =~ s{^\s+testing:\s+([^/]+)/.*?\s+OK$}{$1};
+
+ system "$unzip $opt $zipfile";
+ return $root if -d $root;
+
+ $self->diag_fail("Bad archive: [$root] $zipfile");
+ return undef;
+ }
+ } else {
+ $self->{_backends}{unzip} = sub {
+ eval { require Archive::Zip }
+ or die "Failed to extract $_[1] - You need to have unzip or Archive::Zip installed.\n";
+ my($self, $file) = @_;
+ my $zip = Archive::Zip->new();
+ my $status;
+ $status = $zip->read($file);
+ $self->diag_fail("Read of file[$file] failed")
+ if $status != Archive::Zip::AZ_OK();
+ my @members = $zip->members();
+ for my $member ( @members ) {
+ my $af = $member->fileName();
+ next if ($af =~ m!^(/|\.\./)!);
+ $status = $member->extractToFileNamed( $af );
+ $self->diag_fail("Extracting of file[$af] from zipfile[$file failed")
+ if $status != Archive::Zip::AZ_OK();
+ }
+
+ my ($root) = $zip->membersMatching( qr<^[^/]+/$> );
+ $root &&= $root->fileName;
+ return -d $root ? $root : undef;
+ };
+ }
+ }
+
+ sub safeexec {
+ my $self = shift;
+ my $rdr = $_[0] ||= Symbol::gensym();
+
+ if (WIN32) {
+ my $cmd = $self->shell_quote(@_[1..$#_]);
+ return open( $rdr, "$cmd |" );
+ }
+
+ if ( my $pid = open( $rdr, '-|' ) ) {
+ return $pid;
+ }
+ elsif ( defined $pid ) {
+ exec( @_[ 1 .. $#_ ] );
+ exit 1;
+ }
+ else {
+ return;
+ }
+ }
+
+ sub mask_uri_passwords {
+ my($self, @strings) = @_;
+ s{ (https?://) ([^:/]+) : [^@/]+ @ }{$1$2:********@}gx for @strings;
+ return @strings;
+ }
+
+ 1;
+ APP_CPANMINUS_SCRIPT
+
+ $fatpacked{"CPAN/DistnameInfo.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_DISTNAMEINFO';
+
+ package CPAN::DistnameInfo;
+
+ $VERSION = "0.12";
+ use strict;
+
+ sub distname_info {
+ my $file = shift or return;
+
+ my ($dist, $version) = $file =~ /^
+ ((?:[-+.]*(?:[A-Za-z0-9]+|(?<=\D)_|_(?=\D))*
+ (?:
+ [A-Za-z](?=[^A-Za-z]|$)
+ |
+ \d(?=-)
+ )(?<![._-][vV])
+ )+)(.*)
+ $/xs or return ($file,undef,undef);
+
+ if ($dist =~ /-undef\z/ and ! length $version) {
+ $dist =~ s/-undef\z//;
+ }
+
+ # Remove potential -withoutworldwriteables suffix
+ $version =~ s/-withoutworldwriteables$//;
+
+ if ($version =~ /^(-[Vv].*)-(\d.*)/) {
+
+ # Catch names like Unicode-Collate-Standard-V3_1_1-0.1
+ # where the V3_1_1 is part of the distname
+ $dist .= $1;
+ $version = $2;
+ }
+
+ if ($version =~ /(.+_.*)-(\d.*)/) {
+ # Catch names like Task-Deprecations5_14-1.00.tar.gz where the 5_14 is
+ # part of the distname. However, names like libao-perl_0.03-1.tar.gz
+ # should still have 0.03-1 as their version.
+ $dist .= $1;
+ $version = $2;
+ }
+
+ # Normalize the Dist.pm-1.23 convention which CGI.pm and
+ # a few others use.
+ $dist =~ s{\.pm$}{};
+
+ $version = $1
+ if !length $version and $dist =~ s/-(\d+\w)$//;
+
+ $version = $1 . $version
+ if $version =~ /^\d+$/ and $dist =~ s/-(\w+)$//;
+
+ if ($version =~ /\d\.\d/) {
+ $version =~ s/^[-_.]+//;
+ }
+ else {
+ $version =~ s/^[-_]+//;
+ }
+
+ my $dev;
+ if (length $version) {
+ if ($file =~ /^perl-?\d+\.(\d+)(?:\D(\d+))?(-(?:TRIAL|RC)\d+)?$/) {
+ $dev = 1 if (($1 > 6 and $1 & 1) or ($2 and $2 >= 50)) or $3;
+ }
+ elsif ($version =~ /\d\D\d+_\d/ or $version =~ /-TRIAL/) {
+ $dev = 1;
+ }
+ }
+ else {
+ $version = undef;
+ }
+
+ ($dist, $version, $dev);
+ }
+
+ sub new {
+ my $class = shift;
+ my $distfile = shift;
+
+ $distfile =~ s,//+,/,g;
+
+ my %info = ( pathname => $distfile );
+
+ ($info{filename} = $distfile) =~ s,^(((.*?/)?authors/)?id/)?([A-Z])/(\4[A-Z])/(\5[-A-Z0-9]*)/,,
+ and $info{cpanid} = $6;
+
+ if ($distfile =~ m,([^/]+)\.(tar\.(?:g?z|bz2)|zip|tgz)$,i) { # support more ?
+ $info{distvname} = $1;
+ $info{extension} = $2;
+ }
+
+ @info{qw(dist version beta)} = distname_info($info{distvname});
+ $info{maturity} = delete $info{beta} ? 'developer' : 'released';
+
+ return bless \%info, $class;
+ }
+
+ sub dist { shift->{dist} }
+ sub version { shift->{version} }
+ sub maturity { shift->{maturity} }
+ sub filename { shift->{filename} }
+ sub cpanid { shift->{cpanid} }
+ sub distvname { shift->{distvname} }
+ sub extension { shift->{extension} }
+ sub pathname { shift->{pathname} }
+
+ sub properties { %{ $_[0] } }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ CPAN::DistnameInfo - Extract distribution name and version from a distribution filename
+
+ =head1 SYNOPSIS
+
+ my $pathname = "authors/id/G/GB/GBARR/CPAN-DistnameInfo-0.02.tar.gz";
+
+ my $d = CPAN::DistnameInfo->new($pathname);
+
+ my $dist = $d->dist; # "CPAN-DistnameInfo"
+ my $version = $d->version; # "0.02"
+ my $maturity = $d->maturity; # "released"
+ my $filename = $d->filename; # "CPAN-DistnameInfo-0.02.tar.gz"
+ my $cpanid = $d->cpanid; # "GBARR"
+ my $distvname = $d->distvname; # "CPAN-DistnameInfo-0.02"
+ my $extension = $d->extension; # "tar.gz"
+ my $pathname = $d->pathname; # "authors/id/G/GB/GBARR/..."
+
+ my %prop = $d->properties;
+
+ =head1 DESCRIPTION
+
+ Many online services that are centered around CPAN attempt to
+ associate multiple uploads by extracting a distribution name from
+ the filename of the upload. For most distributions this is easy as
+ they have used ExtUtils::MakeMaker or Module::Build to create the
+ distribution, which results in a uniform name. But sadly not all
+ uploads are created in this way.
+
+ C<CPAN::DistnameInfo> uses heuristics that have been learnt by
+ L<http://search.cpan.org/> to extract the distribution name and
+ version from filenames and also report if the version is to be
+ treated as a developer release
+
+ The constructor takes a single pathname, returning an object with the following methods
+
+ =over
+
+ =item cpanid
+
+ If the path given looked like a CPAN authors directory path, then this will be the
+ the CPAN id of the author.
+
+ =item dist
+
+ The name of the distribution
+
+ =item distvname
+
+ The file name with any suffix and leading directory names removed
+
+ =item filename
+
+ If the path given looked like a CPAN authors directory path, then this will be the
+ path to the file relative to the detected CPAN author directory. Otherwise it is the path
+ that was passed in.
+
+ =item maturity
+
+ The maturity of the distribution. This will be either C<released> or C<developer>
+
+ =item extension
+
+ The extension of the distribution, often used to denote the archive type (e.g. 'tar.gz')
+
+ =item pathname
+
+ The pathname that was passed to the constructor when creating the object.
+
+ =item properties
+
+ This will return a list of key-value pairs, suitable for assigning to a hash,
+ for the known properties.
+
+ =item version
+
+ The extracted version
+
+ =back
+
+ =head1 AUTHOR
+
+ Graham Barr <gbarr@pobox.com>
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2003 Graham Barr. All rights reserved. This program is
+ free software; you can redistribute it and/or modify it under the same
+ terms as Perl itself.
+
+ =cut
+
+ CPAN_DISTNAMEINFO
+
+ $fatpacked{"CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta;
+
+ our $VERSION = '2.150005';
+
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod use v5.10;
+ #pod use strict;
+ #pod use warnings;
+ #pod use CPAN::Meta;
+ #pod use Module::Load;
+ #pod
+ #pod my $meta = CPAN::Meta->load_file('META.json');
+ #pod
+ #pod printf "testing requirements for %s version %s\n",
+ #pod $meta->name,
+ #pod $meta->version;
+ #pod
+ #pod my $prereqs = $meta->effective_prereqs;
+ #pod
+ #pod for my $phase ( qw/configure runtime build test/ ) {
+ #pod say "Requirements for $phase:";
+ #pod my $reqs = $prereqs->requirements_for($phase, "requires");
+ #pod for my $module ( sort $reqs->required_modules ) {
+ #pod my $status;
+ #pod if ( eval { load $module unless $module eq 'perl'; 1 } ) {
+ #pod my $version = $module eq 'perl' ? $] : $module->VERSION;
+ #pod $status = $reqs->accepts_module($module, $version)
+ #pod ? "$version ok" : "$version not ok";
+ #pod } else {
+ #pod $status = "missing"
+ #pod };
+ #pod say " $module ($status)";
+ #pod }
+ #pod }
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod Software distributions released to the CPAN include a F<META.json> or, for
+ #pod older distributions, F<META.yml>, which describes the distribution, its
+ #pod contents, and the requirements for building and installing the distribution.
+ #pod The data structure stored in the F<META.json> file is described in
+ #pod L<CPAN::Meta::Spec>.
+ #pod
+ #pod CPAN::Meta provides a simple class to represent this distribution metadata (or
+ #pod I<distmeta>), along with some helpful methods for interrogating that data.
+ #pod
+ #pod The documentation below is only for the methods of the CPAN::Meta object. For
+ #pod information on the meaning of individual fields, consult the spec.
+ #pod
+ #pod =cut
+
+ use Carp qw(carp croak);
+ use CPAN::Meta::Feature;
+ use CPAN::Meta::Prereqs;
+ use CPAN::Meta::Converter;
+ use CPAN::Meta::Validator;
+ use Parse::CPAN::Meta 1.4414 ();
+
+ BEGIN { *_dclone = \&CPAN::Meta::Converter::_dclone }
+
+ #pod =head1 STRING DATA
+ #pod
+ #pod The following methods return a single value, which is the value for the
+ #pod corresponding entry in the distmeta structure. Values should be either undef
+ #pod or strings.
+ #pod
+ #pod =for :list
+ #pod * abstract
+ #pod * description
+ #pod * dynamic_config
+ #pod * generated_by
+ #pod * name
+ #pod * release_status
+ #pod * version
+ #pod
+ #pod =cut
+
+ BEGIN {
+ my @STRING_READERS = qw(
+ abstract
+ description
+ dynamic_config
+ generated_by
+ name
+ release_status
+ version
+ );
+
+ no strict 'refs';
+ for my $attr (@STRING_READERS) {
+ *$attr = sub { $_[0]{ $attr } };
+ }
+ }
+
+ #pod =head1 LIST DATA
+ #pod
+ #pod These methods return lists of string values, which might be represented in the
+ #pod distmeta structure as arrayrefs or scalars:
+ #pod
+ #pod =for :list
+ #pod * authors
+ #pod * keywords
+ #pod * licenses
+ #pod
+ #pod The C<authors> and C<licenses> methods may also be called as C<author> and
+ #pod C<license>, respectively, to match the field name in the distmeta structure.
+ #pod
+ #pod =cut
+
+ BEGIN {
+ my @LIST_READERS = qw(
+ author
+ keywords
+ license
+ );
+
+ no strict 'refs';
+ for my $attr (@LIST_READERS) {
+ *$attr = sub {
+ my $value = $_[0]{ $attr };
+ croak "$attr must be called in list context"
+ unless wantarray;
+ return @{ _dclone($value) } if ref $value;
+ return $value;
+ };
+ }
+ }
+
+ sub authors { $_[0]->author }
+ sub licenses { $_[0]->license }
+
+ #pod =head1 MAP DATA
+ #pod
+ #pod These readers return hashrefs of arbitrary unblessed data structures, each
+ #pod described more fully in the specification:
+ #pod
+ #pod =for :list
+ #pod * meta_spec
+ #pod * resources
+ #pod * provides
+ #pod * no_index
+ #pod * prereqs
+ #pod * optional_features
+ #pod
+ #pod =cut
+
+ BEGIN {
+ my @MAP_READERS = qw(
+ meta-spec
+ resources
+ provides
+ no_index
+
+ prereqs
+ optional_features
+ );
+
+ no strict 'refs';
+ for my $attr (@MAP_READERS) {
+ (my $subname = $attr) =~ s/-/_/;
+ *$subname = sub {
+ my $value = $_[0]{ $attr };
+ return _dclone($value) if $value;
+ return {};
+ };
+ }
+ }
+
+ #pod =head1 CUSTOM DATA
+ #pod
+ #pod A list of custom keys are available from the C<custom_keys> method and
+ #pod particular keys may be retrieved with the C<custom> method.
+ #pod
+ #pod say $meta->custom($_) for $meta->custom_keys;
+ #pod
+ #pod If a custom key refers to a data structure, a deep clone is returned.
+ #pod
+ #pod =cut
+
+ sub custom_keys {
+ return grep { /^x_/i } keys %{$_[0]};
+ }
+
+ sub custom {
+ my ($self, $attr) = @_;
+ my $value = $self->{$attr};
+ return _dclone($value) if ref $value;
+ return $value;
+ }
+
+ #pod =method new
+ #pod
+ #pod my $meta = CPAN::Meta->new($distmeta_struct, \%options);
+ #pod
+ #pod Returns a valid CPAN::Meta object or dies if the supplied metadata hash
+ #pod reference fails to validate. Older-format metadata will be up-converted to
+ #pod version 2 if they validate against the original stated specification.
+ #pod
+ #pod It takes an optional hashref of options. Valid options include:
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod lazy_validation -- if true, new will attempt to convert the given metadata
+ #pod to version 2 before attempting to validate it. This means than any
+ #pod fixable errors will be handled by CPAN::Meta::Converter before validation.
+ #pod (Note that this might result in invalid optional data being silently
+ #pod dropped.) The default is false.
+ #pod
+ #pod =back
+ #pod
+ #pod =cut
+
+ sub _new {
+ my ($class, $struct, $options) = @_;
+ my $self;
+
+ if ( $options->{lazy_validation} ) {
+ # try to convert to a valid structure; if succeeds, then return it
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+ $self = $cmc->convert( version => 2 ); # valid or dies
+ return bless $self, $class;
+ }
+ else {
+ # validate original struct
+ my $cmv = CPAN::Meta::Validator->new( $struct );
+ unless ( $cmv->is_valid) {
+ die "Invalid metadata structure. Errors: "
+ . join(", ", $cmv->errors) . "\n";
+ }
+ }
+
+ # up-convert older spec versions
+ my $version = $struct->{'meta-spec'}{version} || '1.0';
+ if ( $version == 2 ) {
+ $self = $struct;
+ }
+ else {
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+ $self = $cmc->convert( version => 2 );
+ }
+
+ return bless $self, $class;
+ }
+
+ sub new {
+ my ($class, $struct, $options) = @_;
+ my $self = eval { $class->_new($struct, $options) };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method create
+ #pod
+ #pod my $meta = CPAN::Meta->create($distmeta_struct, \%options);
+ #pod
+ #pod This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields
+ #pod will be generated if not provided. This means the metadata structure is
+ #pod assumed to otherwise follow the latest L<CPAN::Meta::Spec>.
+ #pod
+ #pod =cut
+
+ sub create {
+ my ($class, $struct, $options) = @_;
+ my $version = __PACKAGE__->VERSION || 2;
+ $struct->{generated_by} ||= __PACKAGE__ . " version $version" ;
+ $struct->{'meta-spec'}{version} ||= int($version);
+ my $self = eval { $class->_new($struct, $options) };
+ croak ($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_file
+ #pod
+ #pod my $meta = CPAN::Meta->load_file($distmeta_file, \%options);
+ #pod
+ #pod Given a pathname to a file containing metadata, this deserializes the file
+ #pod according to its file suffix and constructs a new C<CPAN::Meta> object, just
+ #pod like C<new()>. It will die if the deserialized version fails to validate
+ #pod against its stated specification version.
+ #pod
+ #pod It takes the same options as C<new()> but C<lazy_validation> defaults to
+ #pod true.
+ #pod
+ #pod =cut
+
+ sub load_file {
+ my ($class, $file, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ croak "load_file() requires a valid, readable filename"
+ unless -r $file;
+
+ my $self;
+ eval {
+ my $struct = Parse::CPAN::Meta->load_file( $file );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_yaml_string
+ #pod
+ #pod my $meta = CPAN::Meta->load_yaml_string($yaml, \%options);
+ #pod
+ #pod This method returns a new CPAN::Meta object using the first document in the
+ #pod given YAML string. In other respects it is identical to C<load_file()>.
+ #pod
+ #pod =cut
+
+ sub load_yaml_string {
+ my ($class, $yaml, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ my $self;
+ eval {
+ my ($struct) = Parse::CPAN::Meta->load_yaml_string( $yaml );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_json_string
+ #pod
+ #pod my $meta = CPAN::Meta->load_json_string($json, \%options);
+ #pod
+ #pod This method returns a new CPAN::Meta object using the structure represented by
+ #pod the given JSON string. In other respects it is identical to C<load_file()>.
+ #pod
+ #pod =cut
+
+ sub load_json_string {
+ my ($class, $json, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ my $self;
+ eval {
+ my $struct = Parse::CPAN::Meta->load_json_string( $json );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_string
+ #pod
+ #pod my $meta = CPAN::Meta->load_string($string, \%options);
+ #pod
+ #pod If you don't know if a string contains YAML or JSON, this method will use
+ #pod L<Parse::CPAN::Meta> to guess. In other respects it is identical to
+ #pod C<load_file()>.
+ #pod
+ #pod =cut
+
+ sub load_string {
+ my ($class, $string, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ my $self;
+ eval {
+ my $struct = Parse::CPAN::Meta->load_string( $string );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method save
+ #pod
+ #pod $meta->save($distmeta_file, \%options);
+ #pod
+ #pod Serializes the object as JSON and writes it to the given file. The only valid
+ #pod option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file
+ #pod is saved with UTF-8 encoding.
+ #pod
+ #pod For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP>
+ #pod is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or
+ #pod later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate
+ #pod backend like L<JSON::XS>.
+ #pod
+ #pod For C<version> less than 2, the filename should end in '.yml'.
+ #pod L<CPAN::Meta::Converter> is used to generate an older metadata structure, which
+ #pod is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may
+ #pod set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though
+ #pod this is not recommended due to subtle incompatibilities between YAML parsers on
+ #pod CPAN.
+ #pod
+ #pod =cut
+
+ sub save {
+ my ($self, $file, $options) = @_;
+
+ my $version = $options->{version} || '2';
+ my $layer = $] ge '5.008001' ? ':utf8' : '';
+
+ if ( $version ge '2' ) {
+ carp "'$file' should end in '.json'"
+ unless $file =~ m{\.json$};
+ }
+ else {
+ carp "'$file' should end in '.yml'"
+ unless $file =~ m{\.yml$};
+ }
+
+ my $data = $self->as_string( $options );
+ open my $fh, ">$layer", $file
+ or die "Error opening '$file' for writing: $!\n";
+
+ print {$fh} $data;
+ close $fh
+ or die "Error closing '$file': $!\n";
+
+ return 1;
+ }
+
+ #pod =method meta_spec_version
+ #pod
+ #pod This method returns the version part of the C<meta_spec> entry in the distmeta
+ #pod structure. It is equivalent to:
+ #pod
+ #pod $meta->meta_spec->{version};
+ #pod
+ #pod =cut
+
+ sub meta_spec_version {
+ my ($self) = @_;
+ return $self->meta_spec->{version};
+ }
+
+ #pod =method effective_prereqs
+ #pod
+ #pod my $prereqs = $meta->effective_prereqs;
+ #pod
+ #pod my $prereqs = $meta->effective_prereqs( \@feature_identifiers );
+ #pod
+ #pod This method returns a L<CPAN::Meta::Prereqs> object describing all the
+ #pod prereqs for the distribution. If an arrayref of feature identifiers is given,
+ #pod the prereqs for the identified features are merged together with the
+ #pod distribution's core prereqs before the CPAN::Meta::Prereqs object is returned.
+ #pod
+ #pod =cut
+
+ sub effective_prereqs {
+ my ($self, $features) = @_;
+ $features ||= [];
+
+ my $prereq = CPAN::Meta::Prereqs->new($self->prereqs);
+
+ return $prereq unless @$features;
+
+ my @other = map {; $self->feature($_)->prereqs } @$features;
+
+ return $prereq->with_merged_prereqs(\@other);
+ }
+
+ #pod =method should_index_file
+ #pod
+ #pod ... if $meta->should_index_file( $filename );
+ #pod
+ #pod This method returns true if the given file should be indexed. It decides this
+ #pod by checking the C<file> and C<directory> keys in the C<no_index> property of
+ #pod the distmeta structure. Note that neither the version format nor
+ #pod C<release_status> are considered.
+ #pod
+ #pod C<$filename> should be given in unix format.
+ #pod
+ #pod =cut
+
+ sub should_index_file {
+ my ($self, $filename) = @_;
+
+ for my $no_index_file (@{ $self->no_index->{file} || [] }) {
+ return if $filename eq $no_index_file;
+ }
+
+ for my $no_index_dir (@{ $self->no_index->{directory} }) {
+ $no_index_dir =~ s{$}{/} unless $no_index_dir =~ m{/\z};
+ return if index($filename, $no_index_dir) == 0;
+ }
+
+ return 1;
+ }
+
+ #pod =method should_index_package
+ #pod
+ #pod ... if $meta->should_index_package( $package );
+ #pod
+ #pod This method returns true if the given package should be indexed. It decides
+ #pod this by checking the C<package> and C<namespace> keys in the C<no_index>
+ #pod property of the distmeta structure. Note that neither the version format nor
+ #pod C<release_status> are considered.
+ #pod
+ #pod =cut
+
+ sub should_index_package {
+ my ($self, $package) = @_;
+
+ for my $no_index_pkg (@{ $self->no_index->{package} || [] }) {
+ return if $package eq $no_index_pkg;
+ }
+
+ for my $no_index_ns (@{ $self->no_index->{namespace} }) {
+ return if index($package, "${no_index_ns}::") == 0;
+ }
+
+ return 1;
+ }
+
+ #pod =method features
+ #pod
+ #pod my @feature_objects = $meta->features;
+ #pod
+ #pod This method returns a list of L<CPAN::Meta::Feature> objects, one for each
+ #pod optional feature described by the distribution's metadata.
+ #pod
+ #pod =cut
+
+ sub features {
+ my ($self) = @_;
+
+ my $opt_f = $self->optional_features;
+ my @features = map {; CPAN::Meta::Feature->new($_ => $opt_f->{ $_ }) }
+ keys %$opt_f;
+
+ return @features;
+ }
+
+ #pod =method feature
+ #pod
+ #pod my $feature_object = $meta->feature( $identifier );
+ #pod
+ #pod This method returns a L<CPAN::Meta::Feature> object for the optional feature
+ #pod with the given identifier. If no feature with that identifier exists, an
+ #pod exception will be raised.
+ #pod
+ #pod =cut
+
+ sub feature {
+ my ($self, $ident) = @_;
+
+ croak "no feature named $ident"
+ unless my $f = $self->optional_features->{ $ident };
+
+ return CPAN::Meta::Feature->new($ident, $f);
+ }
+
+ #pod =method as_struct
+ #pod
+ #pod my $copy = $meta->as_struct( \%options );
+ #pod
+ #pod This method returns a deep copy of the object's metadata as an unblessed hash
+ #pod reference. It takes an optional hashref of options. If the hashref contains
+ #pod a C<version> argument, the copied metadata will be converted to the version
+ #pod of the specification and returned. For example:
+ #pod
+ #pod my $old_spec = $meta->as_struct( {version => "1.4"} );
+ #pod
+ #pod =cut
+
+ sub as_struct {
+ my ($self, $options) = @_;
+ my $struct = _dclone($self);
+ if ( $options->{version} ) {
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+ $struct = $cmc->convert( version => $options->{version} );
+ }
+ return $struct;
+ }
+
+ #pod =method as_string
+ #pod
+ #pod my $string = $meta->as_string( \%options );
+ #pod
+ #pod This method returns a serialized copy of the object's metadata as a character
+ #pod string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref
+ #pod of options. If the hashref contains a C<version> argument, the copied metadata
+ #pod will be converted to the version of the specification and returned. For
+ #pod example:
+ #pod
+ #pod my $string = $meta->as_string( {version => "1.4"} );
+ #pod
+ #pod For C<version> greater than or equal to 2, the string will be serialized as
+ #pod JSON. For C<version> less than 2, the string will be serialized as YAML. In
+ #pod both cases, the same rules are followed as in the C<save()> method for choosing
+ #pod a serialization backend.
+ #pod
+ #pod The serialized structure will include a C<x_serialization_backend> entry giving
+ #pod the package and version used to serialize. Any existing key in the given
+ #pod C<$meta> object will be clobbered.
+ #pod
+ #pod =cut
+
+ sub as_string {
+ my ($self, $options) = @_;
+
+ my $version = $options->{version} || '2';
+
+ my $struct;
+ if ( $self->meta_spec_version ne $version ) {
+ my $cmc = CPAN::Meta::Converter->new( $self->as_struct );
+ $struct = $cmc->convert( version => $version );
+ }
+ else {
+ $struct = $self->as_struct;
+ }
+
+ my ($data, $backend);
+ if ( $version ge '2' ) {
+ $backend = Parse::CPAN::Meta->json_backend();
+ local $struct->{x_serialization_backend} = sprintf '%s version %s',
+ $backend, $backend->VERSION;
+ $data = $backend->new->pretty->canonical->encode($struct);
+ }
+ else {
+ $backend = Parse::CPAN::Meta->yaml_backend();
+ local $struct->{x_serialization_backend} = sprintf '%s version %s',
+ $backend, $backend->VERSION;
+ $data = eval { no strict 'refs'; &{"$backend\::Dump"}($struct) };
+ if ( $@ ) {
+ croak $backend->can('errstr') ? $backend->errstr : $@
+ }
+ }
+
+ return $data;
+ }
+
+ # Used by JSON::PP, etc. for "convert_blessed"
+ sub TO_JSON {
+ return { %{ $_[0] } };
+ }
+
+ 1;
+
+ # ABSTRACT: the distribution metadata for a CPAN dist
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta - the distribution metadata for a CPAN dist
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 SYNOPSIS
+
+ use v5.10;
+ use strict;
+ use warnings;
+ use CPAN::Meta;
+ use Module::Load;
+
+ my $meta = CPAN::Meta->load_file('META.json');
+
+ printf "testing requirements for %s version %s\n",
+ $meta->name,
+ $meta->version;
+
+ my $prereqs = $meta->effective_prereqs;
+
+ for my $phase ( qw/configure runtime build test/ ) {
+ say "Requirements for $phase:";
+ my $reqs = $prereqs->requirements_for($phase, "requires");
+ for my $module ( sort $reqs->required_modules ) {
+ my $status;
+ if ( eval { load $module unless $module eq 'perl'; 1 } ) {
+ my $version = $module eq 'perl' ? $] : $module->VERSION;
+ $status = $reqs->accepts_module($module, $version)
+ ? "$version ok" : "$version not ok";
+ } else {
+ $status = "missing"
+ };
+ say " $module ($status)";
+ }
+ }
+
+ =head1 DESCRIPTION
+
+ Software distributions released to the CPAN include a F<META.json> or, for
+ older distributions, F<META.yml>, which describes the distribution, its
+ contents, and the requirements for building and installing the distribution.
+ The data structure stored in the F<META.json> file is described in
+ L<CPAN::Meta::Spec>.
+
+ CPAN::Meta provides a simple class to represent this distribution metadata (or
+ I<distmeta>), along with some helpful methods for interrogating that data.
+
+ The documentation below is only for the methods of the CPAN::Meta object. For
+ information on the meaning of individual fields, consult the spec.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $meta = CPAN::Meta->new($distmeta_struct, \%options);
+
+ Returns a valid CPAN::Meta object or dies if the supplied metadata hash
+ reference fails to validate. Older-format metadata will be up-converted to
+ version 2 if they validate against the original stated specification.
+
+ It takes an optional hashref of options. Valid options include:
+
+ =over
+
+ =item *
+
+ lazy_validation -- if true, new will attempt to convert the given metadata
+ to version 2 before attempting to validate it. This means than any
+ fixable errors will be handled by CPAN::Meta::Converter before validation.
+ (Note that this might result in invalid optional data being silently
+ dropped.) The default is false.
+
+ =back
+
+ =head2 create
+
+ my $meta = CPAN::Meta->create($distmeta_struct, \%options);
+
+ This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields
+ will be generated if not provided. This means the metadata structure is
+ assumed to otherwise follow the latest L<CPAN::Meta::Spec>.
+
+ =head2 load_file
+
+ my $meta = CPAN::Meta->load_file($distmeta_file, \%options);
+
+ Given a pathname to a file containing metadata, this deserializes the file
+ according to its file suffix and constructs a new C<CPAN::Meta> object, just
+ like C<new()>. It will die if the deserialized version fails to validate
+ against its stated specification version.
+
+ It takes the same options as C<new()> but C<lazy_validation> defaults to
+ true.
+
+ =head2 load_yaml_string
+
+ my $meta = CPAN::Meta->load_yaml_string($yaml, \%options);
+
+ This method returns a new CPAN::Meta object using the first document in the
+ given YAML string. In other respects it is identical to C<load_file()>.
+
+ =head2 load_json_string
+
+ my $meta = CPAN::Meta->load_json_string($json, \%options);
+
+ This method returns a new CPAN::Meta object using the structure represented by
+ the given JSON string. In other respects it is identical to C<load_file()>.
+
+ =head2 load_string
+
+ my $meta = CPAN::Meta->load_string($string, \%options);
+
+ If you don't know if a string contains YAML or JSON, this method will use
+ L<Parse::CPAN::Meta> to guess. In other respects it is identical to
+ C<load_file()>.
+
+ =head2 save
+
+ $meta->save($distmeta_file, \%options);
+
+ Serializes the object as JSON and writes it to the given file. The only valid
+ option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file
+ is saved with UTF-8 encoding.
+
+ For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP>
+ is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or
+ later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate
+ backend like L<JSON::XS>.
+
+ For C<version> less than 2, the filename should end in '.yml'.
+ L<CPAN::Meta::Converter> is used to generate an older metadata structure, which
+ is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may
+ set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though
+ this is not recommended due to subtle incompatibilities between YAML parsers on
+ CPAN.
+
+ =head2 meta_spec_version
+
+ This method returns the version part of the C<meta_spec> entry in the distmeta
+ structure. It is equivalent to:
+
+ $meta->meta_spec->{version};
+
+ =head2 effective_prereqs
+
+ my $prereqs = $meta->effective_prereqs;
+
+ my $prereqs = $meta->effective_prereqs( \@feature_identifiers );
+
+ This method returns a L<CPAN::Meta::Prereqs> object describing all the
+ prereqs for the distribution. If an arrayref of feature identifiers is given,
+ the prereqs for the identified features are merged together with the
+ distribution's core prereqs before the CPAN::Meta::Prereqs object is returned.
+
+ =head2 should_index_file
+
+ ... if $meta->should_index_file( $filename );
+
+ This method returns true if the given file should be indexed. It decides this
+ by checking the C<file> and C<directory> keys in the C<no_index> property of
+ the distmeta structure. Note that neither the version format nor
+ C<release_status> are considered.
+
+ C<$filename> should be given in unix format.
+
+ =head2 should_index_package
+
+ ... if $meta->should_index_package( $package );
+
+ This method returns true if the given package should be indexed. It decides
+ this by checking the C<package> and C<namespace> keys in the C<no_index>
+ property of the distmeta structure. Note that neither the version format nor
+ C<release_status> are considered.
+
+ =head2 features
+
+ my @feature_objects = $meta->features;
+
+ This method returns a list of L<CPAN::Meta::Feature> objects, one for each
+ optional feature described by the distribution's metadata.
+
+ =head2 feature
+
+ my $feature_object = $meta->feature( $identifier );
+
+ This method returns a L<CPAN::Meta::Feature> object for the optional feature
+ with the given identifier. If no feature with that identifier exists, an
+ exception will be raised.
+
+ =head2 as_struct
+
+ my $copy = $meta->as_struct( \%options );
+
+ This method returns a deep copy of the object's metadata as an unblessed hash
+ reference. It takes an optional hashref of options. If the hashref contains
+ a C<version> argument, the copied metadata will be converted to the version
+ of the specification and returned. For example:
+
+ my $old_spec = $meta->as_struct( {version => "1.4"} );
+
+ =head2 as_string
+
+ my $string = $meta->as_string( \%options );
+
+ This method returns a serialized copy of the object's metadata as a character
+ string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref
+ of options. If the hashref contains a C<version> argument, the copied metadata
+ will be converted to the version of the specification and returned. For
+ example:
+
+ my $string = $meta->as_string( {version => "1.4"} );
+
+ For C<version> greater than or equal to 2, the string will be serialized as
+ JSON. For C<version> less than 2, the string will be serialized as YAML. In
+ both cases, the same rules are followed as in the C<save()> method for choosing
+ a serialization backend.
+
+ The serialized structure will include a C<x_serialization_backend> entry giving
+ the package and version used to serialize. Any existing key in the given
+ C<$meta> object will be clobbered.
+
+ =head1 STRING DATA
+
+ The following methods return a single value, which is the value for the
+ corresponding entry in the distmeta structure. Values should be either undef
+ or strings.
+
+ =over 4
+
+ =item *
+
+ abstract
+
+ =item *
+
+ description
+
+ =item *
+
+ dynamic_config
+
+ =item *
+
+ generated_by
+
+ =item *
+
+ name
+
+ =item *
+
+ release_status
+
+ =item *
+
+ version
+
+ =back
+
+ =head1 LIST DATA
+
+ These methods return lists of string values, which might be represented in the
+ distmeta structure as arrayrefs or scalars:
+
+ =over 4
+
+ =item *
+
+ authors
+
+ =item *
+
+ keywords
+
+ =item *
+
+ licenses
+
+ =back
+
+ The C<authors> and C<licenses> methods may also be called as C<author> and
+ C<license>, respectively, to match the field name in the distmeta structure.
+
+ =head1 MAP DATA
+
+ These readers return hashrefs of arbitrary unblessed data structures, each
+ described more fully in the specification:
+
+ =over 4
+
+ =item *
+
+ meta_spec
+
+ =item *
+
+ resources
+
+ =item *
+
+ provides
+
+ =item *
+
+ no_index
+
+ =item *
+
+ prereqs
+
+ =item *
+
+ optional_features
+
+ =back
+
+ =head1 CUSTOM DATA
+
+ A list of custom keys are available from the C<custom_keys> method and
+ particular keys may be retrieved with the C<custom> method.
+
+ say $meta->custom($_) for $meta->custom_keys;
+
+ If a custom key refers to a data structure, a deep clone is returned.
+
+ =for Pod::Coverage TO_JSON abstract author authors custom custom_keys description dynamic_config
+ generated_by keywords license licenses meta_spec name no_index
+ optional_features prereqs provides release_status resources version
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ L<CPAN::Meta::Converter>
+
+ =item *
+
+ L<CPAN::Meta::Validator>
+
+ =back
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/Perl-Toolchain-Gang/CPAN-Meta>
+
+ git clone https://github.com/Perl-Toolchain-Gang/CPAN-Meta.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Ansgar Burchardt Avar Arnfjord Bjarmason Christopher J. Madsen Chuck Adams Cory G Watson Damyan Ivanov Eric Wilhelm Graham Knop Gregor Hermann Karen Etheridge Kenichi Ishigaki Ken Williams Lars Dieckow Leon Timmermans majensen Mark Fowler Matt S Trout Michael G. Schwern mohawk2 moznion Niko Tyni Olaf Alders Olivier Mengué Randy Sims Tomohiro Hosaka
+
+ =over 4
+
+ =item *
+
+ Ansgar Burchardt <ansgar@cpan.org>
+
+ =item *
+
+ Avar Arnfjord Bjarmason <avar@cpan.org>
+
+ =item *
+
+ Christopher J. Madsen <cjm@cpan.org>
+
+ =item *
+
+ Chuck Adams <cja987@gmail.com>
+
+ =item *
+
+ Cory G Watson <gphat@cpan.org>
+
+ =item *
+
+ Damyan Ivanov <dam@cpan.org>
+
+ =item *
+
+ Eric Wilhelm <ewilhelm@cpan.org>
+
+ =item *
+
+ Graham Knop <haarg@haarg.org>
+
+ =item *
+
+ Gregor Hermann <gregoa@debian.org>
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Kenichi Ishigaki <ishigaki@cpan.org>
+
+ =item *
+
+ Ken Williams <kwilliams@cpan.org>
+
+ =item *
+
+ Lars Dieckow <daxim@cpan.org>
+
+ =item *
+
+ Leon Timmermans <leont@cpan.org>
+
+ =item *
+
+ majensen <maj@fortinbras.us>
+
+ =item *
+
+ Mark Fowler <markf@cpan.org>
+
+ =item *
+
+ Matt S Trout <mst@shadowcat.co.uk>
+
+ =item *
+
+ Michael G. Schwern <mschwern@cpan.org>
+
+ =item *
+
+ mohawk2 <mohawk2@users.noreply.github.com>
+
+ =item *
+
+ moznion <moznion@gmail.com>
+
+ =item *
+
+ Niko Tyni <ntyni@debian.org>
+
+ =item *
+
+ Olaf Alders <olaf@wundersolutions.com>
+
+ =item *
+
+ Olivier Mengué <dolmen@cpan.org>
+
+ =item *
+
+ Randy Sims <randys@thepierianspring.org>
+
+ =item *
+
+ Tomohiro Hosaka <bokutin@bokut.in>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=2 sts=2 sw=2 et :
+ CPAN_META
+
+ $fatpacked{"CPAN/Meta/Check.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_CHECK';
+ package CPAN::Meta::Check;
+ $CPAN::Meta::Check::VERSION = '0.012';
+ use strict;
+ use warnings;
+
+ use base 'Exporter';
+ our @EXPORT = qw//;
+ our @EXPORT_OK = qw/check_requirements requirements_for verify_dependencies/;
+ our %EXPORT_TAGS = (all => [ @EXPORT, @EXPORT_OK ] );
+
+ use CPAN::Meta::Prereqs '2.132830';
+ use CPAN::Meta::Requirements 2.121;
+ use Module::Metadata 1.000023;
+
+ sub _check_dep {
+ my ($reqs, $module, $dirs) = @_;
+
+ $module eq 'perl' and return ($reqs->accepts_module($module, $]) ? () : sprintf "Your Perl (%s) is not in the range '%s'", $], $reqs->requirements_for_module($module));
+
+ my $metadata = Module::Metadata->new_from_module($module, inc => $dirs);
+ return "Module '$module' is not installed" if not defined $metadata;
+ my $version = eval { $metadata->version };
+ return "Missing version info for module '$module'" if $reqs->requirements_for_module($module) and not $version;
+ return sprintf 'Installed version (%s) of %s is not in range \'%s\'', $version, $module, $reqs->requirements_for_module($module) if not $reqs->accepts_module($module, $version || 0);
+ return;
+ }
+
+ sub _check_conflict {
+ my ($reqs, $module, $dirs) = @_;
+ my $metadata = Module::Metadata->new_from_module($module, inc => $dirs);
+ return if not defined $metadata;
+ my $version = eval { $metadata->version };
+ return "Missing version info for module '$module'" if not $version;
+ return sprintf 'Installed version (%s) of %s is in range \'%s\'', $version, $module, $reqs->requirements_for_module($module) if $reqs->accepts_module($module, $version);
+ return;
+ }
+
+ sub requirements_for {
+ my ($meta, $phases, $type) = @_;
+ my $prereqs = ref($meta) eq 'CPAN::Meta' ? $meta->effective_prereqs : $meta;
+ return $prereqs->merged_requirements(ref($phases) ? $phases : [ $phases ], [ $type ]);
+ }
+
+ sub check_requirements {
+ my ($reqs, $type, $dirs) = @_;
+
+ return +{
+ map {
+ $_ => $type ne 'conflicts'
+ ? scalar _check_dep($reqs, $_, $dirs)
+ : scalar _check_conflict($reqs, $_, $dirs)
+ } $reqs->required_modules
+ };
+ }
+
+ sub verify_dependencies {
+ my ($meta, $phases, $type, $dirs) = @_;
+ my $reqs = requirements_for($meta, $phases, $type);
+ my $issues = check_requirements($reqs, $type, $dirs);
+ return grep { defined } values %{ $issues };
+ }
+
+ 1;
+
+ #ABSTRACT: Verify requirements in a CPAN::Meta object
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Check - Verify requirements in a CPAN::Meta object
+
+ =head1 VERSION
+
+ version 0.012
+
+ =head1 SYNOPSIS
+
+ warn "$_\n" for verify_dependencies($meta, [qw/runtime build test/], 'requires');
+
+ =head1 DESCRIPTION
+
+ This module verifies if requirements described in a CPAN::Meta object are present.
+
+ =head1 FUNCTIONS
+
+ =head2 check_requirements($reqs, $type, $incdirs)
+
+ This function checks if all dependencies in C<$reqs> (a L<CPAN::Meta::Requirements|CPAN::Meta::Requirements> object) are met, taking into account that 'conflicts' dependencies have to be checked in reverse. It returns a hash with the modules as keys and any problems as values; the value for a successfully found module will be undef. Modules are searched for in C<@$incdirs>, defaulting to C<@INC>.
+
+ =head2 verify_dependencies($meta, $phases, $types, $incdirs)
+
+ Check all requirements in C<$meta> for phases C<$phases> and type C<$type>. Modules are searched for in C<@$incdirs>, defaulting to C<@INC>. C<$meta> should be a L<CPAN::Meta::Prereqs> or L<CPAN::Meta> object.
+
+ =head2 requirements_for($meta, $phases, $types)
+
+ B<< This function is deprecated and may be removed at some point in the future, please use CPAN::Meta::Prereqs->merged_requirements instead. >>
+
+ This function returns a unified L<CPAN::Meta::Requirements|CPAN::Meta::Requirements> object for all C<$type> requirements for C<$phases>. C<$phases> may be either one (scalar) value or an arrayref of valid values as defined by the L<CPAN::Meta spec|CPAN::Meta::Spec>. C<$type> must be a relationship as defined by the same spec. C<$meta> should be a L<CPAN::Meta::Prereqs> or L<CPAN::Meta> object.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item * L<Test::CheckDeps|Test::CheckDeps>
+
+ =item * L<CPAN::Meta|CPAN::Meta>
+
+ =for comment # vi:noet:sts=2:sw=2:ts=2
+
+ =back
+
+ =head1 AUTHOR
+
+ Leon Timmermans <leont@cpan.org>
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2012 by Leon Timmermans.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ CPAN_META_CHECK
+
+ $fatpacked{"CPAN/Meta/Converter.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_CONVERTER';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Converter;
+
+ our $VERSION = '2.150005';
+
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod my $struct = decode_json_file('META.json');
+ #pod
+ #pod my $cmc = CPAN::Meta::Converter->new( $struct );
+ #pod
+ #pod my $new_struct = $cmc->convert( version => "2" );
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod This module converts CPAN Meta structures from one form to another. The
+ #pod primary use is to convert older structures to the most modern version of
+ #pod the specification, but other transformations may be implemented in the
+ #pod future as needed. (E.g. stripping all custom fields or stripping all
+ #pod optional fields.)
+ #pod
+ #pod =cut
+
+ use CPAN::Meta::Validator;
+ use CPAN::Meta::Requirements;
+ use Parse::CPAN::Meta 1.4400 ();
+
+ # To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls
+ # before 5.10, we fall back to the EUMM bundled compatibility version module if
+ # that's the only thing available. This shouldn't ever happen in a normal CPAN
+ # install of CPAN::Meta::Requirements, as version.pm will be picked up from
+ # prereqs and be available at runtime.
+
+ BEGIN {
+ eval "use version ()"; ## no critic
+ if ( my $err = $@ ) {
+ eval "use ExtUtils::MakeMaker::version" or die $err; ## no critic
+ }
+ }
+
+ # Perl 5.10.0 didn't have "is_qv" in version.pm
+ *_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} };
+
+ sub _dclone {
+ my $ref = shift;
+
+ # if an object is in the data structure and doesn't specify how to
+ # turn itself into JSON, we just stringify the object. That does the
+ # right thing for typical things that might be there, like version objects,
+ # Path::Class objects, etc.
+ no warnings 'once';
+ no warnings 'redefine';
+ local *UNIVERSAL::TO_JSON = sub { "$_[0]" };
+
+ my $json = Parse::CPAN::Meta->json_backend()->new
+ ->utf8
+ ->allow_blessed
+ ->convert_blessed;
+ $json->decode($json->encode($ref))
+ }
+
+ my %known_specs = (
+ '2' => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
+ '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html',
+ '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html',
+ '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html',
+ '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html'
+ );
+
+ my @spec_list = sort { $a <=> $b } keys %known_specs;
+ my ($LOWEST, $HIGHEST) = @spec_list[0,-1];
+
+ #--------------------------------------------------------------------------#
+ # converters
+ #
+ # called as $converter->($element, $field_name, $full_meta, $to_version)
+ #
+ # defined return value used for field
+ # undef return value means field is skipped
+ #--------------------------------------------------------------------------#
+
+ sub _keep { $_[0] }
+
+ sub _keep_or_one { defined($_[0]) ? $_[0] : 1 }
+
+ sub _keep_or_zero { defined($_[0]) ? $_[0] : 0 }
+
+ sub _keep_or_unknown { defined($_[0]) && length($_[0]) ? $_[0] : "unknown" }
+
+ sub _generated_by {
+ my $gen = shift;
+ my $sig = __PACKAGE__ . " version " . (__PACKAGE__->VERSION || "<dev>");
+
+ return $sig unless defined $gen and length $gen;
+ return $gen if $gen =~ /\Q$sig/;
+ return "$gen, $sig";
+ }
+
+ sub _listify { ! defined $_[0] ? undef : ref $_[0] eq 'ARRAY' ? $_[0] : [$_[0]] }
+
+ sub _prefix_custom {
+ my $key = shift;
+ $key =~ s/^(?!x_) # Unless it already starts with x_
+ (?:x-?)? # Remove leading x- or x (if present)
+ /x_/ix; # and prepend x_
+ return $key;
+ }
+
+ sub _ucfirst_custom {
+ my $key = shift;
+ $key = ucfirst $key unless $key =~ /[A-Z]/;
+ return $key;
+ }
+
+ sub _no_prefix_ucfirst_custom {
+ my $key = shift;
+ $key =~ s/^x_//;
+ return _ucfirst_custom($key);
+ }
+
+ sub _change_meta_spec {
+ my ($element, undef, undef, $version) = @_;
+ return {
+ version => $version,
+ url => $known_specs{$version},
+ };
+ }
+
+ my @open_source = (
+ 'perl',
+ 'gpl',
+ 'apache',
+ 'artistic',
+ 'artistic_2',
+ 'lgpl',
+ 'bsd',
+ 'gpl',
+ 'mit',
+ 'mozilla',
+ 'open_source',
+ );
+
+ my %is_open_source = map {; $_ => 1 } @open_source;
+
+ my @valid_licenses_1 = (
+ @open_source,
+ 'unrestricted',
+ 'restrictive',
+ 'unknown',
+ );
+
+ my %license_map_1 = (
+ ( map { $_ => $_ } @valid_licenses_1 ),
+ artistic2 => 'artistic_2',
+ );
+
+ sub _license_1 {
+ my ($element) = @_;
+ return 'unknown' unless defined $element;
+ if ( $license_map_1{lc $element} ) {
+ return $license_map_1{lc $element};
+ }
+ else {
+ return 'unknown';
+ }
+ }
+
+ my @valid_licenses_2 = qw(
+ agpl_3
+ apache_1_1
+ apache_2_0
+ artistic_1
+ artistic_2
+ bsd
+ freebsd
+ gfdl_1_2
+ gfdl_1_3
+ gpl_1
+ gpl_2
+ gpl_3
+ lgpl_2_1
+ lgpl_3_0
+ mit
+ mozilla_1_0
+ mozilla_1_1
+ openssl
+ perl_5
+ qpl_1_0
+ ssleay
+ sun
+ zlib
+ open_source
+ restricted
+ unrestricted
+ unknown
+ );
+
+ # The "old" values were defined by Module::Build, and were often vague. I have
+ # made the decisions below based on reading Module::Build::API and how clearly
+ # it specifies the version of the license.
+ my %license_map_2 = (
+ (map { $_ => $_ } @valid_licenses_2),
+ apache => 'apache_2_0', # clearly stated as 2.0
+ artistic => 'artistic_1', # clearly stated as 1
+ artistic2 => 'artistic_2', # clearly stated as 2
+ gpl => 'open_source', # we don't know which GPL; punt
+ lgpl => 'open_source', # we don't know which LGPL; punt
+ mozilla => 'open_source', # we don't know which MPL; punt
+ perl => 'perl_5', # clearly Perl 5
+ restrictive => 'restricted',
+ );
+
+ sub _license_2 {
+ my ($element) = @_;
+ return [ 'unknown' ] unless defined $element;
+ $element = [ $element ] unless ref $element eq 'ARRAY';
+ my @new_list;
+ for my $lic ( @$element ) {
+ next unless defined $lic;
+ if ( my $new = $license_map_2{lc $lic} ) {
+ push @new_list, $new;
+ }
+ }
+ return @new_list ? \@new_list : [ 'unknown' ];
+ }
+
+ my %license_downgrade_map = qw(
+ agpl_3 open_source
+ apache_1_1 apache
+ apache_2_0 apache
+ artistic_1 artistic
+ artistic_2 artistic_2
+ bsd bsd
+ freebsd open_source
+ gfdl_1_2 open_source
+ gfdl_1_3 open_source
+ gpl_1 gpl
+ gpl_2 gpl
+ gpl_3 gpl
+ lgpl_2_1 lgpl
+ lgpl_3_0 lgpl
+ mit mit
+ mozilla_1_0 mozilla
+ mozilla_1_1 mozilla
+ openssl open_source
+ perl_5 perl
+ qpl_1_0 open_source
+ ssleay open_source
+ sun open_source
+ zlib open_source
+ open_source open_source
+ restricted restrictive
+ unrestricted unrestricted
+ unknown unknown
+ );
+
+ sub _downgrade_license {
+ my ($element) = @_;
+ if ( ! defined $element ) {
+ return "unknown";
+ }
+ elsif( ref $element eq 'ARRAY' ) {
+ if ( @$element > 1) {
+ if (grep { !$is_open_source{ $license_downgrade_map{lc $_} || 'unknown' } } @$element) {
+ return 'unknown';
+ }
+ else {
+ return 'open_source';
+ }
+ }
+ elsif ( @$element == 1 ) {
+ return $license_downgrade_map{lc $element->[0]} || "unknown";
+ }
+ }
+ elsif ( ! ref $element ) {
+ return $license_downgrade_map{lc $element} || "unknown";
+ }
+ return "unknown";
+ }
+
+ my $no_index_spec_1_2 = {
+ 'file' => \&_listify,
+ 'dir' => \&_listify,
+ 'package' => \&_listify,
+ 'namespace' => \&_listify,
+ };
+
+ my $no_index_spec_1_3 = {
+ 'file' => \&_listify,
+ 'directory' => \&_listify,
+ 'package' => \&_listify,
+ 'namespace' => \&_listify,
+ };
+
+ my $no_index_spec_2 = {
+ 'file' => \&_listify,
+ 'directory' => \&_listify,
+ 'package' => \&_listify,
+ 'namespace' => \&_listify,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _no_index_1_2 {
+ my (undef, undef, $meta) = @_;
+ my $no_index = $meta->{no_index} || $meta->{private};
+ return unless $no_index;
+
+ # cleanup wrong format
+ if ( ! ref $no_index ) {
+ my $item = $no_index;
+ $no_index = { dir => [ $item ], file => [ $item ] };
+ }
+ elsif ( ref $no_index eq 'ARRAY' ) {
+ my $list = $no_index;
+ $no_index = { dir => [ @$list ], file => [ @$list ] };
+ }
+
+ # common mistake: files -> file
+ if ( exists $no_index->{files} ) {
+ $no_index->{file} = delete $no_index->{files};
+ }
+ # common mistake: modules -> module
+ if ( exists $no_index->{modules} ) {
+ $no_index->{module} = delete $no_index->{modules};
+ }
+ return _convert($no_index, $no_index_spec_1_2);
+ }
+
+ sub _no_index_directory {
+ my ($element, $key, $meta, $version) = @_;
+ return unless $element;
+
+ # cleanup wrong format
+ if ( ! ref $element ) {
+ my $item = $element;
+ $element = { directory => [ $item ], file => [ $item ] };
+ }
+ elsif ( ref $element eq 'ARRAY' ) {
+ my $list = $element;
+ $element = { directory => [ @$list ], file => [ @$list ] };
+ }
+
+ if ( exists $element->{dir} ) {
+ $element->{directory} = delete $element->{dir};
+ }
+ # common mistake: files -> file
+ if ( exists $element->{files} ) {
+ $element->{file} = delete $element->{files};
+ }
+ # common mistake: modules -> module
+ if ( exists $element->{modules} ) {
+ $element->{module} = delete $element->{modules};
+ }
+ my $spec = $version == 2 ? $no_index_spec_2 : $no_index_spec_1_3;
+ return _convert($element, $spec);
+ }
+
+ sub _is_module_name {
+ my $mod = shift;
+ return unless defined $mod && length $mod;
+ return $mod =~ m{^[A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z0-9_]+)*$};
+ }
+
+ sub _clean_version {
+ my ($element) = @_;
+ return 0 if ! defined $element;
+
+ $element =~ s{^\s*}{};
+ $element =~ s{\s*$}{};
+ $element =~ s{^\.}{0.};
+
+ return 0 if ! length $element;
+ return 0 if ( $element eq 'undef' || $element eq '<undef>' );
+
+ my $v = eval { version->new($element) };
+ # XXX check defined $v and not just $v because version objects leak memory
+ # in boolean context -- dagolden, 2012-02-03
+ if ( defined $v ) {
+ return _is_qv($v) ? $v->normal : $element;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ sub _bad_version_hook {
+ my ($v) = @_;
+ $v =~ s{^\s*}{};
+ $v =~ s{\s*$}{};
+ $v =~ s{[a-z]+$}{}; # strip trailing alphabetics
+ my $vobj = eval { version->new($v) };
+ return defined($vobj) ? $vobj : version->new(0); # or give up
+ }
+
+ sub _version_map {
+ my ($element) = @_;
+ return unless defined $element;
+ if ( ref $element eq 'HASH' ) {
+ # XXX turn this into CPAN::Meta::Requirements with bad version hook
+ # and then turn it back into a hash
+ my $new_map = CPAN::Meta::Requirements->new(
+ { bad_version_hook => \&_bad_version_hook } # punt
+ );
+ while ( my ($k,$v) = each %$element ) {
+ next unless _is_module_name($k);
+ if ( !defined($v) || !length($v) || $v eq 'undef' || $v eq '<undef>' ) {
+ $v = 0;
+ }
+ # some weird, old META have bad yml with module => module
+ # so check if value is like a module name and not like a version
+ if ( _is_module_name($v) && ! version::is_lax($v) ) {
+ $new_map->add_minimum($k => 0);
+ $new_map->add_minimum($v => 0);
+ }
+ $new_map->add_string_requirement($k => $v);
+ }
+ return $new_map->as_string_hash;
+ }
+ elsif ( ref $element eq 'ARRAY' ) {
+ my $hashref = { map { $_ => 0 } @$element };
+ return _version_map($hashref); # cleanup any weird stuff
+ }
+ elsif ( ref $element eq '' && length $element ) {
+ return { $element => 0 }
+ }
+ return;
+ }
+
+ sub _prereqs_from_1 {
+ my (undef, undef, $meta) = @_;
+ my $prereqs = {};
+ for my $phase ( qw/build configure/ ) {
+ my $key = "${phase}_requires";
+ $prereqs->{$phase}{requires} = _version_map($meta->{$key})
+ if $meta->{$key};
+ }
+ for my $rel ( qw/requires recommends conflicts/ ) {
+ $prereqs->{runtime}{$rel} = _version_map($meta->{$rel})
+ if $meta->{$rel};
+ }
+ return $prereqs;
+ }
+
+ my $prereqs_spec = {
+ configure => \&_prereqs_rel,
+ build => \&_prereqs_rel,
+ test => \&_prereqs_rel,
+ runtime => \&_prereqs_rel,
+ develop => \&_prereqs_rel,
+ ':custom' => \&_prefix_custom,
+ };
+
+ my $relation_spec = {
+ requires => \&_version_map,
+ recommends => \&_version_map,
+ suggests => \&_version_map,
+ conflicts => \&_version_map,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _cleanup_prereqs {
+ my ($prereqs, $key, $meta, $to_version) = @_;
+ return unless $prereqs && ref $prereqs eq 'HASH';
+ return _convert( $prereqs, $prereqs_spec, $to_version );
+ }
+
+ sub _prereqs_rel {
+ my ($relation, $key, $meta, $to_version) = @_;
+ return unless $relation && ref $relation eq 'HASH';
+ return _convert( $relation, $relation_spec, $to_version );
+ }
+
+
+ BEGIN {
+ my @old_prereqs = qw(
+ requires
+ configure_requires
+ recommends
+ conflicts
+ );
+
+ for ( @old_prereqs ) {
+ my $sub = "_get_$_";
+ my ($phase,$type) = split qr/_/, $_;
+ if ( ! defined $type ) {
+ $type = $phase;
+ $phase = 'runtime';
+ }
+ no strict 'refs';
+ *{$sub} = sub { _extract_prereqs($_[2]->{prereqs},$phase,$type) };
+ }
+ }
+
+ sub _get_build_requires {
+ my ($data, $key, $meta) = @_;
+
+ my $test_h = _extract_prereqs($_[2]->{prereqs}, qw(test requires)) || {};
+ my $build_h = _extract_prereqs($_[2]->{prereqs}, qw(build requires)) || {};
+
+ my $test_req = CPAN::Meta::Requirements->from_string_hash($test_h);
+ my $build_req = CPAN::Meta::Requirements->from_string_hash($build_h);
+
+ $test_req->add_requirements($build_req)->as_string_hash;
+ }
+
+ sub _extract_prereqs {
+ my ($prereqs, $phase, $type) = @_;
+ return unless ref $prereqs eq 'HASH';
+ return scalar _version_map($prereqs->{$phase}{$type});
+ }
+
+ sub _downgrade_optional_features {
+ my (undef, undef, $meta) = @_;
+ return unless exists $meta->{optional_features};
+ my $origin = $meta->{optional_features};
+ my $features = {};
+ for my $name ( keys %$origin ) {
+ $features->{$name} = {
+ description => $origin->{$name}{description},
+ requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','requires'),
+ configure_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','configure_requires'),
+ build_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','build_requires'),
+ recommends => _extract_prereqs($origin->{$name}{prereqs},'runtime','recommends'),
+ conflicts => _extract_prereqs($origin->{$name}{prereqs},'runtime','conflicts'),
+ };
+ for my $k (keys %{$features->{$name}} ) {
+ delete $features->{$name}{$k} unless defined $features->{$name}{$k};
+ }
+ }
+ return $features;
+ }
+
+ sub _upgrade_optional_features {
+ my (undef, undef, $meta) = @_;
+ return unless exists $meta->{optional_features};
+ my $origin = $meta->{optional_features};
+ my $features = {};
+ for my $name ( keys %$origin ) {
+ $features->{$name} = {
+ description => $origin->{$name}{description},
+ prereqs => _prereqs_from_1(undef, undef, $origin->{$name}),
+ };
+ delete $features->{$name}{prereqs}{configure};
+ }
+ return $features;
+ }
+
+ my $optional_features_2_spec = {
+ description => \&_keep,
+ prereqs => \&_cleanup_prereqs,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _feature_2 {
+ my ($element, $key, $meta, $to_version) = @_;
+ return unless $element && ref $element eq 'HASH';
+ _convert( $element, $optional_features_2_spec, $to_version );
+ }
+
+ sub _cleanup_optional_features_2 {
+ my ($element, $key, $meta, $to_version) = @_;
+ return unless $element && ref $element eq 'HASH';
+ my $new_data = {};
+ for my $k ( keys %$element ) {
+ $new_data->{$k} = _feature_2( $element->{$k}, $k, $meta, $to_version );
+ }
+ return unless keys %$new_data;
+ return $new_data;
+ }
+
+ sub _optional_features_1_4 {
+ my ($element) = @_;
+ return unless $element;
+ $element = _optional_features_as_map($element);
+ for my $name ( keys %$element ) {
+ for my $drop ( qw/requires_packages requires_os excluded_os/ ) {
+ delete $element->{$name}{$drop};
+ }
+ }
+ return $element;
+ }
+
+ sub _optional_features_as_map {
+ my ($element) = @_;
+ return unless $element;
+ if ( ref $element eq 'ARRAY' ) {
+ my %map;
+ for my $feature ( @$element ) {
+ my (@parts) = %$feature;
+ $map{$parts[0]} = $parts[1];
+ }
+ $element = \%map;
+ }
+ return $element;
+ }
+
+ sub _is_urlish { defined $_[0] && $_[0] =~ m{\A[-+.a-z0-9]+:.+}i }
+
+ sub _url_or_drop {
+ my ($element) = @_;
+ return $element if _is_urlish($element);
+ return;
+ }
+
+ sub _url_list {
+ my ($element) = @_;
+ return unless $element;
+ $element = _listify( $element );
+ $element = [ grep { _is_urlish($_) } @$element ];
+ return unless @$element;
+ return $element;
+ }
+
+ sub _author_list {
+ my ($element) = @_;
+ return [ 'unknown' ] unless $element;
+ $element = _listify( $element );
+ $element = [ map { defined $_ && length $_ ? $_ : 'unknown' } @$element ];
+ return [ 'unknown' ] unless @$element;
+ return $element;
+ }
+
+ my $resource2_upgrade = {
+ license => sub { return _is_urlish($_[0]) ? _listify( $_[0] ) : undef },
+ homepage => \&_url_or_drop,
+ bugtracker => sub {
+ my ($item) = @_;
+ return unless $item;
+ if ( $item =~ m{^mailto:(.*)$} ) { return { mailto => $1 } }
+ elsif( _is_urlish($item) ) { return { web => $item } }
+ else { return }
+ },
+ repository => sub { return _is_urlish($_[0]) ? { url => $_[0] } : undef },
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _upgrade_resources_2 {
+ my (undef, undef, $meta, $version) = @_;
+ return unless exists $meta->{resources};
+ return _convert($meta->{resources}, $resource2_upgrade);
+ }
+
+ my $bugtracker2_spec = {
+ web => \&_url_or_drop,
+ mailto => \&_keep,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _repo_type {
+ my ($element, $key, $meta, $to_version) = @_;
+ return $element if defined $element;
+ return unless exists $meta->{url};
+ my $repo_url = $meta->{url};
+ for my $type ( qw/git svn/ ) {
+ return $type if $repo_url =~ m{\A$type};
+ }
+ return;
+ }
+
+ my $repository2_spec = {
+ web => \&_url_or_drop,
+ url => \&_url_or_drop,
+ type => \&_repo_type,
+ ':custom' => \&_prefix_custom,
+ };
+
+ my $resources2_cleanup = {
+ license => \&_url_list,
+ homepage => \&_url_or_drop,
+ bugtracker => sub { ref $_[0] ? _convert( $_[0], $bugtracker2_spec ) : undef },
+ repository => sub { my $data = shift; ref $data ? _convert( $data, $repository2_spec ) : undef },
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _cleanup_resources_2 {
+ my ($resources, $key, $meta, $to_version) = @_;
+ return unless $resources && ref $resources eq 'HASH';
+ return _convert($resources, $resources2_cleanup, $to_version);
+ }
+
+ my $resource1_spec = {
+ license => \&_url_or_drop,
+ homepage => \&_url_or_drop,
+ bugtracker => \&_url_or_drop,
+ repository => \&_url_or_drop,
+ ':custom' => \&_keep,
+ };
+
+ sub _resources_1_3 {
+ my (undef, undef, $meta, $version) = @_;
+ return unless exists $meta->{resources};
+ return _convert($meta->{resources}, $resource1_spec);
+ }
+
+ *_resources_1_4 = *_resources_1_3;
+
+ sub _resources_1_2 {
+ my (undef, undef, $meta) = @_;
+ my $resources = $meta->{resources} || {};
+ if ( $meta->{license_url} && ! $resources->{license} ) {
+ $resources->{license} = $meta->{license_url}
+ if _is_urlish($meta->{license_url});
+ }
+ return unless keys %$resources;
+ return _convert($resources, $resource1_spec);
+ }
+
+ my $resource_downgrade_spec = {
+ license => sub { return ref $_[0] ? $_[0]->[0] : $_[0] },
+ homepage => \&_url_or_drop,
+ bugtracker => sub { return $_[0]->{web} },
+ repository => sub { return $_[0]->{url} || $_[0]->{web} },
+ ':custom' => \&_no_prefix_ucfirst_custom,
+ };
+
+ sub _downgrade_resources {
+ my (undef, undef, $meta, $version) = @_;
+ return unless exists $meta->{resources};
+ return _convert($meta->{resources}, $resource_downgrade_spec);
+ }
+
+ sub _release_status {
+ my ($element, undef, $meta) = @_;
+ return $element if $element && $element =~ m{\A(?:stable|testing|unstable)\z};
+ return _release_status_from_version(undef, undef, $meta);
+ }
+
+ sub _release_status_from_version {
+ my (undef, undef, $meta) = @_;
+ my $version = $meta->{version} || '';
+ return ( $version =~ /_/ ) ? 'testing' : 'stable';
+ }
+
+ my $provides_spec = {
+ file => \&_keep,
+ version => \&_keep,
+ };
+
+ my $provides_spec_2 = {
+ file => \&_keep,
+ version => \&_keep,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _provides {
+ my ($element, $key, $meta, $to_version) = @_;
+ return unless defined $element && ref $element eq 'HASH';
+ my $spec = $to_version == 2 ? $provides_spec_2 : $provides_spec;
+ my $new_data = {};
+ for my $k ( keys %$element ) {
+ $new_data->{$k} = _convert($element->{$k}, $spec, $to_version);
+ $new_data->{$k}{version} = _clean_version($element->{$k}{version})
+ if exists $element->{$k}{version};
+ }
+ return $new_data;
+ }
+
+ sub _convert {
+ my ($data, $spec, $to_version, $is_fragment) = @_;
+
+ my $new_data = {};
+ for my $key ( keys %$spec ) {
+ next if $key eq ':custom' || $key eq ':drop';
+ next unless my $fcn = $spec->{$key};
+ if ( $is_fragment && $key eq 'generated_by' ) {
+ $fcn = \&_keep;
+ }
+ die "spec for '$key' is not a coderef"
+ unless ref $fcn && ref $fcn eq 'CODE';
+ my $new_value = $fcn->($data->{$key}, $key, $data, $to_version);
+ $new_data->{$key} = $new_value if defined $new_value;
+ }
+
+ my $drop_list = $spec->{':drop'};
+ my $customizer = $spec->{':custom'} || \&_keep;
+
+ for my $key ( keys %$data ) {
+ next if $drop_list && grep { $key eq $_ } @$drop_list;
+ next if exists $spec->{$key}; # we handled it
+ $new_data->{ $customizer->($key) } = $data->{$key};
+ }
+
+ return $new_data;
+ }
+
+ #--------------------------------------------------------------------------#
+ # define converters for each conversion
+ #--------------------------------------------------------------------------#
+
+ # each converts from prior version
+ # special ":custom" field is used for keys not recognized in spec
+ my %up_convert = (
+ '2-from-1.4' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_2,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'dynamic_config' => \&_keep_or_one,
+ # ADDED MANDATORY
+ 'release_status' => \&_release_status,
+ # PRIOR OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_upgrade_optional_features,
+ 'provides' => \&_provides,
+ 'resources' => \&_upgrade_resources_2,
+ # ADDED OPTIONAL
+ 'description' => \&_keep,
+ 'prereqs' => \&_prereqs_from_1,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ build_requires
+ configure_requires
+ conflicts
+ distribution_type
+ license_url
+ private
+ recommends
+ requires
+ ) ],
+
+ # other random keys need x_ prefixing
+ ':custom' => \&_prefix_custom,
+ },
+ '1.4-from-1.3' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_1_4,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_4,
+ # ADDED OPTIONAL
+ 'configure_requires' => \&_keep,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ license_url
+ private
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.3-from-1.2' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ license_url
+ private
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.2-from-1.1' => {
+ # PRIOR MANDATORY
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'license' => \&_license_1,
+ 'name' => \&_keep,
+ 'generated_by' => \&_generated_by,
+ # ADDED MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'meta-spec' => \&_change_meta_spec,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_1_2,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'resources' => \&_resources_1_2,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ license_url
+ private
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.1-from-1.0' => {
+ # CHANGED TO MANDATORY
+ 'version' => \&_keep,
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'license_url' => \&_url_or_drop,
+ 'private' => \&_keep,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ );
+
+ my %down_convert = (
+ '1.4-from-2' => {
+ # MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_downgrade_license,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # OPTIONAL
+ 'build_requires' => \&_get_build_requires,
+ 'configure_requires' => \&_get_configure_requires,
+ 'conflicts' => \&_get_conflicts,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_downgrade_optional_features,
+ 'provides' => \&_provides,
+ 'recommends' => \&_get_recommends,
+ 'requires' => \&_get_requires,
+ 'resources' => \&_downgrade_resources,
+
+ # drop these unsupported fields (after conversion)
+ ':drop' => [ qw(
+ description
+ prereqs
+ release_status
+ )],
+
+ # custom keys will be left unchanged
+ ':custom' => \&_keep
+ },
+ '1.3-from-1.4' => {
+ # MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # drop these unsupported fields, but only after we convert
+ ':drop' => [ qw(
+ configure_requires
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ '1.2-from-1.3' => {
+ # MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_1_2,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ '1.1-from-1.2' => {
+ # MANDATORY
+ 'version' => \&_keep,
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ # OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'private' => \&_keep,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+
+ # drop unsupported fields
+ ':drop' => [ qw(
+ abstract
+ author
+ provides
+ no_index
+ keywords
+ resources
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ '1.0-from-1.1' => {
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ );
+
+ my %cleanup = (
+ '2' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_2,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'dynamic_config' => \&_keep_or_one,
+ # ADDED MANDATORY
+ 'release_status' => \&_release_status,
+ # PRIOR OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_cleanup_optional_features_2,
+ 'provides' => \&_provides,
+ 'resources' => \&_cleanup_resources_2,
+ # ADDED OPTIONAL
+ 'description' => \&_keep,
+ 'prereqs' => \&_cleanup_prereqs,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ build_requires
+ configure_requires
+ conflicts
+ distribution_type
+ license_url
+ private
+ recommends
+ requires
+ ) ],
+
+ # other random keys need x_ prefixing
+ ':custom' => \&_prefix_custom,
+ },
+ '1.4' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_1_4,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_4,
+ # ADDED OPTIONAL
+ 'configure_requires' => \&_keep,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.3' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.2' => {
+ # PRIOR MANDATORY
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'license' => \&_license_1,
+ 'name' => \&_keep,
+ 'generated_by' => \&_generated_by,
+ # ADDED MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'meta-spec' => \&_change_meta_spec,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_1_2,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'resources' => \&_resources_1_2,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.1' => {
+ # CHANGED TO MANDATORY
+ 'version' => \&_keep,
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'license_url' => \&_url_or_drop,
+ 'private' => \&_keep,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.0' => {
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ 'version' => \&_keep,
+ # IMPLIED OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ );
+
+ # for a given field in a spec version, what fields will it feed
+ # into in the *latest* spec (i.e. v2); meta-spec omitted because
+ # we always expect a meta-spec to be generated
+ my %fragments_generate = (
+ '2' => {
+ 'abstract' => 'abstract',
+ 'author' => 'author',
+ 'generated_by' => 'generated_by',
+ 'license' => 'license',
+ 'name' => 'name',
+ 'version' => 'version',
+ 'dynamic_config' => 'dynamic_config',
+ 'release_status' => 'release_status',
+ 'keywords' => 'keywords',
+ 'no_index' => 'no_index',
+ 'optional_features' => 'optional_features',
+ 'provides' => 'provides',
+ 'resources' => 'resources',
+ 'description' => 'description',
+ 'prereqs' => 'prereqs',
+ },
+ '1.4' => {
+ 'abstract' => 'abstract',
+ 'author' => 'author',
+ 'generated_by' => 'generated_by',
+ 'license' => 'license',
+ 'name' => 'name',
+ 'version' => 'version',
+ 'build_requires' => 'prereqs',
+ 'conflicts' => 'prereqs',
+ 'distribution_type' => 'distribution_type',
+ 'dynamic_config' => 'dynamic_config',
+ 'keywords' => 'keywords',
+ 'no_index' => 'no_index',
+ 'optional_features' => 'optional_features',
+ 'provides' => 'provides',
+ 'recommends' => 'prereqs',
+ 'requires' => 'prereqs',
+ 'resources' => 'resources',
+ 'configure_requires' => 'prereqs',
+ },
+ );
+ # this is not quite true but will work well enough
+ # as 1.4 is a superset of earlier ones
+ $fragments_generate{$_} = $fragments_generate{'1.4'} for qw/1.3 1.2 1.1 1.0/;
+
+ #--------------------------------------------------------------------------#
+ # Code
+ #--------------------------------------------------------------------------#
+
+ #pod =method new
+ #pod
+ #pod my $cmc = CPAN::Meta::Converter->new( $struct );
+ #pod
+ #pod The constructor should be passed a valid metadata structure but invalid
+ #pod structures are accepted. If no meta-spec version is provided, version 1.0 will
+ #pod be assumed.
+ #pod
+ #pod Optionally, you can provide a C<default_version> argument after C<$struct>:
+ #pod
+ #pod my $cmc = CPAN::Meta::Converter->new( $struct, default_version => "1.4" );
+ #pod
+ #pod This is only needed when converting a metadata fragment that does not include a
+ #pod C<meta-spec> field.
+ #pod
+ #pod =cut
+
+ sub new {
+ my ($class,$data,%args) = @_;
+
+ # create an attributes hash
+ my $self = {
+ 'data' => $data,
+ 'spec' => _extract_spec_version($data, $args{default_version}),
+ };
+
+ # create the object
+ return bless $self, $class;
+ }
+
+ sub _extract_spec_version {
+ my ($data, $default) = @_;
+ my $spec = $data->{'meta-spec'};
+
+ # is meta-spec there and valid?
+ return( $default || "1.0" ) unless defined $spec && ref $spec eq 'HASH'; # before meta-spec?
+
+ # does the version key look like a valid version?
+ my $v = $spec->{version};
+ if ( defined $v && $v =~ /^\d+(?:\.\d+)?$/ ) {
+ return $v if defined $v && grep { $v eq $_ } keys %known_specs; # known spec
+ return $v+0 if defined $v && grep { $v == $_ } keys %known_specs; # 2.0 => 2
+ }
+
+ # otherwise, use heuristics: look for 1.x vs 2.0 fields
+ return "2" if exists $data->{prereqs};
+ return "1.4" if exists $data->{configure_requires};
+ return( $default || "1.2" ); # when meta-spec was first defined
+ }
+
+ #pod =method convert
+ #pod
+ #pod my $new_struct = $cmc->convert( version => "2" );
+ #pod
+ #pod Returns a new hash reference with the metadata converted to a different form.
+ #pod C<convert> will die if any conversion/standardization still results in an
+ #pod invalid structure.
+ #pod
+ #pod Valid parameters include:
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod C<version> -- Indicates the desired specification version (e.g. "1.0", "1.1" ... "1.4", "2").
+ #pod Defaults to the latest version of the CPAN Meta Spec.
+ #pod
+ #pod =back
+ #pod
+ #pod Conversion proceeds through each version in turn. For example, a version 1.2
+ #pod structure might be converted to 1.3 then 1.4 then finally to version 2. The
+ #pod conversion process attempts to clean-up simple errors and standardize data.
+ #pod For example, if C<author> is given as a scalar, it will converted to an array
+ #pod reference containing the item. (Converting a structure to its own version will
+ #pod also clean-up and standardize.)
+ #pod
+ #pod When data are cleaned and standardized, missing or invalid fields will be
+ #pod replaced with sensible defaults when possible. This may be lossy or imprecise.
+ #pod For example, some badly structured META.yml files on CPAN have prerequisite
+ #pod modules listed as both keys and values:
+ #pod
+ #pod requires => { 'Foo::Bar' => 'Bam::Baz' }
+ #pod
+ #pod These would be split and each converted to a prerequisite with a minimum
+ #pod version of zero.
+ #pod
+ #pod When some mandatory fields are missing or invalid, the conversion will attempt
+ #pod to provide a sensible default or will fill them with a value of 'unknown'. For
+ #pod example a missing or unrecognized C<license> field will result in a C<license>
+ #pod field of 'unknown'. Fields that may get an 'unknown' include:
+ #pod
+ #pod =for :list
+ #pod * abstract
+ #pod * author
+ #pod * license
+ #pod
+ #pod =cut
+
+ sub convert {
+ my ($self, %args) = @_;
+ my $args = { %args };
+
+ my $new_version = $args->{version} || $HIGHEST;
+ my $is_fragment = $args->{is_fragment};
+
+ my ($old_version) = $self->{spec};
+ my $converted = _dclone($self->{data});
+
+ if ( $old_version == $new_version ) {
+ $converted = _convert( $converted, $cleanup{$old_version}, $old_version, $is_fragment );
+ unless ( $args->{is_fragment} ) {
+ my $cmv = CPAN::Meta::Validator->new( $converted );
+ unless ( $cmv->is_valid ) {
+ my $errs = join("\n", $cmv->errors);
+ die "Failed to clean-up $old_version metadata. Errors:\n$errs\n";
+ }
+ }
+ return $converted;
+ }
+ elsif ( $old_version > $new_version ) {
+ my @vers = sort { $b <=> $a } keys %known_specs;
+ for my $i ( 0 .. $#vers-1 ) {
+ next if $vers[$i] > $old_version;
+ last if $vers[$i+1] < $new_version;
+ my $spec_string = "$vers[$i+1]-from-$vers[$i]";
+ $converted = _convert( $converted, $down_convert{$spec_string}, $vers[$i+1], $is_fragment );
+ unless ( $args->{is_fragment} ) {
+ my $cmv = CPAN::Meta::Validator->new( $converted );
+ unless ( $cmv->is_valid ) {
+ my $errs = join("\n", $cmv->errors);
+ die "Failed to downconvert metadata to $vers[$i+1]. Errors:\n$errs\n";
+ }
+ }
+ }
+ return $converted;
+ }
+ else {
+ my @vers = sort { $a <=> $b } keys %known_specs;
+ for my $i ( 0 .. $#vers-1 ) {
+ next if $vers[$i] < $old_version;
+ last if $vers[$i+1] > $new_version;
+ my $spec_string = "$vers[$i+1]-from-$vers[$i]";
+ $converted = _convert( $converted, $up_convert{$spec_string}, $vers[$i+1], $is_fragment );
+ unless ( $args->{is_fragment} ) {
+ my $cmv = CPAN::Meta::Validator->new( $converted );
+ unless ( $cmv->is_valid ) {
+ my $errs = join("\n", $cmv->errors);
+ die "Failed to upconvert metadata to $vers[$i+1]. Errors:\n$errs\n";
+ }
+ }
+ }
+ return $converted;
+ }
+ }
+
+ #pod =method upgrade_fragment
+ #pod
+ #pod my $new_struct = $cmc->upgrade_fragment;
+ #pod
+ #pod Returns a new hash reference with the metadata converted to the latest version
+ #pod of the CPAN Meta Spec. No validation is done on the result -- you must
+ #pod validate after merging fragments into a complete metadata document.
+ #pod
+ #pod Available since version 2.141170.
+ #pod
+ #pod =cut
+
+ sub upgrade_fragment {
+ my ($self) = @_;
+ my ($old_version) = $self->{spec};
+ my %expected =
+ map {; $_ => 1 }
+ grep { defined }
+ map { $fragments_generate{$old_version}{$_} }
+ keys %{ $self->{data} };
+ my $converted = $self->convert( version => $HIGHEST, is_fragment => 1 );
+ for my $key ( keys %$converted ) {
+ next if $key =~ /^x_/i || $key eq 'meta-spec';
+ delete $converted->{$key} unless $expected{$key};
+ }
+ return $converted;
+ }
+
+ 1;
+
+ # ABSTRACT: Convert CPAN distribution metadata structures
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Converter - Convert CPAN distribution metadata structures
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 SYNOPSIS
+
+ my $struct = decode_json_file('META.json');
+
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+
+ my $new_struct = $cmc->convert( version => "2" );
+
+ =head1 DESCRIPTION
+
+ This module converts CPAN Meta structures from one form to another. The
+ primary use is to convert older structures to the most modern version of
+ the specification, but other transformations may be implemented in the
+ future as needed. (E.g. stripping all custom fields or stripping all
+ optional fields.)
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+
+ The constructor should be passed a valid metadata structure but invalid
+ structures are accepted. If no meta-spec version is provided, version 1.0 will
+ be assumed.
+
+ Optionally, you can provide a C<default_version> argument after C<$struct>:
+
+ my $cmc = CPAN::Meta::Converter->new( $struct, default_version => "1.4" );
+
+ This is only needed when converting a metadata fragment that does not include a
+ C<meta-spec> field.
+
+ =head2 convert
+
+ my $new_struct = $cmc->convert( version => "2" );
+
+ Returns a new hash reference with the metadata converted to a different form.
+ C<convert> will die if any conversion/standardization still results in an
+ invalid structure.
+
+ Valid parameters include:
+
+ =over
+
+ =item *
+
+ C<version> -- Indicates the desired specification version (e.g. "1.0", "1.1" ... "1.4", "2").
+ Defaults to the latest version of the CPAN Meta Spec.
+
+ =back
+
+ Conversion proceeds through each version in turn. For example, a version 1.2
+ structure might be converted to 1.3 then 1.4 then finally to version 2. The
+ conversion process attempts to clean-up simple errors and standardize data.
+ For example, if C<author> is given as a scalar, it will converted to an array
+ reference containing the item. (Converting a structure to its own version will
+ also clean-up and standardize.)
+
+ When data are cleaned and standardized, missing or invalid fields will be
+ replaced with sensible defaults when possible. This may be lossy or imprecise.
+ For example, some badly structured META.yml files on CPAN have prerequisite
+ modules listed as both keys and values:
+
+ requires => { 'Foo::Bar' => 'Bam::Baz' }
+
+ These would be split and each converted to a prerequisite with a minimum
+ version of zero.
+
+ When some mandatory fields are missing or invalid, the conversion will attempt
+ to provide a sensible default or will fill them with a value of 'unknown'. For
+ example a missing or unrecognized C<license> field will result in a C<license>
+ field of 'unknown'. Fields that may get an 'unknown' include:
+
+ =over 4
+
+ =item *
+
+ abstract
+
+ =item *
+
+ author
+
+ =item *
+
+ license
+
+ =back
+
+ =head2 upgrade_fragment
+
+ my $new_struct = $cmc->upgrade_fragment;
+
+ Returns a new hash reference with the metadata converted to the latest version
+ of the CPAN Meta Spec. No validation is done on the result -- you must
+ validate after merging fragments into a complete metadata document.
+
+ Available since version 2.141170.
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=2 sts=2 sw=2 et :
+ CPAN_META_CONVERTER
+
+ $fatpacked{"CPAN/Meta/Feature.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_FEATURE';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Feature;
+
+ our $VERSION = '2.150005';
+
+ use CPAN::Meta::Prereqs;
+
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod A CPAN::Meta::Feature object describes an optional feature offered by a CPAN
+ #pod distribution and specified in the distribution's F<META.json> (or F<META.yml>)
+ #pod file.
+ #pod
+ #pod For the most part, this class will only be used when operating on the result of
+ #pod the C<feature> or C<features> methods on a L<CPAN::Meta> object.
+ #pod
+ #pod =method new
+ #pod
+ #pod my $feature = CPAN::Meta::Feature->new( $identifier => \%spec );
+ #pod
+ #pod This returns a new Feature object. The C<%spec> argument to the constructor
+ #pod should be the same as the value of the C<optional_feature> entry in the
+ #pod distmeta. It must contain entries for C<description> and C<prereqs>.
+ #pod
+ #pod =cut
+
+ sub new {
+ my ($class, $identifier, $spec) = @_;
+
+ my %guts = (
+ identifier => $identifier,
+ description => $spec->{description},
+ prereqs => CPAN::Meta::Prereqs->new($spec->{prereqs}),
+ );
+
+ bless \%guts => $class;
+ }
+
+ #pod =method identifier
+ #pod
+ #pod This method returns the feature's identifier.
+ #pod
+ #pod =cut
+
+ sub identifier { $_[0]{identifier} }
+
+ #pod =method description
+ #pod
+ #pod This method returns the feature's long description.
+ #pod
+ #pod =cut
+
+ sub description { $_[0]{description} }
+
+ #pod =method prereqs
+ #pod
+ #pod This method returns the feature's prerequisites as a L<CPAN::Meta::Prereqs>
+ #pod object.
+ #pod
+ #pod =cut
+
+ sub prereqs { $_[0]{prereqs} }
+
+ 1;
+
+ # ABSTRACT: an optional feature provided by a CPAN distribution
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Feature - an optional feature provided by a CPAN distribution
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 DESCRIPTION
+
+ A CPAN::Meta::Feature object describes an optional feature offered by a CPAN
+ distribution and specified in the distribution's F<META.json> (or F<META.yml>)
+ file.
+
+ For the most part, this class will only be used when operating on the result of
+ the C<feature> or C<features> methods on a L<CPAN::Meta> object.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $feature = CPAN::Meta::Feature->new( $identifier => \%spec );
+
+ This returns a new Feature object. The C<%spec> argument to the constructor
+ should be the same as the value of the C<optional_feature> entry in the
+ distmeta. It must contain entries for C<description> and C<prereqs>.
+
+ =head2 identifier
+
+ This method returns the feature's identifier.
+
+ =head2 description
+
+ This method returns the feature's long description.
+
+ =head2 prereqs
+
+ This method returns the feature's prerequisites as a L<CPAN::Meta::Prereqs>
+ object.
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=2 sts=2 sw=2 et :
+ CPAN_META_FEATURE
+
+ $fatpacked{"CPAN/Meta/History.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_HISTORY';
+ # vi:tw=72
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::History;
+
+ our $VERSION = '2.150005';
+
+ 1;
+
+ # ABSTRACT: history of CPAN Meta Spec changes
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::History - history of CPAN Meta Spec changes
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 DESCRIPTION
+
+ The CPAN Meta Spec has gone through several iterations. It was
+ originally written in HTML and later revised into POD (though published
+ in HTML generated from the POD). Fields were added, removed or changed,
+ sometimes by design and sometimes to reflect real-world usage after the
+ fact.
+
+ This document reconstructs the history of the CPAN Meta Spec based on
+ change logs, repository commit messages and the published HTML files.
+ In some cases, particularly prior to version 1.2, the exact version
+ when certain fields were introduced or changed is inconsistent between
+ sources. When in doubt, the published HTML files for versions 1.0 to
+ 1.4 as they existed when version 2 was developed are used as the
+ definitive source.
+
+ Starting with version 2, the specification document is part of the
+ CPAN-Meta distribution and will be published on CPAN as
+ L<CPAN::Meta::Spec>.
+
+ Going forward, specification version numbers will be integers and
+ decimal portions will correspond to a release date for the CPAN::Meta
+ library.
+
+ =head1 HISTORY
+
+ =head2 Version 2
+
+ April 2010
+
+ =over
+
+ =item *
+
+ Revised spec examples as perl data structures rather than YAML
+
+ =item *
+
+ Switched to JSON serialization from YAML
+
+ =item *
+
+ Specified allowed version number formats
+
+ =item *
+
+ Replaced 'requires', 'build_requires', 'configure_requires',
+ 'recommends' and 'conflicts' with new 'prereqs' data structure divided
+ by I<phase> (configure, build, test, runtime, etc.) and I<relationship>
+ (requires, recommends, suggests, conflicts)
+
+ =item *
+
+ Added support for 'develop' phase for requirements for maintaining
+ a list of authoring tools
+
+ =item *
+
+ Changed 'license' to a list and revised the set of valid licenses
+
+ =item *
+
+ Made 'dynamic_config' mandatory to reduce confusion
+
+ =item *
+
+ Changed 'resources' subkey 'repository' to a hash that clarifies
+ repository type, url for browsing and url for checkout
+
+ =item *
+
+ Changed 'resources' subkey 'bugtracker' to a hash for either web
+ or mailto resource
+
+ =item *
+
+ Changed specification of 'optional_features':
+
+ =over
+
+ =item *
+
+ Added formal specification and usage guide instead of just example
+
+ =item *
+
+ Changed to use new prereqs data structure instead of individual keys
+
+ =back
+
+ =item *
+
+ Clarified intended use of 'author' as generalized contact list
+
+ =item *
+
+ Added 'release_status' field to indicate stable, testing or unstable
+ status to provide hints to indexers
+
+ =item *
+
+ Added 'description' field for a longer description of the distribution
+
+ =item *
+
+ Formalized use of "x_" or "X_" for all custom keys not listed in the
+ official spec
+
+ =back
+
+ =head2 Version 1.4
+
+ June 2008
+
+ =over
+
+ =item *
+
+ Noted explicit support for 'perl' in prerequisites
+
+ =item *
+
+ Added 'configure_requires' prerequisite type
+
+ =item *
+
+ Changed 'optional_features'
+
+ =over
+
+ =item *
+
+ Example corrected to show map of maps instead of list of maps
+ (though descriptive text said 'map' even in v1.3)
+
+ =item *
+
+ Removed 'requires_packages', 'requires_os' and 'excluded_os'
+ as valid subkeys
+
+ =back
+
+ =back
+
+ =head2 Version 1.3
+
+ November 2006
+
+ =over
+
+ =item *
+
+ Added 'no_index' subkey 'directory' and removed 'dir' to match actual
+ usage in the wild
+
+ =item *
+
+ Added a 'repository' subkey to 'resources'
+
+ =back
+
+ =head2 Version 1.2
+
+ August 2005
+
+ =over
+
+ =item *
+
+ Re-wrote and restructured spec in POD syntax
+
+ =item *
+
+ Changed 'name' to be mandatory
+
+ =item *
+
+ Changed 'generated_by' to be mandatory
+
+ =item *
+
+ Changed 'license' to be mandatory
+
+ =item *
+
+ Added version range specifications for prerequisites
+
+ =item *
+
+ Added required 'abstract' field
+
+ =item *
+
+ Added required 'author' field
+
+ =item *
+
+ Added required 'meta-spec' field to define 'version' (and 'url') of the
+ CPAN Meta Spec used for metadata
+
+ =item *
+
+ Added 'provides' field
+
+ =item *
+
+ Added 'no_index' field and deprecated 'private' field. 'no_index'
+ subkeys include 'file', 'dir', 'package' and 'namespace'
+
+ =item *
+
+ Added 'keywords' field
+
+ =item *
+
+ Added 'resources' field with subkeys 'homepage', 'license', and
+ 'bugtracker'
+
+ =item *
+
+ Added 'optional_features' field as an alternate under 'recommends'.
+ Includes 'description', 'requires', 'build_requires', 'conflicts',
+ 'requires_packages', 'requires_os' and 'excluded_os' as valid subkeys
+
+ =item *
+
+ Removed 'license_uri' field
+
+ =back
+
+ =head2 Version 1.1
+
+ May 2003
+
+ =over
+
+ =item *
+
+ Changed 'version' to be mandatory
+
+ =item *
+
+ Added 'private' field
+
+ =item *
+
+ Added 'license_uri' field
+
+ =back
+
+ =head2 Version 1.0
+
+ March 2003
+
+ =over
+
+ =item *
+
+ Original release (in HTML format only)
+
+ =item *
+
+ Included 'name', 'version', 'license', 'distribution_type', 'requires',
+ 'recommends', 'build_requires', 'conflicts', 'dynamic_config',
+ 'generated_by'
+
+ =back
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ CPAN_META_HISTORY
+
+ $fatpacked{"CPAN/Meta/Merge.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_MERGE';
+ use strict;
+ use warnings;
+
+ package CPAN::Meta::Merge;
+
+ our $VERSION = '2.150005';
+
+ use Carp qw/croak/;
+ use Scalar::Util qw/blessed/;
+ use CPAN::Meta::Converter 2.141170;
+
+ sub _is_identical {
+ my ($left, $right) = @_;
+ return
+ (not defined $left and not defined $right)
+ # if either of these are references, we compare the serialized value
+ || (defined $left and defined $right and $left eq $right);
+ }
+
+ sub _identical {
+ my ($left, $right, $path) = @_;
+ croak sprintf "Can't merge attribute %s: '%s' does not equal '%s'", join('.', @{$path}), $left, $right
+ unless _is_identical($left, $right);
+ return $left;
+ }
+
+ sub _merge {
+ my ($current, $next, $mergers, $path) = @_;
+ for my $key (keys %{$next}) {
+ if (not exists $current->{$key}) {
+ $current->{$key} = $next->{$key};
+ }
+ elsif (my $merger = $mergers->{$key}) {
+ $current->{$key} = $merger->($current->{$key}, $next->{$key}, [ @{$path}, $key ]);
+ }
+ elsif ($merger = $mergers->{':default'}) {
+ $current->{$key} = $merger->($current->{$key}, $next->{$key}, [ @{$path}, $key ]);
+ }
+ else {
+ croak sprintf "Can't merge unknown attribute '%s'", join '.', @{$path}, $key;
+ }
+ }
+ return $current;
+ }
+
+ sub _uniq {
+ my %seen = ();
+ return grep { not $seen{$_}++ } @_;
+ }
+
+ sub _set_addition {
+ my ($left, $right) = @_;
+ return [ +_uniq(@{$left}, @{$right}) ];
+ }
+
+ sub _uniq_map {
+ my ($left, $right, $path) = @_;
+ for my $key (keys %{$right}) {
+ if (not exists $left->{$key}) {
+ $left->{$key} = $right->{$key};
+ }
+ # identical strings or references are merged identically
+ elsif (_is_identical($left->{$key}, $right->{$key})) {
+ 1; # do nothing - keep left
+ }
+ elsif (ref $left->{$key} eq 'HASH' and ref $right->{$key} eq 'HASH') {
+ $left->{$key} = _uniq_map($left->{$key}, $right->{$key}, [ @{$path}, $key ]);
+ }
+ else {
+ croak 'Duplication of element ' . join '.', @{$path}, $key;
+ }
+ }
+ return $left;
+ }
+
+ sub _improvize {
+ my ($left, $right, $path) = @_;
+ my ($name) = reverse @{$path};
+ if ($name =~ /^x_/) {
+ if (ref($left) eq 'ARRAY') {
+ return _set_addition($left, $right, $path);
+ }
+ elsif (ref($left) eq 'HASH') {
+ return _uniq_map($left, $right, $path);
+ }
+ else {
+ return _identical($left, $right, $path);
+ }
+ }
+ croak sprintf "Can't merge '%s'", join '.', @{$path};
+ }
+
+ sub _optional_features {
+ my ($left, $right, $path) = @_;
+
+ for my $key (keys %{$right}) {
+ if (not exists $left->{$key}) {
+ $left->{$key} = $right->{$key};
+ }
+ else {
+ for my $subkey (keys %{ $right->{$key} }) {
+ next if $subkey eq 'prereqs';
+ if (not exists $left->{$key}{$subkey}) {
+ $left->{$key}{$subkey} = $right->{$key}{$subkey};
+ }
+ else {
+ Carp::croak "Cannot merge two optional_features named '$key' with different '$subkey' values"
+ if do { no warnings 'uninitialized'; $left->{$key}{$subkey} ne $right->{$key}{$subkey} };
+ }
+ }
+
+ require CPAN::Meta::Prereqs;
+ $left->{$key}{prereqs} =
+ CPAN::Meta::Prereqs->new($left->{$key}{prereqs})
+ ->with_merged_prereqs(CPAN::Meta::Prereqs->new($right->{$key}{prereqs}))
+ ->as_string_hash;
+ }
+ }
+ return $left;
+ }
+
+
+ my %default = (
+ abstract => \&_identical,
+ author => \&_set_addition,
+ dynamic_config => sub {
+ my ($left, $right) = @_;
+ return $left || $right;
+ },
+ generated_by => sub {
+ my ($left, $right) = @_;
+ return join ', ', _uniq(split(/, /, $left), split(/, /, $right));
+ },
+ license => \&_set_addition,
+ 'meta-spec' => {
+ version => \&_identical,
+ url => \&_identical
+ },
+ name => \&_identical,
+ release_status => \&_identical,
+ version => \&_identical,
+ description => \&_identical,
+ keywords => \&_set_addition,
+ no_index => { map { ($_ => \&_set_addition) } qw/file directory package namespace/ },
+ optional_features => \&_optional_features,
+ prereqs => sub {
+ require CPAN::Meta::Prereqs;
+ my ($left, $right) = map { CPAN::Meta::Prereqs->new($_) } @_[0,1];
+ return $left->with_merged_prereqs($right)->as_string_hash;
+ },
+ provides => \&_uniq_map,
+ resources => {
+ license => \&_set_addition,
+ homepage => \&_identical,
+ bugtracker => \&_uniq_map,
+ repository => \&_uniq_map,
+ ':default' => \&_improvize,
+ },
+ ':default' => \&_improvize,
+ );
+
+ sub new {
+ my ($class, %arguments) = @_;
+ croak 'default version required' if not exists $arguments{default_version};
+ my %mapping = %default;
+ my %extra = %{ $arguments{extra_mappings} || {} };
+ for my $key (keys %extra) {
+ if (ref($mapping{$key}) eq 'HASH') {
+ $mapping{$key} = { %{ $mapping{$key} }, %{ $extra{$key} } };
+ }
+ else {
+ $mapping{$key} = $extra{$key};
+ }
+ }
+ return bless {
+ default_version => $arguments{default_version},
+ mapping => _coerce_mapping(\%mapping, []),
+ }, $class;
+ }
+
+ my %coderef_for = (
+ set_addition => \&_set_addition,
+ uniq_map => \&_uniq_map,
+ identical => \&_identical,
+ improvize => \&_improvize,
+ );
+
+ sub _coerce_mapping {
+ my ($orig, $map_path) = @_;
+ my %ret;
+ for my $key (keys %{$orig}) {
+ my $value = $orig->{$key};
+ if (ref($orig->{$key}) eq 'CODE') {
+ $ret{$key} = $value;
+ }
+ elsif (ref($value) eq 'HASH') {
+ my $mapping = _coerce_mapping($value, [ @{$map_path}, $key ]);
+ $ret{$key} = sub {
+ my ($left, $right, $path) = @_;
+ return _merge($left, $right, $mapping, [ @{$path} ]);
+ };
+ }
+ elsif ($coderef_for{$value}) {
+ $ret{$key} = $coderef_for{$value};
+ }
+ else {
+ croak "Don't know what to do with " . join '.', @{$map_path}, $key;
+ }
+ }
+ return \%ret;
+ }
+
+ sub merge {
+ my ($self, @items) = @_;
+ my $current = {};
+ for my $next (@items) {
+ if ( blessed($next) && $next->isa('CPAN::Meta') ) {
+ $next = $next->as_struct;
+ }
+ elsif ( ref($next) eq 'HASH' ) {
+ my $cmc = CPAN::Meta::Converter->new(
+ $next, default_version => $self->{default_version}
+ );
+ $next = $cmc->upgrade_fragment;
+ }
+ else {
+ croak "Don't know how to merge '$next'";
+ }
+ $current = _merge($current, $next, $self->{mapping}, []);
+ }
+ return $current;
+ }
+
+ 1;
+
+ # ABSTRACT: Merging CPAN Meta fragments
+
+
+ # vim: ts=2 sts=2 sw=2 et :
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Merge - Merging CPAN Meta fragments
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 SYNOPSIS
+
+ my $merger = CPAN::Meta::Merge->new(default_version => "2");
+ my $meta = $merger->merge($base, @additional);
+
+ =head1 DESCRIPTION
+
+ =head1 METHODS
+
+ =head2 new
+
+ This creates a CPAN::Meta::Merge object. It takes one mandatory named
+ argument, C<version>, declaring the version of the meta-spec that must be
+ used for the merge. It can optionally take an C<extra_mappings> argument
+ that allows one to add additional merging functions for specific elements.
+
+ =head2 merge(@fragments)
+
+ Merge all C<@fragments> together. It will accept both CPAN::Meta objects and
+ (possibly incomplete) hashrefs of metadata.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ CPAN_META_MERGE
+
+ $fatpacked{"CPAN/Meta/Prereqs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_PREREQS';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Prereqs;
+
+ our $VERSION = '2.150005';
+
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod A CPAN::Meta::Prereqs object represents the prerequisites for a CPAN
+ #pod distribution or one of its optional features. Each set of prereqs is
+ #pod organized by phase and type, as described in L<CPAN::Meta::Prereqs>.
+ #pod
+ #pod =cut
+
+ use Carp qw(confess);
+ use Scalar::Util qw(blessed);
+ use CPAN::Meta::Requirements 2.121;
+
+ #pod =method new
+ #pod
+ #pod my $prereq = CPAN::Meta::Prereqs->new( \%prereq_spec );
+ #pod
+ #pod This method returns a new set of Prereqs. The input should look like the
+ #pod contents of the C<prereqs> field described in L<CPAN::Meta::Spec>, meaning
+ #pod something more or less like this:
+ #pod
+ #pod my $prereq = CPAN::Meta::Prereqs->new({
+ #pod runtime => {
+ #pod requires => {
+ #pod 'Some::Module' => '1.234',
+ #pod ...,
+ #pod },
+ #pod ...,
+ #pod },
+ #pod ...,
+ #pod });
+ #pod
+ #pod You can also construct an empty set of prereqs with:
+ #pod
+ #pod my $prereqs = CPAN::Meta::Prereqs->new;
+ #pod
+ #pod This empty set of prereqs is useful for accumulating new prereqs before finally
+ #pod dumping the whole set into a structure or string.
+ #pod
+ #pod =cut
+
+ sub __legal_phases { qw(configure build test runtime develop) }
+ sub __legal_types { qw(requires recommends suggests conflicts) }
+
+ # expect a prereq spec from META.json -- rjbs, 2010-04-11
+ sub new {
+ my ($class, $prereq_spec) = @_;
+ $prereq_spec ||= {};
+
+ my %is_legal_phase = map {; $_ => 1 } $class->__legal_phases;
+ my %is_legal_type = map {; $_ => 1 } $class->__legal_types;
+
+ my %guts;
+ PHASE: for my $phase (keys %$prereq_spec) {
+ next PHASE unless $phase =~ /\Ax_/i or $is_legal_phase{$phase};
+
+ my $phase_spec = $prereq_spec->{ $phase };
+ next PHASE unless keys %$phase_spec;
+
+ TYPE: for my $type (keys %$phase_spec) {
+ next TYPE unless $type =~ /\Ax_/i or $is_legal_type{$type};
+
+ my $spec = $phase_spec->{ $type };
+
+ next TYPE unless keys %$spec;
+
+ $guts{prereqs}{$phase}{$type} = CPAN::Meta::Requirements->from_string_hash(
+ $spec
+ );
+ }
+ }
+
+ return bless \%guts => $class;
+ }
+
+ #pod =method requirements_for
+ #pod
+ #pod my $requirements = $prereqs->requirements_for( $phase, $type );
+ #pod
+ #pod This method returns a L<CPAN::Meta::Requirements> object for the given
+ #pod phase/type combination. If no prerequisites are registered for that
+ #pod combination, a new CPAN::Meta::Requirements object will be returned, and it may
+ #pod be added to as needed.
+ #pod
+ #pod If C<$phase> or C<$type> are undefined or otherwise invalid, an exception will
+ #pod be raised.
+ #pod
+ #pod =cut
+
+ sub requirements_for {
+ my ($self, $phase, $type) = @_;
+
+ confess "requirements_for called without phase" unless defined $phase;
+ confess "requirements_for called without type" unless defined $type;
+
+ unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) {
+ confess "requested requirements for unknown phase: $phase";
+ }
+
+ unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) {
+ confess "requested requirements for unknown type: $type";
+ }
+
+ my $req = ($self->{prereqs}{$phase}{$type} ||= CPAN::Meta::Requirements->new);
+
+ $req->finalize if $self->is_finalized;
+
+ return $req;
+ }
+
+ #pod =method with_merged_prereqs
+ #pod
+ #pod my $new_prereqs = $prereqs->with_merged_prereqs( $other_prereqs );
+ #pod
+ #pod my $new_prereqs = $prereqs->with_merged_prereqs( \@other_prereqs );
+ #pod
+ #pod This method returns a new CPAN::Meta::Prereqs objects in which all the
+ #pod other prerequisites given are merged into the current set. This is primarily
+ #pod provided for combining a distribution's core prereqs with the prereqs of one of
+ #pod its optional features.
+ #pod
+ #pod The new prereqs object has no ties to the originals, and altering it further
+ #pod will not alter them.
+ #pod
+ #pod =cut
+
+ sub with_merged_prereqs {
+ my ($self, $other) = @_;
+
+ my @other = blessed($other) ? $other : @$other;
+
+ my @prereq_objs = ($self, @other);
+
+ my %new_arg;
+
+ for my $phase ($self->__legal_phases) {
+ for my $type ($self->__legal_types) {
+ my $req = CPAN::Meta::Requirements->new;
+
+ for my $prereq (@prereq_objs) {
+ my $this_req = $prereq->requirements_for($phase, $type);
+ next unless $this_req->required_modules;
+
+ $req->add_requirements($this_req);
+ }
+
+ next unless $req->required_modules;
+
+ $new_arg{ $phase }{ $type } = $req->as_string_hash;
+ }
+ }
+
+ return (ref $self)->new(\%new_arg);
+ }
+
+ #pod =method merged_requirements
+ #pod
+ #pod my $new_reqs = $prereqs->merged_requirements( \@phases, \@types );
+ #pod my $new_reqs = $prereqs->merged_requirements( \@phases );
+ #pod my $new_reqs = $prereqs->merged_requirements();
+ #pod
+ #pod This method joins together all requirements across a number of phases
+ #pod and types into a new L<CPAN::Meta::Requirements> object. If arguments
+ #pod are omitted, it defaults to "runtime", "build" and "test" for phases
+ #pod and "requires" and "recommends" for types.
+ #pod
+ #pod =cut
+
+ sub merged_requirements {
+ my ($self, $phases, $types) = @_;
+ $phases = [qw/runtime build test/] unless defined $phases;
+ $types = [qw/requires recommends/] unless defined $types;
+
+ confess "merged_requirements phases argument must be an arrayref"
+ unless ref $phases eq 'ARRAY';
+ confess "merged_requirements types argument must be an arrayref"
+ unless ref $types eq 'ARRAY';
+
+ my $req = CPAN::Meta::Requirements->new;
+
+ for my $phase ( @$phases ) {
+ unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) {
+ confess "requested requirements for unknown phase: $phase";
+ }
+ for my $type ( @$types ) {
+ unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) {
+ confess "requested requirements for unknown type: $type";
+ }
+ $req->add_requirements( $self->requirements_for($phase, $type) );
+ }
+ }
+
+ $req->finalize if $self->is_finalized;
+
+ return $req;
+ }
+
+
+ #pod =method as_string_hash
+ #pod
+ #pod This method returns a hashref containing structures suitable for dumping into a
+ #pod distmeta data structure. It is made up of hashes and strings, only; there will
+ #pod be no Prereqs, CPAN::Meta::Requirements, or C<version> objects inside it.
+ #pod
+ #pod =cut
+
+ sub as_string_hash {
+ my ($self) = @_;
+
+ my %hash;
+
+ for my $phase ($self->__legal_phases) {
+ for my $type ($self->__legal_types) {
+ my $req = $self->requirements_for($phase, $type);
+ next unless $req->required_modules;
+
+ $hash{ $phase }{ $type } = $req->as_string_hash;
+ }
+ }
+
+ return \%hash;
+ }
+
+ #pod =method is_finalized
+ #pod
+ #pod This method returns true if the set of prereqs has been marked "finalized," and
+ #pod cannot be altered.
+ #pod
+ #pod =cut
+
+ sub is_finalized { $_[0]{finalized} }
+
+ #pod =method finalize
+ #pod
+ #pod Calling C<finalize> on a Prereqs object will close it for further modification.
+ #pod Attempting to make any changes that would actually alter the prereqs will
+ #pod result in an exception being thrown.
+ #pod
+ #pod =cut
+
+ sub finalize {
+ my ($self) = @_;
+
+ $self->{finalized} = 1;
+
+ for my $phase (keys %{ $self->{prereqs} }) {
+ $_->finalize for values %{ $self->{prereqs}{$phase} };
+ }
+ }
+
+ #pod =method clone
+ #pod
+ #pod my $cloned_prereqs = $prereqs->clone;
+ #pod
+ #pod This method returns a Prereqs object that is identical to the original object,
+ #pod but can be altered without affecting the original object. Finalization does
+ #pod not survive cloning, meaning that you may clone a finalized set of prereqs and
+ #pod then modify the clone.
+ #pod
+ #pod =cut
+
+ sub clone {
+ my ($self) = @_;
+
+ my $clone = (ref $self)->new( $self->as_string_hash );
+ }
+
+ 1;
+
+ # ABSTRACT: a set of distribution prerequisites by phase and type
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Prereqs - a set of distribution prerequisites by phase and type
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 DESCRIPTION
+
+ A CPAN::Meta::Prereqs object represents the prerequisites for a CPAN
+ distribution or one of its optional features. Each set of prereqs is
+ organized by phase and type, as described in L<CPAN::Meta::Prereqs>.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $prereq = CPAN::Meta::Prereqs->new( \%prereq_spec );
+
+ This method returns a new set of Prereqs. The input should look like the
+ contents of the C<prereqs> field described in L<CPAN::Meta::Spec>, meaning
+ something more or less like this:
+
+ my $prereq = CPAN::Meta::Prereqs->new({
+ runtime => {
+ requires => {
+ 'Some::Module' => '1.234',
+ ...,
+ },
+ ...,
+ },
+ ...,
+ });
+
+ You can also construct an empty set of prereqs with:
+
+ my $prereqs = CPAN::Meta::Prereqs->new;
+
+ This empty set of prereqs is useful for accumulating new prereqs before finally
+ dumping the whole set into a structure or string.
+
+ =head2 requirements_for
+
+ my $requirements = $prereqs->requirements_for( $phase, $type );
+
+ This method returns a L<CPAN::Meta::Requirements> object for the given
+ phase/type combination. If no prerequisites are registered for that
+ combination, a new CPAN::Meta::Requirements object will be returned, and it may
+ be added to as needed.
+
+ If C<$phase> or C<$type> are undefined or otherwise invalid, an exception will
+ be raised.
+
+ =head2 with_merged_prereqs
+
+ my $new_prereqs = $prereqs->with_merged_prereqs( $other_prereqs );
+
+ my $new_prereqs = $prereqs->with_merged_prereqs( \@other_prereqs );
+
+ This method returns a new CPAN::Meta::Prereqs objects in which all the
+ other prerequisites given are merged into the current set. This is primarily
+ provided for combining a distribution's core prereqs with the prereqs of one of
+ its optional features.
+
+ The new prereqs object has no ties to the originals, and altering it further
+ will not alter them.
+
+ =head2 merged_requirements
+
+ my $new_reqs = $prereqs->merged_requirements( \@phases, \@types );
+ my $new_reqs = $prereqs->merged_requirements( \@phases );
+ my $new_reqs = $prereqs->merged_requirements();
+
+ This method joins together all requirements across a number of phases
+ and types into a new L<CPAN::Meta::Requirements> object. If arguments
+ are omitted, it defaults to "runtime", "build" and "test" for phases
+ and "requires" and "recommends" for types.
+
+ =head2 as_string_hash
+
+ This method returns a hashref containing structures suitable for dumping into a
+ distmeta data structure. It is made up of hashes and strings, only; there will
+ be no Prereqs, CPAN::Meta::Requirements, or C<version> objects inside it.
+
+ =head2 is_finalized
+
+ This method returns true if the set of prereqs has been marked "finalized," and
+ cannot be altered.
+
+ =head2 finalize
+
+ Calling C<finalize> on a Prereqs object will close it for further modification.
+ Attempting to make any changes that would actually alter the prereqs will
+ result in an exception being thrown.
+
+ =head2 clone
+
+ my $cloned_prereqs = $prereqs->clone;
+
+ This method returns a Prereqs object that is identical to the original object,
+ but can be altered without affecting the original object. Finalization does
+ not survive cloning, meaning that you may clone a finalized set of prereqs and
+ then modify the clone.
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=2 sts=2 sw=2 et :
+ CPAN_META_PREREQS
+
+ $fatpacked{"CPAN/Meta/Requirements.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_REQUIREMENTS';
+ use strict;
+ use warnings;
+ package CPAN::Meta::Requirements;
+ # ABSTRACT: a set of version requirements for a CPAN dist
+
+ our $VERSION = '2.133';
+
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod use CPAN::Meta::Requirements;
+ #pod
+ #pod my $build_requires = CPAN::Meta::Requirements->new;
+ #pod
+ #pod $build_requires->add_minimum('Library::Foo' => 1.208);
+ #pod
+ #pod $build_requires->add_minimum('Library::Foo' => 2.602);
+ #pod
+ #pod $build_requires->add_minimum('Module::Bar' => 'v1.2.3');
+ #pod
+ #pod $METAyml->{build_requires} = $build_requires->as_string_hash;
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod A CPAN::Meta::Requirements object models a set of version constraints like
+ #pod those specified in the F<META.yml> or F<META.json> files in CPAN distributions,
+ #pod and as defined by L<CPAN::Meta::Spec>;
+ #pod It can be built up by adding more and more constraints, and it will reduce them
+ #pod to the simplest representation.
+ #pod
+ #pod Logically impossible constraints will be identified immediately by thrown
+ #pod exceptions.
+ #pod
+ #pod =cut
+
+ use Carp ();
+
+ # To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls
+ # before 5.10, we fall back to the EUMM bundled compatibility version module if
+ # that's the only thing available. This shouldn't ever happen in a normal CPAN
+ # install of CPAN::Meta::Requirements, as version.pm will be picked up from
+ # prereqs and be available at runtime.
+
+ BEGIN {
+ eval "use version ()"; ## no critic
+ if ( my $err = $@ ) {
+ eval "use ExtUtils::MakeMaker::version" or die $err; ## no critic
+ }
+ }
+
+ # Perl 5.10.0 didn't have "is_qv" in version.pm
+ *_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} };
+
+ # construct once, reuse many times
+ my $V0 = version->new(0);
+
+ #pod =method new
+ #pod
+ #pod my $req = CPAN::Meta::Requirements->new;
+ #pod
+ #pod This returns a new CPAN::Meta::Requirements object. It takes an optional
+ #pod hash reference argument. Currently, only one key is supported:
+ #pod
+ #pod =for :list
+ #pod * C<bad_version_hook> -- if provided, when a version cannot be parsed into
+ #pod a version object, this code reference will be called with the invalid
+ #pod version string as first argument, and the module name as second
+ #pod argument. It must return a valid version object.
+ #pod
+ #pod All other keys are ignored.
+ #pod
+ #pod =cut
+
+ my @valid_options = qw( bad_version_hook );
+
+ sub new {
+ my ($class, $options) = @_;
+ $options ||= {};
+ Carp::croak "Argument to $class\->new() must be a hash reference"
+ unless ref $options eq 'HASH';
+ my %self = map {; $_ => $options->{$_}} @valid_options;
+
+ return bless \%self => $class;
+ }
+
+ # from version::vpp
+ sub _find_magic_vstring {
+ my $value = shift;
+ my $tvalue = '';
+ require B;
+ my $sv = B::svref_2object(\$value);
+ my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
+ while ( $magic ) {
+ if ( $magic->TYPE eq 'V' ) {
+ $tvalue = $magic->PTR;
+ $tvalue =~ s/^v?(.+)$/v$1/;
+ last;
+ }
+ else {
+ $magic = $magic->MOREMAGIC;
+ }
+ }
+ return $tvalue;
+ }
+
+ # safe if given an unblessed reference
+ sub _isa_version {
+ UNIVERSAL::isa( $_[0], 'UNIVERSAL' ) && $_[0]->isa('version')
+ }
+
+ sub _version_object {
+ my ($self, $module, $version) = @_;
+
+ my ($vobj, $err);
+
+ if (not defined $version or (!ref($version) && $version eq '0')) {
+ return $V0;
+ }
+ elsif ( ref($version) eq 'version' || _isa_version($version) ) {
+ $vobj = $version;
+ }
+ else {
+ # hack around version::vpp not handling <3 character vstring literals
+ if ( $INC{'version/vpp.pm'} || $INC{'ExtUtils/MakeMaker/version/vpp.pm'} ) {
+ my $magic = _find_magic_vstring( $version );
+ $version = $magic if length $magic;
+ }
+ eval {
+ local $SIG{__WARN__} = sub { die "Invalid version: $_[0]" };
+ $vobj = version->new($version);
+ };
+ if ( my $err = $@ ) {
+ my $hook = $self->{bad_version_hook};
+ $vobj = eval { $hook->($version, $module) }
+ if ref $hook eq 'CODE';
+ unless (eval { $vobj->isa("version") }) {
+ $err =~ s{ at .* line \d+.*$}{};
+ die "Can't convert '$version': $err";
+ }
+ }
+ }
+
+ # ensure no leading '.'
+ if ( $vobj =~ m{\A\.} ) {
+ $vobj = version->new("0$vobj");
+ }
+
+ # ensure normal v-string form
+ if ( _is_qv($vobj) ) {
+ $vobj = version->new($vobj->normal);
+ }
+
+ return $vobj;
+ }
+
+ #pod =method add_minimum
+ #pod
+ #pod $req->add_minimum( $module => $version );
+ #pod
+ #pod This adds a new minimum version requirement. If the new requirement is
+ #pod redundant to the existing specification, this has no effect.
+ #pod
+ #pod Minimum requirements are inclusive. C<$version> is required, along with any
+ #pod greater version number.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =method add_maximum
+ #pod
+ #pod $req->add_maximum( $module => $version );
+ #pod
+ #pod This adds a new maximum version requirement. If the new requirement is
+ #pod redundant to the existing specification, this has no effect.
+ #pod
+ #pod Maximum requirements are inclusive. No version strictly greater than the given
+ #pod version is allowed.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =method add_exclusion
+ #pod
+ #pod $req->add_exclusion( $module => $version );
+ #pod
+ #pod This adds a new excluded version. For example, you might use these three
+ #pod method calls:
+ #pod
+ #pod $req->add_minimum( $module => '1.00' );
+ #pod $req->add_maximum( $module => '1.82' );
+ #pod
+ #pod $req->add_exclusion( $module => '1.75' );
+ #pod
+ #pod Any version between 1.00 and 1.82 inclusive would be acceptable, except for
+ #pod 1.75.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =method exact_version
+ #pod
+ #pod $req->exact_version( $module => $version );
+ #pod
+ #pod This sets the version required for the given module to I<exactly> the given
+ #pod version. No other version would be considered acceptable.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =cut
+
+ BEGIN {
+ for my $type (qw(maximum exclusion exact_version)) {
+ my $method = "with_$type";
+ my $to_add = $type eq 'exact_version' ? $type : "add_$type";
+
+ my $code = sub {
+ my ($self, $name, $version) = @_;
+
+ $version = $self->_version_object( $name, $version );
+
+ $self->__modify_entry_for($name, $method, $version);
+
+ return $self;
+ };
+
+ no strict 'refs';
+ *$to_add = $code;
+ }
+ }
+
+ # add_minimum is optimized compared to generated subs above because
+ # it is called frequently and with "0" or equivalent input
+ sub add_minimum {
+ my ($self, $name, $version) = @_;
+
+ # stringify $version so that version->new("0.00")->stringify ne "0"
+ # which preserves the user's choice of "0.00" as the requirement
+ if (not defined $version or "$version" eq '0') {
+ return $self if $self->__entry_for($name);
+ Carp::confess("can't add new requirements to finalized requirements")
+ if $self->is_finalized;
+
+ $self->{requirements}{ $name } =
+ CPAN::Meta::Requirements::_Range::Range->with_minimum($V0);
+ }
+ else {
+ $version = $self->_version_object( $name, $version );
+
+ $self->__modify_entry_for($name, 'with_minimum', $version);
+ }
+ return $self;
+ }
+
+ #pod =method add_requirements
+ #pod
+ #pod $req->add_requirements( $another_req_object );
+ #pod
+ #pod This method adds all the requirements in the given CPAN::Meta::Requirements object
+ #pod to the requirements object on which it was called. If there are any conflicts,
+ #pod an exception is thrown.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =cut
+
+ sub add_requirements {
+ my ($self, $req) = @_;
+
+ for my $module ($req->required_modules) {
+ my $modifiers = $req->__entry_for($module)->as_modifiers;
+ for my $modifier (@$modifiers) {
+ my ($method, @args) = @$modifier;
+ $self->$method($module => @args);
+ };
+ }
+
+ return $self;
+ }
+
+ #pod =method accepts_module
+ #pod
+ #pod my $bool = $req->accepts_module($module => $version);
+ #pod
+ #pod Given an module and version, this method returns true if the version
+ #pod specification for the module accepts the provided version. In other words,
+ #pod given:
+ #pod
+ #pod Module => '>= 1.00, < 2.00'
+ #pod
+ #pod We will accept 1.00 and 1.75 but not 0.50 or 2.00.
+ #pod
+ #pod For modules that do not appear in the requirements, this method will return
+ #pod true.
+ #pod
+ #pod =cut
+
+ sub accepts_module {
+ my ($self, $module, $version) = @_;
+
+ $version = $self->_version_object( $module, $version );
+
+ return 1 unless my $range = $self->__entry_for($module);
+ return $range->_accepts($version);
+ }
+
+ #pod =method clear_requirement
+ #pod
+ #pod $req->clear_requirement( $module );
+ #pod
+ #pod This removes the requirement for a given module from the object.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =cut
+
+ sub clear_requirement {
+ my ($self, $module) = @_;
+
+ return $self unless $self->__entry_for($module);
+
+ Carp::confess("can't clear requirements on finalized requirements")
+ if $self->is_finalized;
+
+ delete $self->{requirements}{ $module };
+
+ return $self;
+ }
+
+ #pod =method requirements_for_module
+ #pod
+ #pod $req->requirements_for_module( $module );
+ #pod
+ #pod This returns a string containing the version requirements for a given module in
+ #pod the format described in L<CPAN::Meta::Spec> or undef if the given module has no
+ #pod requirements. This should only be used for informational purposes such as error
+ #pod messages and should not be interpreted or used for comparison (see
+ #pod L</accepts_module> instead.)
+ #pod
+ #pod =cut
+
+ sub requirements_for_module {
+ my ($self, $module) = @_;
+ my $entry = $self->__entry_for($module);
+ return unless $entry;
+ return $entry->as_string;
+ }
+
+ #pod =method required_modules
+ #pod
+ #pod This method returns a list of all the modules for which requirements have been
+ #pod specified.
+ #pod
+ #pod =cut
+
+ sub required_modules { keys %{ $_[0]{requirements} } }
+
+ #pod =method clone
+ #pod
+ #pod $req->clone;
+ #pod
+ #pod This method returns a clone of the invocant. The clone and the original object
+ #pod can then be changed independent of one another.
+ #pod
+ #pod =cut
+
+ sub clone {
+ my ($self) = @_;
+ my $new = (ref $self)->new;
+
+ return $new->add_requirements($self);
+ }
+
+ sub __entry_for { $_[0]{requirements}{ $_[1] } }
+
+ sub __modify_entry_for {
+ my ($self, $name, $method, $version) = @_;
+
+ my $fin = $self->is_finalized;
+ my $old = $self->__entry_for($name);
+
+ Carp::confess("can't add new requirements to finalized requirements")
+ if $fin and not $old;
+
+ my $new = ($old || 'CPAN::Meta::Requirements::_Range::Range')
+ ->$method($version);
+
+ Carp::confess("can't modify finalized requirements")
+ if $fin and $old->as_string ne $new->as_string;
+
+ $self->{requirements}{ $name } = $new;
+ }
+
+ #pod =method is_simple
+ #pod
+ #pod This method returns true if and only if all requirements are inclusive minimums
+ #pod -- that is, if their string expression is just the version number.
+ #pod
+ #pod =cut
+
+ sub is_simple {
+ my ($self) = @_;
+ for my $module ($self->required_modules) {
+ # XXX: This is a complete hack, but also entirely correct.
+ return if $self->__entry_for($module)->as_string =~ /\s/;
+ }
+
+ return 1;
+ }
+
+ #pod =method is_finalized
+ #pod
+ #pod This method returns true if the requirements have been finalized by having the
+ #pod C<finalize> method called on them.
+ #pod
+ #pod =cut
+
+ sub is_finalized { $_[0]{finalized} }
+
+ #pod =method finalize
+ #pod
+ #pod This method marks the requirements finalized. Subsequent attempts to change
+ #pod the requirements will be fatal, I<if> they would result in a change. If they
+ #pod would not alter the requirements, they have no effect.
+ #pod
+ #pod If a finalized set of requirements is cloned, the cloned requirements are not
+ #pod also finalized.
+ #pod
+ #pod =cut
+
+ sub finalize { $_[0]{finalized} = 1 }
+
+ #pod =method as_string_hash
+ #pod
+ #pod This returns a reference to a hash describing the requirements using the
+ #pod strings in the L<CPAN::Meta::Spec> specification.
+ #pod
+ #pod For example after the following program:
+ #pod
+ #pod my $req = CPAN::Meta::Requirements->new;
+ #pod
+ #pod $req->add_minimum('CPAN::Meta::Requirements' => 0.102);
+ #pod
+ #pod $req->add_minimum('Library::Foo' => 1.208);
+ #pod
+ #pod $req->add_maximum('Library::Foo' => 2.602);
+ #pod
+ #pod $req->add_minimum('Module::Bar' => 'v1.2.3');
+ #pod
+ #pod $req->add_exclusion('Module::Bar' => 'v1.2.8');
+ #pod
+ #pod $req->exact_version('Xyzzy' => '6.01');
+ #pod
+ #pod my $hashref = $req->as_string_hash;
+ #pod
+ #pod C<$hashref> would contain:
+ #pod
+ #pod {
+ #pod 'CPAN::Meta::Requirements' => '0.102',
+ #pod 'Library::Foo' => '>= 1.208, <= 2.206',
+ #pod 'Module::Bar' => '>= v1.2.3, != v1.2.8',
+ #pod 'Xyzzy' => '== 6.01',
+ #pod }
+ #pod
+ #pod =cut
+
+ sub as_string_hash {
+ my ($self) = @_;
+
+ my %hash = map {; $_ => $self->{requirements}{$_}->as_string }
+ $self->required_modules;
+
+ return \%hash;
+ }
+
+ #pod =method add_string_requirement
+ #pod
+ #pod $req->add_string_requirement('Library::Foo' => '>= 1.208, <= 2.206');
+ #pod $req->add_string_requirement('Library::Foo' => v1.208);
+ #pod
+ #pod This method parses the passed in string and adds the appropriate requirement
+ #pod for the given module. A version can be a Perl "v-string". It understands
+ #pod version ranges as described in the L<CPAN::Meta::Spec/Version Ranges>. For
+ #pod example:
+ #pod
+ #pod =over 4
+ #pod
+ #pod =item 1.3
+ #pod
+ #pod =item >= 1.3
+ #pod
+ #pod =item <= 1.3
+ #pod
+ #pod =item == 1.3
+ #pod
+ #pod =item != 1.3
+ #pod
+ #pod =item > 1.3
+ #pod
+ #pod =item < 1.3
+ #pod
+ #pod =item >= 1.3, != 1.5, <= 2.0
+ #pod
+ #pod A version number without an operator is equivalent to specifying a minimum
+ #pod (C<E<gt>=>). Extra whitespace is allowed.
+ #pod
+ #pod =back
+ #pod
+ #pod =cut
+
+ my %methods_for_op = (
+ '==' => [ qw(exact_version) ],
+ '!=' => [ qw(add_exclusion) ],
+ '>=' => [ qw(add_minimum) ],
+ '<=' => [ qw(add_maximum) ],
+ '>' => [ qw(add_minimum add_exclusion) ],
+ '<' => [ qw(add_maximum add_exclusion) ],
+ );
+
+ sub add_string_requirement {
+ my ($self, $module, $req) = @_;
+
+ unless ( defined $req && length $req ) {
+ $req = 0;
+ $self->_blank_carp($module);
+ }
+
+ my $magic = _find_magic_vstring( $req );
+ if (length $magic) {
+ $self->add_minimum($module => $magic);
+ return;
+ }
+
+ my @parts = split qr{\s*,\s*}, $req;
+
+ for my $part (@parts) {
+ my ($op, $ver) = $part =~ m{\A\s*(==|>=|>|<=|<|!=)\s*(.*)\z};
+
+ if (! defined $op) {
+ $self->add_minimum($module => $part);
+ } else {
+ Carp::confess("illegal requirement string: $req")
+ unless my $methods = $methods_for_op{ $op };
+
+ $self->$_($module => $ver) for @$methods;
+ }
+ }
+ }
+
+ #pod =method from_string_hash
+ #pod
+ #pod my $req = CPAN::Meta::Requirements->from_string_hash( \%hash );
+ #pod my $req = CPAN::Meta::Requirements->from_string_hash( \%hash, \%opts );
+ #pod
+ #pod This is an alternate constructor for a CPAN::Meta::Requirements
+ #pod object. It takes a hash of module names and version requirement
+ #pod strings and returns a new CPAN::Meta::Requirements object. As with
+ #pod add_string_requirement, a version can be a Perl "v-string". Optionally,
+ #pod you can supply a hash-reference of options, exactly as with the L</new>
+ #pod method.
+ #pod
+ #pod =cut
+
+ sub _blank_carp {
+ my ($self, $module) = @_;
+ Carp::carp("Undefined requirement for $module treated as '0'");
+ }
+
+ sub from_string_hash {
+ my ($class, $hash, $options) = @_;
+
+ my $self = $class->new($options);
+
+ for my $module (keys %$hash) {
+ my $req = $hash->{$module};
+ unless ( defined $req && length $req ) {
+ $req = 0;
+ $class->_blank_carp($module);
+ }
+ $self->add_string_requirement($module, $req);
+ }
+
+ return $self;
+ }
+
+ ##############################################################
+
+ {
+ package
+ CPAN::Meta::Requirements::_Range::Exact;
+ sub _new { bless { version => $_[1] } => $_[0] }
+
+ sub _accepts { return $_[0]{version} == $_[1] }
+
+ sub as_string { return "== $_[0]{version}" }
+
+ sub as_modifiers { return [ [ exact_version => $_[0]{version} ] ] }
+
+ sub _clone {
+ (ref $_[0])->_new( version->new( $_[0]{version} ) )
+ }
+
+ sub with_exact_version {
+ my ($self, $version) = @_;
+
+ return $self->_clone if $self->_accepts($version);
+
+ Carp::confess("illegal requirements: unequal exact version specified");
+ }
+
+ sub with_minimum {
+ my ($self, $minimum) = @_;
+ return $self->_clone if $self->{version} >= $minimum;
+ Carp::confess("illegal requirements: minimum above exact specification");
+ }
+
+ sub with_maximum {
+ my ($self, $maximum) = @_;
+ return $self->_clone if $self->{version} <= $maximum;
+ Carp::confess("illegal requirements: maximum below exact specification");
+ }
+
+ sub with_exclusion {
+ my ($self, $exclusion) = @_;
+ return $self->_clone unless $exclusion == $self->{version};
+ Carp::confess("illegal requirements: excluded exact specification");
+ }
+ }
+
+ ##############################################################
+
+ {
+ package
+ CPAN::Meta::Requirements::_Range::Range;
+
+ sub _self { ref($_[0]) ? $_[0] : (bless { } => $_[0]) }
+
+ sub _clone {
+ return (bless { } => $_[0]) unless ref $_[0];
+
+ my ($s) = @_;
+ my %guts = (
+ (exists $s->{minimum} ? (minimum => version->new($s->{minimum})) : ()),
+ (exists $s->{maximum} ? (maximum => version->new($s->{maximum})) : ()),
+
+ (exists $s->{exclusions}
+ ? (exclusions => [ map { version->new($_) } @{ $s->{exclusions} } ])
+ : ()),
+ );
+
+ bless \%guts => ref($s);
+ }
+
+ sub as_modifiers {
+ my ($self) = @_;
+ my @mods;
+ push @mods, [ add_minimum => $self->{minimum} ] if exists $self->{minimum};
+ push @mods, [ add_maximum => $self->{maximum} ] if exists $self->{maximum};
+ push @mods, map {; [ add_exclusion => $_ ] } @{$self->{exclusions} || []};
+ return \@mods;
+ }
+
+ sub as_string {
+ my ($self) = @_;
+
+ return 0 if ! keys %$self;
+
+ return "$self->{minimum}" if (keys %$self) == 1 and exists $self->{minimum};
+
+ my @exclusions = @{ $self->{exclusions} || [] };
+
+ my @parts;
+
+ for my $pair (
+ [ qw( >= > minimum ) ],
+ [ qw( <= < maximum ) ],
+ ) {
+ my ($op, $e_op, $k) = @$pair;
+ if (exists $self->{$k}) {
+ my @new_exclusions = grep { $_ != $self->{ $k } } @exclusions;
+ if (@new_exclusions == @exclusions) {
+ push @parts, "$op $self->{ $k }";
+ } else {
+ push @parts, "$e_op $self->{ $k }";
+ @exclusions = @new_exclusions;
+ }
+ }
+ }
+
+ push @parts, map {; "!= $_" } @exclusions;
+
+ return join q{, }, @parts;
+ }
+
+ sub with_exact_version {
+ my ($self, $version) = @_;
+ $self = $self->_clone;
+
+ Carp::confess("illegal requirements: exact specification outside of range")
+ unless $self->_accepts($version);
+
+ return CPAN::Meta::Requirements::_Range::Exact->_new($version);
+ }
+
+ sub _simplify {
+ my ($self) = @_;
+
+ if (defined $self->{minimum} and defined $self->{maximum}) {
+ if ($self->{minimum} == $self->{maximum}) {
+ Carp::confess("illegal requirements: excluded all values")
+ if grep { $_ == $self->{minimum} } @{ $self->{exclusions} || [] };
+
+ return CPAN::Meta::Requirements::_Range::Exact->_new($self->{minimum})
+ }
+
+ Carp::confess("illegal requirements: minimum exceeds maximum")
+ if $self->{minimum} > $self->{maximum};
+ }
+
+ # eliminate irrelevant exclusions
+ if ($self->{exclusions}) {
+ my %seen;
+ @{ $self->{exclusions} } = grep {
+ (! defined $self->{minimum} or $_ >= $self->{minimum})
+ and
+ (! defined $self->{maximum} or $_ <= $self->{maximum})
+ and
+ ! $seen{$_}++
+ } @{ $self->{exclusions} };
+ }
+
+ return $self;
+ }
+
+ sub with_minimum {
+ my ($self, $minimum) = @_;
+ $self = $self->_clone;
+
+ if (defined (my $old_min = $self->{minimum})) {
+ $self->{minimum} = (sort { $b cmp $a } ($minimum, $old_min))[0];
+ } else {
+ $self->{minimum} = $minimum;
+ }
+
+ return $self->_simplify;
+ }
+
+ sub with_maximum {
+ my ($self, $maximum) = @_;
+ $self = $self->_clone;
+
+ if (defined (my $old_max = $self->{maximum})) {
+ $self->{maximum} = (sort { $a cmp $b } ($maximum, $old_max))[0];
+ } else {
+ $self->{maximum} = $maximum;
+ }
+
+ return $self->_simplify;
+ }
+
+ sub with_exclusion {
+ my ($self, $exclusion) = @_;
+ $self = $self->_clone;
+
+ push @{ $self->{exclusions} ||= [] }, $exclusion;
+
+ return $self->_simplify;
+ }
+
+ sub _accepts {
+ my ($self, $version) = @_;
+
+ return if defined $self->{minimum} and $version < $self->{minimum};
+ return if defined $self->{maximum} and $version > $self->{maximum};
+ return if defined $self->{exclusions}
+ and grep { $version == $_ } @{ $self->{exclusions} };
+
+ return 1;
+ }
+ }
+
+ 1;
+ # vim: ts=2 sts=2 sw=2 et:
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Requirements - a set of version requirements for a CPAN dist
+
+ =head1 VERSION
+
+ version 2.133
+
+ =head1 SYNOPSIS
+
+ use CPAN::Meta::Requirements;
+
+ my $build_requires = CPAN::Meta::Requirements->new;
+
+ $build_requires->add_minimum('Library::Foo' => 1.208);
+
+ $build_requires->add_minimum('Library::Foo' => 2.602);
+
+ $build_requires->add_minimum('Module::Bar' => 'v1.2.3');
+
+ $METAyml->{build_requires} = $build_requires->as_string_hash;
+
+ =head1 DESCRIPTION
+
+ A CPAN::Meta::Requirements object models a set of version constraints like
+ those specified in the F<META.yml> or F<META.json> files in CPAN distributions,
+ and as defined by L<CPAN::Meta::Spec>;
+ It can be built up by adding more and more constraints, and it will reduce them
+ to the simplest representation.
+
+ Logically impossible constraints will be identified immediately by thrown
+ exceptions.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $req = CPAN::Meta::Requirements->new;
+
+ This returns a new CPAN::Meta::Requirements object. It takes an optional
+ hash reference argument. Currently, only one key is supported:
+
+ =over 4
+
+ =item *
+
+ C<bad_version_hook> -- if provided, when a version cannot be parsed into a version object, this code reference will be called with the invalid version string as first argument, and the module name as second argument. It must return a valid version object.
+
+ =back
+
+ All other keys are ignored.
+
+ =head2 add_minimum
+
+ $req->add_minimum( $module => $version );
+
+ This adds a new minimum version requirement. If the new requirement is
+ redundant to the existing specification, this has no effect.
+
+ Minimum requirements are inclusive. C<$version> is required, along with any
+ greater version number.
+
+ This method returns the requirements object.
+
+ =head2 add_maximum
+
+ $req->add_maximum( $module => $version );
+
+ This adds a new maximum version requirement. If the new requirement is
+ redundant to the existing specification, this has no effect.
+
+ Maximum requirements are inclusive. No version strictly greater than the given
+ version is allowed.
+
+ This method returns the requirements object.
+
+ =head2 add_exclusion
+
+ $req->add_exclusion( $module => $version );
+
+ This adds a new excluded version. For example, you might use these three
+ method calls:
+
+ $req->add_minimum( $module => '1.00' );
+ $req->add_maximum( $module => '1.82' );
+
+ $req->add_exclusion( $module => '1.75' );
+
+ Any version between 1.00 and 1.82 inclusive would be acceptable, except for
+ 1.75.
+
+ This method returns the requirements object.
+
+ =head2 exact_version
+
+ $req->exact_version( $module => $version );
+
+ This sets the version required for the given module to I<exactly> the given
+ version. No other version would be considered acceptable.
+
+ This method returns the requirements object.
+
+ =head2 add_requirements
+
+ $req->add_requirements( $another_req_object );
+
+ This method adds all the requirements in the given CPAN::Meta::Requirements object
+ to the requirements object on which it was called. If there are any conflicts,
+ an exception is thrown.
+
+ This method returns the requirements object.
+
+ =head2 accepts_module
+
+ my $bool = $req->accepts_module($module => $version);
+
+ Given an module and version, this method returns true if the version
+ specification for the module accepts the provided version. In other words,
+ given:
+
+ Module => '>= 1.00, < 2.00'
+
+ We will accept 1.00 and 1.75 but not 0.50 or 2.00.
+
+ For modules that do not appear in the requirements, this method will return
+ true.
+
+ =head2 clear_requirement
+
+ $req->clear_requirement( $module );
+
+ This removes the requirement for a given module from the object.
+
+ This method returns the requirements object.
+
+ =head2 requirements_for_module
+
+ $req->requirements_for_module( $module );
+
+ This returns a string containing the version requirements for a given module in
+ the format described in L<CPAN::Meta::Spec> or undef if the given module has no
+ requirements. This should only be used for informational purposes such as error
+ messages and should not be interpreted or used for comparison (see
+ L</accepts_module> instead.)
+
+ =head2 required_modules
+
+ This method returns a list of all the modules for which requirements have been
+ specified.
+
+ =head2 clone
+
+ $req->clone;
+
+ This method returns a clone of the invocant. The clone and the original object
+ can then be changed independent of one another.
+
+ =head2 is_simple
+
+ This method returns true if and only if all requirements are inclusive minimums
+ -- that is, if their string expression is just the version number.
+
+ =head2 is_finalized
+
+ This method returns true if the requirements have been finalized by having the
+ C<finalize> method called on them.
+
+ =head2 finalize
+
+ This method marks the requirements finalized. Subsequent attempts to change
+ the requirements will be fatal, I<if> they would result in a change. If they
+ would not alter the requirements, they have no effect.
+
+ If a finalized set of requirements is cloned, the cloned requirements are not
+ also finalized.
+
+ =head2 as_string_hash
+
+ This returns a reference to a hash describing the requirements using the
+ strings in the L<CPAN::Meta::Spec> specification.
+
+ For example after the following program:
+
+ my $req = CPAN::Meta::Requirements->new;
+
+ $req->add_minimum('CPAN::Meta::Requirements' => 0.102);
+
+ $req->add_minimum('Library::Foo' => 1.208);
+
+ $req->add_maximum('Library::Foo' => 2.602);
+
+ $req->add_minimum('Module::Bar' => 'v1.2.3');
+
+ $req->add_exclusion('Module::Bar' => 'v1.2.8');
+
+ $req->exact_version('Xyzzy' => '6.01');
+
+ my $hashref = $req->as_string_hash;
+
+ C<$hashref> would contain:
+
+ {
+ 'CPAN::Meta::Requirements' => '0.102',
+ 'Library::Foo' => '>= 1.208, <= 2.206',
+ 'Module::Bar' => '>= v1.2.3, != v1.2.8',
+ 'Xyzzy' => '== 6.01',
+ }
+
+ =head2 add_string_requirement
+
+ $req->add_string_requirement('Library::Foo' => '>= 1.208, <= 2.206');
+ $req->add_string_requirement('Library::Foo' => v1.208);
+
+ This method parses the passed in string and adds the appropriate requirement
+ for the given module. A version can be a Perl "v-string". It understands
+ version ranges as described in the L<CPAN::Meta::Spec/Version Ranges>. For
+ example:
+
+ =over 4
+
+ =item 1.3
+
+ =item >= 1.3
+
+ =item <= 1.3
+
+ =item == 1.3
+
+ =item != 1.3
+
+ =item > 1.3
+
+ =item < 1.3
+
+ =item >= 1.3, != 1.5, <= 2.0
+
+ A version number without an operator is equivalent to specifying a minimum
+ (C<E<gt>=>). Extra whitespace is allowed.
+
+ =back
+
+ =head2 from_string_hash
+
+ my $req = CPAN::Meta::Requirements->from_string_hash( \%hash );
+ my $req = CPAN::Meta::Requirements->from_string_hash( \%hash, \%opts );
+
+ This is an alternate constructor for a CPAN::Meta::Requirements
+ object. It takes a hash of module names and version requirement
+ strings and returns a new CPAN::Meta::Requirements object. As with
+ add_string_requirement, a version can be a Perl "v-string". Optionally,
+ you can supply a hash-reference of options, exactly as with the L</new>
+ method.
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/dagolden/CPAN-Meta-Requirements/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/dagolden/CPAN-Meta-Requirements>
+
+ git clone https://github.com/dagolden/CPAN-Meta-Requirements.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Ed J Karen Etheridge Leon Timmermans robario
+
+ =over 4
+
+ =item *
+
+ Ed J <mohawk2@users.noreply.github.com>
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Leon Timmermans <fawaka@gmail.com>
+
+ =item *
+
+ robario <webmaster@robario.com>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ CPAN_META_REQUIREMENTS
+
+ $fatpacked{"CPAN/Meta/Spec.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_SPEC';
+ # XXX RULES FOR PATCHING THIS FILE XXX
+ # Patches that fix typos or formatting are acceptable. Patches
+ # that change semantics are not acceptable without prior approval
+ # by David Golden or Ricardo Signes.
+
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Spec;
+
+ our $VERSION = '2.150005';
+
+ 1;
+
+ # ABSTRACT: specification for CPAN distribution metadata
+
+
+ # vi:tw=72
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Spec - specification for CPAN distribution metadata
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 SYNOPSIS
+
+ my $distmeta = {
+ name => 'Module-Build',
+ abstract => 'Build and install Perl modules',
+ description => "Module::Build is a system for "
+ . "building, testing, and installing Perl modules. "
+ . "It is meant to ... blah blah blah ...",
+ version => '0.36',
+ release_status => 'stable',
+ author => [
+ 'Ken Williams <kwilliams@cpan.org>',
+ 'Module-Build List <module-build@perl.org>', # additional contact
+ ],
+ license => [ 'perl_5' ],
+ prereqs => {
+ runtime => {
+ requires => {
+ 'perl' => '5.006',
+ 'ExtUtils::Install' => '0',
+ 'File::Basename' => '0',
+ 'File::Compare' => '0',
+ 'IO::File' => '0',
+ },
+ recommends => {
+ 'Archive::Tar' => '1.00',
+ 'ExtUtils::Install' => '0.3',
+ 'ExtUtils::ParseXS' => '2.02',
+ },
+ },
+ build => {
+ requires => {
+ 'Test::More' => '0',
+ },
+ }
+ },
+ resources => {
+ license => ['http://dev.perl.org/licenses/'],
+ },
+ optional_features => {
+ domination => {
+ description => 'Take over the world',
+ prereqs => {
+ develop => { requires => { 'Genius::Evil' => '1.234' } },
+ runtime => { requires => { 'Machine::Weather' => '2.0' } },
+ },
+ },
+ },
+ dynamic_config => 1,
+ keywords => [ qw/ toolchain cpan dual-life / ],
+ 'meta-spec' => {
+ version => '2',
+ url => 'https://metacpan.org/pod/CPAN::Meta::Spec',
+ },
+ generated_by => 'Module::Build version 0.36',
+ };
+
+ =head1 DESCRIPTION
+
+ This document describes version 2 of the CPAN distribution metadata
+ specification, also known as the "CPAN Meta Spec".
+
+ Revisions of this specification for typo corrections and prose
+ clarifications may be issued as CPAN::Meta::Spec 2.I<x>. These
+ revisions will never change semantics or add or remove specified
+ behavior.
+
+ Distribution metadata describe important properties of Perl
+ distributions. Distribution building tools like Module::Build,
+ Module::Install, ExtUtils::MakeMaker or Dist::Zilla should create a
+ metadata file in accordance with this specification and include it with
+ the distribution for use by automated tools that index, examine, package
+ or install Perl distributions.
+
+ =head1 TERMINOLOGY
+
+ =over 4
+
+ =item distribution
+
+ This is the primary object described by the metadata. In the context of
+ this document it usually refers to a collection of modules, scripts,
+ and/or documents that are distributed together for other developers to
+ use. Examples of distributions are C<Class-Container>, C<libwww-perl>,
+ or C<DBI>.
+
+ =item module
+
+ This refers to a reusable library of code contained in a single file.
+ Modules usually contain one or more packages and are often referred
+ to by the name of a primary package that can be mapped to the file
+ name. For example, one might refer to C<File::Spec> instead of
+ F<File/Spec.pm>
+
+ =item package
+
+ This refers to a namespace declared with the Perl C<package> statement.
+ In Perl, packages often have a version number property given by the
+ C<$VERSION> variable in the namespace.
+
+ =item consumer
+
+ This refers to code that reads a metadata file, deserializes it into a
+ data structure in memory, or interprets a data structure of metadata
+ elements.
+
+ =item producer
+
+ This refers to code that constructs a metadata data structure,
+ serializes into a bytestream and/or writes it to disk.
+
+ =item must, should, may, etc.
+
+ These terms are interpreted as described in IETF RFC 2119.
+
+ =back
+
+ =head1 DATA TYPES
+
+ Fields in the L</STRUCTURE> section describe data elements, each of
+ which has an associated data type as described herein. There are four
+ primitive types: Boolean, String, List and Map. Other types are
+ subtypes of primitives and define compound data structures or define
+ constraints on the values of a data element.
+
+ =head2 Boolean
+
+ A I<Boolean> is used to provide a true or false value. It B<must> be
+ represented as a defined value.
+
+ =head2 String
+
+ A I<String> is data element containing a non-zero length sequence of
+ Unicode characters, such as an ordinary Perl scalar that is not a
+ reference.
+
+ =head2 List
+
+ A I<List> is an ordered collection of zero or more data elements.
+ Elements of a List may be of mixed types.
+
+ Producers B<must> represent List elements using a data structure which
+ unambiguously indicates that multiple values are possible, such as a
+ reference to a Perl array (an "arrayref").
+
+ Consumers expecting a List B<must> consider a String as equivalent to a
+ List of length 1.
+
+ =head2 Map
+
+ A I<Map> is an unordered collection of zero or more data elements
+ ("values"), indexed by associated String elements ("keys"). The Map's
+ value elements may be of mixed types.
+
+ =head2 License String
+
+ A I<License String> is a subtype of String with a restricted set of
+ values. Valid values are described in detail in the description of
+ the L</license> field.
+
+ =head2 URL
+
+ I<URL> is a subtype of String containing a Uniform Resource Locator or
+ Identifier. [ This type is called URL and not URI for historical reasons. ]
+
+ =head2 Version
+
+ A I<Version> is a subtype of String containing a value that describes
+ the version number of packages or distributions. Restrictions on format
+ are described in detail in the L</Version Formats> section.
+
+ =head2 Version Range
+
+ The I<Version Range> type is a subtype of String. It describes a range
+ of Versions that may be present or installed to fulfill prerequisites.
+ It is specified in detail in the L</Version Ranges> section.
+
+ =head1 STRUCTURE
+
+ The metadata structure is a data element of type Map. This section
+ describes valid keys within the Map.
+
+ Any keys not described in this specification document (whether top-level
+ or within compound data structures described herein) are considered
+ I<custom keys> and B<must> begin with an "x" or "X" and be followed by an
+ underscore; i.e. they must match the pattern: C<< qr{\Ax_}i >>. If a
+ custom key refers to a compound data structure, subkeys within it do not
+ need an "x_" or "X_" prefix.
+
+ Consumers of metadata may ignore any or all custom keys. All other keys
+ not described herein are invalid and should be ignored by consumers.
+ Producers must not generate or output invalid keys.
+
+ For each key, an example is provided followed by a description. The
+ description begins with the version of spec in which the key was added
+ or in which the definition was modified, whether the key is I<required>
+ or I<optional> and the data type of the corresponding data element.
+ These items are in parentheses, brackets and braces, respectively.
+
+ If a data type is a Map or Map subtype, valid subkeys will be described
+ as well.
+
+ Some fields are marked I<Deprecated>. These are shown for historical
+ context and must not be produced in or consumed from any metadata structure
+ of version 2 or higher.
+
+ =head2 REQUIRED FIELDS
+
+ =head3 abstract
+
+ Example:
+
+ abstract => 'Build and install Perl modules'
+
+ (Spec 1.2) [required] {String}
+
+ This is a short description of the purpose of the distribution.
+
+ =head3 author
+
+ Example:
+
+ author => [ 'Ken Williams <kwilliams@cpan.org>' ]
+
+ (Spec 1.2) [required] {List of one or more Strings}
+
+ This List indicates the person(s) to contact concerning the
+ distribution. The preferred form of the contact string is:
+
+ contact-name <email-address>
+
+ This field provides a general contact list independent of other
+ structured fields provided within the L</resources> field, such as
+ C<bugtracker>. The addressee(s) can be contacted for any purpose
+ including but not limited to (security) problems with the distribution,
+ questions about the distribution or bugs in the distribution.
+
+ A distribution's original author is usually the contact listed within
+ this field. Co-maintainers, successor maintainers or mailing lists
+ devoted to the distribution may also be listed in addition to or instead
+ of the original author.
+
+ =head3 dynamic_config
+
+ Example:
+
+ dynamic_config => 1
+
+ (Spec 2) [required] {Boolean}
+
+ A boolean flag indicating whether a F<Build.PL> or F<Makefile.PL> (or
+ similar) must be executed to determine prerequisites.
+
+ This field should be set to a true value if the distribution performs
+ some dynamic configuration (asking questions, sensing the environment,
+ etc.) as part of its configuration. This field should be set to a false
+ value to indicate that prerequisites included in metadata may be
+ considered final and valid for static analysis.
+
+ Note: when this field is true, post-configuration prerequisites are not
+ guaranteed to bear any relation whatsoever to those stated in the metadata,
+ and relying on them doing so is an error. See also
+ L</Prerequisites for dynamically configured distributions> in the implementors'
+ notes.
+
+ This field explicitly B<does not> indicate whether installation may be
+ safely performed without using a Makefile or Build file, as there may be
+ special files to install or custom installation targets (e.g. for
+ dual-life modules that exist on CPAN as well as in the Perl core). This
+ field only defines whether or not prerequisites are exactly as given in the
+ metadata.
+
+ =head3 generated_by
+
+ Example:
+
+ generated_by => 'Module::Build version 0.36'
+
+ (Spec 1.0) [required] {String}
+
+ This field indicates the tool that was used to create this metadata.
+ There are no defined semantics for this field, but it is traditional to
+ use a string in the form "Generating::Package version 1.23" or the
+ author's name, if the file was generated by hand.
+
+ =head3 license
+
+ Example:
+
+ license => [ 'perl_5' ]
+
+ license => [ 'apache_2_0', 'mozilla_1_0' ]
+
+ (Spec 2) [required] {List of one or more License Strings}
+
+ One or more licenses that apply to some or all of the files in the
+ distribution. If multiple licenses are listed, the distribution
+ documentation should be consulted to clarify the interpretation of
+ multiple licenses.
+
+ The following list of license strings are valid:
+
+ string description
+ ------------- -----------------------------------------------
+ agpl_3 GNU Affero General Public License, Version 3
+ apache_1_1 Apache Software License, Version 1.1
+ apache_2_0 Apache License, Version 2.0
+ artistic_1 Artistic License, (Version 1)
+ artistic_2 Artistic License, Version 2.0
+ bsd BSD License (three-clause)
+ freebsd FreeBSD License (two-clause)
+ gfdl_1_2 GNU Free Documentation License, Version 1.2
+ gfdl_1_3 GNU Free Documentation License, Version 1.3
+ gpl_1 GNU General Public License, Version 1
+ gpl_2 GNU General Public License, Version 2
+ gpl_3 GNU General Public License, Version 3
+ lgpl_2_1 GNU Lesser General Public License, Version 2.1
+ lgpl_3_0 GNU Lesser General Public License, Version 3.0
+ mit MIT (aka X11) License
+ mozilla_1_0 Mozilla Public License, Version 1.0
+ mozilla_1_1 Mozilla Public License, Version 1.1
+ openssl OpenSSL License
+ perl_5 The Perl 5 License (Artistic 1 & GPL 1 or later)
+ qpl_1_0 Q Public License, Version 1.0
+ ssleay Original SSLeay License
+ sun Sun Internet Standards Source License (SISSL)
+ zlib zlib License
+
+ The following license strings are also valid and indicate other
+ licensing not described above:
+
+ string description
+ ------------- -----------------------------------------------
+ open_source Other Open Source Initiative (OSI) approved license
+ restricted Requires special permission from copyright holder
+ unrestricted Not an OSI approved license, but not restricted
+ unknown License not provided in metadata
+
+ All other strings are invalid in the license field.
+
+ =head3 meta-spec
+
+ Example:
+
+ 'meta-spec' => {
+ version => '2',
+ url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
+ }
+
+ (Spec 1.2) [required] {Map}
+
+ This field indicates the version of the CPAN Meta Spec that should be
+ used to interpret the metadata. Consumers must check this key as soon
+ as possible and abort further metadata processing if the meta-spec
+ version is not supported by the consumer.
+
+ The following keys are valid, but only C<version> is required.
+
+ =over
+
+ =item version
+
+ This subkey gives the integer I<Version> of the CPAN Meta Spec against
+ which the document was generated.
+
+ =item url
+
+ This is a I<URL> of the metadata specification document corresponding to
+ the given version. This is strictly for human-consumption and should
+ not impact the interpretation of the document.
+
+ For the version 2 spec, either of these are recommended:
+
+ =over 4
+
+ =item *
+
+ C<https://metacpan.org/pod/CPAN::Meta::Spec>
+
+ =item *
+
+ C<http://search.cpan.org/perldoc?CPAN::Meta::Spec>
+
+ =back
+
+ =back
+
+ =head3 name
+
+ Example:
+
+ name => 'Module-Build'
+
+ (Spec 1.0) [required] {String}
+
+ This field is the name of the distribution. This is often created by
+ taking the "main package" in the distribution and changing C<::> to
+ C<->, but the name may be completely unrelated to the packages within
+ the distribution. For example, L<LWP::UserAgent> is distributed as part
+ of the distribution name "libwww-perl".
+
+ =head3 release_status
+
+ Example:
+
+ release_status => 'stable'
+
+ (Spec 2) [required] {String}
+
+ This field provides the release status of this distribution. If the
+ C<version> field contains an underscore character, then
+ C<release_status> B<must not> be "stable."
+
+ The C<release_status> field B<must> have one of the following values:
+
+ =over
+
+ =item stable
+
+ This indicates an ordinary, "final" release that should be indexed by PAUSE
+ or other indexers.
+
+ =item testing
+
+ This indicates a "beta" release that is substantially complete, but has an
+ elevated risk of bugs and requires additional testing. The distribution
+ should not be installed over a stable release without an explicit request
+ or other confirmation from a user. This release status may also be used
+ for "release candidate" versions of a distribution.
+
+ =item unstable
+
+ This indicates an "alpha" release that is under active development, but has
+ been released for early feedback or testing and may be missing features or
+ may have serious bugs. The distribution should not be installed over a
+ stable release without an explicit request or other confirmation from a
+ user.
+
+ =back
+
+ Consumers B<may> use this field to determine how to index the
+ distribution for CPAN or other repositories in addition to or in
+ replacement of heuristics based on version number or file name.
+
+ =head3 version
+
+ Example:
+
+ version => '0.36'
+
+ (Spec 1.0) [required] {Version}
+
+ This field gives the version of the distribution to which the metadata
+ structure refers.
+
+ =head2 OPTIONAL FIELDS
+
+ =head3 description
+
+ Example:
+
+ description => "Module::Build is a system for "
+ . "building, testing, and installing Perl modules. "
+ . "It is meant to ... blah blah blah ...",
+
+ (Spec 2) [optional] {String}
+
+ A longer, more complete description of the purpose or intended use of
+ the distribution than the one provided by the C<abstract> key.
+
+ =head3 keywords
+
+ Example:
+
+ keywords => [ qw/ toolchain cpan dual-life / ]
+
+ (Spec 1.1) [optional] {List of zero or more Strings}
+
+ A List of keywords that describe this distribution. Keywords
+ B<must not> include whitespace.
+
+ =head3 no_index
+
+ Example:
+
+ no_index => {
+ file => [ 'My/Module.pm' ],
+ directory => [ 'My/Private' ],
+ package => [ 'My::Module::Secret' ],
+ namespace => [ 'My::Module::Sample' ],
+ }
+
+ (Spec 1.2) [optional] {Map}
+
+ This Map describes any files, directories, packages, and namespaces that
+ are private to the packaging or implementation of the distribution and
+ should be ignored by indexing or search tools. Note that this is a list of
+ exclusions, and the spec does not define what to I<include> - see
+ L</Indexing distributions a la PAUSE> in the implementors notes for more
+ information.
+
+ Valid subkeys are as follows:
+
+ =over
+
+ =item file
+
+ A I<List> of relative paths to files. Paths B<must be> specified with
+ unix conventions.
+
+ =item directory
+
+ A I<List> of relative paths to directories. Paths B<must be> specified
+ with unix conventions.
+
+ [ Note: previous editions of the spec had C<dir> instead of C<directory> ]
+
+ =item package
+
+ A I<List> of package names.
+
+ =item namespace
+
+ A I<List> of package namespaces, where anything below the namespace
+ must be ignored, but I<not> the namespace itself.
+
+ In the example above for C<no_index>, C<My::Module::Sample::Foo> would
+ be ignored, but C<My::Module::Sample> would not.
+
+ =back
+
+ =head3 optional_features
+
+ Example:
+
+ optional_features => {
+ sqlite => {
+ description => 'Provides SQLite support',
+ prereqs => {
+ runtime => {
+ requires => {
+ 'DBD::SQLite' => '1.25'
+ }
+ }
+ }
+ }
+ }
+
+ (Spec 2) [optional] {Map}
+
+ This Map describes optional features with incremental prerequisites.
+ Each key of the C<optional_features> Map is a String used to identify
+ the feature and each value is a Map with additional information about
+ the feature. Valid subkeys include:
+
+ =over
+
+ =item description
+
+ This is a String describing the feature. Every optional feature
+ should provide a description
+
+ =item prereqs
+
+ This entry is required and has the same structure as that of the
+ C<L</prereqs>> key. It provides a list of package requirements
+ that must be satisfied for the feature to be supported or enabled.
+
+ There is one crucial restriction: the prereqs of an optional feature
+ B<must not> include C<configure> phase prereqs.
+
+ =back
+
+ Consumers B<must not> include optional features as prerequisites without
+ explicit instruction from users (whether via interactive prompting,
+ a function parameter or a configuration value, etc. ).
+
+ If an optional feature is used by a consumer to add additional
+ prerequisites, the consumer should merge the optional feature
+ prerequisites into those given by the C<prereqs> key using the same
+ semantics. See L</Merging and Resolving Prerequisites> for details on
+ merging prerequisites.
+
+ I<Suggestion for disuse:> Because there is currently no way for a
+ distribution to specify a dependency on an optional feature of another
+ dependency, the use of C<optional_feature> is discouraged. Instead,
+ create a separate, installable distribution that ensures the desired
+ feature is available. For example, if C<Foo::Bar> has a C<Baz> feature,
+ release a separate C<Foo-Bar-Baz> distribution that satisfies
+ requirements for the feature.
+
+ =head3 prereqs
+
+ Example:
+
+ prereqs => {
+ runtime => {
+ requires => {
+ 'perl' => '5.006',
+ 'File::Spec' => '0.86',
+ 'JSON' => '2.16',
+ },
+ recommends => {
+ 'JSON::XS' => '2.26',
+ },
+ suggests => {
+ 'Archive::Tar' => '0',
+ },
+ },
+ build => {
+ requires => {
+ 'Alien::SDL' => '1.00',
+ },
+ },
+ test => {
+ recommends => {
+ 'Test::Deep' => '0.10',
+ },
+ }
+ }
+
+ (Spec 2) [optional] {Map}
+
+ This is a Map that describes all the prerequisites of the distribution.
+ The keys are phases of activity, such as C<configure>, C<build>, C<test>
+ or C<runtime>. Values are Maps in which the keys name the type of
+ prerequisite relationship such as C<requires>, C<recommends>, or
+ C<suggests> and the value provides a set of prerequisite relations. The
+ set of relations B<must> be specified as a Map of package names to
+ version ranges.
+
+ The full definition for this field is given in the L</Prereq Spec>
+ section.
+
+ =head3 provides
+
+ Example:
+
+ provides => {
+ 'Foo::Bar' => {
+ file => 'lib/Foo/Bar.pm',
+ version => '0.27_02',
+ },
+ 'Foo::Bar::Blah' => {
+ file => 'lib/Foo/Bar/Blah.pm',
+ },
+ 'Foo::Bar::Baz' => {
+ file => 'lib/Foo/Bar/Baz.pm',
+ version => '0.3',
+ },
+ }
+
+ (Spec 1.2) [optional] {Map}
+
+ This describes all packages provided by this distribution. This
+ information is used by distribution and automation mechanisms like
+ PAUSE, CPAN, metacpan.org and search.cpan.org to build indexes saying in
+ which distribution various packages can be found.
+
+ The keys of C<provides> are package names that can be found within
+ the distribution. If a package name key is provided, it must
+ have a Map with the following valid subkeys:
+
+ =over
+
+ =item file
+
+ This field is required. It must contain a Unix-style relative file path
+ from the root of the distribution directory to a file that contains or
+ generates the package. It may be given as C<META.yml> or C<META.json>
+ to claim a package for indexing without needing a C<*.pm>.
+
+ =item version
+
+ If it exists, this field must contains a I<Version> String for the
+ package. If the package does not have a C<$VERSION>, this field must
+ be omitted.
+
+ =back
+
+ =head3 resources
+
+ Example:
+
+ resources => {
+ license => [ 'http://dev.perl.org/licenses/' ],
+ homepage => 'http://sourceforge.net/projects/module-build',
+ bugtracker => {
+ web => 'http://rt.cpan.org/Public/Dist/Display.html?Name=CPAN-Meta',
+ mailto => 'meta-bugs@example.com',
+ },
+ repository => {
+ url => 'git://github.com/dagolden/cpan-meta.git',
+ web => 'http://github.com/dagolden/cpan-meta',
+ type => 'git',
+ },
+ x_twitter => 'http://twitter.com/cpan_linked/',
+ }
+
+ (Spec 2) [optional] {Map}
+
+ This field describes resources related to this distribution.
+
+ Valid subkeys include:
+
+ =over
+
+ =item homepage
+
+ The official home of this project on the web.
+
+ =item license
+
+ A List of I<URL>'s that relate to this distribution's license. As with the
+ top-level C<license> field, distribution documentation should be consulted
+ to clarify the interpretation of multiple licenses provided here.
+
+ =item bugtracker
+
+ This entry describes the bug tracking system for this distribution. It
+ is a Map with the following valid keys:
+
+ web - a URL pointing to a web front-end for the bug tracker
+ mailto - an email address to which bugs can be sent
+
+ =item repository
+
+ This entry describes the source control repository for this distribution. It
+ is a Map with the following valid keys:
+
+ url - a URL pointing to the repository itself
+ web - a URL pointing to a web front-end for the repository
+ type - a lowercase string indicating the VCS used
+
+ Because a url like C<http://myrepo.example.com/> is ambiguous as to
+ type, producers should provide a C<type> whenever a C<url> key is given.
+ The C<type> field should be the name of the most common program used
+ to work with the repository, e.g. C<git>, C<svn>, C<cvs>, C<darcs>,
+ C<bzr> or C<hg>.
+
+ =back
+
+ =head2 DEPRECATED FIELDS
+
+ =head3 build_requires
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 configure_requires
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 conflicts
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 distribution_type
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ This field indicated 'module' or 'script' but was considered
+ meaningless, since many distributions are hybrids of several kinds of
+ things.
+
+ =head3 license_uri
+
+ I<(Deprecated in Spec 1.2)> [optional] {URL}
+
+ Replaced by C<license> in C<resources>
+
+ =head3 private
+
+ I<(Deprecated in Spec 1.2)> [optional] {Map}
+
+ This field has been renamed to L</"no_index">.
+
+ =head3 recommends
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 requires
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head1 VERSION NUMBERS
+
+ =head2 Version Formats
+
+ This section defines the Version type, used by several fields in the
+ CPAN Meta Spec.
+
+ Version numbers must be treated as strings, not numbers. For
+ example, C<1.200> B<must not> be serialized as C<1.2>. Version
+ comparison should be delegated to the Perl L<version> module, version
+ 0.80 or newer.
+
+ Unless otherwise specified, version numbers B<must> appear in one of two
+ formats:
+
+ =over
+
+ =item Decimal versions
+
+ Decimal versions are regular "decimal numbers", with some limitations.
+ They B<must> be non-negative and B<must> begin and end with a digit. A
+ single underscore B<may> be included, but B<must> be between two digits.
+ They B<must not> use exponential notation ("1.23e-2").
+
+ version => '1.234' # OK
+ version => '1.23_04' # OK
+
+ version => '1.23_04_05' # Illegal
+ version => '1.' # Illegal
+ version => '.1' # Illegal
+
+ =item Dotted-integer versions
+
+ Dotted-integer (also known as dotted-decimal) versions consist of
+ positive integers separated by full stop characters (i.e. "dots",
+ "periods" or "decimal points"). This are equivalent in format to Perl
+ "v-strings", with some additional restrictions on form. They must be
+ given in "normal" form, which has a leading "v" character and at least
+ three integer components. To retain a one-to-one mapping with decimal
+ versions, all components after the first B<should> be restricted to the
+ range 0 to 999. The final component B<may> be separated by an
+ underscore character instead of a period.
+
+ version => 'v1.2.3' # OK
+ version => 'v1.2_3' # OK
+ version => 'v1.2.3.4' # OK
+ version => 'v1.2.3_4' # OK
+ version => 'v2009.10.31' # OK
+
+ version => 'v1.2' # Illegal
+ version => '1.2.3' # Illegal
+ version => 'v1.2_3_4' # Illegal
+ version => 'v1.2009.10.31' # Not recommended
+
+ =back
+
+ =head2 Version Ranges
+
+ Some fields (prereq, optional_features) indicate the particular
+ version(s) of some other module that may be required as a prerequisite.
+ This section details the Version Range type used to provide this
+ information.
+
+ The simplest format for a Version Range is just the version
+ number itself, e.g. C<2.4>. This means that B<at least> version 2.4
+ must be present. To indicate that B<any> version of a prerequisite is
+ okay, even if the prerequisite doesn't define a version at all, use
+ the version C<0>.
+
+ Alternatively, a version range B<may> use the operators E<lt> (less than),
+ E<lt>= (less than or equal), E<gt> (greater than), E<gt>= (greater than
+ or equal), == (equal), and != (not equal). For example, the
+ specification C<E<lt> 2.0> means that any version of the prerequisite
+ less than 2.0 is suitable.
+
+ For more complicated situations, version specifications B<may> be AND-ed
+ together using commas. The specification C<E<gt>= 1.2, != 1.5, E<lt>
+ 2.0> indicates a version that must be B<at least> 1.2, B<less than> 2.0,
+ and B<not equal to> 1.5.
+
+ =head1 PREREQUISITES
+
+ =head2 Prereq Spec
+
+ The C<prereqs> key in the top-level metadata and within
+ C<optional_features> define the relationship between a distribution and
+ other packages. The prereq spec structure is a hierarchical data
+ structure which divides prerequisites into I<Phases> of activity in the
+ installation process and I<Relationships> that indicate how
+ prerequisites should be resolved.
+
+ For example, to specify that C<Data::Dumper> is C<required> during the
+ C<test> phase, this entry would appear in the distribution metadata:
+
+ prereqs => {
+ test => {
+ requires => {
+ 'Data::Dumper' => '2.00'
+ }
+ }
+ }
+
+ =head3 Phases
+
+ Requirements for regular use must be listed in the C<runtime> phase.
+ Other requirements should be listed in the earliest stage in which they
+ are required and consumers must accumulate and satisfy requirements
+ across phases before executing the activity. For example, C<build>
+ requirements must also be available during the C<test> phase.
+
+ before action requirements that must be met
+ ---------------- --------------------------------
+ perl Build.PL configure
+ perl Makefile.PL
+
+ make configure, runtime, build
+ Build
+
+ make test configure, runtime, build, test
+ Build test
+
+ Consumers that install the distribution must ensure that
+ I<runtime> requirements are also installed and may install
+ dependencies from other phases.
+
+ after action requirements that must be met
+ ---------------- --------------------------------
+ make install runtime
+ Build install
+
+ =over
+
+ =item configure
+
+ The configure phase occurs before any dynamic configuration has been
+ attempted. Libraries required by the configure phase B<must> be
+ available for use before the distribution building tool has been
+ executed.
+
+ =item build
+
+ The build phase is when the distribution's source code is compiled (if
+ necessary) and otherwise made ready for installation.
+
+ =item test
+
+ The test phase is when the distribution's automated test suite is run.
+ Any library that is needed only for testing and not for subsequent use
+ should be listed here.
+
+ =item runtime
+
+ The runtime phase refers not only to when the distribution's contents
+ are installed, but also to its continued use. Any library that is a
+ prerequisite for regular use of this distribution should be indicated
+ here.
+
+ =item develop
+
+ The develop phase's prereqs are libraries needed to work on the
+ distribution's source code as its author does. These tools might be
+ needed to build a release tarball, to run author-only tests, or to
+ perform other tasks related to developing new versions of the
+ distribution.
+
+ =back
+
+ =head3 Relationships
+
+ =over
+
+ =item requires
+
+ These dependencies B<must> be installed for proper completion of the
+ phase.
+
+ =item recommends
+
+ Recommended dependencies are I<strongly> encouraged and should be
+ satisfied except in resource constrained environments.
+
+ =item suggests
+
+ These dependencies are optional, but are suggested for enhanced operation
+ of the described distribution.
+
+ =item conflicts
+
+ These libraries cannot be installed when the phase is in operation.
+ This is a very rare situation, and the C<conflicts> relationship should
+ be used with great caution, or not at all.
+
+ =back
+
+ =head2 Merging and Resolving Prerequisites
+
+ Whenever metadata consumers merge prerequisites, either from different
+ phases or from C<optional_features>, they should merged in a way which
+ preserves the intended semantics of the prerequisite structure. Generally,
+ this means concatenating the version specifications using commas, as
+ described in the L<Version Ranges> section.
+
+ Another subtle error that can occur in resolving prerequisites comes from
+ the way that modules in prerequisites are indexed to distribution files on
+ CPAN. When a module is deleted from a distribution, prerequisites calling
+ for that module could indicate an older distribution should be installed,
+ potentially overwriting files from a newer distribution.
+
+ For example, as of Oct 31, 2009, the CPAN index file contained these
+ module-distribution mappings:
+
+ Class::MOP 0.94 D/DR/DROLSKY/Class-MOP-0.94.tar.gz
+ Class::MOP::Class 0.94 D/DR/DROLSKY/Class-MOP-0.94.tar.gz
+ Class::MOP::Class::Immutable 0.04 S/ST/STEVAN/Class-MOP-0.36.tar.gz
+
+ Consider the case where "Class::MOP" 0.94 is installed. If a
+ distribution specified "Class::MOP::Class::Immutable" as a prerequisite,
+ it could result in Class-MOP-0.36.tar.gz being installed, overwriting
+ any files from Class-MOP-0.94.tar.gz.
+
+ Consumers of metadata B<should> test whether prerequisites would result
+ in installed module files being "downgraded" to an older version and
+ B<may> warn users or ignore the prerequisite that would cause such a
+ result.
+
+ =head1 SERIALIZATION
+
+ Distribution metadata should be serialized (as a hashref) as
+ JSON-encoded data and packaged with distributions as the file
+ F<META.json>.
+
+ In the past, the distribution metadata structure had been packed with
+ distributions as F<META.yml>, a file in the YAML Tiny format (for which,
+ see L<YAML::Tiny>). Tools that consume distribution metadata from disk
+ should be capable of loading F<META.yml>, but should prefer F<META.json>
+ if both are found.
+
+ =head1 NOTES FOR IMPLEMENTORS
+
+ =head2 Extracting Version Numbers from Perl Modules
+
+ To get the version number from a Perl module, consumers should use the
+ C<< MM->parse_version($file) >> method provided by
+ L<ExtUtils::MakeMaker> or L<Module::Metadata>. For example, for the
+ module given by C<$mod>, the version may be retrieved in one of the
+ following ways:
+
+ # via ExtUtils::MakeMaker
+ my $file = MM->_installed_file_for_module($mod);
+ my $version = MM->parse_version($file)
+
+ The private C<_installed_file_for_module> method may be replaced with
+ other methods for locating a module in C<@INC>.
+
+ # via Module::Metadata
+ my $info = Module::Metadata->new_from_module($mod);
+ my $version = $info->version;
+
+ If only a filename is available, the following approach may be used:
+
+ # via Module::Build
+ my $info = Module::Metadata->new_from_file($file);
+ my $version = $info->version;
+
+ =head2 Comparing Version Numbers
+
+ The L<version> module provides the most reliable way to compare version
+ numbers in all the various ways they might be provided or might exist
+ within modules. Given two strings containing version numbers, C<$v1> and
+ C<$v2>, they should be converted to C<version> objects before using
+ ordinary comparison operators. For example:
+
+ use version;
+ if ( version->new($v1) <=> version->new($v2) ) {
+ print "Versions are not equal\n";
+ }
+
+ If the only comparison needed is whether an installed module is of a
+ sufficiently high version, a direct test may be done using the string
+ form of C<eval> and the C<use> function. For example, for module C<$mod>
+ and version prerequisite C<$prereq>:
+
+ if ( eval "use $mod $prereq (); 1" ) {
+ print "Module $mod version is OK.\n";
+ }
+
+ If the values of C<$mod> and C<$prereq> have not been scrubbed, however,
+ this presents security implications.
+
+ =head2 Prerequisites for dynamically configured distributions
+
+ When C<dynamic_config> is true, it is an error to presume that the
+ prerequisites given in distribution metadata will have any relationship
+ whatsoever to the actual prerequisites of the distribution.
+
+ In practice, however, one can generally expect such prerequisites to be
+ one of two things:
+
+ =over 4
+
+ =item *
+
+ The minimum prerequisites for the distribution, to which dynamic configuration will only add items
+
+ =item *
+
+ Whatever the distribution configured with on the releaser's machine at release time
+
+ =back
+
+ The second case often turns out to have identical results to the first case,
+ albeit only by accident.
+
+ As such, consumers may use this data for informational analysis, but
+ presenting it to the user as canonical or relying on it as such is
+ invariably the height of folly.
+
+ =head2 Indexing distributions a la PAUSE
+
+ While no_index tells you what must be ignored when indexing, this spec holds
+ no opinion on how you should get your initial candidate list of things to
+ possibly index. For "normal" distributions you might consider simply indexing
+ the contents of lib/, but there are many fascinating oddities on CPAN and
+ many dists from the days when it was normal to put the main .pm file in the
+ root of the distribution archive - so PAUSE currently indexes all .pm and .PL
+ files that are not either (a) specifically excluded by no_index (b) in
+ C<inc>, C<xt>, or C<t> directories, or common 'mistake' directories such as
+ C<perl5>.
+
+ Or: If you're trying to be PAUSE-like, make sure you skip C<inc>, C<xt> and
+ C<t> as well as anything marked as no_index.
+
+ Also remember: If the META file contains a provides field, you shouldn't be
+ indexing anything in the first place - just use that.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ CPAN, L<http://www.cpan.org/>
+
+ =item *
+
+ JSON, L<http://json.org/>
+
+ =item *
+
+ YAML, L<http://www.yaml.org/>
+
+ =item *
+
+ L<CPAN>
+
+ =item *
+
+ L<CPANPLUS>
+
+ =item *
+
+ L<ExtUtils::MakeMaker>
+
+ =item *
+
+ L<Module::Build>
+
+ =item *
+
+ L<Module::Install>
+
+ =back
+
+ =head1 HISTORY
+
+ Ken Williams wrote the original CPAN Meta Spec (also known as the
+ "META.yml spec") in 2003 and maintained it through several revisions
+ with input from various members of the community. In 2005, Randy
+ Sims redrafted it from HTML to POD for the version 1.2 release. Ken
+ continued to maintain the spec through version 1.4.
+
+ In late 2009, David Golden organized the version 2 proposal review
+ process. David and Ricardo Signes drafted the final version 2 spec
+ in April 2010 based on the version 1.4 spec and patches contributed
+ during the proposal process.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ CPAN_META_SPEC
+
+ $fatpacked{"CPAN/Meta/Validator.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_VALIDATOR';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Validator;
+
+ our $VERSION = '2.150005';
+
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod my $struct = decode_json_file('META.json');
+ #pod
+ #pod my $cmv = CPAN::Meta::Validator->new( $struct );
+ #pod
+ #pod unless ( $cmv->is_valid ) {
+ #pod my $msg = "Invalid META structure. Errors found:\n";
+ #pod $msg .= join( "\n", $cmv->errors );
+ #pod die $msg;
+ #pod }
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod This module validates a CPAN Meta structure against the version of the
+ #pod the specification claimed in the C<meta-spec> field of the structure.
+ #pod
+ #pod =cut
+
+ #--------------------------------------------------------------------------#
+ # This code copied and adapted from Test::CPAN::Meta
+ # by Barbie, <barbie@cpan.org> for Miss Barbell Productions,
+ # L<http://www.missbarbell.co.uk>
+ #--------------------------------------------------------------------------#
+
+ #--------------------------------------------------------------------------#
+ # Specification Definitions
+ #--------------------------------------------------------------------------#
+
+ my %known_specs = (
+ '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html',
+ '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html',
+ '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html',
+ '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html'
+ );
+ my %known_urls = map {$known_specs{$_} => $_} keys %known_specs;
+
+ my $module_map1 = { 'map' => { ':key' => { name => \&module, value => \&exversion } } };
+
+ my $module_map2 = { 'map' => { ':key' => { name => \&module, value => \&version } } };
+
+ my $no_index_2 = {
+ 'map' => { file => { list => { value => \&string } },
+ directory => { list => { value => \&string } },
+ 'package' => { list => { value => \&string } },
+ namespace => { list => { value => \&string } },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ };
+
+ my $no_index_1_3 = {
+ 'map' => { file => { list => { value => \&string } },
+ directory => { list => { value => \&string } },
+ 'package' => { list => { value => \&string } },
+ namespace => { list => { value => \&string } },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ };
+
+ my $no_index_1_2 = {
+ 'map' => { file => { list => { value => \&string } },
+ dir => { list => { value => \&string } },
+ 'package' => { list => { value => \&string } },
+ namespace => { list => { value => \&string } },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ };
+
+ my $no_index_1_1 = {
+ 'map' => { ':key' => { name => \&string, list => { value => \&string } },
+ }
+ };
+
+ my $prereq_map = {
+ map => {
+ ':key' => {
+ name => \&phase,
+ 'map' => {
+ ':key' => {
+ name => \&relation,
+ %$module_map1,
+ },
+ },
+ }
+ },
+ };
+
+ my %definitions = (
+ '2' => {
+ # REQUIRED
+ 'abstract' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'dynamic_config' => { mandatory => 1, value => \&boolean },
+ 'generated_by' => { mandatory => 1, value => \&string },
+ 'license' => { mandatory => 1, list => { value => \&license } },
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { value => \&url },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ },
+ 'name' => { mandatory => 1, value => \&string },
+ 'release_status' => { mandatory => 1, value => \&release_status },
+ 'version' => { mandatory => 1, value => \&version },
+
+ # OPTIONAL
+ 'description' => { value => \&string },
+ 'keywords' => { list => { value => \&string } },
+ 'no_index' => $no_index_2,
+ 'optional_features' => {
+ 'map' => {
+ ':key' => {
+ name => \&string,
+ 'map' => {
+ description => { value => \&string },
+ prereqs => $prereq_map,
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ }
+ }
+ },
+ 'prereqs' => $prereq_map,
+ 'provides' => {
+ 'map' => {
+ ':key' => {
+ name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ }
+ }
+ },
+ 'resources' => {
+ 'map' => {
+ license => { list => { value => \&url } },
+ homepage => { value => \&url },
+ bugtracker => {
+ 'map' => {
+ web => { value => \&url },
+ mailto => { value => \&string},
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ },
+ repository => {
+ 'map' => {
+ web => { value => \&url },
+ url => { value => \&url },
+ type => { value => \&string },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ },
+ ':key' => { value => \&string, name => \&custom_2 },
+ }
+ },
+
+ # CUSTOM -- additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&custom_2, value => \&anything },
+ },
+
+ '1.4' => {
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { mandatory => 1, value => \&urlspec },
+ ':key' => { name => \&string, value => \&anything },
+ },
+ },
+
+ 'name' => { mandatory => 1, value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'abstract' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'license' => { mandatory => 1, value => \&license },
+ 'generated_by' => { mandatory => 1, value => \&string },
+
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'configure_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ 'optional_features' => {
+ 'map' => {
+ ':key' => { name => \&string,
+ 'map' => { description => { value => \&string },
+ requires => $module_map1,
+ recommends => $module_map1,
+ build_requires => $module_map1,
+ conflicts => $module_map2,
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'provides' => {
+ 'map' => {
+ ':key' => { name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'no_index' => $no_index_1_3,
+ 'private' => $no_index_1_3,
+
+ 'keywords' => { list => { value => \&string } },
+
+ 'resources' => {
+ 'map' => { license => { value => \&url },
+ homepage => { value => \&url },
+ bugtracker => { value => \&url },
+ repository => { value => \&url },
+ ':key' => { value => \&string, name => \&custom_1 },
+ }
+ },
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ '1.3' => {
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { mandatory => 1, value => \&urlspec },
+ ':key' => { name => \&string, value => \&anything },
+ },
+ },
+
+ 'name' => { mandatory => 1, value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'abstract' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'license' => { mandatory => 1, value => \&license },
+ 'generated_by' => { mandatory => 1, value => \&string },
+
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ 'optional_features' => {
+ 'map' => {
+ ':key' => { name => \&string,
+ 'map' => { description => { value => \&string },
+ requires => $module_map1,
+ recommends => $module_map1,
+ build_requires => $module_map1,
+ conflicts => $module_map2,
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'provides' => {
+ 'map' => {
+ ':key' => { name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+
+ 'no_index' => $no_index_1_3,
+ 'private' => $no_index_1_3,
+
+ 'keywords' => { list => { value => \&string } },
+
+ 'resources' => {
+ 'map' => { license => { value => \&url },
+ homepage => { value => \&url },
+ bugtracker => { value => \&url },
+ repository => { value => \&url },
+ ':key' => { value => \&string, name => \&custom_1 },
+ }
+ },
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ # v1.2 is misleading, it seems to assume that a number of fields where created
+ # within v1.1, when they were created within v1.2. This may have been an
+ # original mistake, and that a v1.1 was retro fitted into the timeline, when
+ # v1.2 was originally slated as v1.1. But I could be wrong ;)
+ '1.2' => {
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { mandatory => 1, value => \&urlspec },
+ ':key' => { name => \&string, value => \&anything },
+ },
+ },
+
+
+ 'name' => { mandatory => 1, value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'license' => { mandatory => 1, value => \&license },
+ 'generated_by' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'abstract' => { mandatory => 1, value => \&string },
+
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'keywords' => { list => { value => \&string } },
+
+ 'private' => $no_index_1_2,
+ '$no_index' => $no_index_1_2,
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ 'optional_features' => {
+ 'map' => {
+ ':key' => { name => \&string,
+ 'map' => { description => { value => \&string },
+ requires => $module_map1,
+ recommends => $module_map1,
+ build_requires => $module_map1,
+ conflicts => $module_map2,
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'provides' => {
+ 'map' => {
+ ':key' => { name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'resources' => {
+ 'map' => { license => { value => \&url },
+ homepage => { value => \&url },
+ bugtracker => { value => \&url },
+ repository => { value => \&url },
+ ':key' => { value => \&string, name => \&custom_1 },
+ }
+ },
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ # note that the 1.1 spec only specifies 'version' as mandatory
+ '1.1' => {
+ 'name' => { value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'license' => { value => \&license },
+ 'generated_by' => { value => \&string },
+
+ 'license_uri' => { value => \&url },
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'private' => $no_index_1_1,
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ # note that the 1.0 spec doesn't specify optional or mandatory fields
+ # but we will treat version as mandatory since otherwise META 1.0 is
+ # completely arbitrary and pointless
+ '1.0' => {
+ 'name' => { value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'license' => { value => \&license },
+ 'generated_by' => { value => \&string },
+
+ 'license_uri' => { value => \&url },
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+ );
+
+ #--------------------------------------------------------------------------#
+ # Code
+ #--------------------------------------------------------------------------#
+
+ #pod =method new
+ #pod
+ #pod my $cmv = CPAN::Meta::Validator->new( $struct )
+ #pod
+ #pod The constructor must be passed a metadata structure.
+ #pod
+ #pod =cut
+
+ sub new {
+ my ($class,$data) = @_;
+
+ # create an attributes hash
+ my $self = {
+ 'data' => $data,
+ 'spec' => eval { $data->{'meta-spec'}{'version'} } || "1.0",
+ 'errors' => undef,
+ };
+
+ # create the object
+ return bless $self, $class;
+ }
+
+ #pod =method is_valid
+ #pod
+ #pod if ( $cmv->is_valid ) {
+ #pod ...
+ #pod }
+ #pod
+ #pod Returns a boolean value indicating whether the metadata provided
+ #pod is valid.
+ #pod
+ #pod =cut
+
+ sub is_valid {
+ my $self = shift;
+ my $data = $self->{data};
+ my $spec_version = $self->{spec};
+ $self->check_map($definitions{$spec_version},$data);
+ return ! $self->errors;
+ }
+
+ #pod =method errors
+ #pod
+ #pod warn( join "\n", $cmv->errors );
+ #pod
+ #pod Returns a list of errors seen during validation.
+ #pod
+ #pod =cut
+
+ sub errors {
+ my $self = shift;
+ return () unless(defined $self->{errors});
+ return @{$self->{errors}};
+ }
+
+ #pod =begin :internals
+ #pod
+ #pod =head2 Check Methods
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod check_map($spec,$data)
+ #pod
+ #pod Checks whether a map (or hash) part of the data structure conforms to the
+ #pod appropriate specification definition.
+ #pod
+ #pod =item *
+ #pod
+ #pod check_list($spec,$data)
+ #pod
+ #pod Checks whether a list (or array) part of the data structure conforms to
+ #pod the appropriate specification definition.
+ #pod
+ #pod =item *
+ #pod
+ #pod =back
+ #pod
+ #pod =cut
+
+ my $spec_error = "Missing validation action in specification. "
+ . "Must be one of 'map', 'list', or 'value'";
+
+ sub check_map {
+ my ($self,$spec,$data) = @_;
+
+ if(ref($spec) ne 'HASH') {
+ $self->_error( "Unknown META specification, cannot validate." );
+ return;
+ }
+
+ if(ref($data) ne 'HASH') {
+ $self->_error( "Expected a map structure from string or file." );
+ return;
+ }
+
+ for my $key (keys %$spec) {
+ next unless($spec->{$key}->{mandatory});
+ next if(defined $data->{$key});
+ push @{$self->{stack}}, $key;
+ $self->_error( "Missing mandatory field, '$key'" );
+ pop @{$self->{stack}};
+ }
+
+ for my $key (keys %$data) {
+ push @{$self->{stack}}, $key;
+ if($spec->{$key}) {
+ if($spec->{$key}{value}) {
+ $spec->{$key}{value}->($self,$key,$data->{$key});
+ } elsif($spec->{$key}{'map'}) {
+ $self->check_map($spec->{$key}{'map'},$data->{$key});
+ } elsif($spec->{$key}{'list'}) {
+ $self->check_list($spec->{$key}{'list'},$data->{$key});
+ } else {
+ $self->_error( "$spec_error for '$key'" );
+ }
+
+ } elsif ($spec->{':key'}) {
+ $spec->{':key'}{name}->($self,$key,$key);
+ if($spec->{':key'}{value}) {
+ $spec->{':key'}{value}->($self,$key,$data->{$key});
+ } elsif($spec->{':key'}{'map'}) {
+ $self->check_map($spec->{':key'}{'map'},$data->{$key});
+ } elsif($spec->{':key'}{'list'}) {
+ $self->check_list($spec->{':key'}{'list'},$data->{$key});
+ } else {
+ $self->_error( "$spec_error for ':key'" );
+ }
+
+
+ } else {
+ $self->_error( "Unknown key, '$key', found in map structure" );
+ }
+ pop @{$self->{stack}};
+ }
+ }
+
+ sub check_list {
+ my ($self,$spec,$data) = @_;
+
+ if(ref($data) ne 'ARRAY') {
+ $self->_error( "Expected a list structure" );
+ return;
+ }
+
+ if(defined $spec->{mandatory}) {
+ if(!defined $data->[0]) {
+ $self->_error( "Missing entries from mandatory list" );
+ }
+ }
+
+ for my $value (@$data) {
+ push @{$self->{stack}}, $value || "<undef>";
+ if(defined $spec->{value}) {
+ $spec->{value}->($self,'list',$value);
+ } elsif(defined $spec->{'map'}) {
+ $self->check_map($spec->{'map'},$value);
+ } elsif(defined $spec->{'list'}) {
+ $self->check_list($spec->{'list'},$value);
+ } elsif ($spec->{':key'}) {
+ $self->check_map($spec,$value);
+ } else {
+ $self->_error( "$spec_error associated with '$self->{stack}[-2]'" );
+ }
+ pop @{$self->{stack}};
+ }
+ }
+
+ #pod =head2 Validator Methods
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod header($self,$key,$value)
+ #pod
+ #pod Validates that the header is valid.
+ #pod
+ #pod Note: No longer used as we now read the data structure, not the file.
+ #pod
+ #pod =item *
+ #pod
+ #pod url($self,$key,$value)
+ #pod
+ #pod Validates that a given value is in an acceptable URL format
+ #pod
+ #pod =item *
+ #pod
+ #pod urlspec($self,$key,$value)
+ #pod
+ #pod Validates that the URL to a META specification is a known one.
+ #pod
+ #pod =item *
+ #pod
+ #pod string_or_undef($self,$key,$value)
+ #pod
+ #pod Validates that the value is either a string or an undef value. Bit of a
+ #pod catchall function for parts of the data structure that are completely user
+ #pod defined.
+ #pod
+ #pod =item *
+ #pod
+ #pod string($self,$key,$value)
+ #pod
+ #pod Validates that a string exists for the given key.
+ #pod
+ #pod =item *
+ #pod
+ #pod file($self,$key,$value)
+ #pod
+ #pod Validate that a file is passed for the given key. This may be made more
+ #pod thorough in the future. For now it acts like \&string.
+ #pod
+ #pod =item *
+ #pod
+ #pod exversion($self,$key,$value)
+ #pod
+ #pod Validates a list of versions, e.g. '<= 5, >=2, ==3, !=4, >1, <6, 0'.
+ #pod
+ #pod =item *
+ #pod
+ #pod version($self,$key,$value)
+ #pod
+ #pod Validates a single version string. Versions of the type '5.8.8' and '0.00_00'
+ #pod are both valid. A leading 'v' like 'v1.2.3' is also valid.
+ #pod
+ #pod =item *
+ #pod
+ #pod boolean($self,$key,$value)
+ #pod
+ #pod Validates for a boolean value. Currently these values are '1', '0', 'true',
+ #pod 'false', however the latter 2 may be removed.
+ #pod
+ #pod =item *
+ #pod
+ #pod license($self,$key,$value)
+ #pod
+ #pod Validates that a value is given for the license. Returns 1 if an known license
+ #pod type, or 2 if a value is given but the license type is not a recommended one.
+ #pod
+ #pod =item *
+ #pod
+ #pod custom_1($self,$key,$value)
+ #pod
+ #pod Validates that the given key is in CamelCase, to indicate a user defined
+ #pod keyword and only has characters in the class [-_a-zA-Z]. In version 1.X
+ #pod of the spec, this was only explicitly stated for 'resources'.
+ #pod
+ #pod =item *
+ #pod
+ #pod custom_2($self,$key,$value)
+ #pod
+ #pod Validates that the given key begins with 'x_' or 'X_', to indicate a user
+ #pod defined keyword and only has characters in the class [-_a-zA-Z]
+ #pod
+ #pod =item *
+ #pod
+ #pod identifier($self,$key,$value)
+ #pod
+ #pod Validates that key is in an acceptable format for the META specification,
+ #pod for an identifier, i.e. any that matches the regular expression
+ #pod qr/[a-z][a-z_]/i.
+ #pod
+ #pod =item *
+ #pod
+ #pod module($self,$key,$value)
+ #pod
+ #pod Validates that a given key is in an acceptable module name format, e.g.
+ #pod 'Test::CPAN::Meta::Version'.
+ #pod
+ #pod =back
+ #pod
+ #pod =end :internals
+ #pod
+ #pod =cut
+
+ sub header {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value && $value =~ /^--- #YAML:1.0/);
+ }
+ $self->_error( "file does not have a valid YAML header." );
+ return 0;
+ }
+
+ sub release_status {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ my $version = $self->{data}{version} || '';
+ if ( $version =~ /_/ ) {
+ return 1 if ( $value =~ /\A(?:testing|unstable)\z/ );
+ $self->_error( "'$value' for '$key' is invalid for version '$version'" );
+ }
+ else {
+ return 1 if ( $value =~ /\A(?:stable|testing|unstable)\z/ );
+ $self->_error( "'$value' for '$key' is invalid" );
+ }
+ }
+ else {
+ $self->_error( "'$key' is not defined" );
+ }
+ return 0;
+ }
+
+ # _uri_split taken from URI::Split by Gisle Aas, Copyright 2003
+ sub _uri_split {
+ return $_[0] =~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,;
+ }
+
+ sub url {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ my ($scheme, $auth, $path, $query, $frag) = _uri_split($value);
+ unless ( defined $scheme && length $scheme ) {
+ $self->_error( "'$value' for '$key' does not have a URL scheme" );
+ return 0;
+ }
+ unless ( defined $auth && length $auth ) {
+ $self->_error( "'$value' for '$key' does not have a URL authority" );
+ return 0;
+ }
+ return 1;
+ }
+ $value ||= '';
+ $self->_error( "'$value' for '$key' is not a valid URL." );
+ return 0;
+ }
+
+ sub urlspec {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value && $known_specs{$self->{spec}} eq $value);
+ if($value && $known_urls{$value}) {
+ $self->_error( 'META specification URL does not match version' );
+ return 0;
+ }
+ }
+ $self->_error( 'Unknown META specification' );
+ return 0;
+ }
+
+ sub anything { return 1 }
+
+ sub string {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value || $value =~ /^0$/);
+ }
+ $self->_error( "value is an undefined string" );
+ return 0;
+ }
+
+ sub string_or_undef {
+ my ($self,$key,$value) = @_;
+ return 1 unless(defined $value);
+ return 1 if($value || $value =~ /^0$/);
+ $self->_error( "No string defined for '$key'" );
+ return 0;
+ }
+
+ sub file {
+ my ($self,$key,$value) = @_;
+ return 1 if(defined $value);
+ $self->_error( "No file defined for '$key'" );
+ return 0;
+ }
+
+ sub exversion {
+ my ($self,$key,$value) = @_;
+ if(defined $value && ($value || $value =~ /0/)) {
+ my $pass = 1;
+ for(split(",",$value)) { $self->version($key,$_) or ($pass = 0); }
+ return $pass;
+ }
+ $value = '<undef>' unless(defined $value);
+ $self->_error( "'$value' for '$key' is not a valid version." );
+ return 0;
+ }
+
+ sub version {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 0 unless($value || $value =~ /0/);
+ return 1 if($value =~ /^\s*((<|<=|>=|>|!=|==)\s*)?v?\d+((\.\d+((_|\.)\d+)?)?)/);
+ } else {
+ $value = '<undef>';
+ }
+ $self->_error( "'$value' for '$key' is not a valid version." );
+ return 0;
+ }
+
+ sub boolean {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value =~ /^(0|1|true|false)$/);
+ } else {
+ $value = '<undef>';
+ }
+ $self->_error( "'$value' for '$key' is not a boolean value." );
+ return 0;
+ }
+
+ my %v1_licenses = (
+ 'perl' => 'http://dev.perl.org/licenses/',
+ 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php',
+ 'apache' => 'http://apache.org/licenses/LICENSE-2.0',
+ 'artistic' => 'http://opensource.org/licenses/artistic-license.php',
+ 'artistic_2' => 'http://opensource.org/licenses/artistic-license-2.0.php',
+ 'lgpl' => 'http://www.opensource.org/licenses/lgpl-license.php',
+ 'bsd' => 'http://www.opensource.org/licenses/bsd-license.php',
+ 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php',
+ 'mit' => 'http://opensource.org/licenses/mit-license.php',
+ 'mozilla' => 'http://opensource.org/licenses/mozilla1.1.php',
+ 'open_source' => undef,
+ 'unrestricted' => undef,
+ 'restrictive' => undef,
+ 'unknown' => undef,
+ );
+
+ my %v2_licenses = map { $_ => 1 } qw(
+ agpl_3
+ apache_1_1
+ apache_2_0
+ artistic_1
+ artistic_2
+ bsd
+ freebsd
+ gfdl_1_2
+ gfdl_1_3
+ gpl_1
+ gpl_2
+ gpl_3
+ lgpl_2_1
+ lgpl_3_0
+ mit
+ mozilla_1_0
+ mozilla_1_1
+ openssl
+ perl_5
+ qpl_1_0
+ ssleay
+ sun
+ zlib
+ open_source
+ restricted
+ unrestricted
+ unknown
+ );
+
+ sub license {
+ my ($self,$key,$value) = @_;
+ my $licenses = $self->{spec} < 2 ? \%v1_licenses : \%v2_licenses;
+ if(defined $value) {
+ return 1 if($value && exists $licenses->{$value});
+ } else {
+ $value = '<undef>';
+ }
+ $self->_error( "License '$value' is invalid" );
+ return 0;
+ }
+
+ sub custom_1 {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ # a valid user defined key should be alphabetic
+ # and contain at least one capital case letter.
+ return 1 if($key && $key =~ /^[_a-z]+$/i && $key =~ /[A-Z]/);
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Custom resource '$key' must be in CamelCase." );
+ return 0;
+ }
+
+ sub custom_2 {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if($key && $key =~ /^x_/i); # user defined
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Custom key '$key' must begin with 'x_' or 'X_'." );
+ return 0;
+ }
+
+ sub identifier {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if($key && $key =~ /^([a-z][_a-z]+)$/i); # spec 2.0 defined
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal identifier." );
+ return 0;
+ }
+
+ sub module {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if($key && $key =~ /^[A-Za-z0-9_]+(::[A-Za-z0-9_]+)*$/);
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal module name." );
+ return 0;
+ }
+
+ my @valid_phases = qw/ configure build test runtime develop /;
+ sub phase {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if( length $key && grep { $key eq $_ } @valid_phases );
+ return 1 if $key =~ /x_/i;
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal phase." );
+ return 0;
+ }
+
+ my @valid_relations = qw/ requires recommends suggests conflicts /;
+ sub relation {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if( length $key && grep { $key eq $_ } @valid_relations );
+ return 1 if $key =~ /x_/i;
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal prereq relationship." );
+ return 0;
+ }
+
+ sub _error {
+ my $self = shift;
+ my $mess = shift;
+
+ $mess .= ' ('.join(' -> ',@{$self->{stack}}).')' if($self->{stack});
+ $mess .= " [Validation: $self->{spec}]";
+
+ push @{$self->{errors}}, $mess;
+ }
+
+ 1;
+
+ # ABSTRACT: validate CPAN distribution metadata structures
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Validator - validate CPAN distribution metadata structures
+
+ =head1 VERSION
+
+ version 2.150005
+
+ =head1 SYNOPSIS
+
+ my $struct = decode_json_file('META.json');
+
+ my $cmv = CPAN::Meta::Validator->new( $struct );
+
+ unless ( $cmv->is_valid ) {
+ my $msg = "Invalid META structure. Errors found:\n";
+ $msg .= join( "\n", $cmv->errors );
+ die $msg;
+ }
+
+ =head1 DESCRIPTION
+
+ This module validates a CPAN Meta structure against the version of the
+ the specification claimed in the C<meta-spec> field of the structure.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $cmv = CPAN::Meta::Validator->new( $struct )
+
+ The constructor must be passed a metadata structure.
+
+ =head2 is_valid
+
+ if ( $cmv->is_valid ) {
+ ...
+ }
+
+ Returns a boolean value indicating whether the metadata provided
+ is valid.
+
+ =head2 errors
+
+ warn( join "\n", $cmv->errors );
+
+ Returns a list of errors seen during validation.
+
+ =begin :internals
+
+ =head2 Check Methods
+
+ =over
+
+ =item *
+
+ check_map($spec,$data)
+
+ Checks whether a map (or hash) part of the data structure conforms to the
+ appropriate specification definition.
+
+ =item *
+
+ check_list($spec,$data)
+
+ Checks whether a list (or array) part of the data structure conforms to
+ the appropriate specification definition.
+
+ =item *
+
+ =back
+
+ =head2 Validator Methods
+
+ =over
+
+ =item *
+
+ header($self,$key,$value)
+
+ Validates that the header is valid.
+
+ Note: No longer used as we now read the data structure, not the file.
+
+ =item *
+
+ url($self,$key,$value)
+
+ Validates that a given value is in an acceptable URL format
+
+ =item *
+
+ urlspec($self,$key,$value)
+
+ Validates that the URL to a META specification is a known one.
+
+ =item *
+
+ string_or_undef($self,$key,$value)
+
+ Validates that the value is either a string or an undef value. Bit of a
+ catchall function for parts of the data structure that are completely user
+ defined.
+
+ =item *
+
+ string($self,$key,$value)
+
+ Validates that a string exists for the given key.
+
+ =item *
+
+ file($self,$key,$value)
+
+ Validate that a file is passed for the given key. This may be made more
+ thorough in the future. For now it acts like \&string.
+
+ =item *
+
+ exversion($self,$key,$value)
+
+ Validates a list of versions, e.g. '<= 5, >=2, ==3, !=4, >1, <6, 0'.
+
+ =item *
+
+ version($self,$key,$value)
+
+ Validates a single version string. Versions of the type '5.8.8' and '0.00_00'
+ are both valid. A leading 'v' like 'v1.2.3' is also valid.
+
+ =item *
+
+ boolean($self,$key,$value)
+
+ Validates for a boolean value. Currently these values are '1', '0', 'true',
+ 'false', however the latter 2 may be removed.
+
+ =item *
+
+ license($self,$key,$value)
+
+ Validates that a value is given for the license. Returns 1 if an known license
+ type, or 2 if a value is given but the license type is not a recommended one.
+
+ =item *
+
+ custom_1($self,$key,$value)
+
+ Validates that the given key is in CamelCase, to indicate a user defined
+ keyword and only has characters in the class [-_a-zA-Z]. In version 1.X
+ of the spec, this was only explicitly stated for 'resources'.
+
+ =item *
+
+ custom_2($self,$key,$value)
+
+ Validates that the given key begins with 'x_' or 'X_', to indicate a user
+ defined keyword and only has characters in the class [-_a-zA-Z]
+
+ =item *
+
+ identifier($self,$key,$value)
+
+ Validates that key is in an acceptable format for the META specification,
+ for an identifier, i.e. any that matches the regular expression
+ qr/[a-z][a-z_]/i.
+
+ =item *
+
+ module($self,$key,$value)
+
+ Validates that a given key is in an acceptable module name format, e.g.
+ 'Test::CPAN::Meta::Version'.
+
+ =back
+
+ =end :internals
+
+ =for Pod::Coverage anything boolean check_list custom_1 custom_2 exversion file
+ identifier license module phase relation release_status string string_or_undef
+ url urlspec version header check_map
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=2 sts=2 sw=2 et :
+ CPAN_META_VALIDATOR
+
+ $fatpacked{"CPAN/Meta/YAML.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_YAML';
+ use 5.008001; # sane UTF-8 support
+ use strict;
+ use warnings;
+ package CPAN::Meta::YAML; # git description: v1.66-5-ge09e1ae
+ # XXX-INGY is 5.8.1 too old/broken for utf8?
+ # XXX-XDG Lancaster consensus was that it was sufficient until
+ # proven otherwise
+ $CPAN::Meta::YAML::VERSION = '0.016';
+ ; # original $VERSION removed by Doppelgaenger
+
+ #####################################################################
+ # The CPAN::Meta::YAML API.
+ #
+ # These are the currently documented API functions/methods and
+ # exports:
+
+ use Exporter;
+ our @ISA = qw{ Exporter };
+ our @EXPORT = qw{ Load Dump };
+ our @EXPORT_OK = qw{ LoadFile DumpFile freeze thaw };
+
+ ###
+ # Functional/Export API:
+
+ sub Dump {
+ return CPAN::Meta::YAML->new(@_)->_dump_string;
+ }
+
+ # XXX-INGY Returning last document seems a bad behavior.
+ # XXX-XDG I think first would seem more natural, but I don't know
+ # that it's worth changing now
+ sub Load {
+ my $self = CPAN::Meta::YAML->_load_string(@_);
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # To match YAML.pm, return the last document
+ return $self->[-1];
+ }
+ }
+
+ # XXX-INGY Do we really need freeze and thaw?
+ # XXX-XDG I don't think so. I'd support deprecating them.
+ BEGIN {
+ *freeze = \&Dump;
+ *thaw = \&Load;
+ }
+
+ sub DumpFile {
+ my $file = shift;
+ return CPAN::Meta::YAML->new(@_)->_dump_file($file);
+ }
+
+ sub LoadFile {
+ my $file = shift;
+ my $self = CPAN::Meta::YAML->_load_file($file);
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # Return only the last document to match YAML.pm,
+ return $self->[-1];
+ }
+ }
+
+
+ ###
+ # Object Oriented API:
+
+ # Create an empty CPAN::Meta::YAML object
+ # XXX-INGY Why do we use ARRAY object?
+ # NOTE: I get it now, but I think it's confusing and not needed.
+ # Will change it on a branch later, for review.
+ #
+ # XXX-XDG I don't support changing it yet. It's a very well-documented
+ # "API" of CPAN::Meta::YAML. I'd support deprecating it, but Adam suggested
+ # we not change it until YAML.pm's own OO API is established so that
+ # users only have one API change to digest, not two
+ sub new {
+ my $class = shift;
+ bless [ @_ ], $class;
+ }
+
+ # XXX-INGY It probably doesn't matter, and it's probably too late to
+ # change, but 'read/write' are the wrong names. Read and Write
+ # are actions that take data from storage to memory
+ # characters/strings. These take the data to/from storage to native
+ # Perl objects, which the terms dump and load are meant. As long as
+ # this is a legacy quirk to CPAN::Meta::YAML it's ok, but I'd prefer not
+ # to add new {read,write}_* methods to this API.
+
+ sub read_string {
+ my $self = shift;
+ $self->_load_string(@_);
+ }
+
+ sub write_string {
+ my $self = shift;
+ $self->_dump_string(@_);
+ }
+
+ sub read {
+ my $self = shift;
+ $self->_load_file(@_);
+ }
+
+ sub write {
+ my $self = shift;
+ $self->_dump_file(@_);
+ }
+
+
+
+
+ #####################################################################
+ # Constants
+
+ # Printed form of the unprintable characters in the lowest range
+ # of ASCII characters, listed by ASCII ordinal position.
+ my @UNPRINTABLE = qw(
+ 0 x01 x02 x03 x04 x05 x06 a
+ b t n v f r x0E x0F
+ x10 x11 x12 x13 x14 x15 x16 x17
+ x18 x19 x1A e x1C x1D x1E x1F
+ );
+
+ # Printable characters for escapes
+ my %UNESCAPES = (
+ 0 => "\x00", z => "\x00", N => "\x85",
+ a => "\x07", b => "\x08", t => "\x09",
+ n => "\x0a", v => "\x0b", f => "\x0c",
+ r => "\x0d", e => "\x1b", '\\' => '\\',
+ );
+
+ # XXX-INGY
+ # I(ngy) need to decide if these values should be quoted in
+ # CPAN::Meta::YAML or not. Probably yes.
+
+ # These 3 values have special meaning when unquoted and using the
+ # default YAML schema. They need quotes if they are strings.
+ my %QUOTE = map { $_ => 1 } qw{
+ null true false
+ };
+
+ # The commented out form is simpler, but overloaded the Perl regex
+ # engine due to recursion and backtracking problems on strings
+ # larger than 32,000ish characters. Keep it for reference purposes.
+ # qr/\"((?:\\.|[^\"])*)\"/
+ my $re_capture_double_quoted = qr/\"([^\\"]*(?:\\.[^\\"]*)*)\"/;
+ my $re_capture_single_quoted = qr/\'([^\']*(?:\'\'[^\']*)*)\'/;
+ # unquoted re gets trailing space that needs to be stripped
+ my $re_capture_unquoted_key = qr/([^:]+(?::+\S(?:[^:]*|.*?(?=:)))*)(?=\s*\:(?:\s+|$))/;
+ my $re_trailing_comment = qr/(?:\s+\#.*)?/;
+ my $re_key_value_separator = qr/\s*:(?:\s+(?:\#.*)?|$)/;
+
+
+
+
+
+ #####################################################################
+ # CPAN::Meta::YAML Implementation.
+ #
+ # These are the private methods that do all the work. They may change
+ # at any time.
+
+
+ ###
+ # Loader functions:
+
+ # Create an object from a file
+ sub _load_file {
+ my $class = ref $_[0] ? ref shift : shift;
+
+ # Check the file
+ my $file = shift or $class->_error( 'You did not specify a file name' );
+ $class->_error( "File '$file' does not exist" )
+ unless -e $file;
+ $class->_error( "'$file' is a directory, not a file" )
+ unless -f _;
+ $class->_error( "Insufficient permissions to read '$file'" )
+ unless -r _;
+
+ # Open unbuffered with strict UTF-8 decoding and no translation layers
+ open( my $fh, "<:unix:encoding(UTF-8)", $file );
+ unless ( $fh ) {
+ $class->_error("Failed to open file '$file': $!");
+ }
+
+ # flock if available (or warn if not possible for OS-specific reasons)
+ if ( _can_flock() ) {
+ flock( $fh, Fcntl::LOCK_SH() )
+ or warn "Couldn't lock '$file' for reading: $!";
+ }
+
+ # slurp the contents
+ my $contents = eval {
+ use warnings FATAL => 'utf8';
+ local $/;
+ <$fh>
+ };
+ if ( my $err = $@ ) {
+ $class->_error("Error reading from file '$file': $err");
+ }
+
+ # close the file (release the lock)
+ unless ( close $fh ) {
+ $class->_error("Failed to close file '$file': $!");
+ }
+
+ $class->_load_string( $contents );
+ }
+
+ # Create an object from a string
+ sub _load_string {
+ my $class = ref $_[0] ? ref shift : shift;
+ my $self = bless [], $class;
+ my $string = $_[0];
+ eval {
+ unless ( defined $string ) {
+ die \"Did not provide a string to load";
+ }
+
+ # Check if Perl has it marked as characters, but it's internally
+ # inconsistent. E.g. maybe latin1 got read on a :utf8 layer
+ if ( utf8::is_utf8($string) && ! utf8::valid($string) ) {
+ die \<<'...';
+ Read an invalid UTF-8 string (maybe mixed UTF-8 and 8-bit character set).
+ Did you decode with lax ":utf8" instead of strict ":encoding(UTF-8)"?
+ ...
+ }
+
+ # Ensure Unicode character semantics, even for 0x80-0xff
+ utf8::upgrade($string);
+
+ # Check for and strip any leading UTF-8 BOM
+ $string =~ s/^\x{FEFF}//;
+
+ # Check for some special cases
+ return $self unless length $string;
+
+ # Split the file into lines
+ my @lines = grep { ! /^\s*(?:\#.*)?\z/ }
+ split /(?:\015{1,2}\012|\015|\012)/, $string;
+
+ # Strip the initial YAML header
+ @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines;
+
+ # A nibbling parser
+ my $in_document = 0;
+ while ( @lines ) {
+ # Do we have a document header?
+ if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) {
+ # Handle scalar documents
+ shift @lines;
+ if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) {
+ push @$self,
+ $self->_load_scalar( "$1", [ undef ], \@lines );
+ next;
+ }
+ $in_document = 1;
+ }
+
+ if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) {
+ # A naked document
+ push @$self, undef;
+ while ( @lines and $lines[0] !~ /^---/ ) {
+ shift @lines;
+ }
+ $in_document = 0;
+
+ # XXX The final '-+$' is to look for -- which ends up being an
+ # error later.
+ } elsif ( ! $in_document && @$self ) {
+ # only the first document can be explicit
+ die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'";
+ } elsif ( $lines[0] =~ /^\s*\-(?:\s|$|-+$)/ ) {
+ # An array at the root
+ my $document = [ ];
+ push @$self, $document;
+ $self->_load_array( $document, [ 0 ], \@lines );
+
+ } elsif ( $lines[0] =~ /^(\s*)\S/ ) {
+ # A hash at the root
+ my $document = { };
+ push @$self, $document;
+ $self->_load_hash( $document, [ length($1) ], \@lines );
+
+ } else {
+ # Shouldn't get here. @lines have whitespace-only lines
+ # stripped, and previous match is a line with any
+ # non-whitespace. So this clause should only be reachable via
+ # a perlbug where \s is not symmetric with \S
+
+ # uncoverable statement
+ die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'";
+ }
+ }
+ };
+ my $err = $@;
+ if ( ref $err eq 'SCALAR' ) {
+ $self->_error(${$err});
+ } elsif ( $err ) {
+ $self->_error($err);
+ }
+
+ return $self;
+ }
+
+ sub _unquote_single {
+ my ($self, $string) = @_;
+ return '' unless length $string;
+ $string =~ s/\'\'/\'/g;
+ return $string;
+ }
+
+ sub _unquote_double {
+ my ($self, $string) = @_;
+ return '' unless length $string;
+ $string =~ s/\\"/"/g;
+ $string =~
+ s{\\([Nnever\\fartz0b]|x([0-9a-fA-F]{2}))}
+ {(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}}gex;
+ return $string;
+ }
+
+ # Load a YAML scalar string to the actual Perl scalar
+ sub _load_scalar {
+ my ($self, $string, $indent, $lines) = @_;
+
+ # Trim trailing whitespace
+ $string =~ s/\s*\z//;
+
+ # Explitic null/undef
+ return undef if $string eq '~';
+
+ # Single quote
+ if ( $string =~ /^$re_capture_single_quoted$re_trailing_comment\z/ ) {
+ return $self->_unquote_single($1);
+ }
+
+ # Double quote.
+ if ( $string =~ /^$re_capture_double_quoted$re_trailing_comment\z/ ) {
+ return $self->_unquote_double($1);
+ }
+
+ # Special cases
+ if ( $string =~ /^[\'\"!&]/ ) {
+ die \"CPAN::Meta::YAML does not support a feature in line '$string'";
+ }
+ return {} if $string =~ /^{}(?:\s+\#.*)?\z/;
+ return [] if $string =~ /^\[\](?:\s+\#.*)?\z/;
+
+ # Regular unquoted string
+ if ( $string !~ /^[>|]/ ) {
+ die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'"
+ if $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or
+ $string =~ /:(?:\s|$)/;
+ $string =~ s/\s+#.*\z//;
+ return $string;
+ }
+
+ # Error
+ die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines;
+
+ # Check the indent depth
+ $lines->[0] =~ /^(\s*)/;
+ $indent->[-1] = length("$1");
+ if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) {
+ die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'";
+ }
+
+ # Pull the lines
+ my @multiline = ();
+ while ( @$lines ) {
+ $lines->[0] =~ /^(\s*)/;
+ last unless length($1) >= $indent->[-1];
+ push @multiline, substr(shift(@$lines), length($1));
+ }
+
+ my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n";
+ my $t = (substr($string, 1, 1) eq '-') ? '' : "\n";
+ return join( $j, @multiline ) . $t;
+ }
+
+ # Load an array
+ sub _load_array {
+ my ($self, $array, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'";
+ }
+
+ if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) {
+ # Inline nested hash
+ my $indent2 = length("$1");
+ $lines->[0] =~ s/-/ /;
+ push @$array, { };
+ $self->_load_hash( $array->[-1], [ @$indent, $indent2 ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) {
+ shift @$lines;
+ unless ( @$lines ) {
+ push @$array, undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)\-/ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] == $indent2 ) {
+ # Null array entry
+ push @$array, undef;
+ } else {
+ # Naked indenter
+ push @$array, [ ];
+ $self->_load_array(
+ $array->[-1], [ @$indent, $indent2 ], $lines
+ );
+ }
+
+ } elsif ( $lines->[0] =~ /^(\s*)\S/ ) {
+ push @$array, { };
+ $self->_load_hash(
+ $array->[-1], [ @$indent, length("$1") ], $lines
+ );
+
+ } else {
+ die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'";
+ }
+
+ } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) {
+ # Array entry with a value
+ shift @$lines;
+ push @$array, $self->_load_scalar(
+ "$2", [ @$indent, undef ], $lines
+ );
+
+ } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) {
+ # This is probably a structure like the following...
+ # ---
+ # foo:
+ # - list
+ # bar: value
+ #
+ # ... so lets return and let the hash parser handle it
+ return 1;
+
+ } else {
+ die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'";
+ }
+ }
+
+ return 1;
+ }
+
+ # Load a hash
+ sub _load_hash {
+ my ($self, $hash, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'";
+ }
+
+ # Find the key
+ my $key;
+
+ # Quoted keys
+ if ( $lines->[0] =~
+ s/^\s*$re_capture_single_quoted$re_key_value_separator//
+ ) {
+ $key = $self->_unquote_single($1);
+ }
+ elsif ( $lines->[0] =~
+ s/^\s*$re_capture_double_quoted$re_key_value_separator//
+ ) {
+ $key = $self->_unquote_double($1);
+ }
+ elsif ( $lines->[0] =~
+ s/^\s*$re_capture_unquoted_key$re_key_value_separator//
+ ) {
+ $key = $1;
+ $key =~ s/\s+$//;
+ }
+ elsif ( $lines->[0] =~ /^\s*\?/ ) {
+ die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'";
+ }
+ else {
+ die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'";
+ }
+
+ if ( exists $hash->{$key} ) {
+ warn "CPAN::Meta::YAML found a duplicate key '$key' in line '$lines->[0]'";
+ }
+
+ # Do we have a value?
+ if ( length $lines->[0] ) {
+ # Yes
+ $hash->{$key} = $self->_load_scalar(
+ shift(@$lines), [ @$indent, undef ], $lines
+ );
+ } else {
+ # An indent
+ shift @$lines;
+ unless ( @$lines ) {
+ $hash->{$key} = undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)-/ ) {
+ $hash->{$key} = [];
+ $self->_load_array(
+ $hash->{$key}, [ @$indent, length($1) ], $lines
+ );
+ } elsif ( $lines->[0] =~ /^(\s*)./ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] >= $indent2 ) {
+ # Null hash entry
+ $hash->{$key} = undef;
+ } else {
+ $hash->{$key} = {};
+ $self->_load_hash(
+ $hash->{$key}, [ @$indent, length($1) ], $lines
+ );
+ }
+ }
+ }
+ }
+
+ return 1;
+ }
+
+
+ ###
+ # Dumper functions:
+
+ # Save an object to a file
+ sub _dump_file {
+ my $self = shift;
+
+ require Fcntl;
+
+ # Check the file
+ my $file = shift or $self->_error( 'You did not specify a file name' );
+
+ my $fh;
+ # flock if available (or warn if not possible for OS-specific reasons)
+ if ( _can_flock() ) {
+ # Open without truncation (truncate comes after lock)
+ my $flags = Fcntl::O_WRONLY()|Fcntl::O_CREAT();
+ sysopen( $fh, $file, $flags );
+ unless ( $fh ) {
+ $self->_error("Failed to open file '$file' for writing: $!");
+ }
+
+ # Use no translation and strict UTF-8
+ binmode( $fh, ":raw:encoding(UTF-8)");
+
+ flock( $fh, Fcntl::LOCK_EX() )
+ or warn "Couldn't lock '$file' for reading: $!";
+
+ # truncate and spew contents
+ truncate $fh, 0;
+ seek $fh, 0, 0;
+ }
+ else {
+ open $fh, ">:unix:encoding(UTF-8)", $file;
+ }
+
+ # serialize and spew to the handle
+ print {$fh} $self->_dump_string;
+
+ # close the file (release the lock)
+ unless ( close $fh ) {
+ $self->_error("Failed to close file '$file': $!");
+ }
+
+ return 1;
+ }
+
+ # Save an object to a string
+ sub _dump_string {
+ my $self = shift;
+ return '' unless ref $self && @$self;
+
+ # Iterate over the documents
+ my $indent = 0;
+ my @lines = ();
+
+ eval {
+ foreach my $cursor ( @$self ) {
+ push @lines, '---';
+
+ # An empty document
+ if ( ! defined $cursor ) {
+ # Do nothing
+
+ # A scalar document
+ } elsif ( ! ref $cursor ) {
+ $lines[-1] .= ' ' . $self->_dump_scalar( $cursor );
+
+ # A list at the root
+ } elsif ( ref $cursor eq 'ARRAY' ) {
+ unless ( @$cursor ) {
+ $lines[-1] .= ' []';
+ next;
+ }
+ push @lines, $self->_dump_array( $cursor, $indent, {} );
+
+ # A hash at the root
+ } elsif ( ref $cursor eq 'HASH' ) {
+ unless ( %$cursor ) {
+ $lines[-1] .= ' {}';
+ next;
+ }
+ push @lines, $self->_dump_hash( $cursor, $indent, {} );
+
+ } else {
+ die \("Cannot serialize " . ref($cursor));
+ }
+ }
+ };
+ if ( ref $@ eq 'SCALAR' ) {
+ $self->_error(${$@});
+ } elsif ( $@ ) {
+ $self->_error($@);
+ }
+
+ join '', map { "$_\n" } @lines;
+ }
+
+ sub _has_internal_string_value {
+ my $value = shift;
+ my $b_obj = B::svref_2object(\$value); # for round trip problem
+ return $b_obj->FLAGS & B::SVf_POK();
+ }
+
+ sub _dump_scalar {
+ my $string = $_[1];
+ my $is_key = $_[2];
+ # Check this before checking length or it winds up looking like a string!
+ my $has_string_flag = _has_internal_string_value($string);
+ return '~' unless defined $string;
+ return "''" unless length $string;
+ if (Scalar::Util::looks_like_number($string)) {
+ # keys and values that have been used as strings get quoted
+ if ( $is_key || $has_string_flag ) {
+ return qq['$string'];
+ }
+ else {
+ return $string;
+ }
+ }
+ if ( $string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/ ) {
+ $string =~ s/\\/\\\\/g;
+ $string =~ s/"/\\"/g;
+ $string =~ s/\n/\\n/g;
+ $string =~ s/[\x85]/\\N/g;
+ $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;
+ $string =~ s/([\x7f-\x9f])/'\x' . sprintf("%X",ord($1))/ge;
+ return qq|"$string"|;
+ }
+ if ( $string =~ /(?:^[~!@#%&*|>?:,'"`{}\[\]]|^-+$|\s|:\z)/ or
+ $QUOTE{$string}
+ ) {
+ return "'$string'";
+ }
+ return $string;
+ }
+
+ sub _dump_array {
+ my ($self, $array, $indent, $seen) = @_;
+ if ( $seen->{refaddr($array)}++ ) {
+ die \"CPAN::Meta::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $el ( @$array ) {
+ my $line = (' ' x $indent) . '-';
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_dump_scalar( $el );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die \"CPAN::Meta::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+ }
+
+ sub _dump_hash {
+ my ($self, $hash, $indent, $seen) = @_;
+ if ( $seen->{refaddr($hash)}++ ) {
+ die \"CPAN::Meta::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $name ( sort keys %$hash ) {
+ my $el = $hash->{$name};
+ my $line = (' ' x $indent) . $self->_dump_scalar($name, 1) . ":";
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_dump_scalar( $el );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die \"CPAN::Meta::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+ }
+
+
+
+ #####################################################################
+ # DEPRECATED API methods:
+
+ # Error storage (DEPRECATED as of 1.57)
+ our $errstr = '';
+
+ # Set error
+ sub _error {
+ require Carp;
+ $errstr = $_[1];
+ $errstr =~ s/ at \S+ line \d+.*//;
+ Carp::croak( $errstr );
+ }
+
+ # Retrieve error
+ my $errstr_warned;
+ sub errstr {
+ require Carp;
+ Carp::carp( "CPAN::Meta::YAML->errstr and \$CPAN::Meta::YAML::errstr is deprecated" )
+ unless $errstr_warned++;
+ $errstr;
+ }
+
+
+
+
+ #####################################################################
+ # Helper functions. Possibly not needed.
+
+
+ # Use to detect nv or iv
+ use B;
+
+ # XXX-INGY Is flock CPAN::Meta::YAML's responsibility?
+ # Some platforms can't flock :-(
+ # XXX-XDG I think it is. When reading and writing files, we ought
+ # to be locking whenever possible. People (foolishly) use YAML
+ # files for things like session storage, which has race issues.
+ my $HAS_FLOCK;
+ sub _can_flock {
+ if ( defined $HAS_FLOCK ) {
+ return $HAS_FLOCK;
+ }
+ else {
+ require Config;
+ my $c = \%Config::Config;
+ $HAS_FLOCK = grep { $c->{$_} } qw/d_flock d_fcntl_can_lock d_lockf/;
+ require Fcntl if $HAS_FLOCK;
+ return $HAS_FLOCK;
+ }
+ }
+
+
+ # XXX-INGY Is this core in 5.8.1? Can we remove this?
+ # XXX-XDG Scalar::Util 1.18 didn't land until 5.8.8, so we need this
+ #####################################################################
+ # Use Scalar::Util if possible, otherwise emulate it
+
+ use Scalar::Util ();
+ BEGIN {
+ local $@;
+ if ( eval { Scalar::Util->VERSION(1.18); } ) {
+ *refaddr = *Scalar::Util::refaddr;
+ }
+ else {
+ eval <<'END_PERL';
+ # Scalar::Util failed to load or too old
+ sub refaddr {
+ my $pkg = ref($_[0]) or return undef;
+ if ( !! UNIVERSAL::can($_[0], 'can') ) {
+ bless $_[0], 'Scalar::Util::Fake';
+ } else {
+ $pkg = undef;
+ }
+ "$_[0]" =~ /0x(\w+)/;
+ my $i = do { no warnings 'portable'; hex $1 };
+ bless $_[0], $pkg if defined $pkg;
+ $i;
+ }
+ END_PERL
+ }
+ }
+
+ delete $CPAN::Meta::YAML::{refaddr};
+
+ 1;
+
+ # XXX-INGY Doc notes I'm putting up here. Changing the doc when it's wrong
+ # but leaving grey area stuff up here.
+ #
+ # I would like to change Read/Write to Load/Dump below without
+ # changing the actual API names.
+ #
+ # It might be better to put Load/Dump API in the SYNOPSIS instead of the
+ # dubious OO API.
+ #
+ # null and bool explanations may be outdated.
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::YAML - Read and write a subset of YAML for CPAN Meta files
+
+ =head1 VERSION
+
+ version 0.016
+
+ =head1 SYNOPSIS
+
+ use CPAN::Meta::YAML;
+
+ # reading a META file
+ open $fh, "<:utf8", "META.yml";
+ $yaml_text = do { local $/; <$fh> };
+ $yaml = CPAN::Meta::YAML->read_string($yaml_text)
+ or die CPAN::Meta::YAML->errstr;
+
+ # finding the metadata
+ $meta = $yaml->[0];
+
+ # writing a META file
+ $yaml_text = $yaml->write_string
+ or die CPAN::Meta::YAML->errstr;
+ open $fh, ">:utf8", "META.yml";
+ print $fh $yaml_text;
+
+ =head1 DESCRIPTION
+
+ This module implements a subset of the YAML specification for use in reading
+ and writing CPAN metadata files like F<META.yml> and F<MYMETA.yml>. It should
+ not be used for any other general YAML parsing or generation task.
+
+ NOTE: F<META.yml> (and F<MYMETA.yml>) files should be UTF-8 encoded. Users are
+ responsible for proper encoding and decoding. In particular, the C<read> and
+ C<write> methods do B<not> support UTF-8 and should not be used.
+
+ =head1 SUPPORT
+
+ This module is currently derived from L<YAML::Tiny> by Adam Kennedy. If
+ there are bugs in how it parses a particular META.yml file, please file
+ a bug report in the YAML::Tiny bugtracker:
+ L<https://github.com/Perl-Toolchain-Gang/YAML-Tiny/issues>
+
+ =head1 SEE ALSO
+
+ L<YAML::Tiny>, L<YAML>, L<YAML::XS>
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ Adam Kennedy <adamk@cpan.org>
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by Adam Kennedy.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # ABSTRACT: Read and write a subset of YAML for CPAN Meta files
+
+
+ CPAN_META_YAML
+
+ $fatpacked{"Exporter.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXPORTER';
+ package Exporter;
+
+ require 5.006;
+
+ # Be lean.
+ #use strict;
+ #no strict 'refs';
+
+ our $Debug = 0;
+ our $ExportLevel = 0;
+ our $Verbose ||= 0;
+ our $VERSION = '5.70';
+ our (%Cache);
+
+ sub as_heavy {
+ require Exporter::Heavy;
+ # Unfortunately, this does not work if the caller is aliased as *name = \&foo
+ # Thus the need to create a lot of identical subroutines
+ my $c = (caller(1))[3];
+ $c =~ s/.*:://;
+ \&{"Exporter::Heavy::heavy_$c"};
+ }
+
+ sub export {
+ goto &{as_heavy()};
+ }
+
+ sub import {
+ my $pkg = shift;
+ my $callpkg = caller($ExportLevel);
+
+ if ($pkg eq "Exporter" and @_ and $_[0] eq "import") {
+ *{$callpkg."::import"} = \&import;
+ return;
+ }
+
+ # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-(
+ my $exports = \@{"$pkg\::EXPORT"};
+ # But, avoid creating things if they don't exist, which saves a couple of
+ # hundred bytes per package processed.
+ my $fail = ${$pkg . '::'}{EXPORT_FAIL} && \@{"$pkg\::EXPORT_FAIL"};
+ return export $pkg, $callpkg, @_
+ if $Verbose or $Debug or $fail && @$fail > 1;
+ my $export_cache = ($Cache{$pkg} ||= {});
+ my $args = @_ or @_ = @$exports;
+
+ if ($args and not %$export_cache) {
+ s/^&//, $export_cache->{$_} = 1
+ foreach (@$exports, @{"$pkg\::EXPORT_OK"});
+ }
+ my $heavy;
+ # Try very hard not to use {} and hence have to enter scope on the foreach
+ # We bomb out of the loop with last as soon as heavy is set.
+ if ($args or $fail) {
+ ($heavy = (/\W/ or $args and not exists $export_cache->{$_}
+ or $fail and @$fail and $_ eq $fail->[0])) and last
+ foreach (@_);
+ } else {
+ ($heavy = /\W/) and last
+ foreach (@_);
+ }
+ return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy;
+ local $SIG{__WARN__} =
+ sub {require Carp; &Carp::carp} if not $SIG{__WARN__};
+ # shortcut for the common case of no type character
+ *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
+ }
+
+ # Default methods
+
+ sub export_fail {
+ my $self = shift;
+ @_;
+ }
+
+ # Unfortunately, caller(1)[3] "does not work" if the caller is aliased as
+ # *name = \&foo. Thus the need to create a lot of identical subroutines
+ # Otherwise we could have aliased them to export().
+
+ sub export_to_level {
+ goto &{as_heavy()};
+ }
+
+ sub export_tags {
+ goto &{as_heavy()};
+ }
+
+ sub export_ok_tags {
+ goto &{as_heavy()};
+ }
+
+ sub require_version {
+ goto &{as_heavy()};
+ }
+
+ 1;
+ __END__
+
+ =head1 NAME
+
+ Exporter - Implements default import method for modules
+
+ =head1 SYNOPSIS
+
+ In module F<YourModule.pm>:
+
+ package YourModule;
+ require Exporter;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+
+ or
+
+ package YourModule;
+ use Exporter 'import'; # gives you Exporter's import() method directly
+ @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+
+ In other files which wish to use C<YourModule>:
+
+ use YourModule qw(frobnicate); # import listed symbols
+ frobnicate ($left, $right) # calls YourModule::frobnicate
+
+ Take a look at L</Good Practices> for some variants
+ you will like to use in modern Perl code.
+
+ =head1 DESCRIPTION
+
+ The Exporter module implements an C<import> method which allows a module
+ to export functions and variables to its users' namespaces. Many modules
+ use Exporter rather than implementing their own C<import> method because
+ Exporter provides a highly flexible interface, with an implementation optimised
+ for the common case.
+
+ Perl automatically calls the C<import> method when processing a
+ C<use> statement for a module. Modules and C<use> are documented
+ in L<perlfunc> and L<perlmod>. Understanding the concept of
+ modules and how the C<use> statement operates is important to
+ understanding the Exporter.
+
+ =head2 How to Export
+
+ The arrays C<@EXPORT> and C<@EXPORT_OK> in a module hold lists of
+ symbols that are going to be exported into the users name space by
+ default, or which they can request to be exported, respectively. The
+ symbols can represent functions, scalars, arrays, hashes, or typeglobs.
+ The symbols must be given by full name with the exception that the
+ ampersand in front of a function is optional, e.g.
+
+ @EXPORT = qw(afunc $scalar @array); # afunc is a function
+ @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
+
+ If you are only exporting function names it is recommended to omit the
+ ampersand, as the implementation is faster this way.
+
+ =head2 Selecting What to Export
+
+ Do B<not> export method names!
+
+ Do B<not> export anything else by default without a good reason!
+
+ Exports pollute the namespace of the module user. If you must export
+ try to use C<@EXPORT_OK> in preference to C<@EXPORT> and avoid short or
+ common symbol names to reduce the risk of name clashes.
+
+ Generally anything not exported is still accessible from outside the
+ module using the C<YourModule::item_name> (or C<< $blessed_ref->method >>)
+ syntax. By convention you can use a leading underscore on names to
+ informally indicate that they are 'internal' and not for public use.
+
+ (It is actually possible to get private functions by saying:
+
+ my $subref = sub { ... };
+ $subref->(@args); # Call it as a function
+ $obj->$subref(@args); # Use it as a method
+
+ However if you use them for methods it is up to you to figure out
+ how to make inheritance work.)
+
+ As a general rule, if the module is trying to be object oriented
+ then export nothing. If it's just a collection of functions then
+ C<@EXPORT_OK> anything but use C<@EXPORT> with caution. For function and
+ method names use barewords in preference to names prefixed with
+ ampersands for the export lists.
+
+ Other module design guidelines can be found in L<perlmod>.
+
+ =head2 How to Import
+
+ In other files which wish to use your module there are three basic ways for
+ them to load your module and import its symbols:
+
+ =over 4
+
+ =item C<use YourModule;>
+
+ This imports all the symbols from YourModule's C<@EXPORT> into the namespace
+ of the C<use> statement.
+
+ =item C<use YourModule ();>
+
+ This causes perl to load your module but does not import any symbols.
+
+ =item C<use YourModule qw(...);>
+
+ This imports only the symbols listed by the caller into their namespace.
+ All listed symbols must be in your C<@EXPORT> or C<@EXPORT_OK>, else an error
+ occurs. The advanced export features of Exporter are accessed like this,
+ but with list entries that are syntactically distinct from symbol names.
+
+ =back
+
+ Unless you want to use its advanced features, this is probably all you
+ need to know to use Exporter.
+
+ =head1 Advanced Features
+
+ =head2 Specialised Import Lists
+
+ If any of the entries in an import list begins with !, : or / then
+ the list is treated as a series of specifications which either add to
+ or delete from the list of names to import. They are processed left to
+ right. Specifications are in the form:
+
+ [!]name This name only
+ [!]:DEFAULT All names in @EXPORT
+ [!]:tag All names in $EXPORT_TAGS{tag} anonymous list
+ [!]/pattern/ All names in @EXPORT and @EXPORT_OK which match
+
+ A leading ! indicates that matching names should be deleted from the
+ list of names to import. If the first specification is a deletion it
+ is treated as though preceded by :DEFAULT. If you just want to import
+ extra names in addition to the default set you will still need to
+ include :DEFAULT explicitly.
+
+ e.g., F<Module.pm> defines:
+
+ @EXPORT = qw(A1 A2 A3 A4 A5);
+ @EXPORT_OK = qw(B1 B2 B3 B4 B5);
+ %EXPORT_TAGS = (T1 => [qw(A1 A2 B1 B2)], T2 => [qw(A1 A2 B3 B4)]);
+
+ Note that you cannot use tags in @EXPORT or @EXPORT_OK.
+
+ Names in EXPORT_TAGS must also appear in @EXPORT or @EXPORT_OK.
+
+ An application using Module can say something like:
+
+ use Module qw(:DEFAULT :T2 !B3 A3);
+
+ Other examples include:
+
+ use Socket qw(!/^[AP]F_/ !SOMAXCONN !SOL_SOCKET);
+ use POSIX qw(:errno_h :termios_h !TCSADRAIN !/^EXIT/);
+
+ Remember that most patterns (using //) will need to be anchored
+ with a leading ^, e.g., C</^EXIT/> rather than C</EXIT/>.
+
+ You can say C<BEGIN { $Exporter::Verbose=1 }> to see how the
+ specifications are being processed and what is actually being imported
+ into modules.
+
+ =head2 Exporting Without Using Exporter's import Method
+
+ Exporter has a special method, 'export_to_level' which is used in situations
+ where you can't directly call Exporter's
+ import method. The export_to_level
+ method looks like:
+
+ MyPackage->export_to_level(
+ $where_to_export, $package, @what_to_export
+ );
+
+ where C<$where_to_export> is an integer telling how far up the calling stack
+ to export your symbols, and C<@what_to_export> is an array telling what
+ symbols *to* export (usually this is C<@_>). The C<$package> argument is
+ currently unused.
+
+ For example, suppose that you have a module, A, which already has an
+ import function:
+
+ package A;
+
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw($b);
+
+ sub import
+ {
+ $A::b = 1; # not a very useful import method
+ }
+
+ and you want to Export symbol C<$A::b> back to the module that called
+ package A. Since Exporter relies on the import method to work, via
+ inheritance, as it stands Exporter::import() will never get called.
+ Instead, say the following:
+
+ package A;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw($b);
+
+ sub import
+ {
+ $A::b = 1;
+ A->export_to_level(1, @_);
+ }
+
+ This will export the symbols one level 'above' the current package - ie: to
+ the program or module that used package A.
+
+ Note: Be careful not to modify C<@_> at all before you call export_to_level
+ - or people using your package will get very unexplained results!
+
+ =head2 Exporting Without Inheriting from Exporter
+
+ By including Exporter in your C<@ISA> you inherit an Exporter's import() method
+ but you also inherit several other helper methods which you probably don't
+ want. To avoid this you can do:
+
+ package YourModule;
+ use Exporter qw(import);
+
+ which will export Exporter's own import() method into YourModule.
+ Everything will work as before but you won't need to include Exporter in
+ C<@YourModule::ISA>.
+
+ Note: This feature was introduced in version 5.57
+ of Exporter, released with perl 5.8.3.
+
+ =head2 Module Version Checking
+
+ The Exporter module will convert an attempt to import a number from a
+ module into a call to C<< $module_name->VERSION($value) >>. This can
+ be used to validate that the version of the module being used is
+ greater than or equal to the required version.
+
+ For historical reasons, Exporter supplies a C<require_version> method that
+ simply delegates to C<VERSION>. Originally, before C<UNIVERSAL::VERSION>
+ existed, Exporter would call C<require_version>.
+
+ Since the C<UNIVERSAL::VERSION> method treats the C<$VERSION> number as
+ a simple numeric value it will regard version 1.10 as lower than
+ 1.9. For this reason it is strongly recommended that you use numbers
+ with at least two decimal places, e.g., 1.09.
+
+ =head2 Managing Unknown Symbols
+
+ In some situations you may want to prevent certain symbols from being
+ exported. Typically this applies to extensions which have functions
+ or constants that may not exist on some systems.
+
+ The names of any symbols that cannot be exported should be listed
+ in the C<@EXPORT_FAIL> array.
+
+ If a module attempts to import any of these symbols the Exporter
+ will give the module an opportunity to handle the situation before
+ generating an error. The Exporter will call an export_fail method
+ with a list of the failed symbols:
+
+ @failed_symbols = $module_name->export_fail(@failed_symbols);
+
+ If the C<export_fail> method returns an empty list then no error is
+ recorded and all the requested symbols are exported. If the returned
+ list is not empty then an error is generated for each symbol and the
+ export fails. The Exporter provides a default C<export_fail> method which
+ simply returns the list unchanged.
+
+ Uses for the C<export_fail> method include giving better error messages
+ for some symbols and performing lazy architectural checks (put more
+ symbols into C<@EXPORT_FAIL> by default and then take them out if someone
+ actually tries to use them and an expensive check shows that they are
+ usable on that platform).
+
+ =head2 Tag Handling Utility Functions
+
+ Since the symbols listed within C<%EXPORT_TAGS> must also appear in either
+ C<@EXPORT> or C<@EXPORT_OK>, two utility functions are provided which allow
+ you to easily add tagged sets of symbols to C<@EXPORT> or C<@EXPORT_OK>:
+
+ %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+
+ Exporter::export_tags('foo'); # add aa, bb and cc to @EXPORT
+ Exporter::export_ok_tags('bar'); # add aa, cc and dd to @EXPORT_OK
+
+ Any names which are not tags are added to C<@EXPORT> or C<@EXPORT_OK>
+ unchanged but will trigger a warning (with C<-w>) to avoid misspelt tags
+ names being silently added to C<@EXPORT> or C<@EXPORT_OK>. Future versions
+ may make this a fatal error.
+
+ =head2 Generating Combined Tags
+
+ If several symbol categories exist in C<%EXPORT_TAGS>, it's usually
+ useful to create the utility ":all" to simplify "use" statements.
+
+ The simplest way to do this is:
+
+ %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+
+ # add all the other ":class" tags to the ":all" class,
+ # deleting duplicates
+ {
+ my %seen;
+
+ push @{$EXPORT_TAGS{all}},
+ grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS;
+ }
+
+ F<CGI.pm> creates an ":all" tag which contains some (but not really
+ all) of its categories. That could be done with one small
+ change:
+
+ # add some of the other ":class" tags to the ":all" class,
+ # deleting duplicates
+ {
+ my %seen;
+
+ push @{$EXPORT_TAGS{all}},
+ grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}}
+ foreach qw/html2 html3 netscape form cgi internal/;
+ }
+
+ Note that the tag names in C<%EXPORT_TAGS> don't have the leading ':'.
+
+ =head2 C<AUTOLOAD>ed Constants
+
+ Many modules make use of C<AUTOLOAD>ing for constant subroutines to
+ avoid having to compile and waste memory on rarely used values (see
+ L<perlsub> for details on constant subroutines). Calls to such
+ constant subroutines are not optimized away at compile time because
+ they can't be checked at compile time for constancy.
+
+ Even if a prototype is available at compile time, the body of the
+ subroutine is not (it hasn't been C<AUTOLOAD>ed yet). perl needs to
+ examine both the C<()> prototype and the body of a subroutine at
+ compile time to detect that it can safely replace calls to that
+ subroutine with the constant value.
+
+ A workaround for this is to call the constants once in a C<BEGIN> block:
+
+ package My ;
+
+ use Socket ;
+
+ foo( SO_LINGER ); ## SO_LINGER NOT optimized away; called at runtime
+ BEGIN { SO_LINGER }
+ foo( SO_LINGER ); ## SO_LINGER optimized away at compile time.
+
+ This forces the C<AUTOLOAD> for C<SO_LINGER> to take place before
+ SO_LINGER is encountered later in C<My> package.
+
+ If you are writing a package that C<AUTOLOAD>s, consider forcing
+ an C<AUTOLOAD> for any constants explicitly imported by other packages
+ or which are usually used when your package is C<use>d.
+
+ =head1 Good Practices
+
+ =head2 Declaring C<@EXPORT_OK> and Friends
+
+ When using C<Exporter> with the standard C<strict> and C<warnings>
+ pragmas, the C<our> keyword is needed to declare the package
+ variables C<@EXPORT_OK>, C<@EXPORT>, C<@ISA>, etc.
+
+ our @ISA = qw(Exporter);
+ our @EXPORT_OK = qw(munge frobnicate);
+
+ If backward compatibility for Perls under 5.6 is important,
+ one must write instead a C<use vars> statement.
+
+ use vars qw(@ISA @EXPORT_OK);
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(munge frobnicate);
+
+ =head2 Playing Safe
+
+ There are some caveats with the use of runtime statements
+ like C<require Exporter> and the assignment to package
+ variables, which can be very subtle for the unaware programmer.
+ This may happen for instance with mutually recursive
+ modules, which are affected by the time the relevant
+ constructions are executed.
+
+ The ideal (but a bit ugly) way to never have to think
+ about that is to use C<BEGIN> blocks. So the first part
+ of the L</SYNOPSIS> code could be rewritten as:
+
+ package YourModule;
+
+ use strict;
+ use warnings;
+
+ our (@ISA, @EXPORT_OK);
+ BEGIN {
+ require Exporter;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+ }
+
+ The C<BEGIN> will assure that the loading of F<Exporter.pm>
+ and the assignments to C<@ISA> and C<@EXPORT_OK> happen
+ immediately, leaving no room for something to get awry
+ or just plain wrong.
+
+ With respect to loading C<Exporter> and inheriting, there
+ are alternatives with the use of modules like C<base> and C<parent>.
+
+ use base qw(Exporter);
+ # or
+ use parent qw(Exporter);
+
+ Any of these statements are nice replacements for
+ C<BEGIN { require Exporter; @ISA = qw(Exporter); }>
+ with the same compile-time effect. The basic difference
+ is that C<base> code interacts with declared C<fields>
+ while C<parent> is a streamlined version of the older
+ C<base> code to just establish the IS-A relationship.
+
+ For more details, see the documentation and code of
+ L<base> and L<parent>.
+
+ Another thorough remedy to that runtime
+ vs. compile-time trap is to use L<Exporter::Easy>,
+ which is a wrapper of Exporter that allows all
+ boilerplate code at a single gulp in the
+ use statement.
+
+ use Exporter::Easy (
+ OK => [ qw(munge frobnicate) ],
+ );
+ # @ISA setup is automatic
+ # all assignments happen at compile time
+
+ =head2 What Not to Export
+
+ You have been warned already in L</Selecting What to Export>
+ to not export:
+
+ =over 4
+
+ =item *
+
+ method names (because you don't need to
+ and that's likely to not do what you want),
+
+ =item *
+
+ anything by default (because you don't want to surprise your users...
+ badly)
+
+ =item *
+
+ anything you don't need to (because less is more)
+
+ =back
+
+ There's one more item to add to this list. Do B<not>
+ export variable names. Just because C<Exporter> lets you
+ do that, it does not mean you should.
+
+ @EXPORT_OK = qw($svar @avar %hvar); # DON'T!
+
+ Exporting variables is not a good idea. They can
+ change under the hood, provoking horrible
+ effects at-a-distance that are too hard to track
+ and to fix. Trust me: they are not worth it.
+
+ To provide the capability to set/get class-wide
+ settings, it is best instead to provide accessors
+ as subroutines or class methods instead.
+
+ =head1 SEE ALSO
+
+ C<Exporter> is definitely not the only module with
+ symbol exporter capabilities. At CPAN, you may find
+ a bunch of them. Some are lighter. Some
+ provide improved APIs and features. Pick the one
+ that fits your needs. The following is
+ a sample list of such modules.
+
+ Exporter::Easy
+ Exporter::Lite
+ Exporter::Renaming
+ Exporter::Tidy
+ Sub::Exporter / Sub::Installer
+ Perl6::Export / Perl6::Export::Attrs
+
+ =head1 LICENSE
+
+ This library is free software. You can redistribute it
+ and/or modify it under the same terms as Perl itself.
+
+ =cut
+
+
+
+ EXPORTER
+
+ $fatpacked{"Exporter/Heavy.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXPORTER_HEAVY';
+ package Exporter::Heavy;
+
+ use strict;
+ no strict 'refs';
+
+ # On one line so MakeMaker will see it.
+ require Exporter; our $VERSION = $Exporter::VERSION;
+
+ =head1 NAME
+
+ Exporter::Heavy - Exporter guts
+
+ =head1 SYNOPSIS
+
+ (internal use only)
+
+ =head1 DESCRIPTION
+
+ No user-serviceable parts inside.
+
+ =cut
+
+ #
+ # We go to a lot of trouble not to 'require Carp' at file scope,
+ # because Carp requires Exporter, and something has to give.
+ #
+
+ sub _rebuild_cache {
+ my ($pkg, $exports, $cache) = @_;
+ s/^&// foreach @$exports;
+ @{$cache}{@$exports} = (1) x @$exports;
+ my $ok = \@{"${pkg}::EXPORT_OK"};
+ if (@$ok) {
+ s/^&// foreach @$ok;
+ @{$cache}{@$ok} = (1) x @$ok;
+ }
+ }
+
+ sub heavy_export {
+
+ # Save the old __WARN__ handler in case it was defined
+ my $oldwarn = $SIG{__WARN__};
+
+ # First make import warnings look like they're coming from the "use".
+ local $SIG{__WARN__} = sub {
+ # restore it back so proper stacking occurs
+ local $SIG{__WARN__} = $oldwarn;
+ my $text = shift;
+ if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//) {
+ require Carp;
+ local $Carp::CarpLevel = 1; # ignore package calling us too.
+ Carp::carp($text);
+ }
+ else {
+ warn $text;
+ }
+ };
+ local $SIG{__DIE__} = sub {
+ require Carp;
+ local $Carp::CarpLevel = 1; # ignore package calling us too.
+ Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT")
+ if $_[0] =~ /^Unable to create sub named "(.*?)::"/;
+ };
+
+ my($pkg, $callpkg, @imports) = @_;
+ my($type, $sym, $cache_is_current, $oops);
+ my($exports, $export_cache) = (\@{"${pkg}::EXPORT"},
+ $Exporter::Cache{$pkg} ||= {});
+
+ if (@imports) {
+ if (!%$export_cache) {
+ _rebuild_cache ($pkg, $exports, $export_cache);
+ $cache_is_current = 1;
+ }
+
+ if (grep m{^[/!:]}, @imports) {
+ my $tagsref = \%{"${pkg}::EXPORT_TAGS"};
+ my $tagdata;
+ my %imports;
+ my($remove, $spec, @names, @allexports);
+ # negated first item implies starting with default set:
+ unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/;
+ foreach $spec (@imports){
+ $remove = $spec =~ s/^!//;
+
+ if ($spec =~ s/^://){
+ if ($spec eq 'DEFAULT'){
+ @names = @$exports;
+ }
+ elsif ($tagdata = $tagsref->{$spec}) {
+ @names = @$tagdata;
+ }
+ else {
+ warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS];
+ ++$oops;
+ next;
+ }
+ }
+ elsif ($spec =~ m:^/(.*)/$:){
+ my $patn = $1;
+ @allexports = keys %$export_cache unless @allexports; # only do keys once
+ @names = grep(/$patn/, @allexports); # not anchored by default
+ }
+ else {
+ @names = ($spec); # is a normal symbol name
+ }
+
+ warn "Import ".($remove ? "del":"add").": @names "
+ if $Exporter::Verbose;
+
+ if ($remove) {
+ foreach $sym (@names) { delete $imports{$sym} }
+ }
+ else {
+ @imports{@names} = (1) x @names;
+ }
+ }
+ @imports = keys %imports;
+ }
+
+ my @carp;
+ foreach $sym (@imports) {
+ if (!$export_cache->{$sym}) {
+ if ($sym =~ m/^\d/) {
+ $pkg->VERSION($sym); # inherit from UNIVERSAL
+ # If the version number was the only thing specified
+ # then we should act as if nothing was specified:
+ if (@imports == 1) {
+ @imports = @$exports;
+ last;
+ }
+ # We need a way to emulate 'use Foo ()' but still
+ # allow an easy version check: "use Foo 1.23, ''";
+ if (@imports == 2 and !$imports[1]) {
+ @imports = ();
+ last;
+ }
+ } elsif ($sym !~ s/^&// || !$export_cache->{$sym}) {
+ # Last chance - see if they've updated EXPORT_OK since we
+ # cached it.
+
+ unless ($cache_is_current) {
+ %$export_cache = ();
+ _rebuild_cache ($pkg, $exports, $export_cache);
+ $cache_is_current = 1;
+ }
+
+ if (!$export_cache->{$sym}) {
+ # accumulate the non-exports
+ push @carp,
+ qq["$sym" is not exported by the $pkg module\n];
+ $oops++;
+ }
+ }
+ }
+ }
+ if ($oops) {
+ require Carp;
+ Carp::croak("@{carp}Can't continue after import errors");
+ }
+ }
+ else {
+ @imports = @$exports;
+ }
+
+ my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"},
+ $Exporter::FailCache{$pkg} ||= {});
+
+ if (@$fail) {
+ if (!%$fail_cache) {
+ # Build cache of symbols. Optimise the lookup by adding
+ # barewords twice... both with and without a leading &.
+ # (Technique could be applied to $export_cache at cost of memory)
+ my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @$fail;
+ warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Exporter::Verbose;
+ @{$fail_cache}{@expanded} = (1) x @expanded;
+ }
+ my @failed;
+ foreach $sym (@imports) { push(@failed, $sym) if $fail_cache->{$sym} }
+ if (@failed) {
+ @failed = $pkg->export_fail(@failed);
+ foreach $sym (@failed) {
+ require Carp;
+ Carp::carp(qq["$sym" is not implemented by the $pkg module ],
+ "on this architecture");
+ }
+ if (@failed) {
+ require Carp;
+ Carp::croak("Can't continue after import errors");
+ }
+ }
+ }
+
+ warn "Importing into $callpkg from $pkg: ",
+ join(", ",sort @imports) if $Exporter::Verbose;
+
+ foreach $sym (@imports) {
+ # shortcut for the common case of no type character
+ (*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next)
+ unless $sym =~ s/^(\W)//;
+ $type = $1;
+ no warnings 'once';
+ *{"${callpkg}::$sym"} =
+ $type eq '&' ? \&{"${pkg}::$sym"} :
+ $type eq '$' ? \${"${pkg}::$sym"} :
+ $type eq '@' ? \@{"${pkg}::$sym"} :
+ $type eq '%' ? \%{"${pkg}::$sym"} :
+ $type eq '*' ? *{"${pkg}::$sym"} :
+ do { require Carp; Carp::croak("Can't export symbol: $type$sym") };
+ }
+ }
+
+ sub heavy_export_to_level
+ {
+ my $pkg = shift;
+ my $level = shift;
+ (undef) = shift; # XXX redundant arg
+ my $callpkg = caller($level);
+ $pkg->export($callpkg, @_);
+ }
+
+ # Utility functions
+
+ sub _push_tags {
+ my($pkg, $var, $syms) = @_;
+ my @nontag = ();
+ my $export_tags = \%{"${pkg}::EXPORT_TAGS"};
+ push(@{"${pkg}::$var"},
+ map { $export_tags->{$_} ? @{$export_tags->{$_}}
+ : scalar(push(@nontag,$_),$_) }
+ (@$syms) ? @$syms : keys %$export_tags);
+ if (@nontag and $^W) {
+ # This may change to a die one day
+ require Carp;
+ Carp::carp(join(", ", @nontag)." are not tags of $pkg");
+ }
+ }
+
+ sub heavy_require_version {
+ my($self, $wanted) = @_;
+ my $pkg = ref $self || $self;
+ return ${pkg}->VERSION($wanted);
+ }
+
+ sub heavy_export_tags {
+ _push_tags((caller)[0], "EXPORT", \@_);
+ }
+
+ sub heavy_export_ok_tags {
+ _push_tags((caller)[0], "EXPORT_OK", \@_);
+ }
+
+ 1;
+ EXPORTER_HEAVY
+
+ $fatpacked{"File/pushd.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_PUSHD';
+ use strict;
+ use warnings;
+
+ package File::pushd;
+ # ABSTRACT: change directory temporarily for a limited scope
+ our $VERSION = '1.009'; # VERSION
+
+ our @EXPORT = qw( pushd tempd );
+ our @ISA = qw( Exporter );
+
+ use Exporter;
+ use Carp;
+ use Cwd qw( getcwd abs_path );
+ use File::Path qw( rmtree );
+ use File::Temp qw();
+ use File::Spec;
+
+ use overload
+ q{""} => sub { File::Spec->canonpath( $_[0]->{_pushd} ) },
+ fallback => 1;
+
+ #--------------------------------------------------------------------------#
+ # pushd()
+ #--------------------------------------------------------------------------#
+
+ sub pushd {
+ my ( $target_dir, $options ) = @_;
+ $options->{untaint_pattern} ||= qr{^([-+@\w./]+)$};
+
+ $target_dir = "." unless defined $target_dir;
+ croak "Can't locate directory $target_dir" unless -d $target_dir;
+
+ my $tainted_orig = getcwd;
+ my $orig;
+ if ( $tainted_orig =~ $options->{untaint_pattern} ) {
+ $orig = $1;
+ }
+ else {
+ $orig = $tainted_orig;
+ }
+
+ my $tainted_dest;
+ eval { $tainted_dest = $target_dir ? abs_path($target_dir) : $orig };
+ croak "Can't locate absolute path for $target_dir: $@" if $@;
+
+ my $dest;
+ if ( $tainted_dest =~ $options->{untaint_pattern} ) {
+ $dest = $1;
+ }
+ else {
+ $dest = $tainted_dest;
+ }
+
+ if ( $dest ne $orig ) {
+ chdir $dest or croak "Can't chdir to $dest\: $!";
+ }
+
+ my $self = bless {
+ _pushd => $dest,
+ _original => $orig
+ },
+ __PACKAGE__;
+
+ return $self;
+ }
+
+ #--------------------------------------------------------------------------#
+ # tempd()
+ #--------------------------------------------------------------------------#
+
+ sub tempd {
+ my ($options) = @_;
+ my $dir;
+ eval { $dir = pushd( File::Temp::tempdir( CLEANUP => 0 ), $options ) };
+ croak $@ if $@;
+ $dir->{_tempd} = 1;
+ return $dir;
+ }
+
+ #--------------------------------------------------------------------------#
+ # preserve()
+ #--------------------------------------------------------------------------#
+
+ sub preserve {
+ my $self = shift;
+ return 1 if !$self->{"_tempd"};
+ if ( @_ == 0 ) {
+ return $self->{_preserve} = 1;
+ }
+ else {
+ return $self->{_preserve} = $_[0] ? 1 : 0;
+ }
+ }
+
+ #--------------------------------------------------------------------------#
+ # DESTROY()
+ # Revert to original directory as object is destroyed and cleanup
+ # if necessary
+ #--------------------------------------------------------------------------#
+
+ sub DESTROY {
+ my ($self) = @_;
+ my $orig = $self->{_original};
+ chdir $orig if $orig; # should always be so, but just in case...
+ if ( $self->{_tempd}
+ && !$self->{_preserve} )
+ {
+ # don't destroy existing $@ if there is no error.
+ my $err = do {
+ local $@;
+ eval { rmtree( $self->{_pushd} ) };
+ $@;
+ };
+ carp $err if $err;
+ }
+ }
+
+ 1;
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ File::pushd - change directory temporarily for a limited scope
+
+ =head1 VERSION
+
+ version 1.009
+
+ =head1 SYNOPSIS
+
+ use File::pushd;
+
+ chdir $ENV{HOME};
+
+ # change directory again for a limited scope
+ {
+ my $dir = pushd( '/tmp' );
+ # working directory changed to /tmp
+ }
+ # working directory has reverted to $ENV{HOME}
+
+ # tempd() is equivalent to pushd( File::Temp::tempdir )
+ {
+ my $dir = tempd();
+ }
+
+ # object stringifies naturally as an absolute path
+ {
+ my $dir = pushd( '/tmp' );
+ my $filename = File::Spec->catfile( $dir, "somefile.txt" );
+ # gives /tmp/somefile.txt
+ }
+
+ =head1 DESCRIPTION
+
+ File::pushd does a temporary C<chdir> that is easily and automatically
+ reverted, similar to C<pushd> in some Unix command shells. It works by
+ creating an object that caches the original working directory. When the object
+ is destroyed, the destructor calls C<chdir> to revert to the original working
+ directory. By storing the object in a lexical variable with a limited scope,
+ this happens automatically at the end of the scope.
+
+ This is very handy when working with temporary directories for tasks like
+ testing; a function is provided to streamline getting a temporary
+ directory from L<File::Temp>.
+
+ For convenience, the object stringifies as the canonical form of the absolute
+ pathname of the directory entered.
+
+ B<Warning>: if you create multiple C<pushd> objects in the same lexical scope,
+ their destruction order is not guaranteed and you might not wind up in the
+ directory you expect.
+
+ =head1 USAGE
+
+ use File::pushd;
+
+ Using File::pushd automatically imports the C<pushd> and C<tempd> functions.
+
+ =head2 pushd
+
+ {
+ my $dir = pushd( $target_directory );
+ }
+
+ Caches the current working directory, calls C<chdir> to change to the target
+ directory, and returns a File::pushd object. When the object is
+ destroyed, the working directory reverts to the original directory.
+
+ The provided target directory can be a relative or absolute path. If
+ called with no arguments, it uses the current directory as its target and
+ returns to the current directory when the object is destroyed.
+
+ If the target directory does not exist or if the directory change fails
+ for some reason, C<pushd> will die with an error message.
+
+ Can be given a hashref as an optional second argument. The only supported
+ option is C<untaint_pattern>, which is used to untaint file paths involved.
+ It defaults to {qr{^(L<-+@\w./>+)$}}, which is reasonably restrictive (e.g.
+ it does not even allow spaces in the path). Change this to suit your
+ circumstances and security needs if running under taint mode. *Note*: you
+ must include the parentheses in the pattern to capture the untainted
+ portion of the path.
+
+ =head2 tempd
+
+ {
+ my $dir = tempd();
+ }
+
+ This function is like C<pushd> but automatically creates and calls C<chdir> to
+ a temporary directory created by L<File::Temp>. Unlike normal L<File::Temp>
+ cleanup which happens at the end of the program, this temporary directory is
+ removed when the object is destroyed. (But also see C<preserve>.) A warning
+ will be issued if the directory cannot be removed.
+
+ As with C<pushd>, C<tempd> will die if C<chdir> fails.
+
+ It may be given a single options hash that will be passed internally
+ to C<pushd>.
+
+ =head2 preserve
+
+ {
+ my $dir = tempd();
+ $dir->preserve; # mark to preserve at end of scope
+ $dir->preserve(0); # mark to delete at end of scope
+ }
+
+ Controls whether a temporary directory will be cleaned up when the object is
+ destroyed. With no arguments, C<preserve> sets the directory to be preserved.
+ With an argument, the directory will be preserved if the argument is true, or
+ marked for cleanup if the argument is false. Only C<tempd> objects may be
+ marked for cleanup. (Target directories to C<pushd> are always preserved.)
+ C<preserve> returns true if the directory will be preserved, and false
+ otherwise.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ L<File::chdir>
+
+ =back
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/dagolden/File-pushd/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/dagolden/File-pushd>
+
+ git clone https://github.com/dagolden/File-pushd.git
+
+ =head1 AUTHOR
+
+ David Golden <dagolden@cpan.org>
+
+ =head1 CONTRIBUTORS
+
+ =over 4
+
+ =item *
+
+ Diab Jerius <djerius@cfa.harvard.edu>
+
+ =item *
+
+ Graham Ollis <plicease@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is Copyright (c) 2014 by David A Golden.
+
+ This is free software, licensed under:
+
+ The Apache License, Version 2.0, January 2004
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=4 sts=4 sw=4 et:
+ FILE_PUSHD
+
+ $fatpacked{"HTTP/Tiny.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_TINY';
+ # vim: ts=4 sts=4 sw=4 et:
+ package HTTP::Tiny;
+ use strict;
+ use warnings;
+ # ABSTRACT: A small, simple, correct HTTP/1.1 client
+
+ our $VERSION = '0.056';
+
+ use Carp ();
+
+ #pod =method new
+ #pod
+ #pod $http = HTTP::Tiny->new( %attributes );
+ #pod
+ #pod This constructor returns a new HTTP::Tiny object. Valid attributes include:
+ #pod
+ #pod =for :list
+ #pod * C<agent> —
+ #pod A user-agent string (defaults to 'HTTP-Tiny/$VERSION'). If C<agent> — ends in a space character, the default user-agent string is appended.
+ #pod * C<cookie_jar> —
+ #pod An instance of L<HTTP::CookieJar> — or equivalent class that supports the C<add> and C<cookie_header> methods
+ #pod * C<default_headers> —
+ #pod A hashref of default headers to apply to requests
+ #pod * C<local_address> —
+ #pod The local IP address to bind to
+ #pod * C<keep_alive> —
+ #pod Whether to reuse the last connection (if for the same scheme, host and port) (defaults to 1)
+ #pod * C<max_redirect> —
+ #pod Maximum number of redirects allowed (defaults to 5)
+ #pod * C<max_size> —
+ #pod Maximum response size in bytes (only when not using a data callback). If defined, responses larger than this will return an exception.
+ #pod * C<http_proxy> —
+ #pod URL of a proxy server to use for HTTP connections (default is C<$ENV{http_proxy}> — if set)
+ #pod * C<https_proxy> —
+ #pod URL of a proxy server to use for HTTPS connections (default is C<$ENV{https_proxy}> — if set)
+ #pod * C<proxy> —
+ #pod URL of a generic proxy server for both HTTP and HTTPS connections (default is C<$ENV{all_proxy}> — if set)
+ #pod * C<no_proxy> —
+ #pod List of domain suffixes that should not be proxied. Must be a comma-separated string or an array reference. (default is C<$ENV{no_proxy}> —)
+ #pod * C<timeout> —
+ #pod Request timeout in seconds (default is 60)
+ #pod * C<verify_SSL> —
+ #pod A boolean that indicates whether to validate the SSL certificate of an C<https> —
+ #pod connection (default is false)
+ #pod * C<SSL_options> —
+ #pod A hashref of C<SSL_*> — options to pass through to L<IO::Socket::SSL>
+ #pod
+ #pod Passing an explicit C<undef> for C<proxy>, C<http_proxy> or C<https_proxy> will
+ #pod prevent getting the corresponding proxies from the environment.
+ #pod
+ #pod Exceptions from C<max_size>, C<timeout> or other errors will result in a
+ #pod pseudo-HTTP status code of 599 and a reason of "Internal Exception". The
+ #pod content field in the response will contain the text of the exception.
+ #pod
+ #pod The C<keep_alive> parameter enables a persistent connection, but only to a
+ #pod single destination scheme, host and port. Also, if any connection-relevant
+ #pod attributes are modified, or if the process ID or thread ID change, the
+ #pod persistent connection will be dropped. If you want persistent connections
+ #pod across multiple destinations, use multiple HTTP::Tiny objects.
+ #pod
+ #pod See L</SSL SUPPORT> for more on the C<verify_SSL> and C<SSL_options> attributes.
+ #pod
+ #pod =cut
+
+ my @attributes;
+ BEGIN {
+ @attributes = qw(
+ cookie_jar default_headers http_proxy https_proxy keep_alive
+ local_address max_redirect max_size proxy no_proxy timeout
+ SSL_options verify_SSL
+ );
+ my %persist_ok = map {; $_ => 1 } qw(
+ cookie_jar default_headers max_redirect max_size
+ );
+ no strict 'refs';
+ no warnings 'uninitialized';
+ for my $accessor ( @attributes ) {
+ *{$accessor} = sub {
+ @_ > 1
+ ? do {
+ delete $_[0]->{handle} if !$persist_ok{$accessor} && $_[1] ne $_[0]->{$accessor};
+ $_[0]->{$accessor} = $_[1]
+ }
+ : $_[0]->{$accessor};
+ };
+ }
+ }
+
+ sub agent {
+ my($self, $agent) = @_;
+ if( @_ > 1 ){
+ $self->{agent} =
+ (defined $agent && $agent =~ / $/) ? $agent . $self->_agent : $agent;
+ }
+ return $self->{agent};
+ }
+
+ sub new {
+ my($class, %args) = @_;
+
+ my $self = {
+ max_redirect => 5,
+ timeout => 60,
+ keep_alive => 1,
+ verify_SSL => $args{verify_SSL} || $args{verify_ssl} || 0, # no verification by default
+ no_proxy => $ENV{no_proxy},
+ };
+
+ bless $self, $class;
+
+ $class->_validate_cookie_jar( $args{cookie_jar} ) if $args{cookie_jar};
+
+ for my $key ( @attributes ) {
+ $self->{$key} = $args{$key} if exists $args{$key}
+ }
+
+ $self->agent( exists $args{agent} ? $args{agent} : $class->_agent );
+
+ $self->_set_proxies;
+
+ return $self;
+ }
+
+ sub _set_proxies {
+ my ($self) = @_;
+
+ # get proxies from %ENV only if not provided; explicit undef will disable
+ # getting proxies from the environment
+
+ # generic proxy
+ if (! exists $self->{proxy} ) {
+ $self->{proxy} = $ENV{all_proxy} || $ENV{ALL_PROXY};
+ }
+
+ if ( defined $self->{proxy} ) {
+ $self->_split_proxy( 'generic proxy' => $self->{proxy} ); # validate
+ }
+ else {
+ delete $self->{proxy};
+ }
+
+ # http proxy
+ if (! exists $self->{http_proxy} ) {
+ # under CGI, bypass HTTP_PROXY as request sets it from Proxy header
+ local $ENV{HTTP_PROXY} if $ENV{REQUEST_METHOD};
+ $self->{http_proxy} = $ENV{http_proxy} || $ENV{HTTP_PROXY} || $self->{proxy};
+ }
+
+ if ( defined $self->{http_proxy} ) {
+ $self->_split_proxy( http_proxy => $self->{http_proxy} ); # validate
+ $self->{_has_proxy}{http} = 1;
+ }
+ else {
+ delete $self->{http_proxy};
+ }
+
+ # https proxy
+ if (! exists $self->{https_proxy} ) {
+ $self->{https_proxy} = $ENV{https_proxy} || $ENV{HTTPS_PROXY} || $self->{proxy};
+ }
+
+ if ( $self->{https_proxy} ) {
+ $self->_split_proxy( https_proxy => $self->{https_proxy} ); # validate
+ $self->{_has_proxy}{https} = 1;
+ }
+ else {
+ delete $self->{https_proxy};
+ }
+
+ # Split no_proxy to array reference if not provided as such
+ unless ( ref $self->{no_proxy} eq 'ARRAY' ) {
+ $self->{no_proxy} =
+ (defined $self->{no_proxy}) ? [ split /\s*,\s*/, $self->{no_proxy} ] : [];
+ }
+
+ return;
+ }
+
+ #pod =method get|head|put|post|delete
+ #pod
+ #pod $response = $http->get($url);
+ #pod $response = $http->get($url, \%options);
+ #pod $response = $http->head($url);
+ #pod
+ #pod These methods are shorthand for calling C<request()> for the given method. The
+ #pod URL must have unsafe characters escaped and international domain names encoded.
+ #pod See C<request()> for valid options and a description of the response.
+ #pod
+ #pod The C<success> field of the response will be true if the status code is 2XX.
+ #pod
+ #pod =cut
+
+ for my $sub_name ( qw/get head put post delete/ ) {
+ my $req_method = uc $sub_name;
+ no strict 'refs';
+ eval <<"HERE"; ## no critic
+ sub $sub_name {
+ my (\$self, \$url, \$args) = \@_;
+ \@_ == 2 || (\@_ == 3 && ref \$args eq 'HASH')
+ or Carp::croak(q/Usage: \$http->$sub_name(URL, [HASHREF])/ . "\n");
+ return \$self->request('$req_method', \$url, \$args || {});
+ }
+ HERE
+ }
+
+ #pod =method post_form
+ #pod
+ #pod $response = $http->post_form($url, $form_data);
+ #pod $response = $http->post_form($url, $form_data, \%options);
+ #pod
+ #pod This method executes a C<POST> request and sends the key/value pairs from a
+ #pod form data hash or array reference to the given URL with a C<content-type> of
+ #pod C<application/x-www-form-urlencoded>. If data is provided as an array
+ #pod reference, the order is preserved; if provided as a hash reference, the terms
+ #pod are sorted on key and value for consistency. See documentation for the
+ #pod C<www_form_urlencode> method for details on the encoding.
+ #pod
+ #pod The URL must have unsafe characters escaped and international domain names
+ #pod encoded. See C<request()> for valid options and a description of the response.
+ #pod Any C<content-type> header or content in the options hashref will be ignored.
+ #pod
+ #pod The C<success> field of the response will be true if the status code is 2XX.
+ #pod
+ #pod =cut
+
+ sub post_form {
+ my ($self, $url, $data, $args) = @_;
+ (@_ == 3 || @_ == 4 && ref $args eq 'HASH')
+ or Carp::croak(q/Usage: $http->post_form(URL, DATAREF, [HASHREF])/ . "\n");
+
+ my $headers = {};
+ while ( my ($key, $value) = each %{$args->{headers} || {}} ) {
+ $headers->{lc $key} = $value;
+ }
+ delete $args->{headers};
+
+ return $self->request('POST', $url, {
+ %$args,
+ content => $self->www_form_urlencode($data),
+ headers => {
+ %$headers,
+ 'content-type' => 'application/x-www-form-urlencoded'
+ },
+ }
+ );
+ }
+
+ #pod =method mirror
+ #pod
+ #pod $response = $http->mirror($url, $file, \%options)
+ #pod if ( $response->{success} ) {
+ #pod print "$file is up to date\n";
+ #pod }
+ #pod
+ #pod Executes a C<GET> request for the URL and saves the response body to the file
+ #pod name provided. The URL must have unsafe characters escaped and international
+ #pod domain names encoded. If the file already exists, the request will include an
+ #pod C<If-Modified-Since> header with the modification timestamp of the file. You
+ #pod may specify a different C<If-Modified-Since> header yourself in the C<<
+ #pod $options->{headers} >> hash.
+ #pod
+ #pod The C<success> field of the response will be true if the status code is 2XX
+ #pod or if the status code is 304 (unmodified).
+ #pod
+ #pod If the file was modified and the server response includes a properly
+ #pod formatted C<Last-Modified> header, the file modification time will
+ #pod be updated accordingly.
+ #pod
+ #pod =cut
+
+ sub mirror {
+ my ($self, $url, $file, $args) = @_;
+ @_ == 3 || (@_ == 4 && ref $args eq 'HASH')
+ or Carp::croak(q/Usage: $http->mirror(URL, FILE, [HASHREF])/ . "\n");
+ if ( -e $file and my $mtime = (stat($file))[9] ) {
+ $args->{headers}{'if-modified-since'} ||= $self->_http_date($mtime);
+ }
+ my $tempfile = $file . int(rand(2**31));
+
+ require Fcntl;
+ sysopen my $fh, $tempfile, Fcntl::O_CREAT()|Fcntl::O_EXCL()|Fcntl::O_WRONLY()
+ or Carp::croak(qq/Error: Could not create temporary file $tempfile for downloading: $!\n/);
+ binmode $fh;
+ $args->{data_callback} = sub { print {$fh} $_[0] };
+ my $response = $self->request('GET', $url, $args);
+ close $fh
+ or Carp::croak(qq/Error: Caught error closing temporary file $tempfile: $!\n/);
+
+ if ( $response->{success} ) {
+ rename $tempfile, $file
+ or Carp::croak(qq/Error replacing $file with $tempfile: $!\n/);
+ my $lm = $response->{headers}{'last-modified'};
+ if ( $lm and my $mtime = $self->_parse_http_date($lm) ) {
+ utime $mtime, $mtime, $file;
+ }
+ }
+ $response->{success} ||= $response->{status} eq '304';
+ unlink $tempfile;
+ return $response;
+ }
+
+ #pod =method request
+ #pod
+ #pod $response = $http->request($method, $url);
+ #pod $response = $http->request($method, $url, \%options);
+ #pod
+ #pod Executes an HTTP request of the given method type ('GET', 'HEAD', 'POST',
+ #pod 'PUT', etc.) on the given URL. The URL must have unsafe characters escaped and
+ #pod international domain names encoded.
+ #pod
+ #pod If the URL includes a "user:password" stanza, they will be used for Basic-style
+ #pod authorization headers. (Authorization headers will not be included in a
+ #pod redirected request.) For example:
+ #pod
+ #pod $http->request('GET', 'http://Aladdin:open sesame@example.com/');
+ #pod
+ #pod If the "user:password" stanza contains reserved characters, they must
+ #pod be percent-escaped:
+ #pod
+ #pod $http->request('GET', 'http://john%40example.com:password@example.com/');
+ #pod
+ #pod A hashref of options may be appended to modify the request.
+ #pod
+ #pod Valid options are:
+ #pod
+ #pod =for :list
+ #pod * C<headers> —
+ #pod A hashref containing headers to include with the request. If the value for
+ #pod a header is an array reference, the header will be output multiple times with
+ #pod each value in the array. These headers over-write any default headers.
+ #pod * C<content> —
+ #pod A scalar to include as the body of the request OR a code reference
+ #pod that will be called iteratively to produce the body of the request
+ #pod * C<trailer_callback> —
+ #pod A code reference that will be called if it exists to provide a hashref
+ #pod of trailing headers (only used with chunked transfer-encoding)
+ #pod * C<data_callback> —
+ #pod A code reference that will be called for each chunks of the response
+ #pod body received.
+ #pod
+ #pod The C<Host> header is generated from the URL in accordance with RFC 2616. It
+ #pod is a fatal error to specify C<Host> in the C<headers> option. Other headers
+ #pod may be ignored or overwritten if necessary for transport compliance.
+ #pod
+ #pod If the C<content> option is a code reference, it will be called iteratively
+ #pod to provide the content body of the request. It should return the empty
+ #pod string or undef when the iterator is exhausted.
+ #pod
+ #pod If the C<content> option is the empty string, no C<content-type> or
+ #pod C<content-length> headers will be generated.
+ #pod
+ #pod If the C<data_callback> option is provided, it will be called iteratively until
+ #pod the entire response body is received. The first argument will be a string
+ #pod containing a chunk of the response body, the second argument will be the
+ #pod in-progress response hash reference, as described below. (This allows
+ #pod customizing the action of the callback based on the C<status> or C<headers>
+ #pod received prior to the content body.)
+ #pod
+ #pod The C<request> method returns a hashref containing the response. The hashref
+ #pod will have the following keys:
+ #pod
+ #pod =for :list
+ #pod * C<success> —
+ #pod Boolean indicating whether the operation returned a 2XX status code
+ #pod * C<url> —
+ #pod URL that provided the response. This is the URL of the request unless
+ #pod there were redirections, in which case it is the last URL queried
+ #pod in a redirection chain
+ #pod * C<status> —
+ #pod The HTTP status code of the response
+ #pod * C<reason> —
+ #pod The response phrase returned by the server
+ #pod * C<content> —
+ #pod The body of the response. If the response does not have any content
+ #pod or if a data callback is provided to consume the response body,
+ #pod this will be the empty string
+ #pod * C<headers> —
+ #pod A hashref of header fields. All header field names will be normalized
+ #pod to be lower case. If a header is repeated, the value will be an arrayref;
+ #pod it will otherwise be a scalar string containing the value
+ #pod
+ #pod On an exception during the execution of the request, the C<status> field will
+ #pod contain 599, and the C<content> field will contain the text of the exception.
+ #pod
+ #pod =cut
+
+ my %idempotent = map { $_ => 1 } qw/GET HEAD PUT DELETE OPTIONS TRACE/;
+
+ sub request {
+ my ($self, $method, $url, $args) = @_;
+ @_ == 3 || (@_ == 4 && ref $args eq 'HASH')
+ or Carp::croak(q/Usage: $http->request(METHOD, URL, [HASHREF])/ . "\n");
+ $args ||= {}; # we keep some state in this during _request
+
+ # RFC 2616 Section 8.1.4 mandates a single retry on broken socket
+ my $response;
+ for ( 0 .. 1 ) {
+ $response = eval { $self->_request($method, $url, $args) };
+ last unless $@ && $idempotent{$method}
+ && $@ =~ m{^(?:Socket closed|Unexpected end)};
+ }
+
+ if (my $e = $@) {
+ # maybe we got a response hash thrown from somewhere deep
+ if ( ref $e eq 'HASH' && exists $e->{status} ) {
+ return $e;
+ }
+
+ # otherwise, stringify it
+ $e = "$e";
+ $response = {
+ url => $url,
+ success => q{},
+ status => 599,
+ reason => 'Internal Exception',
+ content => $e,
+ headers => {
+ 'content-type' => 'text/plain',
+ 'content-length' => length $e,
+ }
+ };
+ }
+ return $response;
+ }
+
+ #pod =method www_form_urlencode
+ #pod
+ #pod $params = $http->www_form_urlencode( $data );
+ #pod $response = $http->get("http://example.com/query?$params");
+ #pod
+ #pod This method converts the key/value pairs from a data hash or array reference
+ #pod into a C<x-www-form-urlencoded> string. The keys and values from the data
+ #pod reference will be UTF-8 encoded and escaped per RFC 3986. If a value is an
+ #pod array reference, the key will be repeated with each of the values of the array
+ #pod reference. If data is provided as a hash reference, the key/value pairs in the
+ #pod resulting string will be sorted by key and value for consistent ordering.
+ #pod
+ #pod =cut
+
+ sub www_form_urlencode {
+ my ($self, $data) = @_;
+ (@_ == 2 && ref $data)
+ or Carp::croak(q/Usage: $http->www_form_urlencode(DATAREF)/ . "\n");
+ (ref $data eq 'HASH' || ref $data eq 'ARRAY')
+ or Carp::croak("form data must be a hash or array reference\n");
+
+ my @params = ref $data eq 'HASH' ? %$data : @$data;
+ @params % 2 == 0
+ or Carp::croak("form data reference must have an even number of terms\n");
+
+ my @terms;
+ while( @params ) {
+ my ($key, $value) = splice(@params, 0, 2);
+ if ( ref $value eq 'ARRAY' ) {
+ unshift @params, map { $key => $_ } @$value;
+ }
+ else {
+ push @terms, join("=", map { $self->_uri_escape($_) } $key, $value);
+ }
+ }
+
+ return join("&", (ref $data eq 'ARRAY') ? (@terms) : (sort @terms) );
+ }
+
+ #pod =method can_ssl
+ #pod
+ #pod $ok = HTTP::Tiny->can_ssl;
+ #pod ($ok, $why) = HTTP::Tiny->can_ssl;
+ #pod ($ok, $why) = $http->can_ssl;
+ #pod
+ #pod Indicates if SSL support is available. When called as a class object, it
+ #pod checks for the correct version of L<Net::SSLeay> and L<IO::Socket::SSL>.
+ #pod When called as an object methods, if C<SSL_verify> is true or if C<SSL_verify_mode>
+ #pod is set in C<SSL_options>, it checks that a CA file is available.
+ #pod
+ #pod In scalar context, returns a boolean indicating if SSL is available.
+ #pod In list context, returns the boolean and a (possibly multi-line) string of
+ #pod errors indicating why SSL isn't available.
+ #pod
+ #pod =cut
+
+ sub can_ssl {
+ my ($self) = @_;
+
+ my($ok, $reason) = (1, '');
+
+ # Need IO::Socket::SSL 1.42 for SSL_create_ctx_callback
+ unless (eval {require IO::Socket::SSL; IO::Socket::SSL->VERSION(1.42)}) {
+ $ok = 0;
+ $reason .= qq/IO::Socket::SSL 1.42 must be installed for https support\n/;
+ }
+
+ # Need Net::SSLeay 1.49 for MODE_AUTO_RETRY
+ unless (eval {require Net::SSLeay; Net::SSLeay->VERSION(1.49)}) {
+ $ok = 0;
+ $reason .= qq/Net::SSLeay 1.49 must be installed for https support\n/;
+ }
+
+ # If an object, check that SSL config lets us get a CA if necessary
+ if ( ref($self) && ( $self->{verify_SSL} || $self->{SSL_options}{SSL_verify_mode} ) ) {
+ my $handle = HTTP::Tiny::Handle->new(
+ SSL_options => $self->{SSL_options},
+ verify_SSL => $self->{verify_SSL},
+ );
+ unless ( eval { $handle->_find_CA_file; 1 } ) {
+ $ok = 0;
+ $reason .= "$@";
+ }
+ }
+
+ wantarray ? ($ok, $reason) : $ok;
+ }
+
+ #--------------------------------------------------------------------------#
+ # private methods
+ #--------------------------------------------------------------------------#
+
+ my %DefaultPort = (
+ http => 80,
+ https => 443,
+ );
+
+ sub _agent {
+ my $class = ref($_[0]) || $_[0];
+ (my $default_agent = $class) =~ s{::}{-}g;
+ return $default_agent . "/" . $class->VERSION;
+ }
+
+ sub _request {
+ my ($self, $method, $url, $args) = @_;
+
+ my ($scheme, $host, $port, $path_query, $auth) = $self->_split_url($url);
+
+ my $request = {
+ method => $method,
+ scheme => $scheme,
+ host => $host,
+ port => $port,
+ host_port => ($port == $DefaultPort{$scheme} ? $host : "$host:$port"),
+ uri => $path_query,
+ headers => {},
+ };
+
+ # We remove the cached handle so it is not reused in the case of redirect.
+ # If all is well, it will be recached at the end of _request. We only
+ # reuse for the same scheme, host and port
+ my $handle = delete $self->{handle};
+ if ( $handle ) {
+ unless ( $handle->can_reuse( $scheme, $host, $port ) ) {
+ $handle->close;
+ undef $handle;
+ }
+ }
+ $handle ||= $self->_open_handle( $request, $scheme, $host, $port );
+
+ $self->_prepare_headers_and_cb($request, $args, $url, $auth);
+ $handle->write_request($request);
+
+ my $response;
+ do { $response = $handle->read_response_header }
+ until (substr($response->{status},0,1) ne '1');
+
+ $self->_update_cookie_jar( $url, $response ) if $self->{cookie_jar};
+
+ if ( my @redir_args = $self->_maybe_redirect($request, $response, $args) ) {
+ $handle->close;
+ return $self->_request(@redir_args, $args);
+ }
+
+ my $known_message_length;
+ if ($method eq 'HEAD' || $response->{status} =~ /^[23]04/) {
+ # response has no message body
+ $known_message_length = 1;
+ }
+ else {
+ my $data_cb = $self->_prepare_data_cb($response, $args);
+ $known_message_length = $handle->read_body($data_cb, $response);
+ }
+
+ if ( $self->{keep_alive}
+ && $known_message_length
+ && $response->{protocol} eq 'HTTP/1.1'
+ && ($response->{headers}{connection} || '') ne 'close'
+ ) {
+ $self->{handle} = $handle;
+ }
+ else {
+ $handle->close;
+ }
+
+ $response->{success} = substr( $response->{status}, 0, 1 ) eq '2';
+ $response->{url} = $url;
+ return $response;
+ }
+
+ sub _open_handle {
+ my ($self, $request, $scheme, $host, $port) = @_;
+
+ my $handle = HTTP::Tiny::Handle->new(
+ timeout => $self->{timeout},
+ SSL_options => $self->{SSL_options},
+ verify_SSL => $self->{verify_SSL},
+ local_address => $self->{local_address},
+ keep_alive => $self->{keep_alive}
+ );
+
+ if ($self->{_has_proxy}{$scheme} && ! grep { $host =~ /\Q$_\E$/ } @{$self->{no_proxy}}) {
+ return $self->_proxy_connect( $request, $handle );
+ }
+ else {
+ return $handle->connect($scheme, $host, $port);
+ }
+ }
+
+ sub _proxy_connect {
+ my ($self, $request, $handle) = @_;
+
+ my @proxy_vars;
+ if ( $request->{scheme} eq 'https' ) {
+ Carp::croak(qq{No https_proxy defined}) unless $self->{https_proxy};
+ @proxy_vars = $self->_split_proxy( https_proxy => $self->{https_proxy} );
+ if ( $proxy_vars[0] eq 'https' ) {
+ Carp::croak(qq{Can't proxy https over https: $request->{uri} via $self->{https_proxy}});
+ }
+ }
+ else {
+ Carp::croak(qq{No http_proxy defined}) unless $self->{http_proxy};
+ @proxy_vars = $self->_split_proxy( http_proxy => $self->{http_proxy} );
+ }
+
+ my ($p_scheme, $p_host, $p_port, $p_auth) = @proxy_vars;
+
+ if ( length $p_auth && ! defined $request->{headers}{'proxy-authorization'} ) {
+ $self->_add_basic_auth_header( $request, 'proxy-authorization' => $p_auth );
+ }
+
+ $handle->connect($p_scheme, $p_host, $p_port);
+
+ if ($request->{scheme} eq 'https') {
+ $self->_create_proxy_tunnel( $request, $handle );
+ }
+ else {
+ # non-tunneled proxy requires absolute URI
+ $request->{uri} = "$request->{scheme}://$request->{host_port}$request->{uri}";
+ }
+
+ return $handle;
+ }
+
+ sub _split_proxy {
+ my ($self, $type, $proxy) = @_;
+
+ my ($scheme, $host, $port, $path_query, $auth) = eval { $self->_split_url($proxy) };
+
+ unless(
+ defined($scheme) && length($scheme) && length($host) && length($port)
+ && $path_query eq '/'
+ ) {
+ Carp::croak(qq{$type URL must be in format http[s]://[auth@]<host>:<port>/\n});
+ }
+
+ return ($scheme, $host, $port, $auth);
+ }
+
+ sub _create_proxy_tunnel {
+ my ($self, $request, $handle) = @_;
+
+ $handle->_assert_ssl;
+
+ my $agent = exists($request->{headers}{'user-agent'})
+ ? $request->{headers}{'user-agent'} : $self->{agent};
+
+ my $connect_request = {
+ method => 'CONNECT',
+ uri => "$request->{host}:$request->{port}",
+ headers => {
+ host => "$request->{host}:$request->{port}",
+ 'user-agent' => $agent,
+ }
+ };
+
+ if ( $request->{headers}{'proxy-authorization'} ) {
+ $connect_request->{headers}{'proxy-authorization'} =
+ delete $request->{headers}{'proxy-authorization'};
+ }
+
+ $handle->write_request($connect_request);
+ my $response;
+ do { $response = $handle->read_response_header }
+ until (substr($response->{status},0,1) ne '1');
+
+ # if CONNECT failed, throw the response so it will be
+ # returned from the original request() method;
+ unless (substr($response->{status},0,1) eq '2') {
+ die $response;
+ }
+
+ # tunnel established, so start SSL handshake
+ $handle->start_ssl( $request->{host} );
+
+ return;
+ }
+
+ sub _prepare_headers_and_cb {
+ my ($self, $request, $args, $url, $auth) = @_;
+
+ for ($self->{default_headers}, $args->{headers}) {
+ next unless defined;
+ while (my ($k, $v) = each %$_) {
+ $request->{headers}{lc $k} = $v;
+ }
+ }
+
+ if (exists $request->{headers}{'host'}) {
+ die(qq/The 'Host' header must not be provided as header option\n/);
+ }
+
+ $request->{headers}{'host'} = $request->{host_port};
+ $request->{headers}{'user-agent'} ||= $self->{agent};
+ $request->{headers}{'connection'} = "close"
+ unless $self->{keep_alive};
+
+ if ( defined $args->{content} ) {
+ if (ref $args->{content} eq 'CODE') {
+ $request->{headers}{'content-type'} ||= "application/octet-stream";
+ $request->{headers}{'transfer-encoding'} = 'chunked'
+ unless $request->{headers}{'content-length'}
+ || $request->{headers}{'transfer-encoding'};
+ $request->{cb} = $args->{content};
+ }
+ elsif ( length $args->{content} ) {
+ my $content = $args->{content};
+ if ( $] ge '5.008' ) {
+ utf8::downgrade($content, 1)
+ or die(qq/Wide character in request message body\n/);
+ }
+ $request->{headers}{'content-type'} ||= "application/octet-stream";
+ $request->{headers}{'content-length'} = length $content
+ unless $request->{headers}{'content-length'}
+ || $request->{headers}{'transfer-encoding'};
+ $request->{cb} = sub { substr $content, 0, length $content, '' };
+ }
+ $request->{trailer_cb} = $args->{trailer_callback}
+ if ref $args->{trailer_callback} eq 'CODE';
+ }
+
+ ### If we have a cookie jar, then maybe add relevant cookies
+ if ( $self->{cookie_jar} ) {
+ my $cookies = $self->cookie_jar->cookie_header( $url );
+ $request->{headers}{cookie} = $cookies if length $cookies;
+ }
+
+ # if we have Basic auth parameters, add them
+ if ( length $auth && ! defined $request->{headers}{authorization} ) {
+ $self->_add_basic_auth_header( $request, 'authorization' => $auth );
+ }
+
+ return;
+ }
+
+ sub _add_basic_auth_header {
+ my ($self, $request, $header, $auth) = @_;
+ require MIME::Base64;
+ $request->{headers}{$header} =
+ "Basic " . MIME::Base64::encode_base64($auth, "");
+ return;
+ }
+
+ sub _prepare_data_cb {
+ my ($self, $response, $args) = @_;
+ my $data_cb = $args->{data_callback};
+ $response->{content} = '';
+
+ if (!$data_cb || $response->{status} !~ /^2/) {
+ if (defined $self->{max_size}) {
+ $data_cb = sub {
+ $_[1]->{content} .= $_[0];
+ die(qq/Size of response body exceeds the maximum allowed of $self->{max_size}\n/)
+ if length $_[1]->{content} > $self->{max_size};
+ };
+ }
+ else {
+ $data_cb = sub { $_[1]->{content} .= $_[0] };
+ }
+ }
+ return $data_cb;
+ }
+
+ sub _update_cookie_jar {
+ my ($self, $url, $response) = @_;
+
+ my $cookies = $response->{headers}->{'set-cookie'};
+ return unless defined $cookies;
+
+ my @cookies = ref $cookies ? @$cookies : $cookies;
+
+ $self->cookie_jar->add( $url, $_ ) for @cookies;
+
+ return;
+ }
+
+ sub _validate_cookie_jar {
+ my ($class, $jar) = @_;
+
+ # duck typing
+ for my $method ( qw/add cookie_header/ ) {
+ Carp::croak(qq/Cookie jar must provide the '$method' method\n/)
+ unless ref($jar) && ref($jar)->can($method);
+ }
+
+ return;
+ }
+
+ sub _maybe_redirect {
+ my ($self, $request, $response, $args) = @_;
+ my $headers = $response->{headers};
+ my ($status, $method) = ($response->{status}, $request->{method});
+ if (($status eq '303' or ($status =~ /^30[1278]/ && $method =~ /^GET|HEAD$/))
+ and $headers->{location}
+ and ++$args->{redirects} <= $self->{max_redirect}
+ ) {
+ my $location = ($headers->{location} =~ /^\//)
+ ? "$request->{scheme}://$request->{host_port}$headers->{location}"
+ : $headers->{location} ;
+ return (($status eq '303' ? 'GET' : $method), $location);
+ }
+ return;
+ }
+
+ sub _split_url {
+ my $url = pop;
+
+ # URI regex adapted from the URI module
+ my ($scheme, $host, $path_query) = $url =~ m<\A([^:/?#]+)://([^/?#]*)([^#]*)>
+ or die(qq/Cannot parse URL: '$url'\n/);
+
+ $scheme = lc $scheme;
+ $path_query = "/$path_query" unless $path_query =~ m<\A/>;
+
+ my $auth = '';
+ if ( (my $i = index $host, '@') != -1 ) {
+ # user:pass@host
+ $auth = substr $host, 0, $i, ''; # take up to the @ for auth
+ substr $host, 0, 1, ''; # knock the @ off the host
+
+ # userinfo might be percent escaped, so recover real auth info
+ $auth =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ }
+ my $port = $host =~ s/:(\d*)\z// && length $1 ? $1
+ : $scheme eq 'http' ? 80
+ : $scheme eq 'https' ? 443
+ : undef;
+
+ return ($scheme, (length $host ? lc $host : "localhost") , $port, $path_query, $auth);
+ }
+
+ # Date conversions adapted from HTTP::Date
+ my $DoW = "Sun|Mon|Tue|Wed|Thu|Fri|Sat";
+ my $MoY = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";
+ sub _http_date {
+ my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($_[1]);
+ return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
+ substr($DoW,$wday*4,3),
+ $mday, substr($MoY,$mon*4,3), $year+1900,
+ $hour, $min, $sec
+ );
+ }
+
+ sub _parse_http_date {
+ my ($self, $str) = @_;
+ require Time::Local;
+ my @tl_parts;
+ if ($str =~ /^[SMTWF][a-z]+, +(\d{1,2}) ($MoY) +(\d\d\d\d) +(\d\d):(\d\d):(\d\d) +GMT$/) {
+ @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3);
+ }
+ elsif ($str =~ /^[SMTWF][a-z]+, +(\d\d)-($MoY)-(\d{2,4}) +(\d\d):(\d\d):(\d\d) +GMT$/ ) {
+ @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3);
+ }
+ elsif ($str =~ /^[SMTWF][a-z]+ +($MoY) +(\d{1,2}) +(\d\d):(\d\d):(\d\d) +(?:[^0-9]+ +)?(\d\d\d\d)$/ ) {
+ @tl_parts = ($5, $4, $3, $2, (index($MoY,$1)/4), $6);
+ }
+ return eval {
+ my $t = @tl_parts ? Time::Local::timegm(@tl_parts) : -1;
+ $t < 0 ? undef : $t;
+ };
+ }
+
+ # URI escaping adapted from URI::Escape
+ # c.f. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
+ # perl 5.6 ready UTF-8 encoding adapted from JSON::PP
+ my %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255;
+ $escapes{' '}="+";
+ my $unsafe_char = qr/[^A-Za-z0-9\-\._~]/;
+
+ sub _uri_escape {
+ my ($self, $str) = @_;
+ if ( $] ge '5.008' ) {
+ utf8::encode($str);
+ }
+ else {
+ $str = pack("U*", unpack("C*", $str)) # UTF-8 encode a byte string
+ if ( length $str == do { use bytes; length $str } );
+ $str = pack("C*", unpack("C*", $str)); # clear UTF-8 flag
+ }
+ $str =~ s/($unsafe_char)/$escapes{$1}/ge;
+ return $str;
+ }
+
+ package
+ HTTP::Tiny::Handle; # hide from PAUSE/indexers
+ use strict;
+ use warnings;
+
+ use Errno qw[EINTR EPIPE];
+ use IO::Socket qw[SOCK_STREAM];
+
+ # PERL_HTTP_TINY_IPV4_ONLY is a private environment variable to force old
+ # behavior if someone is unable to boostrap CPAN from a new perl install; it is
+ # not intended for general, per-client use and may be removed in the future
+ my $SOCKET_CLASS =
+ $ENV{PERL_HTTP_TINY_IPV4_ONLY} ? 'IO::Socket::INET' :
+ eval { require IO::Socket::IP; IO::Socket::IP->VERSION(0.25) } ? 'IO::Socket::IP' :
+ 'IO::Socket::INET';
+
+ sub BUFSIZE () { 32768 } ## no critic
+
+ my $Printable = sub {
+ local $_ = shift;
+ s/\r/\\r/g;
+ s/\n/\\n/g;
+ s/\t/\\t/g;
+ s/([^\x20-\x7E])/sprintf('\\x%.2X', ord($1))/ge;
+ $_;
+ };
+
+ my $Token = qr/[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/;
+
+ sub new {
+ my ($class, %args) = @_;
+ return bless {
+ rbuf => '',
+ timeout => 60,
+ max_line_size => 16384,
+ max_header_lines => 64,
+ verify_SSL => 0,
+ SSL_options => {},
+ %args
+ }, $class;
+ }
+
+ sub connect {
+ @_ == 4 || die(q/Usage: $handle->connect(scheme, host, port)/ . "\n");
+ my ($self, $scheme, $host, $port) = @_;
+
+ if ( $scheme eq 'https' ) {
+ $self->_assert_ssl;
+ }
+ elsif ( $scheme ne 'http' ) {
+ die(qq/Unsupported URL scheme '$scheme'\n/);
+ }
+ $self->{fh} = $SOCKET_CLASS->new(
+ PeerHost => $host,
+ PeerPort => $port,
+ $self->{local_address} ?
+ ( LocalAddr => $self->{local_address} ) : (),
+ Proto => 'tcp',
+ Type => SOCK_STREAM,
+ Timeout => $self->{timeout},
+ KeepAlive => !!$self->{keep_alive}
+ ) or die(qq/Could not connect to '$host:$port': $@\n/);
+
+ binmode($self->{fh})
+ or die(qq/Could not binmode() socket: '$!'\n/);
+
+ $self->start_ssl($host) if $scheme eq 'https';
+
+ $self->{scheme} = $scheme;
+ $self->{host} = $host;
+ $self->{port} = $port;
+ $self->{pid} = $$;
+ $self->{tid} = _get_tid();
+
+ return $self;
+ }
+
+ sub start_ssl {
+ my ($self, $host) = @_;
+
+ # As this might be used via CONNECT after an SSL session
+ # to a proxy, we shut down any existing SSL before attempting
+ # the handshake
+ if ( ref($self->{fh}) eq 'IO::Socket::SSL' ) {
+ unless ( $self->{fh}->stop_SSL ) {
+ my $ssl_err = IO::Socket::SSL->errstr;
+ die(qq/Error halting prior SSL connection: $ssl_err/);
+ }
+ }
+
+ my $ssl_args = $self->_ssl_args($host);
+ IO::Socket::SSL->start_SSL(
+ $self->{fh},
+ %$ssl_args,
+ SSL_create_ctx_callback => sub {
+ my $ctx = shift;
+ Net::SSLeay::CTX_set_mode($ctx, Net::SSLeay::MODE_AUTO_RETRY());
+ },
+ );
+
+ unless ( ref($self->{fh}) eq 'IO::Socket::SSL' ) {
+ my $ssl_err = IO::Socket::SSL->errstr;
+ die(qq/SSL connection failed for $host: $ssl_err\n/);
+ }
+ }
+
+ sub close {
+ @_ == 1 || die(q/Usage: $handle->close()/ . "\n");
+ my ($self) = @_;
+ CORE::close($self->{fh})
+ or die(qq/Could not close socket: '$!'\n/);
+ }
+
+ sub write {
+ @_ == 2 || die(q/Usage: $handle->write(buf)/ . "\n");
+ my ($self, $buf) = @_;
+
+ if ( $] ge '5.008' ) {
+ utf8::downgrade($buf, 1)
+ or die(qq/Wide character in write()\n/);
+ }
+
+ my $len = length $buf;
+ my $off = 0;
+
+ local $SIG{PIPE} = 'IGNORE';
+
+ while () {
+ $self->can_write
+ or die(qq/Timed out while waiting for socket to become ready for writing\n/);
+ my $r = syswrite($self->{fh}, $buf, $len, $off);
+ if (defined $r) {
+ $len -= $r;
+ $off += $r;
+ last unless $len > 0;
+ }
+ elsif ($! == EPIPE) {
+ die(qq/Socket closed by remote server: $!\n/);
+ }
+ elsif ($! != EINTR) {
+ if ($self->{fh}->can('errstr')){
+ my $err = $self->{fh}->errstr();
+ die (qq/Could not write to SSL socket: '$err'\n /);
+ }
+ else {
+ die(qq/Could not write to socket: '$!'\n/);
+ }
+
+ }
+ }
+ return $off;
+ }
+
+ sub read {
+ @_ == 2 || @_ == 3 || die(q/Usage: $handle->read(len [, allow_partial])/ . "\n");
+ my ($self, $len, $allow_partial) = @_;
+
+ my $buf = '';
+ my $got = length $self->{rbuf};
+
+ if ($got) {
+ my $take = ($got < $len) ? $got : $len;
+ $buf = substr($self->{rbuf}, 0, $take, '');
+ $len -= $take;
+ }
+
+ while ($len > 0) {
+ $self->can_read
+ or die(q/Timed out while waiting for socket to become ready for reading/ . "\n");
+ my $r = sysread($self->{fh}, $buf, $len, length $buf);
+ if (defined $r) {
+ last unless $r;
+ $len -= $r;
+ }
+ elsif ($! != EINTR) {
+ if ($self->{fh}->can('errstr')){
+ my $err = $self->{fh}->errstr();
+ die (qq/Could not read from SSL socket: '$err'\n /);
+ }
+ else {
+ die(qq/Could not read from socket: '$!'\n/);
+ }
+ }
+ }
+ if ($len && !$allow_partial) {
+ die(qq/Unexpected end of stream\n/);
+ }
+ return $buf;
+ }
+
+ sub readline {
+ @_ == 1 || die(q/Usage: $handle->readline()/ . "\n");
+ my ($self) = @_;
+
+ while () {
+ if ($self->{rbuf} =~ s/\A ([^\x0D\x0A]* \x0D?\x0A)//x) {
+ return $1;
+ }
+ if (length $self->{rbuf} >= $self->{max_line_size}) {
+ die(qq/Line size exceeds the maximum allowed size of $self->{max_line_size}\n/);
+ }
+ $self->can_read
+ or die(qq/Timed out while waiting for socket to become ready for reading\n/);
+ my $r = sysread($self->{fh}, $self->{rbuf}, BUFSIZE, length $self->{rbuf});
+ if (defined $r) {
+ last unless $r;
+ }
+ elsif ($! != EINTR) {
+ if ($self->{fh}->can('errstr')){
+ my $err = $self->{fh}->errstr();
+ die (qq/Could not read from SSL socket: '$err'\n /);
+ }
+ else {
+ die(qq/Could not read from socket: '$!'\n/);
+ }
+ }
+ }
+ die(qq/Unexpected end of stream while looking for line\n/);
+ }
+
+ sub read_header_lines {
+ @_ == 1 || @_ == 2 || die(q/Usage: $handle->read_header_lines([headers])/ . "\n");
+ my ($self, $headers) = @_;
+ $headers ||= {};
+ my $lines = 0;
+ my $val;
+
+ while () {
+ my $line = $self->readline;
+
+ if (++$lines >= $self->{max_header_lines}) {
+ die(qq/Header lines exceeds maximum number allowed of $self->{max_header_lines}\n/);
+ }
+ elsif ($line =~ /\A ([^\x00-\x1F\x7F:]+) : [\x09\x20]* ([^\x0D\x0A]*)/x) {
+ my ($field_name) = lc $1;
+ if (exists $headers->{$field_name}) {
+ for ($headers->{$field_name}) {
+ $_ = [$_] unless ref $_ eq "ARRAY";
+ push @$_, $2;
+ $val = \$_->[-1];
+ }
+ }
+ else {
+ $val = \($headers->{$field_name} = $2);
+ }
+ }
+ elsif ($line =~ /\A [\x09\x20]+ ([^\x0D\x0A]*)/x) {
+ $val
+ or die(qq/Unexpected header continuation line\n/);
+ next unless length $1;
+ $$val .= ' ' if length $$val;
+ $$val .= $1;
+ }
+ elsif ($line =~ /\A \x0D?\x0A \z/x) {
+ last;
+ }
+ else {
+ die(q/Malformed header line: / . $Printable->($line) . "\n");
+ }
+ }
+ return $headers;
+ }
+
+ sub write_request {
+ @_ == 2 || die(q/Usage: $handle->write_request(request)/ . "\n");
+ my($self, $request) = @_;
+ $self->write_request_header(@{$request}{qw/method uri headers/});
+ $self->write_body($request) if $request->{cb};
+ return;
+ }
+
+ my %HeaderCase = (
+ 'content-md5' => 'Content-MD5',
+ 'etag' => 'ETag',
+ 'te' => 'TE',
+ 'www-authenticate' => 'WWW-Authenticate',
+ 'x-xss-protection' => 'X-XSS-Protection',
+ );
+
+ # to avoid multiple small writes and hence nagle, you can pass the method line or anything else to
+ # combine writes.
+ sub write_header_lines {
+ (@_ == 2 || @_ == 3 && ref $_[1] eq 'HASH') || die(q/Usage: $handle->write_header_lines(headers[,prefix])/ . "\n");
+ my($self, $headers, $prefix_data) = @_;
+
+ my $buf = (defined $prefix_data ? $prefix_data : '');
+ while (my ($k, $v) = each %$headers) {
+ my $field_name = lc $k;
+ if (exists $HeaderCase{$field_name}) {
+ $field_name = $HeaderCase{$field_name};
+ }
+ else {
+ $field_name =~ /\A $Token+ \z/xo
+ or die(q/Invalid HTTP header field name: / . $Printable->($field_name) . "\n");
+ $field_name =~ s/\b(\w)/\u$1/g;
+ $HeaderCase{lc $field_name} = $field_name;
+ }
+ for (ref $v eq 'ARRAY' ? @$v : $v) {
+ $_ = '' unless defined $_;
+ $buf .= "$field_name: $_\x0D\x0A";
+ }
+ }
+ $buf .= "\x0D\x0A";
+ return $self->write($buf);
+ }
+
+ # return value indicates whether message length was defined; this is generally
+ # true unless there was no content-length header and we just read until EOF.
+ # Other message length errors are thrown as exceptions
+ sub read_body {
+ @_ == 3 || die(q/Usage: $handle->read_body(callback, response)/ . "\n");
+ my ($self, $cb, $response) = @_;
+ my $te = $response->{headers}{'transfer-encoding'} || '';
+ my $chunked = grep { /chunked/i } ( ref $te eq 'ARRAY' ? @$te : $te ) ;
+ return $chunked
+ ? $self->read_chunked_body($cb, $response)
+ : $self->read_content_body($cb, $response);
+ }
+
+ sub write_body {
+ @_ == 2 || die(q/Usage: $handle->write_body(request)/ . "\n");
+ my ($self, $request) = @_;
+ if ($request->{headers}{'content-length'}) {
+ return $self->write_content_body($request);
+ }
+ else {
+ return $self->write_chunked_body($request);
+ }
+ }
+
+ sub read_content_body {
+ @_ == 3 || @_ == 4 || die(q/Usage: $handle->read_content_body(callback, response, [read_length])/ . "\n");
+ my ($self, $cb, $response, $content_length) = @_;
+ $content_length ||= $response->{headers}{'content-length'};
+
+ if ( defined $content_length ) {
+ my $len = $content_length;
+ while ($len > 0) {
+ my $read = ($len > BUFSIZE) ? BUFSIZE : $len;
+ $cb->($self->read($read, 0), $response);
+ $len -= $read;
+ }
+ return length($self->{rbuf}) == 0;
+ }
+
+ my $chunk;
+ $cb->($chunk, $response) while length( $chunk = $self->read(BUFSIZE, 1) );
+
+ return;
+ }
+
+ sub write_content_body {
+ @_ == 2 || die(q/Usage: $handle->write_content_body(request)/ . "\n");
+ my ($self, $request) = @_;
+
+ my ($len, $content_length) = (0, $request->{headers}{'content-length'});
+ while () {
+ my $data = $request->{cb}->();
+
+ defined $data && length $data
+ or last;
+
+ if ( $] ge '5.008' ) {
+ utf8::downgrade($data, 1)
+ or die(qq/Wide character in write_content()\n/);
+ }
+
+ $len += $self->write($data);
+ }
+
+ $len == $content_length
+ or die(qq/Content-Length mismatch (got: $len expected: $content_length)\n/);
+
+ return $len;
+ }
+
+ sub read_chunked_body {
+ @_ == 3 || die(q/Usage: $handle->read_chunked_body(callback, $response)/ . "\n");
+ my ($self, $cb, $response) = @_;
+
+ while () {
+ my $head = $self->readline;
+
+ $head =~ /\A ([A-Fa-f0-9]+)/x
+ or die(q/Malformed chunk head: / . $Printable->($head) . "\n");
+
+ my $len = hex($1)
+ or last;
+
+ $self->read_content_body($cb, $response, $len);
+
+ $self->read(2) eq "\x0D\x0A"
+ or die(qq/Malformed chunk: missing CRLF after chunk data\n/);
+ }
+ $self->read_header_lines($response->{headers});
+ return 1;
+ }
+
+ sub write_chunked_body {
+ @_ == 2 || die(q/Usage: $handle->write_chunked_body(request)/ . "\n");
+ my ($self, $request) = @_;
+
+ my $len = 0;
+ while () {
+ my $data = $request->{cb}->();
+
+ defined $data && length $data
+ or last;
+
+ if ( $] ge '5.008' ) {
+ utf8::downgrade($data, 1)
+ or die(qq/Wide character in write_chunked_body()\n/);
+ }
+
+ $len += length $data;
+
+ my $chunk = sprintf '%X', length $data;
+ $chunk .= "\x0D\x0A";
+ $chunk .= $data;
+ $chunk .= "\x0D\x0A";
+
+ $self->write($chunk);
+ }
+ $self->write("0\x0D\x0A");
+ $self->write_header_lines($request->{trailer_cb}->())
+ if ref $request->{trailer_cb} eq 'CODE';
+ return $len;
+ }
+
+ sub read_response_header {
+ @_ == 1 || die(q/Usage: $handle->read_response_header()/ . "\n");
+ my ($self) = @_;
+
+ my $line = $self->readline;
+
+ $line =~ /\A (HTTP\/(0*\d+\.0*\d+)) [\x09\x20]+ ([0-9]{3}) [\x09\x20]+ ([^\x0D\x0A]*) \x0D?\x0A/x
+ or die(q/Malformed Status-Line: / . $Printable->($line). "\n");
+
+ my ($protocol, $version, $status, $reason) = ($1, $2, $3, $4);
+
+ die (qq/Unsupported HTTP protocol: $protocol\n/)
+ unless $version =~ /0*1\.0*[01]/;
+
+ return {
+ status => $status,
+ reason => $reason,
+ headers => $self->read_header_lines,
+ protocol => $protocol,
+ };
+ }
+
+ sub write_request_header {
+ @_ == 4 || die(q/Usage: $handle->write_request_header(method, request_uri, headers)/ . "\n");
+ my ($self, $method, $request_uri, $headers) = @_;
+
+ return $self->write_header_lines($headers, "$method $request_uri HTTP/1.1\x0D\x0A");
+ }
+
+ sub _do_timeout {
+ my ($self, $type, $timeout) = @_;
+ $timeout = $self->{timeout}
+ unless defined $timeout && $timeout >= 0;
+
+ my $fd = fileno $self->{fh};
+ defined $fd && $fd >= 0
+ or die(qq/select(2): 'Bad file descriptor'\n/);
+
+ my $initial = time;
+ my $pending = $timeout;
+ my $nfound;
+
+ vec(my $fdset = '', $fd, 1) = 1;
+
+ while () {
+ $nfound = ($type eq 'read')
+ ? select($fdset, undef, undef, $pending)
+ : select(undef, $fdset, undef, $pending) ;
+ if ($nfound == -1) {
+ $! == EINTR
+ or die(qq/select(2): '$!'\n/);
+ redo if !$timeout || ($pending = $timeout - (time - $initial)) > 0;
+ $nfound = 0;
+ }
+ last;
+ }
+ $! = 0;
+ return $nfound;
+ }
+
+ sub can_read {
+ @_ == 1 || @_ == 2 || die(q/Usage: $handle->can_read([timeout])/ . "\n");
+ my $self = shift;
+ if ( ref($self->{fh}) eq 'IO::Socket::SSL' ) {
+ return 1 if $self->{fh}->pending;
+ }
+ return $self->_do_timeout('read', @_)
+ }
+
+ sub can_write {
+ @_ == 1 || @_ == 2 || die(q/Usage: $handle->can_write([timeout])/ . "\n");
+ my $self = shift;
+ return $self->_do_timeout('write', @_)
+ }
+
+ sub _assert_ssl {
+ my($ok, $reason) = HTTP::Tiny->can_ssl();
+ die $reason unless $ok;
+ }
+
+ sub can_reuse {
+ my ($self,$scheme,$host,$port) = @_;
+ return 0 if
+ $self->{pid} != $$
+ || $self->{tid} != _get_tid()
+ || length($self->{rbuf})
+ || $scheme ne $self->{scheme}
+ || $host ne $self->{host}
+ || $port ne $self->{port}
+ || eval { $self->can_read(0) }
+ || $@ ;
+ return 1;
+ }
+
+ # Try to find a CA bundle to validate the SSL cert,
+ # prefer Mozilla::CA or fallback to a system file
+ sub _find_CA_file {
+ my $self = shift();
+
+ if ( $self->{SSL_options}->{SSL_ca_file} ) {
+ unless ( -r $self->{SSL_options}->{SSL_ca_file} ) {
+ die qq/SSL_ca_file '$self->{SSL_options}->{SSL_ca_file}' not found or not readable\n/;
+ }
+ return $self->{SSL_options}->{SSL_ca_file};
+ }
+
+ return Mozilla::CA::SSL_ca_file()
+ if eval { require Mozilla::CA; 1 };
+
+ # cert list copied from golang src/crypto/x509/root_unix.go
+ foreach my $ca_bundle (
+ "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc.
+ "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL
+ "/etc/ssl/ca-bundle.pem", # OpenSUSE
+ "/etc/openssl/certs/ca-certificates.crt", # NetBSD
+ "/etc/ssl/cert.pem", # OpenBSD
+ "/usr/local/share/certs/ca-root-nss.crt", # FreeBSD/DragonFly
+ "/etc/pki/tls/cacert.pem", # OpenELEC
+ "/etc/certs/ca-certificates.crt", # Solaris 11.2+
+ ) {
+ return $ca_bundle if -e $ca_bundle;
+ }
+
+ die qq/Couldn't find a CA bundle with which to verify the SSL certificate.\n/
+ . qq/Try installing Mozilla::CA from CPAN\n/;
+ }
+
+ # for thread safety, we need to know thread id if threads are loaded
+ sub _get_tid {
+ no warnings 'reserved'; # for 'threads'
+ return threads->can("tid") ? threads->tid : 0;
+ }
+
+ sub _ssl_args {
+ my ($self, $host) = @_;
+
+ my %ssl_args;
+
+ # This test reimplements IO::Socket::SSL::can_client_sni(), which wasn't
+ # added until IO::Socket::SSL 1.84
+ if ( Net::SSLeay::OPENSSL_VERSION_NUMBER() >= 0x01000000 ) {
+ $ssl_args{SSL_hostname} = $host, # Sane SNI support
+ }
+
+ if ($self->{verify_SSL}) {
+ $ssl_args{SSL_verifycn_scheme} = 'http'; # enable CN validation
+ $ssl_args{SSL_verifycn_name} = $host; # set validation hostname
+ $ssl_args{SSL_verify_mode} = 0x01; # enable cert validation
+ $ssl_args{SSL_ca_file} = $self->_find_CA_file;
+ }
+ else {
+ $ssl_args{SSL_verifycn_scheme} = 'none'; # disable CN validation
+ $ssl_args{SSL_verify_mode} = 0x00; # disable cert validation
+ }
+
+ # user options override settings from verify_SSL
+ for my $k ( keys %{$self->{SSL_options}} ) {
+ $ssl_args{$k} = $self->{SSL_options}{$k} if $k =~ m/^SSL_/;
+ }
+
+ return \%ssl_args;
+ }
+
+ 1;
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ HTTP::Tiny - A small, simple, correct HTTP/1.1 client
+
+ =head1 VERSION
+
+ version 0.056
+
+ =head1 SYNOPSIS
+
+ use HTTP::Tiny;
+
+ my $response = HTTP::Tiny->new->get('http://example.com/');
+
+ die "Failed!\n" unless $response->{success};
+
+ print "$response->{status} $response->{reason}\n";
+
+ while (my ($k, $v) = each %{$response->{headers}}) {
+ for (ref $v eq 'ARRAY' ? @$v : $v) {
+ print "$k: $_\n";
+ }
+ }
+
+ print $response->{content} if length $response->{content};
+
+ =head1 DESCRIPTION
+
+ This is a very simple HTTP/1.1 client, designed for doing simple
+ requests without the overhead of a large framework like L<LWP::UserAgent>.
+
+ It is more correct and more complete than L<HTTP::Lite>. It supports
+ proxies and redirection. It also correctly resumes after EINTR.
+
+ If L<IO::Socket::IP> 0.25 or later is installed, HTTP::Tiny will use it instead
+ of L<IO::Socket::INET> for transparent support for both IPv4 and IPv6.
+
+ Cookie support requires L<HTTP::CookieJar> or an equivalent class.
+
+ =head1 METHODS
+
+ =head2 new
+
+ $http = HTTP::Tiny->new( %attributes );
+
+ This constructor returns a new HTTP::Tiny object. Valid attributes include:
+
+ =over 4
+
+ =item *
+
+ C<agent> — A user-agent string (defaults to 'HTTP-Tiny/$VERSION'). If C<agent> — ends in a space character, the default user-agent string is appended.
+
+ =item *
+
+ C<cookie_jar> — An instance of L<HTTP::CookieJar> — or equivalent class that supports the C<add> and C<cookie_header> methods
+
+ =item *
+
+ C<default_headers> — A hashref of default headers to apply to requests
+
+ =item *
+
+ C<local_address> — The local IP address to bind to
+
+ =item *
+
+ C<keep_alive> — Whether to reuse the last connection (if for the same scheme, host and port) (defaults to 1)
+
+ =item *
+
+ C<max_redirect> — Maximum number of redirects allowed (defaults to 5)
+
+ =item *
+
+ C<max_size> — Maximum response size in bytes (only when not using a data callback). If defined, responses larger than this will return an exception.
+
+ =item *
+
+ C<http_proxy> — URL of a proxy server to use for HTTP connections (default is C<$ENV{http_proxy}> — if set)
+
+ =item *
+
+ C<https_proxy> — URL of a proxy server to use for HTTPS connections (default is C<$ENV{https_proxy}> — if set)
+
+ =item *
+
+ C<proxy> — URL of a generic proxy server for both HTTP and HTTPS connections (default is C<$ENV{all_proxy}> — if set)
+
+ =item *
+
+ C<no_proxy> — List of domain suffixes that should not be proxied. Must be a comma-separated string or an array reference. (default is C<$ENV{no_proxy}> —)
+
+ =item *
+
+ C<timeout> — Request timeout in seconds (default is 60)
+
+ =item *
+
+ C<verify_SSL> — A boolean that indicates whether to validate the SSL certificate of an C<https> — connection (default is false)
+
+ =item *
+
+ C<SSL_options> — A hashref of C<SSL_*> — options to pass through to L<IO::Socket::SSL>
+
+ =back
+
+ Passing an explicit C<undef> for C<proxy>, C<http_proxy> or C<https_proxy> will
+ prevent getting the corresponding proxies from the environment.
+
+ Exceptions from C<max_size>, C<timeout> or other errors will result in a
+ pseudo-HTTP status code of 599 and a reason of "Internal Exception". The
+ content field in the response will contain the text of the exception.
+
+ The C<keep_alive> parameter enables a persistent connection, but only to a
+ single destination scheme, host and port. Also, if any connection-relevant
+ attributes are modified, or if the process ID or thread ID change, the
+ persistent connection will be dropped. If you want persistent connections
+ across multiple destinations, use multiple HTTP::Tiny objects.
+
+ See L</SSL SUPPORT> for more on the C<verify_SSL> and C<SSL_options> attributes.
+
+ =head2 get|head|put|post|delete
+
+ $response = $http->get($url);
+ $response = $http->get($url, \%options);
+ $response = $http->head($url);
+
+ These methods are shorthand for calling C<request()> for the given method. The
+ URL must have unsafe characters escaped and international domain names encoded.
+ See C<request()> for valid options and a description of the response.
+
+ The C<success> field of the response will be true if the status code is 2XX.
+
+ =head2 post_form
+
+ $response = $http->post_form($url, $form_data);
+ $response = $http->post_form($url, $form_data, \%options);
+
+ This method executes a C<POST> request and sends the key/value pairs from a
+ form data hash or array reference to the given URL with a C<content-type> of
+ C<application/x-www-form-urlencoded>. If data is provided as an array
+ reference, the order is preserved; if provided as a hash reference, the terms
+ are sorted on key and value for consistency. See documentation for the
+ C<www_form_urlencode> method for details on the encoding.
+
+ The URL must have unsafe characters escaped and international domain names
+ encoded. See C<request()> for valid options and a description of the response.
+ Any C<content-type> header or content in the options hashref will be ignored.
+
+ The C<success> field of the response will be true if the status code is 2XX.
+
+ =head2 mirror
+
+ $response = $http->mirror($url, $file, \%options)
+ if ( $response->{success} ) {
+ print "$file is up to date\n";
+ }
+
+ Executes a C<GET> request for the URL and saves the response body to the file
+ name provided. The URL must have unsafe characters escaped and international
+ domain names encoded. If the file already exists, the request will include an
+ C<If-Modified-Since> header with the modification timestamp of the file. You
+ may specify a different C<If-Modified-Since> header yourself in the C<<
+ $options->{headers} >> hash.
+
+ The C<success> field of the response will be true if the status code is 2XX
+ or if the status code is 304 (unmodified).
+
+ If the file was modified and the server response includes a properly
+ formatted C<Last-Modified> header, the file modification time will
+ be updated accordingly.
+
+ =head2 request
+
+ $response = $http->request($method, $url);
+ $response = $http->request($method, $url, \%options);
+
+ Executes an HTTP request of the given method type ('GET', 'HEAD', 'POST',
+ 'PUT', etc.) on the given URL. The URL must have unsafe characters escaped and
+ international domain names encoded.
+
+ If the URL includes a "user:password" stanza, they will be used for Basic-style
+ authorization headers. (Authorization headers will not be included in a
+ redirected request.) For example:
+
+ $http->request('GET', 'http://Aladdin:open sesame@example.com/');
+
+ If the "user:password" stanza contains reserved characters, they must
+ be percent-escaped:
+
+ $http->request('GET', 'http://john%40example.com:password@example.com/');
+
+ A hashref of options may be appended to modify the request.
+
+ Valid options are:
+
+ =over 4
+
+ =item *
+
+ C<headers> — A hashref containing headers to include with the request. If the value for a header is an array reference, the header will be output multiple times with each value in the array. These headers over-write any default headers.
+
+ =item *
+
+ C<content> — A scalar to include as the body of the request OR a code reference that will be called iteratively to produce the body of the request
+
+ =item *
+
+ C<trailer_callback> — A code reference that will be called if it exists to provide a hashref of trailing headers (only used with chunked transfer-encoding)
+
+ =item *
+
+ C<data_callback> — A code reference that will be called for each chunks of the response body received.
+
+ =back
+
+ The C<Host> header is generated from the URL in accordance with RFC 2616. It
+ is a fatal error to specify C<Host> in the C<headers> option. Other headers
+ may be ignored or overwritten if necessary for transport compliance.
+
+ If the C<content> option is a code reference, it will be called iteratively
+ to provide the content body of the request. It should return the empty
+ string or undef when the iterator is exhausted.
+
+ If the C<content> option is the empty string, no C<content-type> or
+ C<content-length> headers will be generated.
+
+ If the C<data_callback> option is provided, it will be called iteratively until
+ the entire response body is received. The first argument will be a string
+ containing a chunk of the response body, the second argument will be the
+ in-progress response hash reference, as described below. (This allows
+ customizing the action of the callback based on the C<status> or C<headers>
+ received prior to the content body.)
+
+ The C<request> method returns a hashref containing the response. The hashref
+ will have the following keys:
+
+ =over 4
+
+ =item *
+
+ C<success> — Boolean indicating whether the operation returned a 2XX status code
+
+ =item *
+
+ C<url> — URL that provided the response. This is the URL of the request unless there were redirections, in which case it is the last URL queried in a redirection chain
+
+ =item *
+
+ C<status> — The HTTP status code of the response
+
+ =item *
+
+ C<reason> — The response phrase returned by the server
+
+ =item *
+
+ C<content> — The body of the response. If the response does not have any content or if a data callback is provided to consume the response body, this will be the empty string
+
+ =item *
+
+ C<headers> — A hashref of header fields. All header field names will be normalized to be lower case. If a header is repeated, the value will be an arrayref; it will otherwise be a scalar string containing the value
+
+ =back
+
+ On an exception during the execution of the request, the C<status> field will
+ contain 599, and the C<content> field will contain the text of the exception.
+
+ =head2 www_form_urlencode
+
+ $params = $http->www_form_urlencode( $data );
+ $response = $http->get("http://example.com/query?$params");
+
+ This method converts the key/value pairs from a data hash or array reference
+ into a C<x-www-form-urlencoded> string. The keys and values from the data
+ reference will be UTF-8 encoded and escaped per RFC 3986. If a value is an
+ array reference, the key will be repeated with each of the values of the array
+ reference. If data is provided as a hash reference, the key/value pairs in the
+ resulting string will be sorted by key and value for consistent ordering.
+
+ =head2 can_ssl
+
+ $ok = HTTP::Tiny->can_ssl;
+ ($ok, $why) = HTTP::Tiny->can_ssl;
+ ($ok, $why) = $http->can_ssl;
+
+ Indicates if SSL support is available. When called as a class object, it
+ checks for the correct version of L<Net::SSLeay> and L<IO::Socket::SSL>.
+ When called as an object methods, if C<SSL_verify> is true or if C<SSL_verify_mode>
+ is set in C<SSL_options>, it checks that a CA file is available.
+
+ In scalar context, returns a boolean indicating if SSL is available.
+ In list context, returns the boolean and a (possibly multi-line) string of
+ errors indicating why SSL isn't available.
+
+ =for Pod::Coverage SSL_options
+ agent
+ cookie_jar
+ default_headers
+ http_proxy
+ https_proxy
+ keep_alive
+ local_address
+ max_redirect
+ max_size
+ no_proxy
+ proxy
+ timeout
+ verify_SSL
+
+ =head1 SSL SUPPORT
+
+ Direct C<https> connections are supported only if L<IO::Socket::SSL> 1.56 or
+ greater and L<Net::SSLeay> 1.49 or greater are installed. An exception will be
+ thrown if new enough versions of these modules are not installed or if the SSL
+ encryption fails. You can also use C<HTTP::Tiny::can_ssl()> utility function
+ that returns boolean to see if the required modules are installed.
+
+ An C<https> connection may be made via an C<http> proxy that supports the CONNECT
+ command (i.e. RFC 2817). You may not proxy C<https> via a proxy that itself
+ requires C<https> to communicate.
+
+ SSL provides two distinct capabilities:
+
+ =over 4
+
+ =item *
+
+ Encrypted communication channel
+
+ =item *
+
+ Verification of server identity
+
+ =back
+
+ B<By default, HTTP::Tiny does not verify server identity>.
+
+ Server identity verification is controversial and potentially tricky because it
+ depends on a (usually paid) third-party Certificate Authority (CA) trust model
+ to validate a certificate as legitimate. This discriminates against servers
+ with self-signed certificates or certificates signed by free, community-driven
+ CA's such as L<CAcert.org|http://cacert.org>.
+
+ By default, HTTP::Tiny does not make any assumptions about your trust model,
+ threat level or risk tolerance. It just aims to give you an encrypted channel
+ when you need one.
+
+ Setting the C<verify_SSL> attribute to a true value will make HTTP::Tiny verify
+ that an SSL connection has a valid SSL certificate corresponding to the host
+ name of the connection and that the SSL certificate has been verified by a CA.
+ Assuming you trust the CA, this will protect against a L<man-in-the-middle
+ attack|http://en.wikipedia.org/wiki/Man-in-the-middle_attack>. If you are
+ concerned about security, you should enable this option.
+
+ Certificate verification requires a file containing trusted CA certificates.
+ If the L<Mozilla::CA> module is installed, HTTP::Tiny will use the CA file
+ included with it as a source of trusted CA's. (This means you trust Mozilla,
+ the author of Mozilla::CA, the CPAN mirror where you got Mozilla::CA, the
+ toolchain used to install it, and your operating system security, right?)
+
+ If that module is not available, then HTTP::Tiny will search several
+ system-specific default locations for a CA certificate file:
+
+ =over 4
+
+ =item *
+
+ /etc/ssl/certs/ca-certificates.crt
+
+ =item *
+
+ /etc/pki/tls/certs/ca-bundle.crt
+
+ =item *
+
+ /etc/ssl/ca-bundle.pem
+
+ =back
+
+ An exception will be raised if C<verify_SSL> is true and no CA certificate file
+ is available.
+
+ If you desire complete control over SSL connections, the C<SSL_options> attribute
+ lets you provide a hash reference that will be passed through to
+ C<IO::Socket::SSL::start_SSL()>, overriding any options set by HTTP::Tiny. For
+ example, to provide your own trusted CA file:
+
+ SSL_options => {
+ SSL_ca_file => $file_path,
+ }
+
+ The C<SSL_options> attribute could also be used for such things as providing a
+ client certificate for authentication to a server or controlling the choice of
+ cipher used for the SSL connection. See L<IO::Socket::SSL> documentation for
+ details.
+
+ =head1 PROXY SUPPORT
+
+ HTTP::Tiny can proxy both C<http> and C<https> requests. Only Basic proxy
+ authorization is supported and it must be provided as part of the proxy URL:
+ C<http://user:pass@proxy.example.com/>.
+
+ HTTP::Tiny supports the following proxy environment variables:
+
+ =over 4
+
+ =item *
+
+ http_proxy or HTTP_PROXY
+
+ =item *
+
+ https_proxy or HTTPS_PROXY
+
+ =item *
+
+ all_proxy or ALL_PROXY
+
+ =back
+
+ If the C<REQUEST_METHOD> environment variable is set, then this might be a CGI
+ process and C<HTTP_PROXY> would be set from the C<Proxy:> header, which is a
+ security risk. If C<REQUEST_METHOD> is set, C<HTTP_PROXY> (the upper case
+ variant only) is ignored.
+
+ Tunnelling C<https> over an C<http> proxy using the CONNECT method is
+ supported. If your proxy uses C<https> itself, you can not tunnel C<https>
+ over it.
+
+ Be warned that proxying an C<https> connection opens you to the risk of a
+ man-in-the-middle attack by the proxy server.
+
+ The C<no_proxy> environment variable is supported in the format of a
+ comma-separated list of domain extensions proxy should not be used for.
+
+ Proxy arguments passed to C<new> will override their corresponding
+ environment variables.
+
+ =head1 LIMITATIONS
+
+ HTTP::Tiny is I<conditionally compliant> with the
+ L<HTTP/1.1 specifications|http://www.w3.org/Protocols/>:
+
+ =over 4
+
+ =item *
+
+ "Message Syntax and Routing" [RFC7230]
+
+ =item *
+
+ "Semantics and Content" [RFC7231]
+
+ =item *
+
+ "Conditional Requests" [RFC7232]
+
+ =item *
+
+ "Range Requests" [RFC7233]
+
+ =item *
+
+ "Caching" [RFC7234]
+
+ =item *
+
+ "Authentication" [RFC7235]
+
+ =back
+
+ It attempts to meet all "MUST" requirements of the specification, but does not
+ implement all "SHOULD" requirements. (Note: it was developed against the
+ earlier RFC 2616 specification and may not yet meet the revised RFC 7230-7235
+ spec.)
+
+ Some particular limitations of note include:
+
+ =over
+
+ =item *
+
+ HTTP::Tiny focuses on correct transport. Users are responsible for ensuring
+ that user-defined headers and content are compliant with the HTTP/1.1
+ specification.
+
+ =item *
+
+ Users must ensure that URLs are properly escaped for unsafe characters and that
+ international domain names are properly encoded to ASCII. See L<URI::Escape>,
+ L<URI::_punycode> and L<Net::IDN::Encode>.
+
+ =item *
+
+ Redirection is very strict against the specification. Redirection is only
+ automatic for response codes 301, 302, 307 and 308 if the request method is
+ 'GET' or 'HEAD'. Response code 303 is always converted into a 'GET'
+ redirection, as mandated by the specification. There is no automatic support
+ for status 305 ("Use proxy") redirections.
+
+ =item *
+
+ There is no provision for delaying a request body using an C<Expect> header.
+ Unexpected C<1XX> responses are silently ignored as per the specification.
+
+ =item *
+
+ Only 'chunked' C<Transfer-Encoding> is supported.
+
+ =item *
+
+ There is no support for a Request-URI of '*' for the 'OPTIONS' request.
+
+ =back
+
+ Despite the limitations listed above, HTTP::Tiny is considered
+ feature-complete. New feature requests should be directed to
+ L<HTTP::Tiny::UA>.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ L<HTTP::Tiny::UA> - Higher level UA features for HTTP::Tiny
+
+ =item *
+
+ L<HTTP::Thin> - HTTP::Tiny wrapper with L<HTTP::Request>/L<HTTP::Response> compatibility
+
+ =item *
+
+ L<HTTP::Tiny::Mech> - Wrap L<WWW::Mechanize> instance in HTTP::Tiny compatible interface
+
+ =item *
+
+ L<IO::Socket::IP> - Required for IPv6 support
+
+ =item *
+
+ L<IO::Socket::SSL> - Required for SSL support
+
+ =item *
+
+ L<LWP::UserAgent> - If HTTP::Tiny isn't enough for you, this is the "standard" way to do things
+
+ =item *
+
+ L<Mozilla::CA> - Required if you want to validate SSL certificates
+
+ =item *
+
+ L<Net::SSLeay> - Required for SSL support
+
+ =back
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/chansen/p5-http-tiny/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/chansen/p5-http-tiny>
+
+ git clone https://github.com/chansen/p5-http-tiny.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ Christian Hansen <chansen@cpan.org>
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Alan Gardner Alessandro Ghedini Brad Gilbert Chris Nehren Weyl Claes Jakobsson Clinton Gormley Dean Pearce Edward Zborowski James Raspass Jeremy Mates Jess Robinson Lukas Eklund Martin J. Evans Martin-Louis Bright Mike Doherty Olaf Alders Olivier Mengué Petr Písař Sören Kornetzki Syohei YOSHIDA Tatsuhiko Miyagawa Tom Hukins Tony Cook
+
+ =over 4
+
+ =item *
+
+ Alan Gardner <gardner@pythian.com>
+
+ =item *
+
+ Alessandro Ghedini <al3xbio@gmail.com>
+
+ =item *
+
+ Brad Gilbert <bgills@cpan.org>
+
+ =item *
+
+ Chris Nehren <apeiron@cpan.org>
+
+ =item *
+
+ Chris Weyl <cweyl@alumni.drew.edu>
+
+ =item *
+
+ Claes Jakobsson <claes@surfar.nu>
+
+ =item *
+
+ Clinton Gormley <clint@traveljury.com>
+
+ =item *
+
+ Dean Pearce <pearce@pythian.com>
+
+ =item *
+
+ Edward Zborowski <ed@rubensteintech.com>
+
+ =item *
+
+ James Raspass <jraspass@gmail.com>
+
+ =item *
+
+ Jeremy Mates <jmates@cpan.org>
+
+ =item *
+
+ Jess Robinson <castaway@desert-island.me.uk>
+
+ =item *
+
+ Lukas Eklund <leklund@gmail.com>
+
+ =item *
+
+ Martin J. Evans <mjegh@ntlworld.com>
+
+ =item *
+
+ Martin-Louis Bright <mlbright@gmail.com>
+
+ =item *
+
+ Mike Doherty <doherty@cpan.org>
+
+ =item *
+
+ Olaf Alders <olaf@wundersolutions.com>
+
+ =item *
+
+ Olivier Mengué <dolmen@cpan.org>
+
+ =item *
+
+ Petr Písař <ppisar@redhat.com>
+
+ =item *
+
+ Sören Kornetzki <soeren.kornetzki@delti.com>
+
+ =item *
+
+ Syohei YOSHIDA <syohex@gmail.com>
+
+ =item *
+
+ Tatsuhiko Miyagawa <miyagawa@bulknews.net>
+
+ =item *
+
+ Tom Hukins <tom@eborcom.com>
+
+ =item *
+
+ Tony Cook <tony@develop-help.com>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2015 by Christian Hansen.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ HTTP_TINY
+
+ $fatpacked{"JSON/PP.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP';
+ package JSON::PP;
+
+ # JSON-2.0
+
+ use 5.005;
+ use strict;
+ use base qw(Exporter);
+ use overload ();
+
+ use Carp ();
+ use B ();
+ #use Devel::Peek;
+
+ $JSON::PP::VERSION = '2.27300';
+
+ @JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
+
+ # instead of hash-access, i tried index-access for speed.
+ # but this method is not faster than what i expected. so it will be changed.
+
+ use constant P_ASCII => 0;
+ use constant P_LATIN1 => 1;
+ use constant P_UTF8 => 2;
+ use constant P_INDENT => 3;
+ use constant P_CANONICAL => 4;
+ use constant P_SPACE_BEFORE => 5;
+ use constant P_SPACE_AFTER => 6;
+ use constant P_ALLOW_NONREF => 7;
+ use constant P_SHRINK => 8;
+ use constant P_ALLOW_BLESSED => 9;
+ use constant P_CONVERT_BLESSED => 10;
+ use constant P_RELAXED => 11;
+
+ use constant P_LOOSE => 12;
+ use constant P_ALLOW_BIGNUM => 13;
+ use constant P_ALLOW_BAREKEY => 14;
+ use constant P_ALLOW_SINGLEQUOTE => 15;
+ use constant P_ESCAPE_SLASH => 16;
+ use constant P_AS_NONBLESSED => 17;
+
+ use constant P_ALLOW_UNKNOWN => 18;
+
+ use constant OLD_PERL => $] < 5.008 ? 1 : 0;
+
+ BEGIN {
+ my @xs_compati_bit_properties = qw(
+ latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink
+ allow_blessed convert_blessed relaxed allow_unknown
+ );
+ my @pp_bit_properties = qw(
+ allow_singlequote allow_bignum loose
+ allow_barekey escape_slash as_nonblessed
+ );
+
+ # Perl version check, Unicode handling is enable?
+ # Helper module sets @JSON::PP::_properties.
+ if ($] < 5.008 ) {
+ my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';
+ eval qq| require $helper |;
+ if ($@) { Carp::croak $@; }
+ }
+
+ for my $name (@xs_compati_bit_properties, @pp_bit_properties) {
+ my $flag_name = 'P_' . uc($name);
+
+ eval qq/
+ sub $name {
+ my \$enable = defined \$_[1] ? \$_[1] : 1;
+
+ if (\$enable) {
+ \$_[0]->{PROPS}->[$flag_name] = 1;
+ }
+ else {
+ \$_[0]->{PROPS}->[$flag_name] = 0;
+ }
+
+ \$_[0];
+ }
+
+ sub get_$name {
+ \$_[0]->{PROPS}->[$flag_name] ? 1 : '';
+ }
+ /;
+ }
+
+ }
+
+
+
+ # Functions
+
+ my %encode_allow_method
+ = map {($_ => 1)} qw/utf8 pretty allow_nonref latin1 self_encode escape_slash
+ allow_blessed convert_blessed indent indent_length allow_bignum
+ as_nonblessed
+ /;
+ my %decode_allow_method
+ = map {($_ => 1)} qw/utf8 allow_nonref loose allow_singlequote allow_bignum
+ allow_barekey max_size relaxed/;
+
+
+ my $JSON; # cache
+
+ sub encode_json ($) { # encode
+ ($JSON ||= __PACKAGE__->new->utf8)->encode(@_);
+ }
+
+
+ sub decode_json { # decode
+ ($JSON ||= __PACKAGE__->new->utf8)->decode(@_);
+ }
+
+ # Obsoleted
+
+ sub to_json($) {
+ Carp::croak ("JSON::PP::to_json has been renamed to encode_json.");
+ }
+
+
+ sub from_json($) {
+ Carp::croak ("JSON::PP::from_json has been renamed to decode_json.");
+ }
+
+
+ # Methods
+
+ sub new {
+ my $class = shift;
+ my $self = {
+ max_depth => 512,
+ max_size => 0,
+ indent => 0,
+ FLAGS => 0,
+ fallback => sub { encode_error('Invalid value. JSON can only reference.') },
+ indent_length => 3,
+ };
+
+ bless $self, $class;
+ }
+
+
+ sub encode {
+ return $_[0]->PP_encode_json($_[1]);
+ }
+
+
+ sub decode {
+ return $_[0]->PP_decode_json($_[1], 0x00000000);
+ }
+
+
+ sub decode_prefix {
+ return $_[0]->PP_decode_json($_[1], 0x00000001);
+ }
+
+
+ # accessor
+
+
+ # pretty printing
+
+ sub pretty {
+ my ($self, $v) = @_;
+ my $enable = defined $v ? $v : 1;
+
+ if ($enable) { # indent_length(3) for JSON::XS compatibility
+ $self->indent(1)->indent_length(3)->space_before(1)->space_after(1);
+ }
+ else {
+ $self->indent(0)->space_before(0)->space_after(0);
+ }
+
+ $self;
+ }
+
+ # etc
+
+ sub max_depth {
+ my $max = defined $_[1] ? $_[1] : 0x80000000;
+ $_[0]->{max_depth} = $max;
+ $_[0];
+ }
+
+
+ sub get_max_depth { $_[0]->{max_depth}; }
+
+
+ sub max_size {
+ my $max = defined $_[1] ? $_[1] : 0;
+ $_[0]->{max_size} = $max;
+ $_[0];
+ }
+
+
+ sub get_max_size { $_[0]->{max_size}; }
+
+
+ sub filter_json_object {
+ $_[0]->{cb_object} = defined $_[1] ? $_[1] : 0;
+ $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
+ $_[0];
+ }
+
+ sub filter_json_single_key_object {
+ if (@_ > 1) {
+ $_[0]->{cb_sk_object}->{$_[1]} = $_[2];
+ }
+ $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
+ $_[0];
+ }
+
+ sub indent_length {
+ if (!defined $_[1] or $_[1] > 15 or $_[1] < 0) {
+ Carp::carp "The acceptable range of indent_length() is 0 to 15.";
+ }
+ else {
+ $_[0]->{indent_length} = $_[1];
+ }
+ $_[0];
+ }
+
+ sub get_indent_length {
+ $_[0]->{indent_length};
+ }
+
+ sub sort_by {
+ $_[0]->{sort_by} = defined $_[1] ? $_[1] : 1;
+ $_[0];
+ }
+
+ sub allow_bigint {
+ Carp::carp("allow_bigint() is obsoleted. use allow_bignum() insted.");
+ }
+
+ ###############################
+
+ ###
+ ### Perl => JSON
+ ###
+
+
+ { # Convert
+
+ my $max_depth;
+ my $indent;
+ my $ascii;
+ my $latin1;
+ my $utf8;
+ my $space_before;
+ my $space_after;
+ my $canonical;
+ my $allow_blessed;
+ my $convert_blessed;
+
+ my $indent_length;
+ my $escape_slash;
+ my $bignum;
+ my $as_nonblessed;
+
+ my $depth;
+ my $indent_count;
+ my $keysort;
+
+
+ sub PP_encode_json {
+ my $self = shift;
+ my $obj = shift;
+
+ $indent_count = 0;
+ $depth = 0;
+
+ my $idx = $self->{PROPS};
+
+ ($ascii, $latin1, $utf8, $indent, $canonical, $space_before, $space_after, $allow_blessed,
+ $convert_blessed, $escape_slash, $bignum, $as_nonblessed)
+ = @{$idx}[P_ASCII .. P_SPACE_AFTER, P_ALLOW_BLESSED, P_CONVERT_BLESSED,
+ P_ESCAPE_SLASH, P_ALLOW_BIGNUM, P_AS_NONBLESSED];
+
+ ($max_depth, $indent_length) = @{$self}{qw/max_depth indent_length/};
+
+ $keysort = $canonical ? sub { $a cmp $b } : undef;
+
+ if ($self->{sort_by}) {
+ $keysort = ref($self->{sort_by}) eq 'CODE' ? $self->{sort_by}
+ : $self->{sort_by} =~ /\D+/ ? $self->{sort_by}
+ : sub { $a cmp $b };
+ }
+
+ encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)")
+ if(!ref $obj and !$idx->[ P_ALLOW_NONREF ]);
+
+ my $str = $self->object_to_json($obj);
+
+ $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible
+
+ unless ($ascii or $latin1 or $utf8) {
+ utf8::upgrade($str);
+ }
+
+ if ($idx->[ P_SHRINK ]) {
+ utf8::downgrade($str, 1);
+ }
+
+ return $str;
+ }
+
+
+ sub object_to_json {
+ my ($self, $obj) = @_;
+ my $type = ref($obj);
+
+ if($type eq 'HASH'){
+ return $self->hash_to_json($obj);
+ }
+ elsif($type eq 'ARRAY'){
+ return $self->array_to_json($obj);
+ }
+ elsif ($type) { # blessed object?
+ if (blessed($obj)) {
+
+ return $self->value_to_json($obj) if ( $obj->isa('JSON::PP::Boolean') );
+
+ if ( $convert_blessed and $obj->can('TO_JSON') ) {
+ my $result = $obj->TO_JSON();
+ if ( defined $result and ref( $result ) ) {
+ if ( refaddr( $obj ) eq refaddr( $result ) ) {
+ encode_error( sprintf(
+ "%s::TO_JSON method returned same object as was passed instead of a new one",
+ ref $obj
+ ) );
+ }
+ }
+
+ return $self->object_to_json( $result );
+ }
+
+ return "$obj" if ( $bignum and _is_bignum($obj) );
+ return $self->blessed_to_json($obj) if ($allow_blessed and $as_nonblessed); # will be removed.
+
+ encode_error( sprintf("encountered object '%s', but neither allow_blessed "
+ . "nor convert_blessed settings are enabled", $obj)
+ ) unless ($allow_blessed);
+
+ return 'null';
+ }
+ else {
+ return $self->value_to_json($obj);
+ }
+ }
+ else{
+ return $self->value_to_json($obj);
+ }
+ }
+
+
+ sub hash_to_json {
+ my ($self, $obj) = @_;
+ my @res;
+
+ encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
+ if (++$depth > $max_depth);
+
+ my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
+ my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : '');
+
+ for my $k ( _sort( $obj ) ) {
+ if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized
+ push @res, string_to_json( $self, $k )
+ . $del
+ . ( $self->object_to_json( $obj->{$k} ) || $self->value_to_json( $obj->{$k} ) );
+ }
+
+ --$depth;
+ $self->_down_indent() if ($indent);
+
+ return '{' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . '}';
+ }
+
+
+ sub array_to_json {
+ my ($self, $obj) = @_;
+ my @res;
+
+ encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
+ if (++$depth > $max_depth);
+
+ my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
+
+ for my $v (@$obj){
+ push @res, $self->object_to_json($v) || $self->value_to_json($v);
+ }
+
+ --$depth;
+ $self->_down_indent() if ($indent);
+
+ return '[' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . ']';
+ }
+
+
+ sub value_to_json {
+ my ($self, $value) = @_;
+
+ return 'null' if(!defined $value);
+
+ my $b_obj = B::svref_2object(\$value); # for round trip problem
+ my $flags = $b_obj->FLAGS;
+
+ return $value # as is
+ if $flags & ( B::SVp_IOK | B::SVp_NOK ) and !( $flags & B::SVp_POK ); # SvTYPE is IV or NV?
+
+ my $type = ref($value);
+
+ if(!$type){
+ return string_to_json($self, $value);
+ }
+ elsif( blessed($value) and $value->isa('JSON::PP::Boolean') ){
+ return $$value == 1 ? 'true' : 'false';
+ }
+ elsif ($type) {
+ if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
+ return $self->value_to_json("$value");
+ }
+
+ if ($type eq 'SCALAR' and defined $$value) {
+ return $$value eq '1' ? 'true'
+ : $$value eq '0' ? 'false'
+ : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
+ : encode_error("cannot encode reference to scalar");
+ }
+
+ if ( $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ) {
+ return 'null';
+ }
+ else {
+ if ( $type eq 'SCALAR' or $type eq 'REF' ) {
+ encode_error("cannot encode reference to scalar");
+ }
+ else {
+ encode_error("encountered $value, but JSON can only represent references to arrays or hashes");
+ }
+ }
+
+ }
+ else {
+ return $self->{fallback}->($value)
+ if ($self->{fallback} and ref($self->{fallback}) eq 'CODE');
+ return 'null';
+ }
+
+ }
+
+
+ my %esc = (
+ "\n" => '\n',
+ "\r" => '\r',
+ "\t" => '\t',
+ "\f" => '\f',
+ "\b" => '\b',
+ "\"" => '\"',
+ "\\" => '\\\\',
+ "\'" => '\\\'',
+ );
+
+
+ sub string_to_json {
+ my ($self, $arg) = @_;
+
+ $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
+ $arg =~ s/\//\\\//g if ($escape_slash);
+ $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
+
+ if ($ascii) {
+ $arg = JSON_PP_encode_ascii($arg);
+ }
+
+ if ($latin1) {
+ $arg = JSON_PP_encode_latin1($arg);
+ }
+
+ if ($utf8) {
+ utf8::encode($arg);
+ }
+
+ return '"' . $arg . '"';
+ }
+
+
+ sub blessed_to_json {
+ my $reftype = reftype($_[1]) || '';
+ if ($reftype eq 'HASH') {
+ return $_[0]->hash_to_json($_[1]);
+ }
+ elsif ($reftype eq 'ARRAY') {
+ return $_[0]->array_to_json($_[1]);
+ }
+ else {
+ return 'null';
+ }
+ }
+
+
+ sub encode_error {
+ my $error = shift;
+ Carp::croak "$error";
+ }
+
+
+ sub _sort {
+ defined $keysort ? (sort $keysort (keys %{$_[0]})) : keys %{$_[0]};
+ }
+
+
+ sub _up_indent {
+ my $self = shift;
+ my $space = ' ' x $indent_length;
+
+ my ($pre,$post) = ('','');
+
+ $post = "\n" . $space x $indent_count;
+
+ $indent_count++;
+
+ $pre = "\n" . $space x $indent_count;
+
+ return ($pre,$post);
+ }
+
+
+ sub _down_indent { $indent_count--; }
+
+
+ sub PP_encode_box {
+ {
+ depth => $depth,
+ indent_count => $indent_count,
+ };
+ }
+
+ } # Convert
+
+
+ sub _encode_ascii {
+ join('',
+ map {
+ $_ <= 127 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
+ } unpack('U*', $_[0])
+ );
+ }
+
+
+ sub _encode_latin1 {
+ join('',
+ map {
+ $_ <= 255 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
+ } unpack('U*', $_[0])
+ );
+ }
+
+
+ sub _encode_surrogates { # from perlunicode
+ my $uni = $_[0] - 0x10000;
+ return ($uni / 0x400 + 0xD800, $uni % 0x400 + 0xDC00);
+ }
+
+
+ sub _is_bignum {
+ $_[0]->isa('Math::BigInt') or $_[0]->isa('Math::BigFloat');
+ }
+
+
+
+ #
+ # JSON => Perl
+ #
+
+ my $max_intsize;
+
+ BEGIN {
+ my $checkint = 1111;
+ for my $d (5..64) {
+ $checkint .= 1;
+ my $int = eval qq| $checkint |;
+ if ($int =~ /[eE]/) {
+ $max_intsize = $d - 1;
+ last;
+ }
+ }
+ }
+
+ { # PARSE
+
+ my %escapes = ( # by Jeremy Muhlich <jmuhlich [at] bitflood.org>
+ b => "\x8",
+ t => "\x9",
+ n => "\xA",
+ f => "\xC",
+ r => "\xD",
+ '\\' => '\\',
+ '"' => '"',
+ '/' => '/',
+ );
+
+ my $text; # json data
+ my $at; # offset
+ my $ch; # 1chracter
+ my $len; # text length (changed according to UTF8 or NON UTF8)
+ # INTERNAL
+ my $depth; # nest counter
+ my $encoding; # json text encoding
+ my $is_valid_utf8; # temp variable
+ my $utf8_len; # utf8 byte length
+ # FLAGS
+ my $utf8; # must be utf8
+ my $max_depth; # max nest nubmer of objects and arrays
+ my $max_size;
+ my $relaxed;
+ my $cb_object;
+ my $cb_sk_object;
+
+ my $F_HOOK;
+
+ my $allow_bigint; # using Math::BigInt
+ my $singlequote; # loosely quoting
+ my $loose; #
+ my $allow_barekey; # bareKey
+
+ # $opt flag
+ # 0x00000001 .... decode_prefix
+ # 0x10000000 .... incr_parse
+
+ sub PP_decode_json {
+ my ($self, $opt); # $opt is an effective flag during this decode_json.
+
+ ($self, $text, $opt) = @_;
+
+ ($at, $ch, $depth) = (0, '', 0);
+
+ if ( !defined $text or ref $text ) {
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+
+ my $idx = $self->{PROPS};
+
+ ($utf8, $relaxed, $loose, $allow_bigint, $allow_barekey, $singlequote)
+ = @{$idx}[P_UTF8, P_RELAXED, P_LOOSE .. P_ALLOW_SINGLEQUOTE];
+
+ if ( $utf8 ) {
+ utf8::downgrade( $text, 1 ) or Carp::croak("Wide character in subroutine entry");
+ }
+ else {
+ utf8::upgrade( $text );
+ utf8::encode( $text );
+ }
+
+ $len = length $text;
+
+ ($max_depth, $max_size, $cb_object, $cb_sk_object, $F_HOOK)
+ = @{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/};
+
+ if ($max_size > 1) {
+ use bytes;
+ my $bytes = length $text;
+ decode_error(
+ sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s"
+ , $bytes, $max_size), 1
+ ) if ($bytes > $max_size);
+ }
+
+ # Currently no effect
+ # should use regexp
+ my @octets = unpack('C4', $text);
+ $encoding = ( $octets[0] and $octets[1]) ? 'UTF-8'
+ : (!$octets[0] and $octets[1]) ? 'UTF-16BE'
+ : (!$octets[0] and !$octets[1]) ? 'UTF-32BE'
+ : ( $octets[2] ) ? 'UTF-16LE'
+ : (!$octets[2] ) ? 'UTF-32LE'
+ : 'unknown';
+
+ white(); # remove head white space
+
+ my $valid_start = defined $ch; # Is there a first character for JSON structure?
+
+ my $result = value();
+
+ return undef if ( !$result && ( $opt & 0x10000000 ) ); # for incr_parse
+
+ decode_error("malformed JSON string, neither array, object, number, string or atom") unless $valid_start;
+
+ if ( !$idx->[ P_ALLOW_NONREF ] and !ref $result ) {
+ decode_error(
+ 'JSON text must be an object or array (but found number, string, true, false or null,'
+ . ' use allow_nonref to allow this)', 1);
+ }
+
+ Carp::croak('something wrong.') if $len < $at; # we won't arrive here.
+
+ my $consumed = defined $ch ? $at - 1 : $at; # consumed JSON text length
+
+ white(); # remove tail white space
+
+ if ( $ch ) {
+ return ( $result, $consumed ) if ($opt & 0x00000001); # all right if decode_prefix
+ decode_error("garbage after JSON object");
+ }
+
+ ( $opt & 0x00000001 ) ? ( $result, $consumed ) : $result;
+ }
+
+
+ sub next_chr {
+ return $ch = undef if($at >= $len);
+ $ch = substr($text, $at++, 1);
+ }
+
+
+ sub value {
+ white();
+ return if(!defined $ch);
+ return object() if($ch eq '{');
+ return array() if($ch eq '[');
+ return string() if($ch eq '"' or ($singlequote and $ch eq "'"));
+ return number() if($ch =~ /[0-9]/ or $ch eq '-');
+ return word();
+ }
+
+ sub string {
+ my ($i, $s, $t, $u);
+ my $utf16;
+ my $is_utf8;
+
+ ($is_valid_utf8, $utf8_len) = ('', 0);
+
+ $s = ''; # basically UTF8 flag on
+
+ if($ch eq '"' or ($singlequote and $ch eq "'")){
+ my $boundChar = $ch;
+
+ OUTER: while( defined(next_chr()) ){
+
+ if($ch eq $boundChar){
+ next_chr();
+
+ if ($utf16) {
+ decode_error("missing low surrogate character in surrogate pair");
+ }
+
+ utf8::decode($s) if($is_utf8);
+
+ return $s;
+ }
+ elsif($ch eq '\\'){
+ next_chr();
+ if(exists $escapes{$ch}){
+ $s .= $escapes{$ch};
+ }
+ elsif($ch eq 'u'){ # UNICODE handling
+ my $u = '';
+
+ for(1..4){
+ $ch = next_chr();
+ last OUTER if($ch !~ /[0-9a-fA-F]/);
+ $u .= $ch;
+ }
+
+ # U+D800 - U+DBFF
+ if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/) { # UTF-16 high surrogate?
+ $utf16 = $u;
+ }
+ # U+DC00 - U+DFFF
+ elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/) { # UTF-16 low surrogate?
+ unless (defined $utf16) {
+ decode_error("missing high surrogate character in surrogate pair");
+ }
+ $is_utf8 = 1;
+ $s .= JSON_PP_decode_surrogates($utf16, $u) || next;
+ $utf16 = undef;
+ }
+ else {
+ if (defined $utf16) {
+ decode_error("surrogate pair expected");
+ }
+
+ if ( ( my $hex = hex( $u ) ) > 127 ) {
+ $is_utf8 = 1;
+ $s .= JSON_PP_decode_unicode($u) || next;
+ }
+ else {
+ $s .= chr $hex;
+ }
+ }
+
+ }
+ else{
+ unless ($loose) {
+ $at -= 2;
+ decode_error('illegal backslash escape sequence in string');
+ }
+ $s .= $ch;
+ }
+ }
+ else{
+
+ if ( ord $ch > 127 ) {
+ unless( $ch = is_valid_utf8($ch) ) {
+ $at -= 1;
+ decode_error("malformed UTF-8 character in JSON string");
+ }
+ else {
+ $at += $utf8_len - 1;
+ }
+
+ $is_utf8 = 1;
+ }
+
+ if (!$loose) {
+ if ($ch =~ /[\x00-\x1f\x22\x5c]/) { # '/' ok
+ $at--;
+ decode_error('invalid character encountered while parsing JSON string');
+ }
+ }
+
+ $s .= $ch;
+ }
+ }
+ }
+
+ decode_error("unexpected end of string while parsing JSON string");
+ }
+
+
+ sub white {
+ while( defined $ch ){
+ if($ch le ' '){
+ next_chr();
+ }
+ elsif($ch eq '/'){
+ next_chr();
+ if(defined $ch and $ch eq '/'){
+ 1 while(defined(next_chr()) and $ch ne "\n" and $ch ne "\r");
+ }
+ elsif(defined $ch and $ch eq '*'){
+ next_chr();
+ while(1){
+ if(defined $ch){
+ if($ch eq '*'){
+ if(defined(next_chr()) and $ch eq '/'){
+ next_chr();
+ last;
+ }
+ }
+ else{
+ next_chr();
+ }
+ }
+ else{
+ decode_error("Unterminated comment");
+ }
+ }
+ next;
+ }
+ else{
+ $at--;
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+ }
+ else{
+ if ($relaxed and $ch eq '#') { # correctly?
+ pos($text) = $at;
+ $text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g;
+ $at = pos($text);
+ next_chr;
+ next;
+ }
+
+ last;
+ }
+ }
+ }
+
+
+ sub array {
+ my $a = $_[0] || []; # you can use this code to use another array ref object.
+
+ decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
+ if (++$depth > $max_depth);
+
+ next_chr();
+ white();
+
+ if(defined $ch and $ch eq ']'){
+ --$depth;
+ next_chr();
+ return $a;
+ }
+ else {
+ while(defined($ch)){
+ push @$a, value();
+
+ white();
+
+ if (!defined $ch) {
+ last;
+ }
+
+ if($ch eq ']'){
+ --$depth;
+ next_chr();
+ return $a;
+ }
+
+ if($ch ne ','){
+ last;
+ }
+
+ next_chr();
+ white();
+
+ if ($relaxed and $ch eq ']') {
+ --$depth;
+ next_chr();
+ return $a;
+ }
+
+ }
+ }
+
+ decode_error(", or ] expected while parsing array");
+ }
+
+
+ sub object {
+ my $o = $_[0] || {}; # you can use this code to use another hash ref object.
+ my $k;
+
+ decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
+ if (++$depth > $max_depth);
+ next_chr();
+ white();
+
+ if(defined $ch and $ch eq '}'){
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+ else {
+ while (defined $ch) {
+ $k = ($allow_barekey and $ch ne '"' and $ch ne "'") ? bareKey() : string();
+ white();
+
+ if(!defined $ch or $ch ne ':'){
+ $at--;
+ decode_error("':' expected");
+ }
+
+ next_chr();
+ $o->{$k} = value();
+ white();
+
+ last if (!defined $ch);
+
+ if($ch eq '}'){
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+
+ if($ch ne ','){
+ last;
+ }
+
+ next_chr();
+ white();
+
+ if ($relaxed and $ch eq '}') {
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+
+ }
+
+ }
+
+ $at--;
+ decode_error(", or } expected while parsing object/hash");
+ }
+
+
+ sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition
+ my $key;
+ while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){
+ $key .= $ch;
+ next_chr();
+ }
+ return $key;
+ }
+
+
+ sub word {
+ my $word = substr($text,$at-1,4);
+
+ if($word eq 'true'){
+ $at += 3;
+ next_chr;
+ return $JSON::PP::true;
+ }
+ elsif($word eq 'null'){
+ $at += 3;
+ next_chr;
+ return undef;
+ }
+ elsif($word eq 'fals'){
+ $at += 3;
+ if(substr($text,$at,1) eq 'e'){
+ $at++;
+ next_chr;
+ return $JSON::PP::false;
+ }
+ }
+
+ $at--; # for decode_error report
+
+ decode_error("'null' expected") if ($word =~ /^n/);
+ decode_error("'true' expected") if ($word =~ /^t/);
+ decode_error("'false' expected") if ($word =~ /^f/);
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+
+
+ sub number {
+ my $n = '';
+ my $v;
+
+ # According to RFC4627, hex or oct digts are invalid.
+ if($ch eq '0'){
+ my $peek = substr($text,$at,1);
+ my $hex = $peek =~ /[xX]/; # 0 or 1
+
+ if($hex){
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ ($n) = ( substr($text, $at+1) =~ /^([0-9a-fA-F]+)/);
+ }
+ else{ # oct
+ ($n) = ( substr($text, $at) =~ /^([0-7]+)/);
+ if (defined $n and length $n > 1) {
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ }
+ }
+
+ if(defined $n and length($n)){
+ if (!$hex and length($n) == 1) {
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ }
+ $at += length($n) + $hex;
+ next_chr;
+ return $hex ? hex($n) : oct($n);
+ }
+ }
+
+ if($ch eq '-'){
+ $n = '-';
+ next_chr;
+ if (!defined $ch or $ch !~ /\d/) {
+ decode_error("malformed number (no digits after initial minus)");
+ }
+ }
+
+ while(defined $ch and $ch =~ /\d/){
+ $n .= $ch;
+ next_chr;
+ }
+
+ if(defined $ch and $ch eq '.'){
+ $n .= '.';
+
+ next_chr;
+ if (!defined $ch or $ch !~ /\d/) {
+ decode_error("malformed number (no digits after decimal point)");
+ }
+ else {
+ $n .= $ch;
+ }
+
+ while(defined(next_chr) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+ }
+
+ if(defined $ch and ($ch eq 'e' or $ch eq 'E')){
+ $n .= $ch;
+ next_chr;
+
+ if(defined($ch) and ($ch eq '+' or $ch eq '-')){
+ $n .= $ch;
+ next_chr;
+ if (!defined $ch or $ch =~ /\D/) {
+ decode_error("malformed number (no digits after exp sign)");
+ }
+ $n .= $ch;
+ }
+ elsif(defined($ch) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+ else {
+ decode_error("malformed number (no digits after exp sign)");
+ }
+
+ while(defined(next_chr) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+
+ }
+
+ $v .= $n;
+
+ if ($v !~ /[.eE]/ and length $v > $max_intsize) {
+ if ($allow_bigint) { # from Adam Sussman
+ require Math::BigInt;
+ return Math::BigInt->new($v);
+ }
+ else {
+ return "$v";
+ }
+ }
+ elsif ($allow_bigint) {
+ require Math::BigFloat;
+ return Math::BigFloat->new($v);
+ }
+
+ return 0+$v;
+ }
+
+
+ sub is_valid_utf8 {
+
+ $utf8_len = $_[0] =~ /[\x00-\x7F]/ ? 1
+ : $_[0] =~ /[\xC2-\xDF]/ ? 2
+ : $_[0] =~ /[\xE0-\xEF]/ ? 3
+ : $_[0] =~ /[\xF0-\xF4]/ ? 4
+ : 0
+ ;
+
+ return unless $utf8_len;
+
+ my $is_valid_utf8 = substr($text, $at - 1, $utf8_len);
+
+ return ( $is_valid_utf8 =~ /^(?:
+ [\x00-\x7F]
+ |[\xC2-\xDF][\x80-\xBF]
+ |[\xE0][\xA0-\xBF][\x80-\xBF]
+ |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
+ |[\xED][\x80-\x9F][\x80-\xBF]
+ |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
+ |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
+ )$/x ) ? $is_valid_utf8 : '';
+ }
+
+
+ sub decode_error {
+ my $error = shift;
+ my $no_rep = shift;
+ my $str = defined $text ? substr($text, $at) : '';
+ my $mess = '';
+ my $type = $] >= 5.008 ? 'U*'
+ : $] < 5.006 ? 'C*'
+ : utf8::is_utf8( $str ) ? 'U*' # 5.6
+ : 'C*'
+ ;
+
+ for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ?
+ $mess .= $c == 0x07 ? '\a'
+ : $c == 0x09 ? '\t'
+ : $c == 0x0a ? '\n'
+ : $c == 0x0d ? '\r'
+ : $c == 0x0c ? '\f'
+ : $c < 0x20 ? sprintf('\x{%x}', $c)
+ : $c == 0x5c ? '\\\\'
+ : $c < 0x80 ? chr($c)
+ : sprintf('\x{%x}', $c)
+ ;
+ if ( length $mess >= 20 ) {
+ $mess .= '...';
+ last;
+ }
+ }
+
+ unless ( length $mess ) {
+ $mess = '(end of string)';
+ }
+
+ Carp::croak (
+ $no_rep ? "$error" : "$error, at character offset $at (before \"$mess\")"
+ );
+
+ }
+
+
+ sub _json_object_hook {
+ my $o = $_[0];
+ my @ks = keys %{$o};
+
+ if ( $cb_sk_object and @ks == 1 and exists $cb_sk_object->{ $ks[0] } and ref $cb_sk_object->{ $ks[0] } ) {
+ my @val = $cb_sk_object->{ $ks[0] }->( $o->{$ks[0]} );
+ if (@val == 1) {
+ return $val[0];
+ }
+ }
+
+ my @val = $cb_object->($o) if ($cb_object);
+ if (@val == 0 or @val > 1) {
+ return $o;
+ }
+ else {
+ return $val[0];
+ }
+ }
+
+
+ sub PP_decode_box {
+ {
+ text => $text,
+ at => $at,
+ ch => $ch,
+ len => $len,
+ depth => $depth,
+ encoding => $encoding,
+ is_valid_utf8 => $is_valid_utf8,
+ };
+ }
+
+ } # PARSE
+
+
+ sub _decode_surrogates { # from perlunicode
+ my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00);
+ my $un = pack('U*', $uni);
+ utf8::encode( $un );
+ return $un;
+ }
+
+
+ sub _decode_unicode {
+ my $un = pack('U', hex shift);
+ utf8::encode( $un );
+ return $un;
+ }
+
+ #
+ # Setup for various Perl versions (the code from JSON::PP58)
+ #
+
+ BEGIN {
+
+ unless ( defined &utf8::is_utf8 ) {
+ require Encode;
+ *utf8::is_utf8 = *Encode::is_utf8;
+ }
+
+ if ( $] >= 5.008 ) {
+ *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii;
+ *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1;
+ *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
+ *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode;
+ }
+
+ if ($] >= 5.008 and $] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken.
+ package JSON::PP;
+ require subs;
+ subs->import('join');
+ eval q|
+ sub join {
+ return '' if (@_ < 2);
+ my $j = shift;
+ my $str = shift;
+ for (@_) { $str .= $j . $_; }
+ return $str;
+ }
+ |;
+ }
+
+
+ sub JSON::PP::incr_parse {
+ local $Carp::CarpLevel = 1;
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
+ }
+
+
+ sub JSON::PP::incr_skip {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
+ }
+
+
+ sub JSON::PP::incr_reset {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+ }
+
+ eval q{
+ sub JSON::PP::incr_text : lvalue {
+ $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
+
+ if ( $_[0]->{_incr_parser}->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+ $_[0]->{_incr_parser}->{incr_text};
+ }
+ } if ( $] >= 5.006 );
+
+ } # Setup for various Perl versions (the code from JSON::PP58)
+
+
+ ###############################
+ # Utilities
+ #
+
+ BEGIN {
+ eval 'require Scalar::Util';
+ unless($@){
+ *JSON::PP::blessed = \&Scalar::Util::blessed;
+ *JSON::PP::reftype = \&Scalar::Util::reftype;
+ *JSON::PP::refaddr = \&Scalar::Util::refaddr;
+ }
+ else{ # This code is from Sclar::Util.
+ # warn $@;
+ eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';
+ *JSON::PP::blessed = sub {
+ local($@, $SIG{__DIE__}, $SIG{__WARN__});
+ ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef;
+ };
+ my %tmap = qw(
+ B::NULL SCALAR
+ B::HV HASH
+ B::AV ARRAY
+ B::CV CODE
+ B::IO IO
+ B::GV GLOB
+ B::REGEXP REGEXP
+ );
+ *JSON::PP::reftype = sub {
+ my $r = shift;
+
+ return undef unless length(ref($r));
+
+ my $t = ref(B::svref_2object($r));
+
+ return
+ exists $tmap{$t} ? $tmap{$t}
+ : length(ref($$r)) ? 'REF'
+ : 'SCALAR';
+ };
+ *JSON::PP::refaddr = sub {
+ return undef unless length(ref($_[0]));
+
+ my $addr;
+ if(defined(my $pkg = blessed($_[0]))) {
+ $addr .= bless $_[0], 'Scalar::Util::Fake';
+ bless $_[0], $pkg;
+ }
+ else {
+ $addr .= $_[0]
+ }
+
+ $addr =~ /0x(\w+)/;
+ local $^W;
+ #no warnings 'portable';
+ hex($1);
+ }
+ }
+ }
+
+
+ # shamely copied and modified from JSON::XS code.
+
+ $JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
+ $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
+
+ sub is_bool { defined $_[0] and UNIVERSAL::isa($_[0], "JSON::PP::Boolean"); }
+
+ sub true { $JSON::PP::true }
+ sub false { $JSON::PP::false }
+ sub null { undef; }
+
+ ###############################
+
+ package JSON::PP::Boolean;
+
+ use overload (
+ "0+" => sub { ${$_[0]} },
+ "++" => sub { $_[0] = ${$_[0]} + 1 },
+ "--" => sub { $_[0] = ${$_[0]} - 1 },
+ fallback => 1,
+ );
+
+
+ ###############################
+
+ package JSON::PP::IncrParser;
+
+ use strict;
+
+ use constant INCR_M_WS => 0; # initial whitespace skipping
+ use constant INCR_M_STR => 1; # inside string
+ use constant INCR_M_BS => 2; # inside backslash
+ use constant INCR_M_JSON => 3; # outside anything, count nesting
+ use constant INCR_M_C0 => 4;
+ use constant INCR_M_C1 => 5;
+
+ $JSON::PP::IncrParser::VERSION = '1.01';
+
+ my $unpack_format = $] < 5.006 ? 'C*' : 'U*';
+
+ sub new {
+ my ( $class ) = @_;
+
+ bless {
+ incr_nest => 0,
+ incr_text => undef,
+ incr_parsing => 0,
+ incr_p => 0,
+ }, $class;
+ }
+
+
+ sub incr_parse {
+ my ( $self, $coder, $text ) = @_;
+
+ $self->{incr_text} = '' unless ( defined $self->{incr_text} );
+
+ if ( defined $text ) {
+ if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) {
+ utf8::upgrade( $self->{incr_text} ) ;
+ utf8::decode( $self->{incr_text} ) ;
+ }
+ $self->{incr_text} .= $text;
+ }
+
+
+ my $max_size = $coder->get_max_size;
+
+ if ( defined wantarray ) {
+
+ $self->{incr_mode} = INCR_M_WS unless defined $self->{incr_mode};
+
+ if ( wantarray ) {
+ my @ret;
+
+ $self->{incr_parsing} = 1;
+
+ do {
+ push @ret, $self->_incr_parse( $coder, $self->{incr_text} );
+
+ unless ( !$self->{incr_nest} and $self->{incr_mode} == INCR_M_JSON ) {
+ $self->{incr_mode} = INCR_M_WS if $self->{incr_mode} != INCR_M_STR;
+ }
+
+ } until ( length $self->{incr_text} >= $self->{incr_p} );
+
+ $self->{incr_parsing} = 0;
+
+ return @ret;
+ }
+ else { # in scalar context
+ $self->{incr_parsing} = 1;
+ my $obj = $self->_incr_parse( $coder, $self->{incr_text} );
+ $self->{incr_parsing} = 0 if defined $obj; # pointed by Martin J. Evans
+ return $obj ? $obj : undef; # $obj is an empty string, parsing was completed.
+ }
+
+ }
+
+ }
+
+
+ sub _incr_parse {
+ my ( $self, $coder, $text, $skip ) = @_;
+ my $p = $self->{incr_p};
+ my $restore = $p;
+
+ my @obj;
+ my $len = length $text;
+
+ if ( $self->{incr_mode} == INCR_M_WS ) {
+ while ( $len > $p ) {
+ my $s = substr( $text, $p, 1 );
+ $p++ and next if ( 0x20 >= unpack($unpack_format, $s) );
+ $self->{incr_mode} = INCR_M_JSON;
+ last;
+ }
+ }
+
+ while ( $len > $p ) {
+ my $s = substr( $text, $p++, 1 );
+
+ if ( $s eq '"' ) {
+ if (substr( $text, $p - 2, 1 ) eq '\\' ) {
+ next;
+ }
+
+ if ( $self->{incr_mode} != INCR_M_STR ) {
+ $self->{incr_mode} = INCR_M_STR;
+ }
+ else {
+ $self->{incr_mode} = INCR_M_JSON;
+ unless ( $self->{incr_nest} ) {
+ last;
+ }
+ }
+ }
+
+ if ( $self->{incr_mode} == INCR_M_JSON ) {
+
+ if ( $s eq '[' or $s eq '{' ) {
+ if ( ++$self->{incr_nest} > $coder->get_max_depth ) {
+ Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)');
+ }
+ }
+ elsif ( $s eq ']' or $s eq '}' ) {
+ last if ( --$self->{incr_nest} <= 0 );
+ }
+ elsif ( $s eq '#' ) {
+ while ( $len > $p ) {
+ last if substr( $text, $p++, 1 ) eq "\n";
+ }
+ }
+
+ }
+
+ }
+
+ $self->{incr_p} = $p;
+
+ return if ( $self->{incr_mode} == INCR_M_STR and not $self->{incr_nest} );
+ return if ( $self->{incr_mode} == INCR_M_JSON and $self->{incr_nest} > 0 );
+
+ return '' unless ( length substr( $self->{incr_text}, 0, $p ) );
+
+ local $Carp::CarpLevel = 2;
+
+ $self->{incr_p} = $restore;
+ $self->{incr_c} = $p;
+
+ my ( $obj, $tail ) = $coder->PP_decode_json( substr( $self->{incr_text}, 0, $p ), 0x10000001 );
+
+ $self->{incr_text} = substr( $self->{incr_text}, $p );
+ $self->{incr_p} = 0;
+
+ return $obj || '';
+ }
+
+
+ sub incr_text {
+ if ( $_[0]->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+ $_[0]->{incr_text};
+ }
+
+
+ sub incr_skip {
+ my $self = shift;
+ $self->{incr_text} = substr( $self->{incr_text}, $self->{incr_c} );
+ $self->{incr_p} = 0;
+ }
+
+
+ sub incr_reset {
+ my $self = shift;
+ $self->{incr_text} = undef;
+ $self->{incr_p} = 0;
+ $self->{incr_mode} = 0;
+ $self->{incr_nest} = 0;
+ $self->{incr_parsing} = 0;
+ }
+
+ ###############################
+
+
+ 1;
+ __END__
+ =pod
+
+ =head1 NAME
+
+ JSON::PP - JSON::XS compatible pure-Perl module.
+
+ =head1 SYNOPSIS
+
+ use JSON::PP;
+
+ # exported functions, they croak on error
+ # and expect/generate UTF-8
+
+ $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
+ $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text;
+
+ # OO-interface
+
+ $coder = JSON::PP->new->ascii->pretty->allow_nonref;
+
+ $json_text = $json->encode( $perl_scalar );
+ $perl_scalar = $json->decode( $json_text );
+
+ $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing
+
+ # Note that JSON version 2.0 and above will automatically use
+ # JSON::XS or JSON::PP, so you should be able to just:
+
+ use JSON;
+
+
+ =head1 VERSION
+
+ 2.27300
+
+ L<JSON::XS> 2.27 (~2.30) compatible.
+
+ =head1 NOTE
+
+ JSON::PP had been inculded in JSON distribution (CPAN module).
+ It was a perl core module in Perl 5.14.
+
+ =head1 DESCRIPTION
+
+ This module is L<JSON::XS> compatible pure Perl module.
+ (Perl 5.8 or later is recommended)
+
+ JSON::XS is the fastest and most proper JSON module on CPAN.
+ It is written by Marc Lehmann in C, so must be compiled and
+ installed in the used environment.
+
+ JSON::PP is a pure-Perl module and has compatibility to JSON::XS.
+
+
+ =head2 FEATURES
+
+ =over
+
+ =item * correct unicode handling
+
+ This module knows how to handle Unicode (depending on Perl version).
+
+ See to L<JSON::XS/A FEW NOTES ON UNICODE AND PERL> and L<UNICODE HANDLING ON PERLS>.
+
+
+ =item * round-trip integrity
+
+ When you serialise a perl data structure using only data types supported
+ by JSON and Perl, the deserialised data structure is identical on the Perl
+ level. (e.g. the string "2.0" doesn't suddenly become "2" just because
+ it looks like a number). There I<are> minor exceptions to this, read the
+ MAPPING section below to learn about those.
+
+
+ =item * strict checking of JSON correctness
+
+ There is no guessing, no generating of illegal JSON texts by default,
+ and only JSON is accepted as input by default (the latter is a security feature).
+ But when some options are set, loose chcking features are available.
+
+ =back
+
+ =head1 FUNCTIONAL INTERFACE
+
+ Some documents are copied and modified from L<JSON::XS/FUNCTIONAL INTERFACE>.
+
+ =head2 encode_json
+
+ $json_text = encode_json $perl_scalar
+
+ Converts the given Perl data structure to a UTF-8 encoded, binary string.
+
+ This function call is functionally identical to:
+
+ $json_text = JSON::PP->new->utf8->encode($perl_scalar)
+
+ =head2 decode_json
+
+ $perl_scalar = decode_json $json_text
+
+ The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
+ to parse that as an UTF-8 encoded JSON text, returning the resulting
+ reference.
+
+ This function call is functionally identical to:
+
+ $perl_scalar = JSON::PP->new->utf8->decode($json_text)
+
+ =head2 JSON::PP::is_bool
+
+ $is_boolean = JSON::PP::is_bool($scalar)
+
+ Returns true if the passed scalar represents either JSON::PP::true or
+ JSON::PP::false, two constants that act like C<1> and C<0> respectively
+ and are also used to represent JSON C<true> and C<false> in Perl strings.
+
+ =head2 JSON::PP::true
+
+ Returns JSON true value which is blessed object.
+ It C<isa> JSON::PP::Boolean object.
+
+ =head2 JSON::PP::false
+
+ Returns JSON false value which is blessed object.
+ It C<isa> JSON::PP::Boolean object.
+
+ =head2 JSON::PP::null
+
+ Returns C<undef>.
+
+ See L<MAPPING>, below, for more information on how JSON values are mapped to
+ Perl.
+
+
+ =head1 HOW DO I DECODE A DATA FROM OUTER AND ENCODE TO OUTER
+
+ This section supposes that your perl vresion is 5.8 or later.
+
+ If you know a JSON text from an outer world - a network, a file content, and so on,
+ is encoded in UTF-8, you should use C<decode_json> or C<JSON> module object
+ with C<utf8> enable. And the decoded result will contain UNICODE characters.
+
+ # from network
+ my $json = JSON::PP->new->utf8;
+ my $json_text = CGI->new->param( 'json_data' );
+ my $perl_scalar = $json->decode( $json_text );
+
+ # from file content
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ $json_text = <$fh>;
+ $perl_scalar = decode_json( $json_text );
+
+ If an outer data is not encoded in UTF-8, firstly you should C<decode> it.
+
+ use Encode;
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ my $encoding = 'cp932';
+ my $unicode_json_text = decode( $encoding, <$fh> ); # UNICODE
+
+ # or you can write the below code.
+ #
+ # open( my $fh, "<:encoding($encoding)", 'json.data' );
+ # $unicode_json_text = <$fh>;
+
+ In this case, C<$unicode_json_text> is of course UNICODE string.
+ So you B<cannot> use C<decode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable.
+
+ $perl_scalar = $json->utf8(0)->decode( $unicode_json_text );
+
+ Or C<encode 'utf8'> and C<decode_json>:
+
+ $perl_scalar = decode_json( encode( 'utf8', $unicode_json_text ) );
+ # this way is not efficient.
+
+ And now, you want to convert your C<$perl_scalar> into JSON data and
+ send it to an outer world - a network or a file content, and so on.
+
+ Your data usually contains UNICODE strings and you want the converted data to be encoded
+ in UTF-8, you should use C<encode_json> or C<JSON> module object with C<utf8> enable.
+
+ print encode_json( $perl_scalar ); # to a network? file? or display?
+ # or
+ print $json->utf8->encode( $perl_scalar );
+
+ If C<$perl_scalar> does not contain UNICODE but C<$encoding>-encoded strings
+ for some reason, then its characters are regarded as B<latin1> for perl
+ (because it does not concern with your $encoding).
+ You B<cannot> use C<encode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable.
+ Note that the resulted text is a UNICODE string but no problem to print it.
+
+ # $perl_scalar contains $encoding encoded string values
+ $unicode_json_text = $json->utf8(0)->encode( $perl_scalar );
+ # $unicode_json_text consists of characters less than 0x100
+ print $unicode_json_text;
+
+ Or C<decode $encoding> all string values and C<encode_json>:
+
+ $perl_scalar->{ foo } = decode( $encoding, $perl_scalar->{ foo } );
+ # ... do it to each string values, then encode_json
+ $json_text = encode_json( $perl_scalar );
+
+ This method is a proper way but probably not efficient.
+
+ See to L<Encode>, L<perluniintro>.
+
+
+ =head1 METHODS
+
+ Basically, check to L<JSON> or L<JSON::XS>.
+
+ =head2 new
+
+ $json = JSON::PP->new
+
+ Rturns a new JSON::PP object that can be used to de/encode JSON
+ strings.
+
+ All boolean flags described below are by default I<disabled>.
+
+ The mutators for flags all return the JSON object again and thus calls can
+ be chained:
+
+ my $json = JSON::PP->new->utf8->space_after->encode({a => [1,2]})
+ => {"a": [1, 2]}
+
+ =head2 ascii
+
+ $json = $json->ascii([$enable])
+
+ $enabled = $json->get_ascii
+
+ If $enable is true (or missing), then the encode method will not generate characters outside
+ the code range 0..127. Any Unicode characters outside that range will be escaped using either
+ a single \uXXXX or a double \uHHHH\uLLLLL escape sequence, as per RFC4627.
+ (See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>).
+
+ In Perl 5.005, there is no character having high value (more than 255).
+ See to L<UNICODE HANDLING ON PERLS>.
+
+ If $enable is false, then the encode method will not escape Unicode characters unless
+ required by the JSON syntax or other flags. This results in a faster and more compact format.
+
+ JSON::PP->new->ascii(1)->encode([chr 0x10401])
+ => ["\ud801\udc01"]
+
+ =head2 latin1
+
+ $json = $json->latin1([$enable])
+
+ $enabled = $json->get_latin1
+
+ If $enable is true (or missing), then the encode method will encode the resulting JSON
+ text as latin1 (or iso-8859-1), escaping any characters outside the code range 0..255.
+
+ If $enable is false, then the encode method will not escape Unicode characters
+ unless required by the JSON syntax or other flags.
+
+ JSON::XS->new->latin1->encode (["\x{89}\x{abc}"]
+ => ["\x{89}\\u0abc"] # (perl syntax, U+abc escaped, U+89 not)
+
+ See to L<UNICODE HANDLING ON PERLS>.
+
+ =head2 utf8
+
+ $json = $json->utf8([$enable])
+
+ $enabled = $json->get_utf8
+
+ If $enable is true (or missing), then the encode method will encode the JSON result
+ into UTF-8, as required by many protocols, while the decode method expects to be handled
+ an UTF-8-encoded string. Please note that UTF-8-encoded strings do not contain any
+ characters outside the range 0..255, they are thus useful for bytewise/binary I/O.
+
+ (In Perl 5.005, any character outside the range 0..255 does not exist.
+ See to L<UNICODE HANDLING ON PERLS>.)
+
+ In future versions, enabling this option might enable autodetection of the UTF-16 and UTF-32
+ encoding families, as described in RFC4627.
+
+ If $enable is false, then the encode method will return the JSON string as a (non-encoded)
+ Unicode string, while decode expects thus a Unicode string. Any decoding or encoding
+ (e.g. to UTF-8 or UTF-16) needs to be done yourself, e.g. using the Encode module.
+
+ Example, output UTF-16BE-encoded JSON:
+
+ use Encode;
+ $jsontext = encode "UTF-16BE", JSON::PP->new->encode ($object);
+
+ Example, decode UTF-32LE-encoded JSON:
+
+ use Encode;
+ $object = JSON::PP->new->decode (decode "UTF-32LE", $jsontext);
+
+
+ =head2 pretty
+
+ $json = $json->pretty([$enable])
+
+ This enables (or disables) all of the C<indent>, C<space_before> and
+ C<space_after> flags in one call to generate the most readable
+ (or most compact) form possible.
+
+ Equivalent to:
+
+ $json->indent->space_before->space_after
+
+ =head2 indent
+
+ $json = $json->indent([$enable])
+
+ $enabled = $json->get_indent
+
+ The default indent space length is three.
+ You can use C<indent_length> to change the length.
+
+ =head2 space_before
+
+ $json = $json->space_before([$enable])
+
+ $enabled = $json->get_space_before
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space before the C<:> separating keys from values in JSON objects.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before enabled, space_after and indent disabled:
+
+ {"key" :"value"}
+
+ =head2 space_after
+
+ $json = $json->space_after([$enable])
+
+ $enabled = $json->get_space_after
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space after the C<:> separating keys from values in JSON objects
+ and extra whitespace after the C<,> separating key-value pairs and array
+ members.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before and indent disabled, space_after enabled:
+
+ {"key": "value"}
+
+ =head2 relaxed
+
+ $json = $json->relaxed([$enable])
+
+ $enabled = $json->get_relaxed
+
+ If C<$enable> is true (or missing), then C<decode> will accept some
+ extensions to normal JSON syntax (see below). C<encode> will not be
+ affected in anyway. I<Be aware that this option makes you accept invalid
+ JSON texts as if they were valid!>. I suggest only to use this option to
+ parse application-specific files written by humans (configuration files,
+ resource files etc.)
+
+ If C<$enable> is false (the default), then C<decode> will only accept
+ valid JSON texts.
+
+ Currently accepted extensions are:
+
+ =over 4
+
+ =item * list items can have an end-comma
+
+ JSON I<separates> array elements and key-value pairs with commas. This
+ can be annoying if you write JSON texts manually and want to be able to
+ quickly append elements, so this extension accepts comma at the end of
+ such items not just between them:
+
+ [
+ 1,
+ 2, <- this comma not normally allowed
+ ]
+ {
+ "k1": "v1",
+ "k2": "v2", <- this comma not normally allowed
+ }
+
+ =item * shell-style '#'-comments
+
+ Whenever JSON allows whitespace, shell-style comments are additionally
+ allowed. They are terminated by the first carriage-return or line-feed
+ character, after which more white-space and comments are allowed.
+
+ [
+ 1, # this comment not allowed in JSON
+ # neither this one...
+ ]
+
+ =back
+
+ =head2 canonical
+
+ $json = $json->canonical([$enable])
+
+ $enabled = $json->get_canonical
+
+ If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
+ by sorting their keys. This is adding a comparatively high overhead.
+
+ If C<$enable> is false, then the C<encode> method will output key-value
+ pairs in the order Perl stores them (which will likely change between runs
+ of the same script).
+
+ This option is useful if you want the same data structure to be encoded as
+ the same JSON text (given the same overall settings). If it is disabled,
+ the same hash might be encoded differently even if contains the same data,
+ as key-value pairs have no inherent ordering in Perl.
+
+ This setting has no effect when decoding JSON texts.
+
+ If you want your own sorting routine, you can give a code referece
+ or a subroutine name to C<sort_by>. See to C<JSON::PP OWN METHODS>.
+
+ =head2 allow_nonref
+
+ $json = $json->allow_nonref([$enable])
+
+ $enabled = $json->get_allow_nonref
+
+ If C<$enable> is true (or missing), then the C<encode> method can convert a
+ non-reference into its corresponding string, number or null JSON value,
+ which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
+ values instead of croaking.
+
+ If C<$enable> is false, then the C<encode> method will croak if it isn't
+ passed an arrayref or hashref, as JSON texts must either be an object
+ or array. Likewise, C<decode> will croak if given something that is not a
+ JSON object or array.
+
+ JSON::PP->new->allow_nonref->encode ("Hello, World!")
+ => "Hello, World!"
+
+ =head2 allow_unknown
+
+ $json = $json->allow_unknown ([$enable])
+
+ $enabled = $json->get_allow_unknown
+
+ If $enable is true (or missing), then "encode" will *not* throw an
+ exception when it encounters values it cannot represent in JSON (for
+ example, filehandles) but instead will encode a JSON "null" value.
+ Note that blessed objects are not included here and are handled
+ separately by c<allow_nonref>.
+
+ If $enable is false (the default), then "encode" will throw an
+ exception when it encounters anything it cannot encode as JSON.
+
+ This option does not affect "decode" in any way, and it is
+ recommended to leave it off unless you know your communications
+ partner.
+
+ =head2 allow_blessed
+
+ $json = $json->allow_blessed([$enable])
+
+ $enabled = $json->get_allow_blessed
+
+ If C<$enable> is true (or missing), then the C<encode> method will not
+ barf when it encounters a blessed reference. Instead, the value of the
+ B<convert_blessed> option will decide whether C<null> (C<convert_blessed>
+ disabled or no C<TO_JSON> method found) or a representation of the
+ object (C<convert_blessed> enabled and C<TO_JSON> method found) is being
+ encoded. Has no effect on C<decode>.
+
+ If C<$enable> is false (the default), then C<encode> will throw an
+ exception when it encounters a blessed object.
+
+ =head2 convert_blessed
+
+ $json = $json->convert_blessed([$enable])
+
+ $enabled = $json->get_convert_blessed
+
+ If C<$enable> is true (or missing), then C<encode>, upon encountering a
+ blessed object, will check for the availability of the C<TO_JSON> method
+ on the object's class. If found, it will be called in scalar context
+ and the resulting scalar will be encoded instead of the object. If no
+ C<TO_JSON> method is found, the value of C<allow_blessed> will decide what
+ to do.
+
+ The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
+ returns other blessed objects, those will be handled in the same
+ way. C<TO_JSON> must take care of not causing an endless recursion cycle
+ (== crash) in this case. The name of C<TO_JSON> was chosen because other
+ methods called by the Perl core (== not by the user of the object) are
+ usually in upper case letters and to avoid collisions with the C<to_json>
+ function or method.
+
+ This setting does not yet influence C<decode> in any way.
+
+ If C<$enable> is false, then the C<allow_blessed> setting will decide what
+ to do when a blessed object is found.
+
+ =head2 filter_json_object
+
+ $json = $json->filter_json_object([$coderef])
+
+ When C<$coderef> is specified, it will be called from C<decode> each
+ time it decodes a JSON object. The only argument passed to the coderef
+ is a reference to the newly-created hash. If the code references returns
+ a single scalar (which need not be a reference), this value
+ (i.e. a copy of that scalar to avoid aliasing) is inserted into the
+ deserialised data structure. If it returns an empty list
+ (NOTE: I<not> C<undef>, which is a valid scalar), the original deserialised
+ hash will be inserted. This setting can slow down decoding considerably.
+
+ When C<$coderef> is omitted or undefined, any existing callback will
+ be removed and C<decode> will not change the deserialised hash in any
+ way.
+
+ Example, convert all JSON objects into the integer 5:
+
+ my $js = JSON::PP->new->filter_json_object (sub { 5 });
+ # returns [5]
+ $js->decode ('[{}]'); # the given subroutine takes a hash reference.
+ # throw an exception because allow_nonref is not enabled
+ # so a lone 5 is not allowed.
+ $js->decode ('{"a":1, "b":2}');
+
+ =head2 filter_json_single_key_object
+
+ $json = $json->filter_json_single_key_object($key [=> $coderef])
+
+ Works remotely similar to C<filter_json_object>, but is only called for
+ JSON objects having a single key named C<$key>.
+
+ This C<$coderef> is called before the one specified via
+ C<filter_json_object>, if any. It gets passed the single value in the JSON
+ object. If it returns a single value, it will be inserted into the data
+ structure. If it returns nothing (not even C<undef> but the empty list),
+ the callback from C<filter_json_object> will be called next, as if no
+ single-key callback were specified.
+
+ If C<$coderef> is omitted or undefined, the corresponding callback will be
+ disabled. There can only ever be one callback for a given key.
+
+ As this callback gets called less often then the C<filter_json_object>
+ one, decoding speed will not usually suffer as much. Therefore, single-key
+ objects make excellent targets to serialise Perl objects into, especially
+ as single-key JSON objects are as close to the type-tagged value concept
+ as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
+ support this in any way, so you need to make sure your data never looks
+ like a serialised Perl hash.
+
+ Typical names for the single object key are C<__class_whatever__>, or
+ C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
+ things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
+ with real hashes.
+
+ Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
+ into the corresponding C<< $WIDGET{<id>} >> object:
+
+ # return whatever is in $WIDGET{5}:
+ JSON::PP
+ ->new
+ ->filter_json_single_key_object (__widget__ => sub {
+ $WIDGET{ $_[0] }
+ })
+ ->decode ('{"__widget__": 5')
+
+ # this can be used with a TO_JSON method in some "widget" class
+ # for serialisation to json:
+ sub WidgetBase::TO_JSON {
+ my ($self) = @_;
+
+ unless ($self->{id}) {
+ $self->{id} = ..get..some..id..;
+ $WIDGET{$self->{id}} = $self;
+ }
+
+ { __widget__ => $self->{id} }
+ }
+
+ =head2 shrink
+
+ $json = $json->shrink([$enable])
+
+ $enabled = $json->get_shrink
+
+ In JSON::XS, this flag resizes strings generated by either
+ C<encode> or C<decode> to their minimum size possible.
+ It will also try to downgrade any strings to octet-form if possible.
+
+ In JSON::PP, it is noop about resizing strings but tries
+ C<utf8::downgrade> to the returned string by C<encode>.
+ See to L<utf8>.
+
+ See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>
+
+ =head2 max_depth
+
+ $json = $json->max_depth([$maximum_nesting_depth])
+
+ $max_depth = $json->get_max_depth
+
+ Sets the maximum nesting level (default C<512>) accepted while encoding
+ or decoding. If a higher nesting level is detected in JSON text or a Perl
+ data structure, then the encoder and decoder will stop and croak at that
+ point.
+
+ Nesting level is defined by number of hash- or arrayrefs that the encoder
+ needs to traverse to reach a given point or the number of C<{> or C<[>
+ characters without their matching closing parenthesis crossed to reach a
+ given character in a string.
+
+ If no argument is given, the highest possible setting will be used, which
+ is rarely useful.
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ When a large value (100 or more) was set and it de/encodes a deep nested object/text,
+ it may raise a warning 'Deep recursion on subroutin' at the perl runtime phase.
+
+ =head2 max_size
+
+ $json = $json->max_size([$maximum_string_size])
+
+ $max_size = $json->get_max_size
+
+ Set the maximum length a JSON text may have (in bytes) where decoding is
+ being attempted. The default is C<0>, meaning no limit. When C<decode>
+ is called on a string that is longer then this many bytes, it will not
+ attempt to decode the string but throw an exception. This setting has no
+ effect on C<encode> (yet).
+
+ If no argument is given, the limit check will be deactivated (same as when
+ C<0> is specified).
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ =head2 encode
+
+ $json_text = $json->encode($perl_scalar)
+
+ Converts the given Perl data structure (a simple scalar or a reference
+ to a hash or array) to its JSON representation. Simple scalars will be
+ converted into JSON string or number sequences, while references to arrays
+ become JSON arrays and references to hashes become JSON objects. Undefined
+ Perl values (e.g. C<undef>) become JSON C<null> values.
+ References to the integers C<0> and C<1> are converted into C<true> and C<false>.
+
+ =head2 decode
+
+ $perl_scalar = $json->decode($json_text)
+
+ The opposite of C<encode>: expects a JSON text and tries to parse it,
+ returning the resulting simple scalar or reference. Croaks on error.
+
+ JSON numbers and strings become simple Perl scalars. JSON arrays become
+ Perl arrayrefs and JSON objects become Perl hashrefs. C<true> becomes
+ C<1> (C<JSON::true>), C<false> becomes C<0> (C<JSON::false>) and
+ C<null> becomes C<undef>.
+
+ =head2 decode_prefix
+
+ ($perl_scalar, $characters) = $json->decode_prefix($json_text)
+
+ This works like the C<decode> method, but instead of raising an exception
+ when there is trailing garbage after the first JSON object, it will
+ silently stop parsing there and return the number of characters consumed
+ so far.
+
+ JSON->new->decode_prefix ("[1] the tail")
+ => ([], 3)
+
+ =head1 INCREMENTAL PARSING
+
+ Most of this section are copied and modified from L<JSON::XS/INCREMENTAL PARSING>.
+
+ In some cases, there is the need for incremental parsing of JSON texts.
+ This module does allow you to parse a JSON stream incrementally.
+ It does so by accumulating text until it has a full JSON object, which
+ it then can decode. This process is similar to using C<decode_prefix>
+ to see if a full JSON object is available, but is much more efficient
+ (and can be implemented with a minimum of method calls).
+
+ This module will only attempt to parse the JSON text once it is sure it
+ has enough text to get a decisive result, using a very simple but
+ truly incremental parser. This means that it sometimes won't stop as
+ early as the full parser, for example, it doesn't detect parenthese
+ mismatches. The only thing it guarantees is that it starts decoding as
+ soon as a syntactically valid JSON text has been seen. This means you need
+ to set resource limits (e.g. C<max_size>) to ensure the parser will stop
+ parsing in the presence if syntax errors.
+
+ The following methods implement this incremental parser.
+
+ =head2 incr_parse
+
+ $json->incr_parse( [$string] ) # void context
+
+ $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
+
+ @obj_or_empty = $json->incr_parse( [$string] ) # list context
+
+ This is the central parsing function. It can both append new text and
+ extract objects from the stream accumulated so far (both of these
+ functions are optional).
+
+ If C<$string> is given, then this string is appended to the already
+ existing JSON fragment stored in the C<$json> object.
+
+ After that, if the function is called in void context, it will simply
+ return without doing anything further. This can be used to add more text
+ in as many chunks as you want.
+
+ If the method is called in scalar context, then it will try to extract
+ exactly I<one> JSON object. If that is successful, it will return this
+ object, otherwise it will return C<undef>. If there is a parse error,
+ this method will croak just as C<decode> would do (one can then use
+ C<incr_skip> to skip the errornous part). This is the most common way of
+ using the method.
+
+ And finally, in list context, it will try to extract as many objects
+ from the stream as it can find and return them, or the empty list
+ otherwise. For this to work, there must be no separators between the JSON
+ objects or arrays, instead they must be concatenated back-to-back. If
+ an error occurs, an exception will be raised as in the scalar context
+ case. Note that in this case, any previously-parsed JSON texts will be
+ lost.
+
+ Example: Parse some JSON arrays/objects in a given string and return them.
+
+ my @objs = JSON->new->incr_parse ("[5][7][1,2]");
+
+ =head2 incr_text
+
+ $lvalue_string = $json->incr_text
+
+ This method returns the currently stored JSON fragment as an lvalue, that
+ is, you can manipulate it. This I<only> works when a preceding call to
+ C<incr_parse> in I<scalar context> successfully returned an object. Under
+ all other circumstances you must not call this function (I mean it.
+ although in simple tests it might actually work, it I<will> fail under
+ real world conditions). As a special exception, you can also call this
+ method before having parsed anything.
+
+ This function is useful in two cases: a) finding the trailing text after a
+ JSON object or b) parsing multiple JSON objects separated by non-JSON text
+ (such as commas).
+
+ $json->incr_text =~ s/\s*,\s*//;
+
+ In Perl 5.005, C<lvalue> attribute is not available.
+ You must write codes like the below:
+
+ $string = $json->incr_text;
+ $string =~ s/\s*,\s*//;
+ $json->incr_text( $string );
+
+ =head2 incr_skip
+
+ $json->incr_skip
+
+ This will reset the state of the incremental parser and will remove the
+ parsed text from the input buffer. This is useful after C<incr_parse>
+ died, in which case the input buffer and incremental parser state is left
+ unchanged, to skip the text parsed so far and to reset the parse state.
+
+ =head2 incr_reset
+
+ $json->incr_reset
+
+ This completely resets the incremental parser, that is, after this call,
+ it will be as if the parser had never parsed anything.
+
+ This is useful if you want ot repeatedly parse JSON objects and want to
+ ignore any trailing data, which means you have to reset the parser after
+ each successful decode.
+
+ See to L<JSON::XS/INCREMENTAL PARSING> for examples.
+
+
+ =head1 JSON::PP OWN METHODS
+
+ =head2 allow_singlequote
+
+ $json = $json->allow_singlequote([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ JSON strings quoted by single quotations that are invalid JSON
+ format.
+
+ $json->allow_singlequote->decode({"foo":'bar'});
+ $json->allow_singlequote->decode({'foo':"bar"});
+ $json->allow_singlequote->decode({'foo':'bar'});
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+
+ =head2 allow_barekey
+
+ $json = $json->allow_barekey([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ bare keys of JSON object that are invalid JSON format.
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+ $json->allow_barekey->decode('{foo:"bar"}');
+
+ =head2 allow_bignum
+
+ $json = $json->allow_bignum([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will convert
+ the big integer Perl cannot handle as integer into a L<Math::BigInt>
+ object and convert a floating number (any) into a L<Math::BigFloat>.
+
+ On the contary, C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers with C<allow_blessed> enable.
+
+ $json->allow_nonref->allow_blessed->allow_bignum;
+ $bigfloat = $json->decode('2.000000000000000000000000001');
+ print $json->encode($bigfloat);
+ # => 2.000000000000000000000000001
+
+ See to L<JSON::XS/MAPPING> aboout the normal conversion of JSON number.
+
+ =head2 loose
+
+ $json = $json->loose([$enable])
+
+ The unescaped [\x00-\x1f\x22\x2f\x5c] strings are invalid in JSON strings
+ and the module doesn't allow to C<decode> to these (except for \x2f).
+ If C<$enable> is true (or missing), then C<decode> will accept these
+ unescaped strings.
+
+ $json->loose->decode(qq|["abc
+ def"]|);
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS>.
+
+ =head2 escape_slash
+
+ $json = $json->escape_slash([$enable])
+
+ According to JSON Grammar, I<slash> (U+002F) is escaped. But default
+ JSON::PP (as same as JSON::XS) encodes strings without escaping slash.
+
+ If C<$enable> is true (or missing), then C<encode> will escape slashes.
+
+ =head2 indent_length
+
+ $json = $json->indent_length($length)
+
+ JSON::XS indent space length is 3 and cannot be changed.
+ JSON::PP set the indent space length with the given $length.
+ The default is 3. The acceptable range is 0 to 15.
+
+ =head2 sort_by
+
+ $json = $json->sort_by($function_name)
+ $json = $json->sort_by($subroutine_ref)
+
+ If $function_name or $subroutine_ref are set, its sort routine are used
+ in encoding JSON objects.
+
+ $js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ $js = $pc->sort_by('own_sort')->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ sub JSON::PP::own_sort { $JSON::PP::a cmp $JSON::PP::b }
+
+ As the sorting routine runs in the JSON::PP scope, the given
+ subroutine name and the special variables C<$a>, C<$b> will begin
+ 'JSON::PP::'.
+
+ If $integer is set, then the effect is same as C<canonical> on.
+
+ =head1 INTERNAL
+
+ For developers.
+
+ =over
+
+ =item PP_encode_box
+
+ Returns
+
+ {
+ depth => $depth,
+ indent_count => $indent_count,
+ }
+
+
+ =item PP_decode_box
+
+ Returns
+
+ {
+ text => $text,
+ at => $at,
+ ch => $ch,
+ len => $len,
+ depth => $depth,
+ encoding => $encoding,
+ is_valid_utf8 => $is_valid_utf8,
+ };
+
+ =back
+
+ =head1 MAPPING
+
+ This section is copied from JSON::XS and modified to C<JSON::PP>.
+ JSON::XS and JSON::PP mapping mechanisms are almost equivalent.
+
+ See to L<JSON::XS/MAPPING>.
+
+ =head2 JSON -> PERL
+
+ =over 4
+
+ =item object
+
+ A JSON object becomes a reference to a hash in Perl. No ordering of object
+ keys is preserved (JSON does not preserver object key ordering itself).
+
+ =item array
+
+ A JSON array becomes a reference to an array in Perl.
+
+ =item string
+
+ A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
+ are represented by the same codepoints in the Perl string, so no manual
+ decoding is necessary.
+
+ =item number
+
+ A JSON number becomes either an integer, numeric (floating point) or
+ string scalar in perl, depending on its range and any fractional parts. On
+ the Perl level, there is no difference between those as Perl handles all
+ the conversion details, but an integer may take slightly less memory and
+ might represent more values exactly than floating point numbers.
+
+ If the number consists of digits only, C<JSON> will try to represent
+ it as an integer value. If that fails, it will try to represent it as
+ a numeric (floating point) value if that is possible without loss of
+ precision. Otherwise it will preserve the number as a string value (in
+ which case you lose roundtripping ability, as the JSON number will be
+ re-encoded toa JSON string).
+
+ Numbers containing a fractional or exponential part will always be
+ represented as numeric (floating point) values, possibly at a loss of
+ precision (in which case you might lose perfect roundtripping ability, but
+ the JSON number will still be re-encoded as a JSON number).
+
+ Note that precision is not accuracy - binary floating point values cannot
+ represent most decimal fractions exactly, and when converting from and to
+ floating point, C<JSON> only guarantees precision up to but not including
+ the leats significant bit.
+
+ When C<allow_bignum> is enable, the big integers
+ and the numeric can be optionally converted into L<Math::BigInt> and
+ L<Math::BigFloat> objects.
+
+ =item true, false
+
+ These JSON atoms become C<JSON::PP::true> and C<JSON::PP::false>,
+ respectively. They are overloaded to act almost exactly like the numbers
+ C<1> and C<0>. You can check wether a scalar is a JSON boolean by using
+ the C<JSON::is_bool> function.
+
+ print JSON::PP::true . "\n";
+ => true
+ print JSON::PP::true + 1;
+ => 1
+
+ ok(JSON::true eq '1');
+ ok(JSON::true == 1);
+
+ C<JSON> will install these missing overloading features to the backend modules.
+
+
+ =item null
+
+ A JSON null atom becomes C<undef> in Perl.
+
+ C<JSON::PP::null> returns C<unddef>.
+
+ =back
+
+
+ =head2 PERL -> JSON
+
+ The mapping from Perl to JSON is slightly more difficult, as Perl is a
+ truly typeless language, so we can only guess which JSON type is meant by
+ a Perl value.
+
+ =over 4
+
+ =item hash references
+
+ Perl hash references become JSON objects. As there is no inherent ordering
+ in hash keys (or JSON objects), they will usually be encoded in a
+ pseudo-random order that can change between runs of the same program but
+ stays generally the same within a single run of a program. C<JSON>
+ optionally sort the hash keys (determined by the I<canonical> flag), so
+ the same datastructure will serialise to the same JSON text (given same
+ settings and version of JSON::XS), but this incurs a runtime overhead
+ and is only rarely useful, e.g. when you want to compare some JSON text
+ against another for equality.
+
+
+ =item array references
+
+ Perl array references become JSON arrays.
+
+ =item other references
+
+ Other unblessed references are generally not allowed and will cause an
+ exception to be thrown, except for references to the integers C<0> and
+ C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
+ also use C<JSON::false> and C<JSON::true> to improve readability.
+
+ to_json [\0,JSON::PP::true] # yields [false,true]
+
+ =item JSON::PP::true, JSON::PP::false, JSON::PP::null
+
+ These special values become JSON true and JSON false values,
+ respectively. You can also use C<\1> and C<\0> directly if you want.
+
+ JSON::PP::null returns C<undef>.
+
+ =item blessed objects
+
+ Blessed objects are not directly representable in JSON. See the
+ C<allow_blessed> and C<convert_blessed> methods on various options on
+ how to deal with this: basically, you can choose between throwing an
+ exception, encoding the reference as if it weren't blessed, or provide
+ your own serialiser method.
+
+ See to L<convert_blessed>.
+
+ =item simple scalars
+
+ Simple Perl scalars (any scalar that is not a reference) are the most
+ difficult objects to encode: JSON::XS and JSON::PP will encode undefined scalars as
+ JSON C<null> values, scalars that have last been used in a string context
+ before encoding as JSON strings, and anything else as number value:
+
+ # dump as number
+ encode_json [2] # yields [2]
+ encode_json [-3.0e17] # yields [-3e+17]
+ my $value = 5; encode_json [$value] # yields [5]
+
+ # used as string, so dump as string
+ print $value;
+ encode_json [$value] # yields ["5"]
+
+ # undef becomes null
+ encode_json [undef] # yields [null]
+
+ You can force the type to be a string by stringifying it:
+
+ my $x = 3.1; # some variable containing a number
+ "$x"; # stringified
+ $x .= ""; # another, more awkward way to stringify
+ print $x; # perl does it for you, too, quite often
+
+ You can force the type to be a number by numifying it:
+
+ my $x = "3"; # some variable containing a string
+ $x += 0; # numify it, ensuring it will be dumped as a number
+ $x *= 1; # same thing, the choise is yours.
+
+ You can not currently force the type in other, less obscure, ways.
+
+ Note that numerical precision has the same meaning as under Perl (so
+ binary to decimal conversion follows the same rules as in Perl, which
+ can differ to other languages). Also, your perl interpreter might expose
+ extensions to the floating point numbers of your platform, such as
+ infinities or NaN's - these cannot be represented in JSON, and it is an
+ error to pass those in.
+
+ =item Big Number
+
+ When C<allow_bignum> is enable,
+ C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers.
+
+
+ =back
+
+ =head1 UNICODE HANDLING ON PERLS
+
+ If you do not know about Unicode on Perl well,
+ please check L<JSON::XS/A FEW NOTES ON UNICODE AND PERL>.
+
+ =head2 Perl 5.8 and later
+
+ Perl can handle Unicode and the JSON::PP de/encode methods also work properly.
+
+ $json->allow_nonref->encode(chr hex 3042);
+ $json->allow_nonref->encode(chr hex 12345);
+
+ Reuturns C<"\u3042"> and C<"\ud808\udf45"> respectively.
+
+ $json->allow_nonref->decode('"\u3042"');
+ $json->allow_nonref->decode('"\ud808\udf45"');
+
+ Returns UTF-8 encoded strings with UTF8 flag, regarded as C<U+3042> and C<U+12345>.
+
+ Note that the versions from Perl 5.8.0 to 5.8.2, Perl built-in C<join> was broken,
+ so JSON::PP wraps the C<join> with a subroutine. Thus JSON::PP works slow in the versions.
+
+
+ =head2 Perl 5.6
+
+ Perl can handle Unicode and the JSON::PP de/encode methods also work.
+
+ =head2 Perl 5.005
+
+ Perl 5.005 is a byte sementics world -- all strings are sequences of bytes.
+ That means the unicode handling is not available.
+
+ In encoding,
+
+ $json->allow_nonref->encode(chr hex 3042); # hex 3042 is 12354.
+ $json->allow_nonref->encode(chr hex 12345); # hex 12345 is 74565.
+
+ Returns C<B> and C<E>, as C<chr> takes a value more than 255, it treats
+ as C<$value % 256>, so the above codes are equivalent to :
+
+ $json->allow_nonref->encode(chr 66);
+ $json->allow_nonref->encode(chr 69);
+
+ In decoding,
+
+ $json->decode('"\u00e3\u0081\u0082"');
+
+ The returned is a byte sequence C<0xE3 0x81 0x82> for UTF-8 encoded
+ japanese character (C<HIRAGANA LETTER A>).
+ And if it is represented in Unicode code point, C<U+3042>.
+
+ Next,
+
+ $json->decode('"\u3042"');
+
+ We ordinary expect the returned value is a Unicode character C<U+3042>.
+ But here is 5.005 world. This is C<0xE3 0x81 0x82>.
+
+ $json->decode('"\ud808\udf45"');
+
+ This is not a character C<U+12345> but bytes - C<0xf0 0x92 0x8d 0x85>.
+
+
+ =head1 TODO
+
+ =over
+
+ =item speed
+
+ =item memory saving
+
+ =back
+
+
+ =head1 SEE ALSO
+
+ Most of the document are copied and modified from JSON::XS doc.
+
+ L<JSON::XS>
+
+ RFC4627 (L<http://www.ietf.org/rfc/rfc4627.txt>)
+
+ =head1 AUTHOR
+
+ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
+
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 2007-2014 by Makamaka Hannyaharamitu
+
+ This library is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+ JSON_PP
+
+ $fatpacked{"JSON/PP/Boolean.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP_BOOLEAN';
+ =head1 NAME
+
+ JSON::PP::Boolean - dummy module providing JSON::PP::Boolean
+
+ =head1 SYNOPSIS
+
+ # do not "use" yourself
+
+ =head1 DESCRIPTION
+
+ This module exists only to provide overload resolution for Storable and similar modules. See
+ L<JSON::PP> for more info about this class.
+
+ =cut
+
+ use JSON::PP ();
+ use strict;
+
+ 1;
+
+ =head1 AUTHOR
+
+ This idea is from L<JSON::XS::Boolean> written by Marc Lehmann <schmorp[at]schmorp.de>
+
+ =cut
+
+ JSON_PP_BOOLEAN
+
+ $fatpacked{"Module/CPANfile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE';
+ package Module::CPANfile;
+ use strict;
+ use warnings;
+ use Cwd;
+ use Carp ();
+ use Module::CPANfile::Environment;
+ use Module::CPANfile::Requirement;
+
+ our $VERSION = '1.1000';
+
+ sub new {
+ my($class, $file) = @_;
+ bless {}, $class;
+ }
+
+ sub load {
+ my($proto, $file) = @_;
+
+ my $self = ref $proto ? $proto : $proto->new;
+ $self->parse($file || Cwd::abs_path('cpanfile'));
+ $self;
+ }
+
+ sub save {
+ my($self, $path) = @_;
+
+ open my $out, ">", $path or die "$path: $!";
+ print {$out} $self->to_string;
+ }
+
+ sub parse {
+ my($self, $file) = @_;
+
+ my $code = do {
+ open my $fh, "<", $file or die "$file: $!";
+ join '', <$fh>;
+ };
+
+ my $env = Module::CPANfile::Environment->new($file);
+ $env->parse($code) or die $@;
+
+ $self->{_mirrors} = $env->mirrors;
+ $self->{_prereqs} = $env->prereqs;
+ }
+
+ sub from_prereqs {
+ my($proto, $prereqs) = @_;
+
+ my $self = $proto->new;
+ $self->{_prereqs} = Module::CPANfile::Prereqs->from_cpan_meta($prereqs);
+
+ $self;
+ }
+
+ sub mirrors {
+ my $self = shift;
+ $self->{_mirrors} || [];
+ }
+
+ sub features {
+ my $self = shift;
+ map $self->feature($_), $self->{_prereqs}->identifiers;
+ }
+
+ sub feature {
+ my($self, $identifier) = @_;
+ $self->{_prereqs}->feature($identifier);
+ }
+
+ sub prereq { shift->prereqs }
+
+ sub prereqs {
+ my $self = shift;
+ $self->{_prereqs}->as_cpan_meta;
+ }
+
+ sub merged_requirements {
+ my $self = shift;
+ $self->{_prereqs}->merged_requirements;
+ }
+
+ sub effective_prereqs {
+ my($self, $features) = @_;
+ $self->prereqs_with(@{$features || []});
+ }
+
+ sub prereqs_with {
+ my($self, @feature_identifiers) = @_;
+
+ my $prereqs = $self->prereqs;
+ my @others = map { $self->feature($_)->prereqs } @feature_identifiers;
+
+ $prereqs->with_merged_prereqs(\@others);
+ }
+
+ sub prereq_specs {
+ my $self = shift;
+ $self->prereqs->as_string_hash;
+ }
+
+ sub prereq_for_module {
+ my($self, $module) = @_;
+ $self->{_prereqs}->find($module);
+ }
+
+ sub options_for_module {
+ my($self, $module) = @_;
+ my $prereq = $self->prereq_for_module($module) or return;
+ $prereq->requirement->options;
+ }
+
+ sub merge_meta {
+ my($self, $file, $version) = @_;
+
+ require CPAN::Meta;
+
+ $version ||= $file =~ /\.yml$/ ? '1.4' : '2';
+
+ my $prereq = $self->prereqs;
+
+ my $meta = CPAN::Meta->load_file($file);
+ my $prereqs_hash = $prereq->with_merged_prereqs($meta->effective_prereqs)->as_string_hash;
+ my $struct = { %{$meta->as_struct}, prereqs => $prereqs_hash };
+
+ CPAN::Meta->new($struct)->save($file, { version => $version });
+ }
+
+ sub _dump {
+ my $str = shift;
+ require Data::Dumper;
+ chomp(my $value = Data::Dumper->new([$str])->Terse(1)->Dump);
+ $value;
+ }
+
+ sub to_string {
+ my($self, $include_empty) = @_;
+
+ my $mirrors = $self->mirrors;
+ my $prereqs = $self->prereq_specs;
+
+ my $code = '';
+ $code .= $self->_dump_mirrors($mirrors);
+ $code .= $self->_dump_prereqs($prereqs, $include_empty);
+
+ for my $feature ($self->features) {
+ $code .= sprintf "feature %s, %s => sub {\n", _dump($feature->{identifier}), _dump($feature->{description});
+ $code .= $self->_dump_prereqs($feature->{spec}, $include_empty, 4);
+ $code .= "}\n\n";
+ }
+
+ $code =~ s/\n+$/\n/s;
+ $code;
+ }
+
+ sub _dump_mirrors {
+ my($self, $mirrors) = @_;
+
+ my $code = "";
+
+ for my $url (@$mirrors) {
+ $code .= "mirror '$url';\n";
+ }
+
+ $code =~ s/\n+$/\n/s;
+ $code;
+ }
+
+ sub _dump_prereqs {
+ my($self, $prereqs, $include_empty, $base_indent) = @_;
+
+ my $code = '';
+ for my $phase (qw(runtime configure build test develop)) {
+ my $indent = $phase eq 'runtime' ? '' : ' ';
+ $indent = (' ' x ($base_indent || 0)) . $indent;
+
+ my($phase_code, $requirements);
+ $phase_code .= "on $phase => sub {\n" unless $phase eq 'runtime';
+
+ for my $type (qw(requires recommends suggests conflicts)) {
+ for my $mod (sort keys %{$prereqs->{$phase}{$type}}) {
+ my $ver = $prereqs->{$phase}{$type}{$mod};
+ $phase_code .= $ver eq '0'
+ ? "${indent}$type '$mod';\n"
+ : "${indent}$type '$mod', '$ver';\n";
+ $requirements++;
+ }
+ }
+
+ $phase_code .= "\n" unless $requirements;
+ $phase_code .= "};\n" unless $phase eq 'runtime';
+
+ $code .= $phase_code . "\n" if $requirements or $include_empty;
+ }
+
+ $code =~ s/\n+$/\n/s;
+ $code;
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ Module::CPANfile - Parse cpanfile
+
+ =head1 SYNOPSIS
+
+ use Module::CPANfile;
+
+ my $file = Module::CPANfile->load("cpanfile");
+ my $prereqs = $file->prereqs; # CPAN::Meta::Prereqs object
+
+ my @features = $file->features; # CPAN::Meta::Feature objects
+ my $merged_prereqs = $file->prereqs_with(@identifiers); # CPAN::Meta::Prereqs
+
+ $file->merge_meta('MYMETA.json');
+
+ =head1 DESCRIPTION
+
+ Module::CPANfile is a tool to handle L<cpanfile> format to load application
+ specific dependencies, not just for CPAN distributions.
+
+ =head1 METHODS
+
+ =over 4
+
+ =item load
+
+ $file = Module::CPANfile->load;
+ $file = Module::CPANfile->load('cpanfile');
+
+ Load and parse a cpanfile. By default it tries to load C<cpanfile> in
+ the current directory, unless you pass the path to its argument.
+
+ =item from_prereqs
+
+ $file = Module::CPANfile->from_prereqs({
+ runtime => { requires => { DBI => '1.000' } },
+ });
+
+ Creates a new Module::CPANfile object from prereqs hash you can get
+ via L<CPAN::Meta>'s C<prereqs>, or L<CPAN::Meta::Prereqs>'
+ C<as_string_hash>.
+
+ # read MYMETA, then feed the prereqs to create Module::CPANfile
+ my $meta = CPAN::Meta->load_file('MYMETA.json');
+ my $file = Module::CPANfile->from_prereqs($meta->prereqs);
+
+ # load cpanfile, then recreate it with round-trip
+ my $file = Module::CPANfile->load('cpanfile');
+ $file = Module::CPANfile->from_prereqs($file->prereq_specs);
+ # or $file->prereqs->as_string_hash
+
+ =item prereqs
+
+ Returns L<CPAN::Meta::Prereqs> object out of the parsed cpanfile.
+
+ =item prereq_specs
+
+ Returns a hash reference that should be passed to C<< CPAN::Meta::Prereqs->new >>.
+
+ =item features
+
+ Returns a list of features available in the cpanfile as L<CPAN::Meta::Feature>.
+
+ =item prereqs_with(@identifiers), effective_prereqs(\@identifiers)
+
+ Returns L<CPAN::Meta::Prereqs> object, with merged prereqs for
+ features identified with the C<@identifiers>.
+
+ =item to_string($include_empty)
+
+ $file->to_string;
+ $file->to_string(1);
+
+ Returns a canonical string (code) representation for cpanfile. Useful
+ if you want to convert L<CPAN::Meta::Prereqs> to a new cpanfile.
+
+ # read MYMETA's prereqs and print cpanfile representation of it
+ my $meta = CPAN::Meta->load_file('MYMETA.json');
+ my $file = Module::CPANfile->from_prereqs($meta->prereqs);
+ print $file->to_string;
+
+ By default, it omits the phase where there're no modules
+ registered. If you pass the argument of a true value, it will print
+ them as well.
+
+ =item save
+
+ $file->save('cpanfile');
+
+ Saves the currently loaded prereqs as a new C<cpanfile> by calling
+ C<to_string>. Beware B<this method will overwrite the existing
+ cpanfile without any warning or backup>. Taking a backup or giving
+ warnings to users is a caller's responsibility.
+
+ # Read MYMETA.json and creates a new cpanfile
+ my $meta = CPAN::Meta->load_file('MYMETA.json');
+ my $file = Module::CPANfile->from_prereqs($meta->prereqs);
+ $file->save('cpanfile');
+
+ =item merge_meta
+
+ $file->merge_meta('META.yml');
+ $file->merge_meta('MYMETA.json', '2.0');
+
+ Merge the effective prereqs with Meta specification loaded from the
+ given META file, using CPAN::Meta. You can specify the META spec
+ version in the second argument, which defaults to 1.4 in case the
+ given file is YAML, and 2 if it is JSON.
+
+ =back
+
+ =head1 AUTHOR
+
+ Tatsuhiko Miyagawa
+
+ =head1 SEE ALSO
+
+ L<cpanfile>, L<CPAN::Meta>, L<CPAN::Meta::Spec>
+
+ =cut
+ MODULE_CPANFILE
+
+ $fatpacked{"Module/CPANfile/Environment.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_ENVIRONMENT';
+ package Module::CPANfile::Environment;
+ use strict;
+ use warnings;
+ use Module::CPANfile::Prereqs;
+ use Carp ();
+
+ my @bindings = qw(
+ on requires recommends suggests conflicts
+ feature
+ osname
+ mirror
+ configure_requires build_requires test_requires author_requires
+ );
+
+ my $file_id = 1;
+
+ sub new {
+ my($class, $file) = @_;
+ bless {
+ file => $file,
+ phase => 'runtime', # default phase
+ feature => undef,
+ features => {},
+ prereqs => Module::CPANfile::Prereqs->new,
+ mirrors => [],
+ }, $class;
+ }
+
+ sub bind {
+ my $self = shift;
+ my $pkg = caller;
+
+ for my $binding (@bindings) {
+ no strict 'refs';
+ *{"$pkg\::$binding"} = sub { $self->$binding(@_) };
+ }
+ }
+
+ sub parse {
+ my($self, $code) = @_;
+
+ my $err;
+ {
+ local $@;
+ $file_id++;
+ $self->_evaluate(<<EVAL);
+ package Module::CPANfile::Sandbox$file_id;
+ no warnings;
+ BEGIN { \$_environment->bind }
+
+ # line 1 "$self->{file}"
+ $code;
+ EVAL
+ $err = $@;
+ }
+
+ if ($err) { die "Parsing $self->{file} failed: $err" };
+
+ return 1;
+ }
+
+ sub _evaluate {
+ my $_environment = $_[0];
+ eval $_[1];
+ }
+
+ sub prereqs { $_[0]->{prereqs} }
+
+ sub mirrors { $_[0]->{mirrors} }
+
+ # DSL goes from here
+
+ sub on {
+ my($self, $phase, $code) = @_;
+ local $self->{phase} = $phase;
+ $code->();
+ }
+
+ sub feature {
+ my($self, $identifier, $description, $code) = @_;
+
+ # shortcut: feature identifier => sub { ... }
+ if (@_ == 3 && ref($description) eq 'CODE') {
+ $code = $description;
+ $description = $identifier;
+ }
+
+ unless (ref $description eq '' && ref $code eq 'CODE') {
+ Carp::croak("Usage: feature 'identifier', 'Description' => sub { ... }");
+ }
+
+ local $self->{feature} = $identifier;
+ $self->prereqs->add_feature($identifier, $description);
+
+ $code->();
+ }
+
+ sub osname { die "TODO" }
+
+ sub mirror {
+ my($self, $url) = @_;
+ push @{$self->{mirrors}}, $url;
+ }
+
+ sub requirement_for {
+ my($self, $module, @args) = @_;
+
+ my $requirement = 0;
+ $requirement = shift @args if @args % 2;
+
+ return Module::CPANfile::Requirement->new(
+ name => $module,
+ version => $requirement,
+ @args,
+ );
+ }
+
+ sub requires {
+ my $self = shift;
+ $self->add_prereq(requires => @_);
+ }
+
+ sub recommends {
+ my $self = shift;
+ $self->add_prereq(recommends => @_);
+ }
+
+ sub suggests {
+ my $self = shift;
+ $self->add_prereq(suggests => @_);
+ }
+
+ sub conflicts {
+ my $self = shift;
+ $self->add_prereq(conflicts => @_);
+ }
+
+ sub add_prereq {
+ my($self, $type, $module, @args) = @_;
+
+ $self->prereqs->add_prereq(
+ feature => $self->{feature},
+ phase => $self->{phase},
+ type => $type,
+ module => $module,
+ requirement => $self->requirement_for($module, @args),
+ );
+ }
+
+ # Module::Install compatible shortcuts
+
+ sub configure_requires {
+ my($self, @args) = @_;
+ $self->on(configure => sub { $self->requires(@args) });
+ }
+
+ sub build_requires {
+ my($self, @args) = @_;
+ $self->on(build => sub { $self->requires(@args) });
+ }
+
+ sub test_requires {
+ my($self, @args) = @_;
+ $self->on(test => sub { $self->requires(@args) });
+ }
+
+ sub author_requires {
+ my($self, @args) = @_;
+ $self->on(develop => sub { $self->requires(@args) });
+ }
+
+ 1;
+
+ MODULE_CPANFILE_ENVIRONMENT
+
+ $fatpacked{"Module/CPANfile/Prereq.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_PREREQ';
+ package Module::CPANfile::Prereq;
+ use strict;
+
+ sub new {
+ my($class, %options) = @_;
+ bless \%options, $class;
+ }
+
+ sub feature { $_[0]->{feature} }
+ sub phase { $_[0]->{phase} }
+ sub type { $_[0]->{type} }
+ sub module { $_[0]->{module} }
+ sub requirement { $_[0]->{requirement} }
+
+ sub match_feature {
+ my($self, $identifier) = @_;
+ no warnings 'uninitialized';
+ $self->feature eq $identifier;
+ }
+
+ 1;
+ MODULE_CPANFILE_PREREQ
+
+ $fatpacked{"Module/CPANfile/Prereqs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_PREREQS';
+ package Module::CPANfile::Prereqs;
+ use strict;
+ use Carp ();
+ use CPAN::Meta::Feature;
+ use Module::CPANfile::Prereq;
+
+ sub from_cpan_meta {
+ my($class, $prereqs) = @_;
+
+ my $self = $class->new;
+
+ for my $phase (keys %$prereqs) {
+ for my $type (keys %{ $prereqs->{$phase} }) {
+ while (my($module, $requirement) = each %{ $prereqs->{$phase}{$type} }) {
+ $self->add_prereq(
+ phase => $phase,
+ type => $type,
+ module => $module,
+ requirement => Module::CPANfile::Requirement->new(name => $module, version => $requirement),
+ );
+ }
+ }
+ }
+
+ $self;
+ }
+
+ sub new {
+ my $class = shift;
+ bless {
+ prereqs => [],
+ features => {},
+ }, $class;
+ }
+
+ sub add_feature {
+ my($self, $identifier, $description) = @_;
+ $self->{features}{$identifier} = { description => $description };
+ }
+
+ sub add_prereq {
+ my($self, %args) = @_;
+ $self->add( Module::CPANfile::Prereq->new(%args) );
+ }
+
+ sub add {
+ my($self, $prereq) = @_;
+ push @{$self->{prereqs}}, $prereq;
+ }
+
+ sub as_cpan_meta {
+ my $self = shift;
+ $self->{cpanmeta} ||= $self->build_cpan_meta;
+ }
+
+ sub build_cpan_meta {
+ my($self, $identifier) = @_;
+
+ my $prereq_spec = {};
+ $self->prereq_each($identifier, sub {
+ my $prereq = shift;
+ $prereq_spec->{$prereq->phase}{$prereq->type}{$prereq->module} = $prereq->requirement->version;
+ });
+
+ CPAN::Meta::Prereqs->new($prereq_spec);
+ }
+
+ sub prereq_each {
+ my($self, $identifier, $code) = @_;
+
+ for my $prereq (@{$self->{prereqs}}) {
+ next unless $prereq->match_feature($identifier);
+ $code->($prereq);
+ }
+ }
+
+ sub merged_requirements {
+ my $self = shift;
+
+ my $reqs = CPAN::Meta::Requirements->new;
+ for my $prereq (@{$self->{prereqs}}) {
+ $reqs->add_string_requirement($prereq->module, $prereq->requirement->version);
+ }
+
+ $reqs;
+ }
+
+ sub find {
+ my($self, $module) = @_;
+
+ for my $prereq (@{$self->{prereqs}}) {
+ return $prereq if $prereq->module eq $module;
+ }
+
+ return;
+ }
+
+ sub identifiers {
+ my $self = shift;
+ keys %{$self->{features}};
+ }
+
+ sub feature {
+ my($self, $identifier) = @_;
+
+ my $data = $self->{features}{$identifier}
+ or Carp::croak("Unknown feature '$identifier'");
+
+ my $prereqs = $self->build_cpan_meta($identifier);
+
+ CPAN::Meta::Feature->new($identifier, {
+ description => $data->{description},
+ prereqs => $prereqs->as_string_hash,
+ });
+ }
+
+ 1;
+ MODULE_CPANFILE_PREREQS
+
+ $fatpacked{"Module/CPANfile/Requirement.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_REQUIREMENT';
+ package Module::CPANfile::Requirement;
+ use strict;
+
+ sub new {
+ my ($class, %args) = @_;
+
+ $args{version} ||= 0;
+
+ bless +{
+ name => delete $args{name},
+ version => delete $args{version},
+ options => \%args,
+ }, $class;
+ }
+
+ sub name { $_[0]->{name} }
+ sub version { $_[0]->{version} }
+
+ sub options { $_[0]->{options} }
+
+ sub has_options {
+ keys %{$_[0]->{options}} > 0;
+ }
+
+ 1;
+ MODULE_CPANFILE_REQUIREMENT
+
+ $fatpacked{"Module/Metadata.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_METADATA';
+ # -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
+ # vim:ts=8:sw=2:et:sta:sts=2
+ package Module::Metadata; # git description: v1.000026-12-g9b12bf1
+
+ # Adapted from Perl-licensed code originally distributed with
+ # Module-Build by Ken Williams
+
+ # This module provides routines to gather information about
+ # perl modules (assuming this may be expanded in the distant
+ # parrot future to look at other types of modules).
+
+ sub __clean_eval { eval $_[0] }
+ use strict;
+ use warnings;
+
+ our $VERSION = '1.000027';
+
+ use Carp qw/croak/;
+ use File::Spec;
+ BEGIN {
+ # Try really hard to not depend ony any DynaLoaded module, such as IO::File or Fcntl
+ eval {
+ require Fcntl; Fcntl->import('SEEK_SET'); 1;
+ } or *SEEK_SET = sub { 0 }
+ }
+ use version 0.87;
+ BEGIN {
+ if ($INC{'Log/Contextual.pm'}) {
+ require "Log/Contextual/WarnLogger.pm"; # Hide from AutoPrereqs
+ Log::Contextual->import('log_info',
+ '-default_logger' => Log::Contextual::WarnLogger->new({ env_prefix => 'MODULE_METADATA', }),
+ );
+ } else {
+ *log_info = sub (&) { warn $_[0]->() };
+ }
+ }
+ use File::Find qw(find);
+
+ my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal
+
+ my $PKG_FIRST_WORD_REGEXP = qr{ # the FIRST word in a package name
+ [a-zA-Z_] # the first word CANNOT start with a digit
+ (?:
+ [\w']? # can contain letters, digits, _, or ticks
+ \w # But, NO multi-ticks or trailing ticks
+ )*
+ }x;
+
+ my $PKG_ADDL_WORD_REGEXP = qr{ # the 2nd+ word in a package name
+ \w # the 2nd+ word CAN start with digits
+ (?:
+ [\w']? # and can contain letters or ticks
+ \w # But, NO multi-ticks or trailing ticks
+ )*
+ }x;
+
+ my $PKG_NAME_REGEXP = qr{ # match a package name
+ (?: :: )? # a pkg name can start with arisdottle
+ $PKG_FIRST_WORD_REGEXP # a package word
+ (?:
+ (?: :: )+ ### arisdottle (allow one or many times)
+ $PKG_ADDL_WORD_REGEXP ### a package word
+ )* # ^ zero, one or many times
+ (?:
+ :: # allow trailing arisdottle
+ )?
+ }x;
+
+ my $PKG_REGEXP = qr{ # match a package declaration
+ ^[\s\{;]* # intro chars on a line
+ package # the word 'package'
+ \s+ # whitespace
+ ($PKG_NAME_REGEXP) # a package name
+ \s* # optional whitespace
+ ($V_NUM_REGEXP)? # optional version number
+ \s* # optional whitesapce
+ [;\{] # semicolon line terminator or block start (since 5.16)
+ }x;
+
+ my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name
+ ([\$*]) # sigil - $ or *
+ (
+ ( # optional leading package name
+ (?:::|\')? # possibly starting like just :: (a la $::VERSION)
+ (?:\w+(?:::|\'))* # Foo::Bar:: ...
+ )?
+ VERSION
+ )\b
+ }x;
+
+ my $VERS_REGEXP = qr{ # match a VERSION definition
+ (?:
+ \(\s*$VARNAME_REGEXP\s*\) # with parens
+ |
+ $VARNAME_REGEXP # without parens
+ )
+ \s*
+ =[^=~>] # = but not ==, nor =~, nor =>
+ }x;
+
+ sub new_from_file {
+ my $class = shift;
+ my $filename = File::Spec->rel2abs( shift );
+
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init(undef, $filename, @_);
+ }
+
+ sub new_from_handle {
+ my $class = shift;
+ my $handle = shift;
+ my $filename = shift;
+ return undef unless defined($handle) && defined($filename);
+ $filename = File::Spec->rel2abs( $filename );
+
+ return $class->_init(undef, $filename, @_, handle => $handle);
+
+ }
+
+
+ sub new_from_module {
+ my $class = shift;
+ my $module = shift;
+ my %props = @_;
+
+ $props{inc} ||= \@INC;
+ my $filename = $class->find_module_by_name( $module, $props{inc} );
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init($module, $filename, %props);
+ }
+
+ {
+
+ my $compare_versions = sub {
+ my ($v1, $op, $v2) = @_;
+ $v1 = version->new($v1)
+ unless UNIVERSAL::isa($v1,'version');
+
+ my $eval_str = "\$v1 $op \$v2";
+ my $result = eval $eval_str;
+ log_info { "error comparing versions: '$eval_str' $@" } if $@;
+
+ return $result;
+ };
+
+ my $normalize_version = sub {
+ my ($version) = @_;
+ if ( $version =~ /[=<>!,]/ ) { # logic, not just version
+ # take as is without modification
+ }
+ elsif ( ref $version eq 'version' ) { # version objects
+ $version = $version->is_qv ? $version->normal : $version->stringify;
+ }
+ elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
+ # normalize string tuples without "v": "1.2.3" -> "v1.2.3"
+ $version = "v$version";
+ }
+ else {
+ # leave alone
+ }
+ return $version;
+ };
+
+ # separate out some of the conflict resolution logic
+
+ my $resolve_module_versions = sub {
+ my $packages = shift;
+
+ my( $file, $version );
+ my $err = '';
+ foreach my $p ( @$packages ) {
+ if ( defined( $p->{version} ) ) {
+ if ( defined( $version ) ) {
+ if ( $compare_versions->( $version, '!=', $p->{version} ) ) {
+ $err .= " $p->{file} ($p->{version})\n";
+ } else {
+ # same version declared multiple times, ignore
+ }
+ } else {
+ $file = $p->{file};
+ $version = $p->{version};
+ }
+ }
+ $file ||= $p->{file} if defined( $p->{file} );
+ }
+
+ if ( $err ) {
+ $err = " $file ($version)\n" . $err;
+ }
+
+ my %result = (
+ file => $file,
+ version => $version,
+ err => $err
+ );
+
+ return \%result;
+ };
+
+ sub provides {
+ my $class = shift;
+
+ croak "provides() requires key/value pairs \n" if @_ % 2;
+ my %args = @_;
+
+ croak "provides() takes only one of 'dir' or 'files'\n"
+ if $args{dir} && $args{files};
+
+ croak "provides() requires a 'version' argument"
+ unless defined $args{version};
+
+ croak "provides() does not support version '$args{version}' metadata"
+ unless grep { $args{version} eq $_ } qw/1.4 2/;
+
+ $args{prefix} = 'lib' unless defined $args{prefix};
+
+ my $p;
+ if ( $args{dir} ) {
+ $p = $class->package_versions_from_directory($args{dir});
+ }
+ else {
+ croak "provides() requires 'files' to be an array reference\n"
+ unless ref $args{files} eq 'ARRAY';
+ $p = $class->package_versions_from_directory($args{files});
+ }
+
+ # Now, fix up files with prefix
+ if ( length $args{prefix} ) { # check in case disabled with q{}
+ $args{prefix} =~ s{/$}{};
+ for my $v ( values %$p ) {
+ $v->{file} = "$args{prefix}/$v->{file}";
+ }
+ }
+
+ return $p
+ }
+
+ sub package_versions_from_directory {
+ my ( $class, $dir, $files ) = @_;
+
+ my @files;
+
+ if ( $files ) {
+ @files = @$files;
+ } else {
+ find( {
+ wanted => sub {
+ push @files, $_ if -f $_ && /\.pm$/;
+ },
+ no_chdir => 1,
+ }, $dir );
+ }
+
+ # First, we enumerate all packages & versions,
+ # separating into primary & alternative candidates
+ my( %prime, %alt );
+ foreach my $file (@files) {
+ my $mapped_filename = File::Spec::Unix->abs2rel( $file, $dir );
+ my @path = split( /\//, $mapped_filename );
+ (my $prime_package = join( '::', @path )) =~ s/\.pm$//;
+
+ my $pm_info = $class->new_from_file( $file );
+
+ foreach my $package ( $pm_info->packages_inside ) {
+ next if $package eq 'main'; # main can appear numerous times, ignore
+ next if $package eq 'DB'; # special debugging package, ignore
+ next if grep /^_/, split( /::/, $package ); # private package, ignore
+
+ my $version = $pm_info->version( $package );
+
+ $prime_package = $package if lc($prime_package) eq lc($package);
+ if ( $package eq $prime_package ) {
+ if ( exists( $prime{$package} ) ) {
+ croak "Unexpected conflict in '$package'; multiple versions found.\n";
+ } else {
+ $mapped_filename = "$package.pm" if lc("$package.pm") eq lc($mapped_filename);
+ $prime{$package}{file} = $mapped_filename;
+ $prime{$package}{version} = $version if defined( $version );
+ }
+ } else {
+ push( @{$alt{$package}}, {
+ file => $mapped_filename,
+ version => $version,
+ } );
+ }
+ }
+ }
+
+ # Then we iterate over all the packages found above, identifying conflicts
+ # and selecting the "best" candidate for recording the file & version
+ # for each package.
+ foreach my $package ( keys( %alt ) ) {
+ my $result = $resolve_module_versions->( $alt{$package} );
+
+ if ( exists( $prime{$package} ) ) { # primary package selected
+
+ if ( $result->{err} ) {
+ # Use the selected primary package, but there are conflicting
+ # errors among multiple alternative packages that need to be
+ # reported
+ log_info {
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ $result->{err}
+ };
+
+ } elsif ( defined( $result->{version} ) ) {
+ # There is a primary package selected, and exactly one
+ # alternative package
+
+ if ( exists( $prime{$package}{version} ) &&
+ defined( $prime{$package}{version} ) ) {
+ # Unless the version of the primary package agrees with the
+ # version of the alternative package, report a conflict
+ if ( $compare_versions->(
+ $prime{$package}{version}, '!=', $result->{version}
+ )
+ ) {
+
+ log_info {
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ " $result->{file} ($result->{version})\n"
+ };
+ }
+
+ } else {
+ # The prime package selected has no version so, we choose to
+ # use any alternative package that does have a version
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version};
+ }
+
+ } else {
+ # no alt package found with a version, but we have a prime
+ # package so we use it whether it has a version or not
+ }
+
+ } else { # No primary package was selected, use the best alternative
+
+ if ( $result->{err} ) {
+ log_info {
+ "Found conflicting versions for package '$package'\n" .
+ $result->{err}
+ };
+ }
+
+ # Despite possible conflicting versions, we choose to record
+ # something rather than nothing
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version}
+ if defined( $result->{version} );
+ }
+ }
+
+ # Normalize versions. Can't use exists() here because of bug in YAML::Node.
+ # XXX "bug in YAML::Node" comment seems irrelevant -- dagolden, 2009-05-18
+ for (grep defined $_->{version}, values %prime) {
+ $_->{version} = $normalize_version->( $_->{version} );
+ }
+
+ return \%prime;
+ }
+ }
+
+
+ sub _init {
+ my $class = shift;
+ my $module = shift;
+ my $filename = shift;
+ my %props = @_;
+
+ my $handle = delete $props{handle};
+ my( %valid_props, @valid_props );
+ @valid_props = qw( collect_pod inc );
+ @valid_props{@valid_props} = delete( @props{@valid_props} );
+ warn "Unknown properties: @{[keys %props]}\n" if scalar( %props );
+
+ my %data = (
+ module => $module,
+ filename => $filename,
+ version => undef,
+ packages => [],
+ versions => {},
+ pod => {},
+ pod_headings => [],
+ collect_pod => 0,
+
+ %valid_props,
+ );
+
+ my $self = bless(\%data, $class);
+
+ if ( not $handle ) {
+ my $filename = $self->{filename};
+ open $handle, '<', $filename
+ or croak( "Can't open '$filename': $!" );
+
+ $self->_handle_bom($handle, $filename);
+ }
+ $self->_parse_fh($handle);
+
+ unless($self->{module} and length($self->{module})) {
+ my ($v, $d, $f) = File::Spec->splitpath($self->{filename});
+ if($f =~ /\.pm$/) {
+ $f =~ s/\..+$//;
+ my @candidates = grep /$f$/, @{$self->{packages}};
+ $self->{module} = shift(@candidates); # punt
+ }
+ else {
+ if(grep /main/, @{$self->{packages}}) {
+ $self->{module} = 'main';
+ }
+ else {
+ $self->{module} = $self->{packages}[0] || '';
+ }
+ }
+ }
+
+ $self->{version} = $self->{versions}{$self->{module}}
+ if defined( $self->{module} );
+
+ return $self;
+ }
+
+ # class method
+ sub _do_find_module {
+ my $class = shift;
+ my $module = shift || croak 'find_module_by_name() requires a package name';
+ my $dirs = shift || \@INC;
+
+ my $file = File::Spec->catfile(split( /::/, $module));
+ foreach my $dir ( @$dirs ) {
+ my $testfile = File::Spec->catfile($dir, $file);
+ return [ File::Spec->rel2abs( $testfile ), $dir ]
+ if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp
+ $testfile .= '.pm';
+ return [ File::Spec->rel2abs( $testfile ), $dir ]
+ if -e $testfile;
+ }
+ return;
+ }
+
+ # class method
+ sub find_module_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[0];
+ }
+
+ # class method
+ sub find_module_dir_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[1];
+ }
+
+
+ # given a line of perl code, attempt to parse it if it looks like a
+ # $VERSION assignment, returning sigil, full name, & package name
+ sub _parse_version_expression {
+ my $self = shift;
+ my $line = shift;
+
+ my( $sigil, $variable_name, $package);
+ if ( $line =~ /$VERS_REGEXP/o ) {
+ ( $sigil, $variable_name, $package) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 );
+ if ( $package ) {
+ $package = ($package eq '::') ? 'main' : $package;
+ $package =~ s/::$//;
+ }
+ }
+
+ return ( $sigil, $variable_name, $package );
+ }
+
+ # Look for a UTF-8/UTF-16BE/UTF-16LE BOM at the beginning of the stream.
+ # If there's one, then skip it and set the :encoding layer appropriately.
+ sub _handle_bom {
+ my ($self, $fh, $filename) = @_;
+
+ my $pos = tell $fh;
+ return unless defined $pos;
+
+ my $buf = ' ' x 2;
+ my $count = read $fh, $buf, length $buf;
+ return unless defined $count and $count >= 2;
+
+ my $encoding;
+ if ( $buf eq "\x{FE}\x{FF}" ) {
+ $encoding = 'UTF-16BE';
+ } elsif ( $buf eq "\x{FF}\x{FE}" ) {
+ $encoding = 'UTF-16LE';
+ } elsif ( $buf eq "\x{EF}\x{BB}" ) {
+ $buf = ' ';
+ $count = read $fh, $buf, length $buf;
+ if ( defined $count and $count >= 1 and $buf eq "\x{BF}" ) {
+ $encoding = 'UTF-8';
+ }
+ }
+
+ if ( defined $encoding ) {
+ if ( "$]" >= 5.008 ) {
+ binmode( $fh, ":encoding($encoding)" );
+ }
+ } else {
+ seek $fh, $pos, SEEK_SET
+ or croak( sprintf "Can't reset position to the top of '$filename'" );
+ }
+
+ return $encoding;
+ }
+
+ sub _parse_fh {
+ my ($self, $fh) = @_;
+
+ my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 );
+ my( @packages, %vers, %pod, @pod );
+ my $package = 'main';
+ my $pod_sect = '';
+ my $pod_data = '';
+ my $in_end = 0;
+
+ while (defined( my $line = <$fh> )) {
+ my $line_num = $.;
+
+ chomp( $line );
+
+ # From toke.c : any line that begins by "=X", where X is an alphabetic
+ # character, introduces a POD segment.
+ my $is_cut;
+ if ( $line =~ /^=([a-zA-Z].*)/ ) {
+ my $cmd = $1;
+ # Then it goes back to Perl code for "=cutX" where X is a non-alphabetic
+ # character (which includes the newline, but here we chomped it away).
+ $is_cut = $cmd =~ /^cut(?:[^a-zA-Z]|$)/;
+ $in_pod = !$is_cut;
+ }
+
+ if ( $in_pod ) {
+
+ if ( $line =~ /^=head[1-4]\s+(.+)\s*$/ ) {
+ push( @pod, $1 );
+ if ( $self->{collect_pod} && length( $pod_data ) ) {
+ $pod{$pod_sect} = $pod_data;
+ $pod_data = '';
+ }
+ $pod_sect = $1;
+
+ } elsif ( $self->{collect_pod} ) {
+ $pod_data .= "$line\n";
+
+ }
+
+ } elsif ( $is_cut ) {
+
+ if ( $self->{collect_pod} && length( $pod_data ) ) {
+ $pod{$pod_sect} = $pod_data;
+ $pod_data = '';
+ }
+ $pod_sect = '';
+
+ } else {
+
+ # Skip after __END__
+ next if $in_end;
+
+ # Skip comments in code
+ next if $line =~ /^\s*#/;
+
+ # Would be nice if we could also check $in_string or something too
+ if ($line eq '__END__') {
+ $in_end++;
+ next;
+ }
+ last if $line eq '__DATA__';
+
+ # parse $line to see if it's a $VERSION declaration
+ my( $version_sigil, $version_fullname, $version_package ) =
+ index($line, 'VERSION') >= 1
+ ? $self->_parse_version_expression( $line )
+ : ();
+
+ if ( $line =~ /$PKG_REGEXP/o ) {
+ $package = $1;
+ my $version = $2;
+ push( @packages, $package ) unless grep( $package eq $_, @packages );
+ $need_vers = defined $version ? 0 : 1;
+
+ if ( not exists $vers{$package} and defined $version ){
+ # Upgrade to a version object.
+ my $dwim_version = eval { _dwim_version($version) };
+ croak "Version '$version' from $self->{filename} does not appear to be valid:\n$line\n\nThe fatal error was: $@\n"
+ unless defined $dwim_version; # "0" is OK!
+ $vers{$package} = $dwim_version;
+ }
+
+ # VERSION defined with full package spec, i.e. $Module::VERSION
+ } elsif ( $version_fullname && $version_package ) {
+ push( @packages, $version_package ) unless grep( $version_package eq $_, @packages );
+ $need_vers = 0 if $version_package eq $package;
+
+ unless ( defined $vers{$version_package} && length $vers{$version_package} ) {
+ $vers{$version_package} = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
+ }
+
+ # first non-comment line in undeclared package main is VERSION
+ } elsif ( $package eq 'main' && $version_fullname && !exists($vers{main}) ) {
+ $need_vers = 0;
+ my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
+ $vers{$package} = $v;
+ push( @packages, 'main' );
+
+ # first non-comment line in undeclared package defines package main
+ } elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w/ ) {
+ $need_vers = 1;
+ $vers{main} = '';
+ push( @packages, 'main' );
+
+ # only keep if this is the first $VERSION seen
+ } elsif ( $version_fullname && $need_vers ) {
+ $need_vers = 0;
+ my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
+
+ unless ( defined $vers{$package} && length $vers{$package} ) {
+ $vers{$package} = $v;
+ }
+ }
+ }
+ }
+
+ if ( $self->{collect_pod} && length($pod_data) ) {
+ $pod{$pod_sect} = $pod_data;
+ }
+
+ $self->{versions} = \%vers;
+ $self->{packages} = \@packages;
+ $self->{pod} = \%pod;
+ $self->{pod_headings} = \@pod;
+ }
+
+ {
+ my $pn = 0;
+ sub _evaluate_version_line {
+ my $self = shift;
+ my( $sigil, $variable_name, $line ) = @_;
+
+ # We compile into a local sub because 'use version' would cause
+ # compiletime/runtime issues with local()
+ $pn++; # everybody gets their own package
+ my $eval = qq{ my \$dummy = q# Hide from _packages_inside()
+ #; package Module::Metadata::_version::p${pn};
+ use version;
+ sub {
+ local $sigil$variable_name;
+ $line;
+ \$$variable_name
+ };
+ };
+
+ $eval = $1 if $eval =~ m{^(.+)}s;
+
+ local $^W;
+ # Try to get the $VERSION
+ my $vsub = __clean_eval($eval);
+ # some modules say $VERSION <equal sign> $Foo::Bar::VERSION, but Foo::Bar isn't
+ # installed, so we need to hunt in ./lib for it
+ if ( $@ =~ /Can't locate/ && -d 'lib' ) {
+ local @INC = ('lib',@INC);
+ $vsub = __clean_eval($eval);
+ }
+ warn "Error evaling version line '$eval' in $self->{filename}: $@\n"
+ if $@;
+
+ (ref($vsub) eq 'CODE') or
+ croak "failed to build version sub for $self->{filename}";
+
+ my $result = eval { $vsub->() };
+ # FIXME: $eval is not the right thing to print here
+ croak "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n"
+ if $@;
+
+ # Upgrade it into a version object
+ my $version = eval { _dwim_version($result) };
+
+ # FIXME: $eval is not the right thing to print here
+ croak "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n"
+ unless defined $version; # "0" is OK!
+
+ return $version;
+ }
+ }
+
+ # Try to DWIM when things fail the lax version test in obvious ways
+ {
+ my @version_prep = (
+ # Best case, it just works
+ sub { return shift },
+
+ # If we still don't have a version, try stripping any
+ # trailing junk that is prohibited by lax rules
+ sub {
+ my $v = shift;
+ $v =~ s{([0-9])[a-z-].*$}{$1}i; # 1.23-alpha or 1.23b
+ return $v;
+ },
+
+ # Activestate apparently creates custom versions like '1.23_45_01', which
+ # cause version.pm to think it's an invalid alpha. So check for that
+ # and strip them
+ sub {
+ my $v = shift;
+ my $num_dots = () = $v =~ m{(\.)}g;
+ my $num_unders = () = $v =~ m{(_)}g;
+ my $leading_v = substr($v,0,1) eq 'v';
+ if ( ! $leading_v && $num_dots < 2 && $num_unders > 1 ) {
+ $v =~ s{_}{}g;
+ $num_unders = () = $v =~ m{(_)}g;
+ }
+ return $v;
+ },
+
+ # Worst case, try numifying it like we would have before version objects
+ sub {
+ my $v = shift;
+ no warnings 'numeric';
+ return 0 + $v;
+ },
+
+ );
+
+ sub _dwim_version {
+ my ($result) = shift;
+
+ return $result if ref($result) eq 'version';
+
+ my ($version, $error);
+ for my $f (@version_prep) {
+ $result = $f->($result);
+ $version = eval { version->new($result) };
+ $error ||= $@ if $@; # capture first failure
+ last if defined $version;
+ }
+
+ croak $error unless defined $version;
+
+ return $version;
+ }
+ }
+
+ ############################################################
+
+ # accessors
+ sub name { $_[0]->{module} }
+
+ sub filename { $_[0]->{filename} }
+ sub packages_inside { @{$_[0]->{packages}} }
+ sub pod_inside { @{$_[0]->{pod_headings}} }
+ sub contains_pod { 0+@{$_[0]->{pod_headings}} }
+
+ sub version {
+ my $self = shift;
+ my $mod = shift || $self->{module};
+ my $vers;
+ if ( defined( $mod ) && length( $mod ) &&
+ exists( $self->{versions}{$mod} ) ) {
+ return $self->{versions}{$mod};
+ } else {
+ return undef;
+ }
+ }
+
+ sub pod {
+ my $self = shift;
+ my $sect = shift;
+ if ( defined( $sect ) && length( $sect ) &&
+ exists( $self->{pod}{$sect} ) ) {
+ return $self->{pod}{$sect};
+ } else {
+ return undef;
+ }
+ }
+
+ sub is_indexable {
+ my ($self, $package) = @_;
+
+ my @indexable_packages = grep { $_ ne 'main' } $self->packages_inside;
+
+ # check for specific package, if provided
+ return !! grep { $_ eq $package } @indexable_packages if $package;
+
+ # otherwise, check for any indexable packages at all
+ return !! @indexable_packages;
+ }
+
+ 1;
+
+ =head1 NAME
+
+ Module::Metadata - Gather package and POD information from perl module files
+
+ =head1 SYNOPSIS
+
+ use Module::Metadata;
+
+ # information about a .pm file
+ my $info = Module::Metadata->new_from_file( $file );
+ my $version = $info->version;
+
+ # CPAN META 'provides' field for .pm files in a directory
+ my $provides = Module::Metadata->provides(
+ dir => 'lib', version => 2
+ );
+
+ =head1 DESCRIPTION
+
+ This module provides a standard way to gather metadata about a .pm file through
+ (mostly) static analysis and (some) code execution. When determining the
+ version of a module, the C<$VERSION> assignment is C<eval>ed, as is traditional
+ in the CPAN toolchain.
+
+ =head1 CLASS METHODS
+
+ =head2 C<< new_from_file($filename, collect_pod => 1) >>
+
+ Constructs a C<Module::Metadata> object given the path to a file. Returns
+ undef if the filename does not exist.
+
+ C<collect_pod> is a optional boolean argument that determines whether POD
+ data is collected and stored for reference. POD data is not collected by
+ default. POD headings are always collected.
+
+ If the file begins by an UTF-8, UTF-16BE or UTF-16LE byte-order mark, then
+ it is skipped before processing, and the content of the file is also decoded
+ appropriately starting from perl 5.8.
+
+ =head2 C<< new_from_handle($handle, $filename, collect_pod => 1) >>
+
+ This works just like C<new_from_file>, except that a handle can be provided
+ as the first argument.
+
+ Note that there is no validation to confirm that the handle is a handle or
+ something that can act like one. Passing something that isn't a handle will
+ cause a exception when trying to read from it. The C<filename> argument is
+ mandatory or undef will be returned.
+
+ You are responsible for setting the decoding layers on C<$handle> if
+ required.
+
+ =head2 C<< new_from_module($module, collect_pod => 1, inc => \@dirs) >>
+
+ Constructs a C<Module::Metadata> object given a module or package name.
+ Returns undef if the module cannot be found.
+
+ In addition to accepting the C<collect_pod> argument as described above,
+ this method accepts a C<inc> argument which is a reference to an array of
+ directories to search for the module. If none are given, the default is
+ @INC.
+
+ If the file that contains the module begins by an UTF-8, UTF-16BE or
+ UTF-16LE byte-order mark, then it is skipped before processing, and the
+ content of the file is also decoded appropriately starting from perl 5.8.
+
+ =head2 C<< find_module_by_name($module, \@dirs) >>
+
+ Returns the path to a module given the module or package name. A list
+ of directories can be passed in as an optional parameter, otherwise
+ @INC is searched.
+
+ Can be called as either an object or a class method.
+
+ =head2 C<< find_module_dir_by_name($module, \@dirs) >>
+
+ Returns the entry in C<@dirs> (or C<@INC> by default) that contains
+ the module C<$module>. A list of directories can be passed in as an
+ optional parameter, otherwise @INC is searched.
+
+ Can be called as either an object or a class method.
+
+ =head2 C<< provides( %options ) >>
+
+ This is a convenience wrapper around C<package_versions_from_directory>
+ to generate a CPAN META C<provides> data structure. It takes key/value
+ pairs. Valid option keys include:
+
+ =over
+
+ =item version B<(required)>
+
+ Specifies which version of the L<CPAN::Meta::Spec> should be used as
+ the format of the C<provides> output. Currently only '1.4' and '2'
+ are supported (and their format is identical). This may change in
+ the future as the definition of C<provides> changes.
+
+ The C<version> option is required. If it is omitted or if
+ an unsupported version is given, then C<provides> will throw an error.
+
+ =item dir
+
+ Directory to search recursively for F<.pm> files. May not be specified with
+ C<files>.
+
+ =item files
+
+ Array reference of files to examine. May not be specified with C<dir>.
+
+ =item prefix
+
+ String to prepend to the C<file> field of the resulting output. This defaults
+ to F<lib>, which is the common case for most CPAN distributions with their
+ F<.pm> files in F<lib>. This option ensures the META information has the
+ correct relative path even when the C<dir> or C<files> arguments are
+ absolute or have relative paths from a location other than the distribution
+ root.
+
+ =back
+
+ For example, given C<dir> of 'lib' and C<prefix> of 'lib', the return value
+ is a hashref of the form:
+
+ {
+ 'Package::Name' => {
+ version => '0.123',
+ file => 'lib/Package/Name.pm'
+ },
+ 'OtherPackage::Name' => ...
+ }
+
+ =head2 C<< package_versions_from_directory($dir, \@files?) >>
+
+ Scans C<$dir> for .pm files (unless C<@files> is given, in which case looks
+ for those files in C<$dir> - and reads each file for packages and versions,
+ returning a hashref of the form:
+
+ {
+ 'Package::Name' => {
+ version => '0.123',
+ file => 'Package/Name.pm'
+ },
+ 'OtherPackage::Name' => ...
+ }
+
+ The C<DB> and C<main> packages are always omitted, as are any "private"
+ packages that have leading underscores in the namespace (e.g.
+ C<Foo::_private>)
+
+ Note that the file path is relative to C<$dir> if that is specified.
+ This B<must not> be used directly for CPAN META C<provides>. See
+ the C<provides> method instead.
+
+ =head2 C<< log_info (internal) >>
+
+ Used internally to perform logging; imported from Log::Contextual if
+ Log::Contextual has already been loaded, otherwise simply calls warn.
+
+ =head1 OBJECT METHODS
+
+ =head2 C<< name() >>
+
+ Returns the name of the package represented by this module. If there
+ is more than one package, it makes a best guess based on the
+ filename. If it's a script (i.e. not a *.pm) the package name is
+ 'main'.
+
+ =head2 C<< version($package) >>
+
+ Returns the version as defined by the $VERSION variable for the
+ package as returned by the C<name> method if no arguments are
+ given. If given the name of a package it will attempt to return the
+ version of that package if it is specified in the file.
+
+ =head2 C<< filename() >>
+
+ Returns the absolute path to the file.
+ Note that this file may not actually exist on disk yet, e.g. if the module was read from an in-memory filehandle.
+
+ =head2 C<< packages_inside() >>
+
+ Returns a list of packages. Note: this is a raw list of packages
+ discovered (or assumed, in the case of C<main>). It is not
+ filtered for C<DB>, C<main> or private packages the way the
+ C<provides> method does. Invalid package names are not returned,
+ for example "Foo:Bar". Strange but valid package names are
+ returned, for example "Foo::Bar::", and are left up to the caller
+ on how to handle.
+
+ =head2 C<< pod_inside() >>
+
+ Returns a list of POD sections.
+
+ =head2 C<< contains_pod() >>
+
+ Returns true if there is any POD in the file.
+
+ =head2 C<< pod($section) >>
+
+ Returns the POD data in the given section.
+
+ =head2 C<< is_indexable($package) >> or C<< is_indexable() >>
+
+ Returns a boolean indicating whether the package (if provided) or any package
+ (otherwise) is eligible for indexing by PAUSE, the Perl Authors Upload Server.
+ Note This only checks for valid C<package> declarations, and does not take any
+ ownership information into account.
+
+ =head1 AUTHOR
+
+ Original code from Module::Build::ModuleInfo by Ken Williams
+ <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org>
+
+ Released as Module::Metadata by Matt S Trout (mst) <mst@shadowcat.co.uk> with
+ assistance from David Golden (xdg) <dagolden@cpan.org>.
+
+ =head1 COPYRIGHT & LICENSE
+
+ Original code Copyright (c) 2001-2011 Ken Williams.
+ Additional code Copyright (c) 2010-2011 Matt Trout and David Golden.
+ All rights reserved.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+ =cut
+ MODULE_METADATA
+
+ $fatpacked{"Parse/CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_CPAN_META';
+ use 5.008001;
+ use strict;
+ package Parse::CPAN::Meta;
+ # ABSTRACT: Parse META.yml and META.json CPAN metadata files
+ our $VERSION = '1.4414'; # VERSION
+
+ use Exporter;
+ use Carp 'croak';
+
+ our @ISA = qw/Exporter/;
+ our @EXPORT_OK = qw/Load LoadFile/;
+
+ sub load_file {
+ my ($class, $filename) = @_;
+
+ my $meta = _slurp($filename);
+
+ if ($filename =~ /\.ya?ml$/) {
+ return $class->load_yaml_string($meta);
+ }
+ elsif ($filename =~ /\.json$/) {
+ return $class->load_json_string($meta);
+ }
+ else {
+ $class->load_string($meta); # try to detect yaml/json
+ }
+ }
+
+ sub load_string {
+ my ($class, $string) = @_;
+ if ( $string =~ /^---/ ) { # looks like YAML
+ return $class->load_yaml_string($string);
+ }
+ elsif ( $string =~ /^\s*\{/ ) { # looks like JSON
+ return $class->load_json_string($string);
+ }
+ else { # maybe doc-marker-free YAML
+ return $class->load_yaml_string($string);
+ }
+ }
+
+ sub load_yaml_string {
+ my ($class, $string) = @_;
+ my $backend = $class->yaml_backend();
+ my $data = eval { no strict 'refs'; &{"$backend\::Load"}($string) };
+ croak $@ if $@;
+ return $data || {}; # in case document was valid but empty
+ }
+
+ sub load_json_string {
+ my ($class, $string) = @_;
+ my $data = eval { $class->json_backend()->new->decode($string) };
+ croak $@ if $@;
+ return $data || {};
+ }
+
+ sub yaml_backend {
+ if (! defined $ENV{PERL_YAML_BACKEND} ) {
+ _can_load( 'CPAN::Meta::YAML', 0.011 )
+ or croak "CPAN::Meta::YAML 0.011 is not available\n";
+ return "CPAN::Meta::YAML";
+ }
+ else {
+ my $backend = $ENV{PERL_YAML_BACKEND};
+ _can_load( $backend )
+ or croak "Could not load PERL_YAML_BACKEND '$backend'\n";
+ $backend->can("Load")
+ or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n";
+ return $backend;
+ }
+ }
+
+ sub json_backend {
+ if (! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') {
+ _can_load( 'JSON::PP' => 2.27103 )
+ or croak "JSON::PP 2.27103 is not available\n";
+ return 'JSON::PP';
+ }
+ else {
+ _can_load( 'JSON' => 2.5 )
+ or croak "JSON 2.5 is required for " .
+ "\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n";
+ return "JSON";
+ }
+ }
+
+ sub _slurp {
+ require Encode;
+ open my $fh, "<:raw", "$_[0]" ## no critic
+ or die "can't open $_[0] for reading: $!";
+ my $content = do { local $/; <$fh> };
+ $content = Encode::decode('UTF-8', $content, Encode::PERLQQ());
+ return $content;
+ }
+
+ sub _can_load {
+ my ($module, $version) = @_;
+ (my $file = $module) =~ s{::}{/}g;
+ $file .= ".pm";
+ return 1 if $INC{$file};
+ return 0 if exists $INC{$file}; # prior load failed
+ eval { require $file; 1 }
+ or return 0;
+ if ( defined $version ) {
+ eval { $module->VERSION($version); 1 }
+ or return 0;
+ }
+ return 1;
+ }
+
+ # Kept for backwards compatibility only
+ # Create an object from a file
+ sub LoadFile ($) {
+ return Load(_slurp(shift));
+ }
+
+ # Parse a document from a string.
+ sub Load ($) {
+ require CPAN::Meta::YAML;
+ my $object = eval { CPAN::Meta::YAML::Load(shift) };
+ croak $@ if $@;
+ return $object;
+ }
+
+ 1;
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ Parse::CPAN::Meta - Parse META.yml and META.json CPAN metadata files
+
+ =head1 VERSION
+
+ version 1.4414
+
+ =head1 SYNOPSIS
+
+ #############################################
+ # In your file
+
+ ---
+ name: My-Distribution
+ version: 1.23
+ resources:
+ homepage: "http://example.com/dist/My-Distribution"
+
+
+ #############################################
+ # In your program
+
+ use Parse::CPAN::Meta;
+
+ my $distmeta = Parse::CPAN::Meta->load_file('META.yml');
+
+ # Reading properties
+ my $name = $distmeta->{name};
+ my $version = $distmeta->{version};
+ my $homepage = $distmeta->{resources}{homepage};
+
+ =head1 DESCRIPTION
+
+ B<Parse::CPAN::Meta> is a parser for F<META.json> and F<META.yml> files, using
+ L<JSON::PP> and/or L<CPAN::Meta::YAML>.
+
+ B<Parse::CPAN::Meta> provides three methods: C<load_file>, C<load_json_string>,
+ and C<load_yaml_string>. These will read and deserialize CPAN metafiles, and
+ are described below in detail.
+
+ B<Parse::CPAN::Meta> provides a legacy API of only two functions,
+ based on the YAML functions of the same name. Wherever possible,
+ identical calling semantics are used. These may only be used with YAML sources.
+
+ All error reporting is done with exceptions (die'ing).
+
+ Note that META files are expected to be in UTF-8 encoding, only. When
+ converted string data, it must first be decoded from UTF-8.
+
+ =begin Pod::Coverage
+
+
+
+
+ =end Pod::Coverage
+
+ =head1 METHODS
+
+ =head2 load_file
+
+ my $metadata_structure = Parse::CPAN::Meta->load_file('META.json');
+
+ my $metadata_structure = Parse::CPAN::Meta->load_file('META.yml');
+
+ This method will read the named file and deserialize it to a data structure,
+ determining whether it should be JSON or YAML based on the filename.
+ The file will be read using the ":utf8" IO layer.
+
+ =head2 load_yaml_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_yaml_string($yaml_string);
+
+ This method deserializes the given string of YAML and returns the first
+ document in it. (CPAN metadata files should always have only one document.)
+ If the source was UTF-8 encoded, the string must be decoded before calling
+ C<load_yaml_string>.
+
+ =head2 load_json_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_json_string($json_string);
+
+ This method deserializes the given string of JSON and the result.
+ If the source was UTF-8 encoded, the string must be decoded before calling
+ C<load_json_string>.
+
+ =head2 load_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_string($some_string);
+
+ If you don't know whether a string contains YAML or JSON data, this method
+ will use some heuristics and guess. If it can't tell, it assumes YAML.
+
+ =head2 yaml_backend
+
+ my $backend = Parse::CPAN::Meta->yaml_backend;
+
+ Returns the module name of the YAML serializer. See L</ENVIRONMENT>
+ for details.
+
+ =head2 json_backend
+
+ my $backend = Parse::CPAN::Meta->json_backend;
+
+ Returns the module name of the JSON serializer. This will either
+ be L<JSON::PP> or L<JSON>. Even if C<PERL_JSON_BACKEND> is set,
+ this will return L<JSON> as further delegation is handled by
+ the L<JSON> module. See L</ENVIRONMENT> for details.
+
+ =head1 FUNCTIONS
+
+ For maintenance clarity, no functions are exported by default. These functions
+ are available for backwards compatibility only and are best avoided in favor of
+ C<load_file>.
+
+ =head2 Load
+
+ my @yaml = Parse::CPAN::Meta::Load( $string );
+
+ Parses a string containing a valid YAML stream into a list of Perl data
+ structures.
+
+ =head2 LoadFile
+
+ my @yaml = Parse::CPAN::Meta::LoadFile( 'META.yml' );
+
+ Reads the YAML stream from a file instead of a string.
+
+ =head1 ENVIRONMENT
+
+ =head2 PERL_JSON_BACKEND
+
+ By default, L<JSON::PP> will be used for deserializing JSON data. If the
+ C<PERL_JSON_BACKEND> environment variable exists, is true and is not
+ "JSON::PP", then the L<JSON> module (version 2.5 or greater) will be loaded and
+ used to interpret C<PERL_JSON_BACKEND>. If L<JSON> is not installed or is too
+ old, an exception will be thrown.
+
+ =head2 PERL_YAML_BACKEND
+
+ By default, L<CPAN::Meta::YAML> will be used for deserializing YAML data. If
+ the C<PERL_YAML_BACKEND> environment variable is defined, then it is interpreted
+ as a module to use for deserialization. The given module must be installed,
+ must load correctly and must implement the C<Load()> function or an exception
+ will be thrown.
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Parse-CPAN-Meta>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/Perl-Toolchain-Gang/Parse-CPAN-Meta>
+
+ git clone https://github.com/Perl-Toolchain-Gang/Parse-CPAN-Meta.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ Adam Kennedy <adamk@cpan.org>
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =over 4
+
+ =item *
+
+ Graham Knop <haarg@haarg.org>
+
+ =item *
+
+ Joshua ben Jore <jjore@cpan.org>
+
+ =item *
+
+ Neil Bowers <neil@bowers.com>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =item *
+
+ Steffen Mueller <smueller@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2014 by Adam Kennedy and Contributors.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ PARSE_CPAN_META
+
+ $fatpacked{"Parse/PMFile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_PMFILE';
+ package Parse::PMFile;
+
+ sub __clean_eval { eval $_[0] } # needs to be here (RT#101273)
+
+ use strict;
+ use warnings;
+ use Safe;
+ use JSON::PP ();
+ use Dumpvalue;
+ use version ();
+ use File::Spec ();
+
+ our $VERSION = '0.36';
+ our $VERBOSE = 0;
+ our $ALLOW_DEV_VERSION = 0;
+ our $FORK = 0;
+ our $UNSAFE = $] < 5.010000 ? 1 : 0;
+
+ sub new {
+ my ($class, $meta, $opts) = @_;
+ bless {%{ $opts || {} }, META_CONTENT => $meta}, $class;
+ }
+
+ # from PAUSE::pmfile::examine_fio
+ sub parse {
+ my ($self, $pmfile) = @_;
+
+ $pmfile =~ s|\\|/|g;
+
+ my($filemtime) = (stat $pmfile)[9];
+ $self->{MTIME} = $filemtime;
+ $self->{PMFILE} = $pmfile;
+
+ unless ($self->_version_from_meta_ok) {
+ my $version;
+ unless (eval { $version = $self->_parse_version; 1 }) {
+ $self->_verbose(1, "error with version in $pmfile: $@");
+ return;
+ }
+
+ $self->{VERSION} = $version;
+ if ($self->{VERSION} =~ /^\{.*\}$/) {
+ # JSON error message
+ } elsif ($self->{VERSION} =~ /[_\s]/ && !$self->{ALLOW_DEV_VERSION} && !$ALLOW_DEV_VERSION){ # ignore developer releases and "You suck!"
+ return;
+ }
+ }
+
+ my($ppp) = $self->_packages_per_pmfile;
+ my @keys_ppp = $self->_filter_ppps(sort keys %$ppp);
+ $self->_verbose(1,"Will check keys_ppp[@keys_ppp]\n");
+
+ #
+ # Immediately after each package (pmfile) examined contact
+ # the database
+ #
+
+ my ($package, %errors);
+ my %checked_in;
+ DBPACK: foreach $package (@keys_ppp) {
+ # this part is taken from PAUSE::package::examine_pkg
+ # and PAUSE::package::_pkg_name_insane
+ if ($package !~ /^\w[\w\:\']*\w?\z/
+ || $package !~ /\w\z/
+ || $package =~ /:/ && $package !~ /::/
+ || $package =~ /\w:\w/
+ || $package =~ /:::/
+ ){
+ $self->_verbose(1,"Package[$package] did not pass the ultimate sanity check");
+ delete $ppp->{$package};
+ next;
+ }
+
+ if ($self->{USERID} && $self->{PERMISSIONS} && !$self->_perm_check($package)) {
+ delete $ppp->{$package};
+ next;
+ }
+
+ # Check that package name matches case of file name
+ {
+ my (undef, $module) = split m{/lib/}, $self->{PMFILE}, 2;
+ if ($module) {
+ $module =~ s{\.pm\z}{};
+ $module =~ s{/}{::}g;
+
+ if (lc $module eq lc $package && $module ne $package) {
+ # warn "/// $self->{PMFILE} vs. $module vs. $package\n";
+ $errors{$package} = {
+ indexing_warning => "Capitalization of package ($package) does not match filename!",
+ infile => $self->{PMFILE},
+ };
+ }
+ }
+ }
+
+ my $pp = $ppp->{$package};
+ if ($pp->{version} && $pp->{version} =~ /^\{.*\}$/) { # JSON parser error
+ my $err = JSON::PP::decode_json($pp->{version});
+ if ($err->{x_normalize}) {
+ $errors{$package} = {
+ normalize => $err->{version},
+ infile => $pp->{infile},
+ };
+ $pp->{version} = "undef";
+ } elsif ($err->{openerr}) {
+ $pp->{version} = "undef";
+ $self->_verbose(1,
+ qq{Parse::PMFile was not able to
+ read the file. It issued the following error: C< $err->{r} >},
+ );
+ $errors{$package} = {
+ open => $err->{r},
+ infile => $pp->{infile},
+ };
+ } else {
+ $pp->{version} = "undef";
+ $self->_verbose(1,
+ qq{Parse::PMFile was not able to
+ parse the following line in that file: C< $err->{line} >
+
+ Note: the indexer is running in a Safe compartement and cannot
+ provide the full functionality of perl in the VERSION line. It
+ is trying hard, but sometime it fails. As a workaround, please
+ consider writing a META.yml that contains a 'provides'
+ attribute or contact the CPAN admins to investigate (yet
+ another) workaround against "Safe" limitations.)},
+
+ );
+ $errors{$package} = {
+ parse_version => $err->{line},
+ infile => $err->{file},
+ };
+ }
+ }
+
+ # Sanity checks
+
+ for (
+ $package,
+ $pp->{version},
+ ) {
+ if (!defined || /^\s*$/ || /\s/){ # for whatever reason I come here
+ delete $ppp->{$package};
+ next; # don't screw up 02packages
+ }
+ }
+ $checked_in{$package} = $ppp->{$package};
+ } # end foreach package
+
+ return (wantarray && %errors) ? (\%checked_in, \%errors) : \%checked_in;
+ }
+
+ sub _perm_check {
+ my ($self, $package) = @_;
+ my $userid = $self->{USERID};
+ my $module = $self->{PERMISSIONS}->module_permissions($package);
+ return 1 if !$module; # not listed yet
+ return 1 if defined $module->m && $module->m eq $userid;
+ return 1 if defined $module->f && $module->f eq $userid;
+ return 1 if defined $module->c && grep {$_ eq $userid} @{$module->c};
+ return;
+ }
+
+ # from PAUSE::pmfile;
+ sub _parse_version {
+ my $self = shift;
+
+ use strict;
+
+ my $pmfile = $self->{PMFILE};
+ my $tmpfile = File::Spec->catfile(File::Spec->tmpdir, "ParsePMFile$$" . rand(1000));
+
+ my $pmcp = $pmfile;
+ for ($pmcp) {
+ s/([^\\](\\\\)*)@/$1\\@/g; # thanks to Raphael Manfredi for the
+ # solution to escape @s and \
+ }
+ my($v);
+ {
+
+ package main; # seems necessary
+
+ # XXX: do we need to fork as PAUSE does?
+ # or, is alarm() just fine?
+ my $pid;
+ if ($self->{FORK} || $FORK) {
+ $pid = fork();
+ die "Can't fork: $!" unless defined $pid;
+ }
+ if ($pid) {
+ waitpid($pid, 0);
+ if (open my $fh, '<', $tmpfile) {
+ $v = <$fh>;
+ }
+ } else {
+ # XXX Limit Resources too
+
+ my($comp) = Safe->new;
+ my $eval = qq{
+ local(\$^W) = 0;
+ Parse::PMFile::_parse_version_safely("$pmcp");
+ };
+ $comp->permit("entereval"); # for MBARBON/Module-Info-0.30.tar.gz
+ $comp->share("*Parse::PMFile::_parse_version_safely");
+ $comp->share("*version::new");
+ $comp->share("*version::numify");
+ $comp->share_from('main', ['*version::',
+ '*charstar::',
+ '*Exporter::',
+ '*DynaLoader::']);
+ $comp->share_from('version', ['&qv']);
+ $comp->permit(":base_math"); # atan2 (Acme-Pi)
+ # $comp->permit("require"); # no strict!
+ $comp->deny(qw/enteriter iter unstack goto/); # minimum protection against Acme::BadExample
+
+ version->import('qv') if $self->{UNSAFE} || $UNSAFE;
+ {
+ no strict;
+ $v = ($self->{UNSAFE} || $UNSAFE) ? eval $eval : $comp->reval($eval);
+ }
+ if ($@){ # still in the child process, out of Safe::reval
+ my $err = $@;
+ # warn ">>>>>>>err[$err]<<<<<<<<";
+ if (ref $err) {
+ if ($err->{line} =~ /([\$*])([\w\:\']*)\bVERSION\b.*?\=(.*)/) {
+ local($^W) = 0;
+ my ($sigil, $vstr) = ($1, $3);
+ $self->_restore_overloaded_stuff(1) if $err->{line} =~ /use\s+version\b|version\->|qv\(/;
+ $v = ($self->{UNSAFE} || $UNSAFE) ? eval $vstr : $comp->reval($vstr);
+ $v = $$v if $sigil eq '*' && ref $v;
+ }
+ if ($@ or !$v) {
+ $self->_verbose(1, sprintf("reval failed: err[%s] for eval[%s]",
+ JSON::PP::encode_json($err),
+ $eval,
+ ));
+ $v = JSON::PP::encode_json($err);
+ }
+ } else {
+ $v = JSON::PP::encode_json({ openerr => $err });
+ }
+ }
+ if (defined $v) {
+ $v = $v->numify if ref($v) =~ /^version(::vpp)?$/;
+ } else {
+ $v = "";
+ }
+ if ($self->{FORK} || $FORK) {
+ open my $fh, '>:utf8', $tmpfile;
+ print $fh $v;
+ exit 0;
+ } else {
+ utf8::encode($v);
+ # undefine empty $v as if read from the tmpfile
+ $v = undef if defined $v && !length $v;
+ $comp->erase;
+ $self->_restore_overloaded_stuff;
+ }
+ }
+ }
+ unlink $tmpfile if ($self->{FORK} || $FORK) && -e $tmpfile;
+
+ return $self->_normalize_version($v);
+ }
+
+ sub _restore_overloaded_stuff {
+ my ($self, $used_version_in_safe) = @_;
+ return if $self->{UNSAFE} || $UNSAFE;
+
+ no strict 'refs';
+ no warnings 'redefine';
+
+ # version XS in CPAN
+ my $restored;
+ if ($INC{'version/vxs.pm'}) {
+ *{'version::(""'} = \&version::vxs::stringify;
+ *{'version::(0+'} = \&version::vxs::numify;
+ *{'version::(cmp'} = \&version::vxs::VCMP;
+ *{'version::(<=>'} = \&version::vxs::VCMP;
+ *{'version::(bool'} = \&version::vxs::boolean;
+ $restored = 1;
+ }
+ # version PP in CPAN
+ if ($INC{'version/vpp.pm'}) {
+ {
+ package # hide from PAUSE
+ charstar;
+ overload->import;
+ }
+ if (!$used_version_in_safe) {
+ package # hide from PAUSE
+ version::vpp;
+ overload->import;
+ }
+ unless ($restored) {
+ *{'version::(""'} = \&version::vpp::stringify;
+ *{'version::(0+'} = \&version::vpp::numify;
+ *{'version::(cmp'} = \&version::vpp::vcmp;
+ *{'version::(<=>'} = \&version::vpp::vcmp;
+ *{'version::(bool'} = \&version::vpp::vbool;
+ }
+ *{'version::vpp::(""'} = \&version::vpp::stringify;
+ *{'version::vpp::(0+'} = \&version::vpp::numify;
+ *{'version::vpp::(cmp'} = \&version::vpp::vcmp;
+ *{'version::vpp::(<=>'} = \&version::vpp::vcmp;
+ *{'version::vpp::(bool'} = \&version::vpp::vbool;
+ *{'charstar::(""'} = \&charstar::thischar;
+ *{'charstar::(0+'} = \&charstar::thischar;
+ *{'charstar::(++'} = \&charstar::increment;
+ *{'charstar::(--'} = \&charstar::decrement;
+ *{'charstar::(+'} = \&charstar::plus;
+ *{'charstar::(-'} = \&charstar::minus;
+ *{'charstar::(*'} = \&charstar::multiply;
+ *{'charstar::(cmp'} = \&charstar::cmp;
+ *{'charstar::(<=>'} = \&charstar::spaceship;
+ *{'charstar::(bool'} = \&charstar::thischar;
+ *{'charstar::(='} = \&charstar::clone;
+ $restored = 1;
+ }
+ # version in core
+ if (!$restored) {
+ *{'version::(""'} = \&version::stringify;
+ *{'version::(0+'} = \&version::numify;
+ *{'version::(cmp'} = \&version::vcmp;
+ *{'version::(<=>'} = \&version::vcmp;
+ *{'version::(bool'} = \&version::boolean;
+ }
+ }
+
+ # from PAUSE::pmfile;
+ sub _packages_per_pmfile {
+ my $self = shift;
+
+ my $ppp = {};
+ my $pmfile = $self->{PMFILE};
+ my $filemtime = $self->{MTIME};
+ my $version = $self->{VERSION};
+
+ open my $fh, "<", "$pmfile" or return $ppp;
+
+ local $/ = "\n";
+ my $inpod = 0;
+
+ PLINE: while (<$fh>) {
+ chomp;
+ my($pline) = $_;
+ $inpod = $pline =~ /^=(?!cut)/ ? 1 :
+ $pline =~ /^=cut/ ? 0 : $inpod;
+ next if $inpod;
+ next if substr($pline,0,4) eq "=cut";
+
+ $pline =~ s/\#.*//;
+ next if $pline =~ /^\s*$/;
+ if ($pline =~ /^__(?:END|DATA)__\b/
+ and $pmfile !~ /\.PL$/ # PL files may well have code after __DATA__
+ ){
+ last PLINE;
+ }
+
+ my $pkg;
+ my $strict_version;
+
+ if (
+ $pline =~ m{
+ # (.*) # takes too much time if $pline is long
+ (?<![*\$\\@%&]) # no sigils
+ \bpackage\s+
+ ([\w\:\']+)
+ \s*
+ (?: $ | [\}\;] | \{ | \s+($version::STRICT) )
+ }x) {
+ $pkg = $1;
+ $strict_version = $2;
+ if ($pkg eq "DB"){
+ # XXX if pumpkin and perl make him comaintainer! I
+ # think I always made the pumpkins comaint on DB
+ # without further ado (?)
+ next PLINE;
+ }
+ }
+
+ if ($pkg) {
+ # Found something
+
+ # from package
+ $pkg =~ s/\'/::/;
+ next PLINE unless $pkg =~ /^[A-Za-z]/;
+ next PLINE unless $pkg =~ /\w$/;
+ next PLINE if $pkg eq "main";
+ # Perl::Critic::Policy::TestingAndDebugging::ProhibitShebangWarningsArg
+ # database for modid in mods, package in packages, package in perms
+ # alter table mods modify modid varchar(128) binary NOT NULL default '';
+ # alter table packages modify package varchar(128) binary NOT NULL default '';
+ next PLINE if length($pkg) > 128;
+ #restriction
+ $ppp->{$pkg}{parsed}++;
+ $ppp->{$pkg}{infile} = $pmfile;
+ if ($self->_simile($pmfile,$pkg)) {
+ $ppp->{$pkg}{simile} = $pmfile;
+ if ($self->_version_from_meta_ok) {
+ my $provides = $self->{META_CONTENT}{provides};
+ if (exists $provides->{$pkg}) {
+ if (defined $provides->{$pkg}{version}) {
+ my $v = $provides->{$pkg}{version};
+ if ($v =~ /[_\s]/ && !$self->{ALLOW_DEV_VERSION} && !$ALLOW_DEV_VERSION){ # ignore developer releases and "You suck!"
+ next PLINE;
+ }
+
+ unless (eval { $version = $self->_normalize_version($v); 1 }) {
+ $self->_verbose(1, "error with version in $pmfile: $@");
+ next;
+
+ }
+ $ppp->{$pkg}{version} = $version;
+ } else {
+ $ppp->{$pkg}{version} = "undef";
+ }
+ }
+ } else {
+ if (defined $strict_version){
+ $ppp->{$pkg}{version} = $strict_version ;
+ } else {
+ $ppp->{$pkg}{version} = defined $version ? $version : "";
+ }
+ no warnings;
+ if ($version eq 'undef') {
+ $ppp->{$pkg}{version} = $version unless defined $ppp->{$pkg}{version};
+ } else {
+ $ppp->{$pkg}{version} =
+ $version
+ if $version
+ > $ppp->{$pkg}{version} ||
+ $version
+ gt $ppp->{$pkg}{version};
+ }
+ }
+ } else { # not simile
+ #### it comes later, it would be nonsense
+ #### to set to "undef". MM_Unix gives us
+ #### the best we can reasonably consider
+ $ppp->{$pkg}{version} =
+ $version
+ unless defined $ppp->{$pkg}{version} &&
+ length($ppp->{$pkg}{version});
+ }
+ $ppp->{$pkg}{filemtime} = $filemtime;
+ } else {
+ # $self->_verbose(2,"no pkg found");
+ }
+ }
+
+ close $fh;
+ $ppp;
+ }
+
+ # from PAUSE::pmfile;
+ {
+ no strict;
+ sub _parse_version_safely {
+ my($parsefile) = @_;
+ my $result;
+ local *FH;
+ local $/ = "\n";
+ open(FH,$parsefile) or die "Could not open '$parsefile': $!";
+ my $inpod = 0;
+ while (<FH>) {
+ $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+ next if $inpod || /^\s*#/;
+ last if /^__(?:END|DATA)__\b/; # fails on quoted __END__ but this is rare -> __END__ in the middle of a line is rarer
+ chop;
+
+ if (my ($ver) = /package \s+ \S+ \s+ (\S+) \s* [;{]/x) {
+ # XXX: should handle this better if version is bogus -- rjbs,
+ # 2014-03-16
+ return $ver if version::is_lax($ver);
+ }
+
+ # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
+ next unless /(?<!\\)([\$*])(([\w\:\']*)\bVERSION)\b.*(?<![!><=])\=(?![=>])/;
+ my $current_parsed_line = $_;
+ my $eval = qq{
+ package #
+ ExtUtils::MakeMaker::_version;
+
+ local $1$2;
+ \$$2=undef; do {
+ $_
+ }; \$$2
+ };
+ local $^W = 0;
+ local $SIG{__WARN__} = sub {};
+ $result = __clean_eval($eval);
+ # warn "current_parsed_line[$current_parsed_line]\$\@[$@]";
+ if ($@ or !defined $result){
+ die +{
+ eval => $eval,
+ line => $current_parsed_line,
+ file => $parsefile,
+ err => $@,
+ };
+ }
+ last;
+ } #;
+ close FH;
+
+ $result = "undef" unless defined $result;
+ if ((ref $result) =~ /^version(?:::vpp)?\b/) {
+ $result = $result->numify;
+ }
+ return $result;
+ }
+ }
+
+ # from PAUSE::pmfile;
+ sub _filter_ppps {
+ my($self,@ppps) = @_;
+ my @res;
+
+ # very similar code is in PAUSE::dist::filter_pms
+ MANI: for my $ppp ( @ppps ) {
+ if ($self->{META_CONTENT}){
+ my $no_index = $self->{META_CONTENT}{no_index}
+ || $self->{META_CONTENT}{private}; # backward compat
+ if (ref($no_index) eq 'HASH') {
+ my %map = (
+ package => qr{\z},
+ namespace => qr{::},
+ );
+ for my $k (qw(package namespace)) {
+ next unless my $v = $no_index->{$k};
+ my $rest = $map{$k};
+ if (ref $v eq "ARRAY") {
+ for my $ve (@$v) {
+ $ve =~ s|::$||;
+ if ($ppp =~ /^$ve$rest/){
+ $self->_verbose(1,"Skipping ppp[$ppp] due to ve[$ve]");
+ next MANI;
+ } else {
+ $self->_verbose(1,"NOT skipping ppp[$ppp] due to ve[$ve]");
+ }
+ }
+ } else {
+ $v =~ s|::$||;
+ if ($ppp =~ /^$v$rest/){
+ $self->_verbose(1,"Skipping ppp[$ppp] due to v[$v]");
+ next MANI;
+ } else {
+ $self->_verbose(1,"NOT skipping ppp[$ppp] due to v[$v]");
+ }
+ }
+ }
+ } else {
+ $self->_verbose(1,"No keyword 'no_index' or 'private' in META_CONTENT");
+ }
+ } else {
+ # $self->_verbose(1,"no META_CONTENT"); # too noisy
+ }
+ push @res, $ppp;
+ }
+ $self->_verbose(1,"Result of filter_ppps: res[@res]");
+ @res;
+ }
+
+ # from PAUSE::pmfile;
+ sub _simile {
+ my($self,$file,$package) = @_;
+ # MakeMaker gives them the chance to have the file Simple.pm in
+ # this directory but have the package HTML::Simple in it.
+ # Afaik, they wouldn't be able to do so with deeper nested packages
+ $file =~ s|.*/||;
+ $file =~ s|\.pm(?:\.PL)?||;
+ my $ret = $package =~ m/\b\Q$file\E$/;
+ $ret ||= 0;
+ unless ($ret) {
+ # Apache::mod_perl_guide stuffs it into Version.pm
+ $ret = 1 if lc $file eq 'version';
+ }
+ $self->_verbose(1,"Result of simile(): file[$file] package[$package] ret[$ret]\n");
+ $ret;
+ }
+
+ # from PAUSE::pmfile
+ sub _normalize_version {
+ my($self,$v) = @_;
+ $v = "undef" unless defined $v;
+ my $dv = Dumpvalue->new;
+ my $sdv = $dv->stringify($v,1); # second argument prevents ticks
+ $self->_verbose(1,"Result of normalize_version: sdv[$sdv]\n");
+
+ return $v if $v eq "undef";
+ return $v if $v =~ /^\{.*\}$/; # JSON object
+ $v =~ s/^\s+//;
+ $v =~ s/\s+\z//;
+ if ($v =~ /_/) {
+ # XXX should pass something like EDEVELOPERRELEASE up e.g.
+ # SIXTEASE/XML-Entities-0.0306.tar.gz had nothing but one
+ # such modules and the mesage was not helpful that "nothing
+ # was found".
+ return $v ;
+ }
+ if (!version::is_lax($v)) {
+ return JSON::PP::encode_json({ x_normalize => 'version::is_lax failed', version => $v });
+ }
+ # may warn "Integer overflow"
+ my $vv = eval { no warnings; version->new($v)->numify };
+ if ($@) {
+ # warn "$v: $@";
+ return JSON::PP::encode_json({ x_normalize => $@, version => $v });
+ # return "undef";
+ }
+ if ($vv eq $v) {
+ # the boring 3.14
+ } else {
+ my $forced = $self->_force_numeric($v);
+ if ($forced eq $vv) {
+ } elsif ($forced =~ /^v(.+)/) {
+ # rare case where a v1.0.23 slipped in (JANL/w3mir-1.0.10.tar.gz)
+ $vv = version->new($1)->numify;
+ } else {
+ # warn "Unequal forced[$forced] and vv[$vv]";
+ if ($forced == $vv) {
+ # the trailing zeroes would cause unnecessary havoc
+ $vv = $forced;
+ }
+ }
+ }
+ return $vv;
+ }
+
+ # from PAUSE::pmfile;
+ sub _force_numeric {
+ my($self,$v) = @_;
+ $v = $self->_readable($v);
+
+ if (
+ $v =~
+ /^(\+?)(\d*)(\.(\d*))?/ &&
+ # "$2$4" ne ''
+ (
+ defined $2 && length $2
+ ||
+ defined $4 && length $4
+ )
+ ) {
+ my $two = defined $2 ? $2 : "";
+ my $three = defined $3 ? $3 : "";
+ $v = "$two$three";
+ }
+ # no else branch! We simply say, everything else is a string.
+ $v;
+ }
+
+ # from PAUSE::dist
+ sub _version_from_meta_ok {
+ my($self) = @_;
+ return $self->{VERSION_FROM_META_OK} if exists $self->{VERSION_FROM_META_OK};
+ my $c = $self->{META_CONTENT};
+
+ # If there's no provides hash, we can't get our module versions from the
+ # provides hash! -- rjbs, 2012-03-31
+ return($self->{VERSION_FROM_META_OK} = 0) unless $c->{provides};
+
+ # Some versions of Module::Build geneated an empty provides hash. If we're
+ # *not* looking at a Module::Build-generated metafile, then it's okay.
+ my ($mb_v) = (defined $c->{generated_by} ? $c->{generated_by} : '') =~ /Module::Build version ([\d\.]+)/;
+ return($self->{VERSION_FROM_META_OK} = 1) unless $mb_v;
+
+ # ??? I don't know why this is here.
+ return($self->{VERSION_FROM_META_OK} = 1) if $mb_v eq '0.250.0';
+
+ if ($mb_v >= 0.19 && $mb_v < 0.26 && ! keys %{$c->{provides}}) {
+ # RSAVAGE/Javascript-SHA1-1.01.tgz had an empty provides hash. Ron
+ # did not find the reason why this happened, but let's not go
+ # overboard, 0.26 seems a good threshold from the statistics: there
+ # are not many empty provides hashes from 0.26 up.
+ return($self->{VERSION_FROM_META_OK} = 0);
+ }
+
+ # We're not in the suspect range of M::B versions. It's good to go.
+ return($self->{VERSION_FROM_META_OK} = 1);
+ }
+
+ sub _verbose {
+ my($self,$level,@what) = @_;
+ warn @what if $level <= ((ref $self && $self->{VERBOSE}) || $VERBOSE);
+ }
+
+ # all of the following methods are stripped from CPAN::Version
+ # (as of version 5.5001, bundled in CPAN 2.03), and slightly
+ # modified (ie. made private, as well as CPAN->debug(...) are
+ # replaced with $self->_verbose(9, ...).)
+
+ # CPAN::Version::vcmp courtesy Jost Krieger
+ sub _vcmp {
+ my($self,$l,$r) = @_;
+ local($^W) = 0;
+ $self->_verbose(9, "l[$l] r[$r]");
+
+ return 0 if $l eq $r; # short circuit for quicker success
+
+ for ($l,$r) {
+ s/_//g;
+ }
+ $self->_verbose(9, "l[$l] r[$r]");
+ for ($l,$r) {
+ next unless tr/.// > 1 || /^v/;
+ s/^v?/v/;
+ 1 while s/\.0+(\d)/.$1/; # remove leading zeroes per group
+ }
+ $self->_verbose(9, "l[$l] r[$r]");
+ if ($l=~/^v/ <=> $r=~/^v/) {
+ for ($l,$r) {
+ next if /^v/;
+ $_ = $self->_float2vv($_);
+ }
+ }
+ $self->_verbose(9, "l[$l] r[$r]");
+ my $lvstring = "v0";
+ my $rvstring = "v0";
+ if ($] >= 5.006
+ && $l =~ /^v/
+ && $r =~ /^v/) {
+ $lvstring = $self->_vstring($l);
+ $rvstring = $self->_vstring($r);
+ $self->_verbose(9, sprintf "lv[%vd] rv[%vd]", $lvstring, $rvstring);
+ }
+
+ return (
+ ($l ne "undef") <=> ($r ne "undef")
+ ||
+ $lvstring cmp $rvstring
+ ||
+ $l <=> $r
+ ||
+ $l cmp $r
+ );
+ }
+
+ sub _vgt {
+ my($self,$l,$r) = @_;
+ $self->_vcmp($l,$r) > 0;
+ }
+
+ sub _vlt {
+ my($self,$l,$r) = @_;
+ $self->_vcmp($l,$r) < 0;
+ }
+
+ sub _vge {
+ my($self,$l,$r) = @_;
+ $self->_vcmp($l,$r) >= 0;
+ }
+
+ sub _vle {
+ my($self,$l,$r) = @_;
+ $self->_vcmp($l,$r) <= 0;
+ }
+
+ sub _vstring {
+ my($self,$n) = @_;
+ $n =~ s/^v// or die "Parse::PMFile::_vstring() called with invalid arg [$n]";
+ pack "U*", split /\./, $n;
+ }
+
+ # vv => visible vstring
+ sub _float2vv {
+ my($self,$n) = @_;
+ my($rev) = int($n);
+ $rev ||= 0;
+ my($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits to limit
+ # architecture influence
+ $mantissa ||= 0;
+ $mantissa .= "0" while length($mantissa)%3;
+ my $ret = "v" . $rev;
+ while ($mantissa) {
+ $mantissa =~ s/(\d{1,3})// or
+ die "Panic: length>0 but not a digit? mantissa[$mantissa]";
+ $ret .= ".".int($1);
+ }
+ # warn "n[$n]ret[$ret]";
+ $ret =~ s/(\.0)+/.0/; # v1.0.0 => v1.0
+ $ret;
+ }
+
+ sub _readable {
+ my($self,$n) = @_;
+ $n =~ /^([\w\-\+\.]+)/;
+
+ return $1 if defined $1 && length($1)>0;
+ # if the first user reaches version v43, he will be treated as "+".
+ # We'll have to decide about a new rule here then, depending on what
+ # will be the prevailing versioning behavior then.
+
+ if ($] < 5.006) { # or whenever v-strings were introduced
+ # we get them wrong anyway, whatever we do, because 5.005 will
+ # have already interpreted 0.2.4 to be "0.24". So even if he
+ # indexer sends us something like "v0.2.4" we compare wrongly.
+
+ # And if they say v1.2, then the old perl takes it as "v12"
+
+ $self->_verbose(9, "Suspicious version string seen [$n]\n");
+ return $n;
+ }
+ my $better = sprintf "v%vd", $n;
+ $self->_verbose(9, "n[$n] better[$better]");
+ return $better;
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ Parse::PMFile - parses .pm file as PAUSE does
+
+ =head1 SYNOPSIS
+
+ use Parse::PMFile;
+
+ my $parser = Parse::PMFile->new($metadata, {VERBOSE => 1});
+ my $packages_info = $parser->parse($pmfile);
+
+ # if you need info about invalid versions
+ my ($packages_info, $errors) = $parser->parse($pmfile);
+
+ # to check permissions
+ my $parser = Parse::PMFile->new($metadata, {
+ USERID => 'ISHIGAKI',
+ PERMISSIONS => PAUSE::Permissions->new,
+ });
+
+ =head1 DESCRIPTION
+
+ The most of the code of this module is taken from the PAUSE code as of April 2013 almost verbatim. Thus, the heart of this module should be quite stable. However, I made it not to use pipe ("-|") as well as I stripped database-related code. If you encounter any issue, that's most probably because of my modification.
+
+ This module doesn't provide features to extract a distribution or parse meta files intentionally.
+
+ =head1 METHODS
+
+ =head2 new
+
+ creates an object. You can also pass a hashref taken from META.yml etc, and an optional hashref. Options are:
+
+ =over 4
+
+ =item ALLOW_DEV_VERSION
+
+ Parse::PMFile usually ignores a version with an underscore as PAUSE does (because it's for a developer release, and should not be indexed). Set this option to true if you happen to need to keep such a version for better analysis.
+
+ =item VERBOSE
+
+ Set this to true if you need to know some details.
+
+ =item FORK
+
+ As of version 0.17, Parse::PMFile stops forking while parsing a version for better performance. Parse::PMFile should return the same result no matter how this option is set, but if you do care, set this to true to fork as PAUSE does.
+
+ =item USERID, PERMISSIONS
+
+ As of version 0.21, Parse::PMFile checks permissions of a package if both USERID and PERMISSIONS (which should be an instance of L<PAUSE::Permissions>) are provided. Unauthorized packages are removed.
+
+ =item UNSAFE
+
+ Parse::PMFile usually parses a module version in a Safe compartment. However, this approach doesn't work smoothly under older perls (prior to 5.10) plus some combinations of recent versions of Safe.pm (2.24 and above) and version.pm (0.9905 and above) for various reasons. As of version 0.27, Parse::PMFile simply uses C<eval> to parse a version under older perls. If you want it to use always C<eval> (even under recent perls), set this to true.
+
+ =back
+
+ =head2 parse
+
+ takes a path to a .pm file, and returns a hash reference that holds information for package(s) found in the file.
+
+ =head1 SEE ALSO
+
+ L<Parse::LocalDistribution>, L<PAUSE::Permissions>
+
+ Most part of this module is derived from PAUSE and CPAN::Version.
+
+ L<https://github.com/andk/pause>
+
+ L<https://github.com/andk/cpanpm>
+
+ =head1 AUTHOR
+
+ Andreas Koenig E<lt>andreas.koenig@anima.deE<gt>
+
+ Kenichi Ishigaki, E<lt>ishigaki@cpan.orgE<gt>
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 1995 - 2013 by Andreas Koenig E<lt>andk@cpan.orgE<gt> for most of the code.
+
+ Copyright 2013 by Kenichi Ishigaki for some.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+ =cut
+ PARSE_PMFILE
+
+ $fatpacked{"String/ShellQuote.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_SHELLQUOTE';
+ # $Id: ShellQuote.pm,v 1.11 2010-06-11 20:08:57 roderick Exp $
+ #
+ # Copyright (c) 1997 Roderick Schertler. All rights reserved. This
+ # program is free software; you can redistribute it and/or modify it
+ # under the same terms as Perl itself.
+
+ =head1 NAME
+
+ String::ShellQuote - quote strings for passing through the shell
+
+ =head1 SYNOPSIS
+
+ $string = shell_quote @list;
+ $string = shell_quote_best_effort @list;
+ $string = shell_comment_quote $string;
+
+ =head1 DESCRIPTION
+
+ This module contains some functions which are useful for quoting strings
+ which are going to pass through the shell or a shell-like object.
+
+ =over
+
+ =cut
+
+ package String::ShellQuote;
+
+ use strict;
+ use vars qw($VERSION @ISA @EXPORT);
+
+ require Exporter;
+
+ $VERSION = '1.04';
+ @ISA = qw(Exporter);
+ @EXPORT = qw(shell_quote shell_quote_best_effort shell_comment_quote);
+
+ sub croak {
+ require Carp;
+ goto &Carp::croak;
+ }
+
+ sub _shell_quote_backend {
+ my @in = @_;
+ my @err = ();
+
+ if (0) {
+ require RS::Handy;
+ print RS::Handy::data_dump(\@in);
+ }
+
+ return \@err, '' unless @in;
+
+ my $ret = '';
+ my $saw_non_equal = 0;
+ foreach (@in) {
+ if (!defined $_ or $_ eq '') {
+ $_ = "''";
+ next;
+ }
+
+ if (s/\x00//g) {
+ push @err, "No way to quote string containing null (\\000) bytes";
+ }
+
+ my $escape = 0;
+
+ # = needs quoting when it's the first element (or part of a
+ # series of such elements), as in command position it's a
+ # program-local environment setting
+
+ if (/=/) {
+ if (!$saw_non_equal) {
+ $escape = 1;
+ }
+ }
+ else {
+ $saw_non_equal = 1;
+ }
+
+ if (m|[^\w!%+,\-./:=@^]|) {
+ $escape = 1;
+ }
+
+ if ($escape
+ || (!$saw_non_equal && /=/)) {
+
+ # ' -> '\''
+ s/'/'\\''/g;
+
+ # make multiple ' in a row look simpler
+ # '\'''\'''\'' -> '"'''"'
+ s|((?:'\\''){2,})|q{'"} . (q{'} x (length($1) / 4)) . q{"'}|ge;
+
+ $_ = "'$_'";
+ s/^''//;
+ s/''$//;
+ }
+ }
+ continue {
+ $ret .= "$_ ";
+ }
+
+ chop $ret;
+ return \@err, $ret;
+ }
+
+ =item B<shell_quote> [I<string>]...
+
+ B<shell_quote> quotes strings so they can be passed through the shell.
+ Each I<string> is quoted so that the shell will pass it along as a
+ single argument and without further interpretation. If no I<string>s
+ are given an empty string is returned.
+
+ If any I<string> can't be safely quoted B<shell_quote> will B<croak>.
+
+ =cut
+
+ sub shell_quote {
+ my ($rerr, $s) = _shell_quote_backend @_;
+
+ if (@$rerr) {
+ my %seen;
+ @$rerr = grep { !$seen{$_}++ } @$rerr;
+ my $s = join '', map { "shell_quote(): $_\n" } @$rerr;
+ chomp $s;
+ croak $s;
+ }
+ return $s;
+ }
+
+ =item B<shell_quote_best_effort> [I<string>]...
+
+ This is like B<shell_quote>, excpet if the string can't be safely quoted
+ it does the best it can and returns the result, instead of dying.
+
+ =cut
+
+ sub shell_quote_best_effort {
+ my ($rerr, $s) = _shell_quote_backend @_;
+
+ return $s;
+ }
+
+ =item B<shell_comment_quote> [I<string>]
+
+ B<shell_comment_quote> quotes the I<string> so that it can safely be
+ included in a shell-style comment (the current algorithm is that a sharp
+ character is placed after any newlines in the string).
+
+ This routine might be changed to accept multiple I<string> arguments
+ in the future. I haven't done this yet because I'm not sure if the
+ I<string>s should be joined with blanks ($") or nothing ($,). Cast
+ your vote today! Be sure to justify your answer.
+
+ =cut
+
+ sub shell_comment_quote {
+ return '' unless @_;
+ unless (@_ == 1) {
+ croak "Too many arguments to shell_comment_quote "
+ . "(got " . @_ . " expected 1)";
+ }
+ local $_ = shift;
+ s/\n/\n#/g;
+ return $_;
+ }
+
+ 1;
+
+ __END__
+
+ =back
+
+ =head1 EXAMPLES
+
+ $cmd = 'fuser 2>/dev/null ' . shell_quote @files;
+ @pids = split ' ', `$cmd`;
+
+ print CFG "# Configured by: ",
+ shell_comment_quote($ENV{LOGNAME}), "\n";
+
+ =head1 BUGS
+
+ Only Bourne shell quoting is supported. I'd like to add other shells
+ (particularly cmd.exe), but I'm not familiar with them. It would be a
+ big help if somebody supplied the details.
+
+ =head1 AUTHOR
+
+ Roderick Schertler <F<roderick@argon.org>>
+
+ =head1 SEE ALSO
+
+ perl(1).
+
+ =cut
+ STRING_SHELLQUOTE
+
+ $fatpacked{"lib/core/only.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LIB_CORE_ONLY';
+ package lib::core::only;
+
+ use strict;
+ use warnings FATAL => 'all';
+ use Config;
+
+ sub import {
+ @INC = @Config{qw(privlibexp archlibexp)};
+ return
+ }
+
+ =head1 NAME
+
+ lib::core::only - Remove all non-core paths from @INC to avoid site/vendor dirs
+
+ =head1 SYNOPSIS
+
+ use lib::core::only; # now @INC contains only the two core directories
+
+ To get only the core directories plus the ones for the local::lib in scope:
+
+ $ perl -mlocal::lib -Mlib::core::only -Mlocal::lib=~/perl5 myscript.pl
+
+ To attempt to do a self-contained build (but note this will not reliably
+ propagate into subprocesses, see the CAVEATS below):
+
+ $ PERL5OPT='-mlocal::lib -Mlib::core::only -Mlocal::lib=~/perl5' cpan
+
+ Please note that it is necessary to use C<local::lib> twice for this to work.
+ First so that C<lib::core::only> doesn't prevent C<local::lib> from loading
+ (it's not currently in core) and then again after C<lib::core::only> so that
+ the local paths are not removed.
+
+ =head1 DESCRIPTION
+
+ lib::core::only is simply a shortcut to say "please reduce my @INC to only
+ the core lib and archlib (architecture-specific lib) directories of this perl".
+
+ You might want to do this to ensure a local::lib contains only the code you
+ need, or to test an L<App::FatPacker|App::FatPacker> tree, or to avoid known
+ bad vendor packages.
+
+ You might want to use this to try and install a self-contained tree of perl
+ modules. Be warned that that probably won't work (see L</CAVEATS>).
+
+ This module was extracted from L<local::lib|local::lib>'s --self-contained
+ feature, and contains the only part that ever worked. I apologise to anybody
+ who thought anything else did.
+
+ =head1 CAVEATS
+
+ This does B<not> propagate properly across perl invocations like local::lib's
+ stuff does. It can't. It's only a module import, so it B<only affects the
+ specific perl VM instance in which you load and import() it>.
+
+ If you want to cascade it across invocations, you can set the PERL5OPT
+ environment variable to '-Mlib::core::only' and it'll sort of work. But be
+ aware that taint mode ignores this, so some modules' build and test code
+ probably will as well.
+
+ You also need to be aware that perl's command line options are not processed
+ in order - -I options take effect before -M options, so
+
+ perl -Mlib::core::only -Ilib
+
+ is unlike to do what you want - it's exactly equivalent to:
+
+ perl -Mlib::core::only
+
+ If you want to combine a core-only @INC with additional paths, you need to
+ add the additional paths using -M options and the L<lib|lib> module:
+
+ perl -Mlib::core::only -Mlib=lib
+
+ # or if you're trying to test compiled code:
+
+ perl -Mlib::core::only -Mblib
+
+ For more information on the impossibility of sanely propagating this across
+ module builds without help from the build program, see
+ L<http://www.shadowcat.co.uk/blog/matt-s-trout/tainted-love> - and for ways
+ to achieve the old --self-contained feature's results, look at
+ L<App::FatPacker|App::FatPacker>'s tree function, and at
+ L<App::cpanminus|cpanm>'s --local-lib-contained feature.
+
+ =head1 AUTHOR
+
+ Matt S. Trout <mst@shadowcat.co.uk>
+
+ =head1 LICENSE
+
+ This library is free software under the same terms as perl itself.
+
+ =head1 COPYRIGHT
+
+ (c) 2010 the lib::core::only L</AUTHOR> as specified above.
+
+ =cut
+
+ 1;
+ LIB_CORE_ONLY
+
+ $fatpacked{"local/lib.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCAL_LIB';
+ package local::lib;
+ use 5.006;
+ use strict;
+ use warnings;
+ use Config;
+
+ our $VERSION = '2.000015';
+ $VERSION = eval $VERSION;
+
+ BEGIN {
+ *_WIN32 = ($^O eq 'MSWin32' || $^O eq 'NetWare' || $^O eq 'symbian')
+ ? sub(){1} : sub(){0};
+ # punt on these systems
+ *_USE_FSPEC = ($^O eq 'MacOS' || $^O eq 'VMS' || $INC{'File/Spec.pm'})
+ ? sub(){1} : sub(){0};
+ }
+ our $_DIR_JOIN = _WIN32 ? '\\' : '/';
+ our $_DIR_SPLIT = (_WIN32 || $^O eq 'cygwin') ? qr{[\\/]}
+ : qr{/};
+ our $_ROOT = _WIN32 ? do {
+ my $UNC = qr{[\\/]{2}[^\\/]+[\\/][^\\/]+};
+ qr{^(?:$UNC|[A-Za-z]:|)$_DIR_SPLIT};
+ } : qr{^/};
+ our $_PERL;
+
+ sub _cwd {
+ my $drive = shift;
+ if (!$_PERL) {
+ ($_PERL) = $^X =~ /(.+)/; # $^X is internal how could it be tainted?!
+ if (_is_abs($_PERL)) {
+ }
+ elsif (-x $Config{perlpath}) {
+ $_PERL = $Config{perlpath};
+ }
+ else {
+ ($_PERL) =
+ map { /(.*)/ }
+ grep { -x $_ }
+ map { join($_DIR_JOIN, $_, $_PERL) }
+ split /\Q$Config{path_sep}\E/, $ENV{PATH};
+ }
+ }
+ local @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)};
+ my $cmd = $drive ? "eval { Cwd::getdcwd(q($drive)) }"
+ : 'getcwd';
+ my $cwd = `"$_PERL" -MCwd -le "print $cmd"`;
+ chomp $cwd;
+ if (!length $cwd && $drive) {
+ $cwd = $drive;
+ }
+ $cwd =~ s/$_DIR_SPLIT?$/$_DIR_JOIN/;
+ $cwd;
+ }
+
+ sub _catdir {
+ if (_USE_FSPEC) {
+ require File::Spec;
+ File::Spec->catdir(@_);
+ }
+ else {
+ my $dir = join($_DIR_JOIN, @_);
+ $dir =~ s{($_DIR_SPLIT)(?:\.?$_DIR_SPLIT)+}{$1}g;
+ $dir;
+ }
+ }
+
+ sub _is_abs {
+ if (_USE_FSPEC) {
+ require File::Spec;
+ File::Spec->file_name_is_absolute($_[0]);
+ }
+ else {
+ $_[0] =~ $_ROOT;
+ }
+ }
+
+ sub _rel2abs {
+ my ($dir, $base) = @_;
+ return $dir
+ if _is_abs($dir);
+
+ $base = _WIN32 && $dir =~ s/^([A-Za-z]:)// ? _cwd("$1")
+ : $base ? $base
+ : _cwd;
+ return _catdir($base, $dir);
+ }
+
+ sub import {
+ my ($class, @args) = @_;
+ push @args, @ARGV
+ if $0 eq '-';
+
+ my @steps;
+ my %opts;
+ my $shelltype;
+
+ while (@args) {
+ my $arg = shift @args;
+ # check for lethal dash first to stop processing before causing problems
+ # the fancy dash is U+2212 or \xE2\x88\x92
+ if ($arg =~ /\xE2\x88\x92/ or $arg =~ /−/) {
+ die <<'DEATH';
+ WHOA THERE! It looks like you've got some fancy dashes in your commandline!
+ These are *not* the traditional -- dashes that software recognizes. You
+ probably got these by copy-pasting from the perldoc for this module as
+ rendered by a UTF8-capable formatter. This most typically happens on an OS X
+ terminal, but can happen elsewhere too. Please try again after replacing the
+ dashes with normal minus signs.
+ DEATH
+ }
+ elsif ($arg eq '--self-contained') {
+ die <<'DEATH';
+ FATAL: The local::lib --self-contained flag has never worked reliably and the
+ original author, Mark Stosberg, was unable or unwilling to maintain it. As
+ such, this flag has been removed from the local::lib codebase in order to
+ prevent misunderstandings and potentially broken builds. The local::lib authors
+ recommend that you look at the lib::core::only module shipped with this
+ distribution in order to create a more robust environment that is equivalent to
+ what --self-contained provided (although quite possibly not what you originally
+ thought it provided due to the poor quality of the documentation, for which we
+ apologise).
+ DEATH
+ }
+ elsif( $arg =~ /^--deactivate(?:=(.*))?$/ ) {
+ my $path = defined $1 ? $1 : shift @args;
+ push @steps, ['deactivate', $path];
+ }
+ elsif ( $arg eq '--deactivate-all' ) {
+ push @steps, ['deactivate_all'];
+ }
+ elsif ( $arg =~ /^--shelltype(?:=(.*))?$/ ) {
+ $shelltype = defined $1 ? $1 : shift @args;
+ }
+ elsif ( $arg eq '--no-create' ) {
+ $opts{no_create} = 1;
+ }
+ elsif ( $arg =~ /^--/ ) {
+ die "Unknown import argument: $arg";
+ }
+ else {
+ push @steps, ['activate', $arg];
+ }
+ }
+ if (!@steps) {
+ push @steps, ['activate', undef];
+ }
+
+ my $self = $class->new(%opts);
+
+ for (@steps) {
+ my ($method, @args) = @$_;
+ $self = $self->$method(@args);
+ }
+
+ if ($0 eq '-') {
+ print $self->environment_vars_string($shelltype);
+ exit 0;
+ }
+ else {
+ $self->setup_local_lib;
+ }
+ }
+
+ sub new {
+ my $class = shift;
+ bless {@_}, $class;
+ }
+
+ sub clone {
+ my $self = shift;
+ bless {%$self, @_}, ref $self;
+ }
+
+ sub inc { $_[0]->{inc} ||= \@INC }
+ sub libs { $_[0]->{libs} ||= [ \'PERL5LIB' ] }
+ sub bins { $_[0]->{bins} ||= [ \'PATH' ] }
+ sub roots { $_[0]->{roots} ||= [ \'PERL_LOCAL_LIB_ROOT' ] }
+ sub extra { $_[0]->{extra} ||= {} }
+ sub no_create { $_[0]->{no_create} }
+
+ my $_archname = $Config{archname};
+ my $_version = $Config{version};
+ my @_inc_version_list = reverse split / /, $Config{inc_version_list};
+ my $_path_sep = $Config{path_sep};
+
+ sub _as_list {
+ my $list = shift;
+ grep length, map {
+ !(ref $_ && ref $_ eq 'SCALAR') ? $_ : (
+ defined $ENV{$$_} ? split(/\Q$_path_sep/, $ENV{$$_})
+ : ()
+ )
+ } ref $list ? @$list : $list;
+ }
+ sub _remove_from {
+ my ($list, @remove) = @_;
+ return @$list
+ if !@remove;
+ my %remove = map { $_ => 1 } @remove;
+ grep !$remove{$_}, _as_list($list);
+ }
+
+ my @_lib_subdirs = (
+ [$_version, $_archname],
+ [$_version],
+ [$_archname],
+ (@_inc_version_list ? \@_inc_version_list : ()),
+ [],
+ );
+
+ sub install_base_bin_path {
+ my ($class, $path) = @_;
+ return _catdir($path, 'bin');
+ }
+ sub install_base_perl_path {
+ my ($class, $path) = @_;
+ return _catdir($path, 'lib', 'perl5');
+ }
+ sub install_base_arch_path {
+ my ($class, $path) = @_;
+ _catdir($class->install_base_perl_path($path), $_archname);
+ }
+
+ sub lib_paths_for {
+ my ($class, $path) = @_;
+ my $base = $class->install_base_perl_path($path);
+ return map { _catdir($base, @$_) } @_lib_subdirs;
+ }
+
+ sub _mm_escape_path {
+ my $path = shift;
+ $path =~ s/\\/\\\\/g;
+ if ($path =~ s/ /\\ /g) {
+ $path = qq{"$path"};
+ }
+ return $path;
+ }
+
+ sub _mb_escape_path {
+ my $path = shift;
+ $path =~ s/\\/\\\\/g;
+ return qq{"$path"};
+ }
+
+ sub installer_options_for {
+ my ($class, $path) = @_;
+ return (
+ PERL_MM_OPT =>
+ defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef,
+ PERL_MB_OPT =>
+ defined $path ? "--install_base "._mb_escape_path($path) : undef,
+ );
+ }
+
+ sub active_paths {
+ my ($self) = @_;
+ $self = ref $self ? $self : $self->new;
+
+ return grep {
+ # screen out entries that aren't actually reflected in @INC
+ my $active_ll = $self->install_base_perl_path($_);
+ grep { $_ eq $active_ll } @{$self->inc};
+ } _as_list($self->roots);
+ }
+
+
+ sub deactivate {
+ my ($self, $path) = @_;
+ $self = $self->new unless ref $self;
+ $path = $self->resolve_path($path);
+ $path = $self->normalize_path($path);
+
+ my @active_lls = $self->active_paths;
+
+ if (!grep { $_ eq $path } @active_lls) {
+ warn "Tried to deactivate inactive local::lib '$path'\n";
+ return $self;
+ }
+
+ my %args = (
+ bins => [ _remove_from($self->bins,
+ $self->install_base_bin_path($path)) ],
+ libs => [ _remove_from($self->libs,
+ $self->install_base_perl_path($path)) ],
+ inc => [ _remove_from($self->inc,
+ $self->lib_paths_for($path)) ],
+ roots => [ _remove_from($self->roots, $path) ],
+ );
+
+ $args{extra} = { $self->installer_options_for($args{roots}[0]) };
+
+ $self->clone(%args);
+ }
+
+ sub deactivate_all {
+ my ($self) = @_;
+ $self = $self->new unless ref $self;
+
+ my @active_lls = $self->active_paths;
+
+ my %args;
+ if (@active_lls) {
+ %args = (
+ bins => [ _remove_from($self->bins,
+ map $self->install_base_bin_path($_), @active_lls) ],
+ libs => [ _remove_from($self->libs,
+ map $self->install_base_perl_path($_), @active_lls) ],
+ inc => [ _remove_from($self->inc,
+ map $self->lib_paths_for($_), @active_lls) ],
+ roots => [ _remove_from($self->roots, @active_lls) ],
+ );
+ }
+
+ $args{extra} = { $self->installer_options_for(undef) };
+
+ $self->clone(%args);
+ }
+
+ sub activate {
+ my ($self, $path) = @_;
+ $self = $self->new unless ref $self;
+ $path = $self->resolve_path($path);
+ $self->ensure_dir_structure_for($path)
+ unless $self->no_create;
+
+ $path = $self->normalize_path($path);
+
+ my @active_lls = $self->active_paths;
+
+ if (grep { $_ eq $path } @active_lls[1 .. $#active_lls]) {
+ $self = $self->deactivate($path);
+ }
+
+ my %args;
+ if (!@active_lls || $active_lls[0] ne $path) {
+ %args = (
+ bins => [ $self->install_base_bin_path($path), @{$self->bins} ],
+ libs => [ $self->install_base_perl_path($path), @{$self->libs} ],
+ inc => [ $self->lib_paths_for($path), @{$self->inc} ],
+ roots => [ $path, @{$self->roots} ],
+ );
+ }
+
+ $args{extra} = { $self->installer_options_for($path) };
+
+ $self->clone(%args);
+ }
+
+ sub normalize_path {
+ my ($self, $path) = @_;
+ $path = ( Win32::GetShortPathName($path) || $path )
+ if $^O eq 'MSWin32';
+ return $path;
+ }
+
+ sub build_environment_vars_for {
+ my $self = $_[0]->new->activate($_[1]);
+ $self->build_environment_vars;
+ }
+ sub build_activate_environment_vars_for {
+ my $self = $_[0]->new->activate($_[1]);
+ $self->build_environment_vars;
+ }
+ sub build_deactivate_environment_vars_for {
+ my $self = $_[0]->new->deactivate($_[1]);
+ $self->build_environment_vars;
+ }
+ sub build_deact_all_environment_vars_for {
+ my $self = $_[0]->new->deactivate_all;
+ $self->build_environment_vars;
+ }
+ sub build_environment_vars {
+ my $self = shift;
+ (
+ PATH => join($_path_sep, _as_list($self->bins)),
+ PERL5LIB => join($_path_sep, _as_list($self->libs)),
+ PERL_LOCAL_LIB_ROOT => join($_path_sep, _as_list($self->roots)),
+ %{$self->extra},
+ );
+ }
+
+ sub setup_local_lib_for {
+ my $self = $_[0]->new->activate($_[1]);
+ $self->setup_local_lib;
+ }
+
+ sub setup_local_lib {
+ my $self = shift;
+
+ # if Carp is already loaded, ensure Carp::Heavy is also loaded, to avoid
+ # $VERSION mismatch errors (Carp::Heavy loads Carp, so we do not need to
+ # check in the other direction)
+ require Carp::Heavy if $INC{'Carp.pm'};
+
+ $self->setup_env_hash;
+ @INC = @{$self->inc};
+ }
+
+ sub setup_env_hash_for {
+ my $self = $_[0]->new->activate($_[1]);
+ $self->setup_env_hash;
+ }
+ sub setup_env_hash {
+ my $self = shift;
+ my %env = $self->build_environment_vars;
+ for my $key (keys %env) {
+ if (defined $env{$key}) {
+ $ENV{$key} = $env{$key};
+ }
+ else {
+ delete $ENV{$key};
+ }
+ }
+ }
+
+ sub print_environment_vars_for {
+ print $_[0]->environment_vars_string_for(@_[1..$#_]);
+ }
+
+ sub environment_vars_string_for {
+ my $self = $_[0]->new->activate($_[1]);
+ $self->environment_vars_string;
+ }
+ sub environment_vars_string {
+ my ($self, $shelltype) = @_;
+
+ $shelltype ||= $self->guess_shelltype;
+
+ my $extra = $self->extra;
+ my @envs = (
+ PATH => $self->bins,
+ PERL5LIB => $self->libs,
+ PERL_LOCAL_LIB_ROOT => $self->roots,
+ map { $_ => $extra->{$_} } sort keys %$extra,
+ );
+ $self->_build_env_string($shelltype, \@envs);
+ }
+
+ sub _build_env_string {
+ my ($self, $shelltype, $envs) = @_;
+ my @envs = @$envs;
+
+ my $build_method = "build_${shelltype}_env_declaration";
+
+ my $out = '';
+ while (@envs) {
+ my ($name, $value) = (shift(@envs), shift(@envs));
+ if (
+ ref $value
+ && @$value == 1
+ && ref $value->[0]
+ && ref $value->[0] eq 'SCALAR'
+ && ${$value->[0]} eq $name) {
+ next;
+ }
+ $out .= $self->$build_method($name, $value);
+ }
+ my $wrap_method = "wrap_${shelltype}_output";
+ if ($self->can($wrap_method)) {
+ return $self->$wrap_method($out);
+ }
+ return $out;
+ }
+
+ sub build_bourne_env_declaration {
+ my ($class, $name, $args) = @_;
+ my $value = $class->_interpolate($args, '${%s}', qr/["\\\$!`]/, '\\%s');
+
+ if (!defined $value) {
+ return qq{unset $name;\n};
+ }
+
+ $value =~ s/(^|\G|$_path_sep)\$\{$name\}$_path_sep/$1\${$name}\${$name+$_path_sep}/g;
+ $value =~ s/$_path_sep\$\{$name\}$/\${$name+$_path_sep}\${$name}/;
+
+ qq{${name}="$value"; export ${name};\n}
+ }
+
+ sub build_csh_env_declaration {
+ my ($class, $name, $args) = @_;
+ my ($value, @vars) = $class->_interpolate($args, '${%s}', '"', '"\\%s"');
+ if (!defined $value) {
+ return qq{unsetenv $name;\n};
+ }
+
+ my $out = '';
+ for my $var (@vars) {
+ $out .= qq{if ! \$?$name setenv $name '';\n};
+ }
+
+ my $value_without = $value;
+ if ($value_without =~ s/(?:^|$_path_sep)\$\{$name\}(?:$_path_sep|$)//g) {
+ $out .= qq{if "\${$name}" != '' setenv $name "$value";\n};
+ $out .= qq{if "\${$name}" == '' };
+ }
+ $out .= qq{setenv $name "$value_without";\n};
+ return $out;
+ }
+
+ sub build_cmd_env_declaration {
+ my ($class, $name, $args) = @_;
+ my $value = $class->_interpolate($args, '%%%s%%', qr(%), '%s');
+ if (!$value) {
+ return qq{\@set $name=\n};
+ }
+
+ my $out = '';
+ my $value_without = $value;
+ if ($value_without =~ s/(?:^|$_path_sep)%$name%(?:$_path_sep|$)//g) {
+ $out .= qq{\@if not "%$name%"=="" set "$name=$value"\n};
+ $out .= qq{\@if "%$name%"=="" };
+ }
+ $out .= qq{\@set "$name=$value_without"\n};
+ return $out;
+ }
+
+ sub build_powershell_env_declaration {
+ my ($class, $name, $args) = @_;
+ my $value = $class->_interpolate($args, '$env:%s', '"', '`%s');
+
+ if (!$value) {
+ return qq{Remove-Item -ErrorAction 0 Env:\\$name;\n};
+ }
+
+ my $maybe_path_sep = qq{\$(if("\$env:$name"-eq""){""}else{"$_path_sep"})};
+ $value =~ s/(^|\G|$_path_sep)\$env:$name$_path_sep/$1\$env:$name"+$maybe_path_sep+"/g;
+ $value =~ s/$_path_sep\$env:$name$/"+$maybe_path_sep+\$env:$name+"/;
+
+ qq{\$env:$name = \$("$value");\n};
+ }
+ sub wrap_powershell_output {
+ my ($class, $out) = @_;
+ return $out || " \n";
+ }
+
+ sub build_fish_env_declaration {
+ my ($class, $name, $args) = @_;
+ my $value = $class->_interpolate($args, '$%s', qr/[\\"' ]/, '\\%s');
+ if (!defined $value) {
+ return qq{set -e $name;\n};
+ }
+ $value =~ s/$_path_sep/ /g;
+ qq{set -x $name $value;\n};
+ }
+
+ sub _interpolate {
+ my ($class, $args, $var_pat, $escape, $escape_pat) = @_;
+ return
+ unless defined $args;
+ my @args = ref $args ? @$args : $args;
+ return
+ unless @args;
+ my @vars = map { $$_ } grep { ref $_ eq 'SCALAR' } @args;
+ my $string = join $_path_sep, map {
+ ref $_ eq 'SCALAR' ? sprintf($var_pat, $$_) : do {
+ s/($escape)/sprintf($escape_pat, $1)/ge; $_;
+ };
+ } @args;
+ return wantarray ? ($string, \@vars) : $string;
+ }
+
+ sub pipeline;
+
+ sub pipeline {
+ my @methods = @_;
+ my $last = pop(@methods);
+ if (@methods) {
+ \sub {
+ my ($obj, @args) = @_;
+ $obj->${pipeline @methods}(
+ $obj->$last(@args)
+ );
+ };
+ } else {
+ \sub {
+ shift->$last(@_);
+ };
+ }
+ }
+
+ sub resolve_path {
+ my ($class, $path) = @_;
+
+ $path = $class->${pipeline qw(
+ resolve_relative_path
+ resolve_home_path
+ resolve_empty_path
+ )}($path);
+
+ $path;
+ }
+
+ sub resolve_empty_path {
+ my ($class, $path) = @_;
+ if (defined $path) {
+ $path;
+ } else {
+ '~/perl5';
+ }
+ }
+
+ sub resolve_home_path {
+ my ($class, $path) = @_;
+ $path =~ /^~([^\/]*)/ or return $path;
+ my $user = $1;
+ my $homedir = do {
+ if (! length($user) && defined $ENV{HOME}) {
+ $ENV{HOME};
+ }
+ else {
+ require File::Glob;
+ File::Glob::bsd_glob("~$user", File::Glob::GLOB_TILDE());
+ }
+ };
+ unless (defined $homedir) {
+ require Carp; require Carp::Heavy;
+ Carp::croak(
+ "Couldn't resolve homedir for "
+ .(defined $user ? $user : 'current user')
+ );
+ }
+ $path =~ s/^~[^\/]*/$homedir/;
+ $path;
+ }
+
+ sub resolve_relative_path {
+ my ($class, $path) = @_;
+ _rel2abs($path);
+ }
+
+ sub ensure_dir_structure_for {
+ my ($class, $path) = @_;
+ unless (-d $path) {
+ warn "Attempting to create directory ${path}\n";
+ }
+ require File::Basename;
+ my @dirs;
+ while(!-d $path) {
+ push @dirs, $path;
+ $path = File::Basename::dirname($path);
+ }
+ mkdir $_ for reverse @dirs;
+ return;
+ }
+
+ sub guess_shelltype {
+ my $shellbin
+ = defined $ENV{SHELL}
+ ? ($ENV{SHELL} =~ /([\w.]+)$/)[-1]
+ : ( $^O eq 'MSWin32' && exists $ENV{'!EXITCODE'} )
+ ? 'bash'
+ : ( $^O eq 'MSWin32' && $ENV{PROMPT} && $ENV{COMSPEC} )
+ ? ($ENV{COMSPEC} =~ /([\w.]+)$/)[-1]
+ : ( $^O eq 'MSWin32' && !$ENV{PROMPT} )
+ ? 'powershell.exe'
+ : 'sh';
+
+ for ($shellbin) {
+ return
+ /csh$/ ? 'csh'
+ : /fish/ ? 'fish'
+ : /command(?:\.com)?$/i ? 'cmd'
+ : /cmd(?:\.exe)?$/i ? 'cmd'
+ : /4nt(?:\.exe)?$/i ? 'cmd'
+ : /powershell(?:\.exe)?$/i ? 'powershell'
+ : 'bourne';
+ }
+ }
+
+ 1;
+ __END__
+
+ =encoding utf8
+
+ =head1 NAME
+
+ local::lib - create and use a local lib/ for perl modules with PERL5LIB
+
+ =head1 SYNOPSIS
+
+ In code -
+
+ use local::lib; # sets up a local lib at ~/perl5
+
+ use local::lib '~/foo'; # same, but ~/foo
+
+ # Or...
+ use FindBin;
+ use local::lib "$FindBin::Bin/../support"; # app-local support library
+
+ From the shell -
+
+ # Install LWP and its missing dependencies to the '~/perl5' directory
+ perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
+
+ # Just print out useful shell commands
+ $ perl -Mlocal::lib
+ PERL_MB_OPT='--install_base /home/username/perl5'; export PERL_MB_OPT;
+ PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'; export PERL_MM_OPT;
+ PERL5LIB="/home/username/perl5/lib/perl5"; export PERL5LIB;
+ PATH="/home/username/perl5/bin:$PATH"; export PATH;
+ PERL_LOCAL_LIB_ROOT="/home/usename/perl5:$PERL_LOCAL_LIB_ROOT"; export PERL_LOCAL_LIB_ROOT;
+
+ From a .bashrc file -
+
+ [ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
+
+ =head2 The bootstrapping technique
+
+ A typical way to install local::lib is using what is known as the
+ "bootstrapping" technique. You would do this if your system administrator
+ hasn't already installed local::lib. In this case, you'll need to install
+ local::lib in your home directory.
+
+ Even if you do have administrative privileges, you will still want to set up your
+ environment variables, as discussed in step 4. Without this, you would still
+ install the modules into the system CPAN installation and also your Perl scripts
+ will not use the lib/ path you bootstrapped with local::lib.
+
+ By default local::lib installs itself and the CPAN modules into ~/perl5.
+
+ Windows users must also see L</Differences when using this module under Win32>.
+
+ =over 4
+
+ =item 1.
+
+ Download and unpack the local::lib tarball from CPAN (search for "Download"
+ on the CPAN page about local::lib). Do this as an ordinary user, not as root
+ or administrator. Unpack the file in your home directory or in any other
+ convenient location.
+
+ =item 2.
+
+ Run this:
+
+ perl Makefile.PL --bootstrap
+
+ If the system asks you whether it should automatically configure as much
+ as possible, you would typically answer yes.
+
+ In order to install local::lib into a directory other than the default, you need
+ to specify the name of the directory when you call bootstrap, as follows:
+
+ perl Makefile.PL --bootstrap=~/foo
+
+ =item 3.
+
+ Run this: (local::lib assumes you have make installed on your system)
+
+ make test && make install
+
+ =item 4.
+
+ Now we need to setup the appropriate environment variables, so that Perl
+ starts using our newly generated lib/ directory. If you are using bash or
+ any other Bourne shells, you can add this to your shell startup script this
+ way:
+
+ echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bashrc
+
+ If you are using C shell, you can do this as follows:
+
+ /bin/csh
+ echo $SHELL
+ /bin/csh
+ echo 'eval `perl -I$HOME/perl5/lib/perl5 -Mlocal::lib`' >> ~/.cshrc
+
+ If you passed to bootstrap a directory other than default, you also need to
+ give that as import parameter to the call of the local::lib module like this
+ way:
+
+ echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)"' >>~/.bashrc
+
+ After writing your shell configuration file, be sure to re-read it to get the
+ changed settings into your current shell's environment. Bourne shells use
+ C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
+
+ =back
+
+ If you're on a slower machine, or are operating under draconian disk space
+ limitations, you can disable the automatic generation of manpages from POD when
+ installing modules by using the C<--no-manpages> argument when bootstrapping:
+
+ perl Makefile.PL --bootstrap --no-manpages
+
+ To avoid doing several bootstrap for several Perl module environments on the
+ same account, for example if you use it for several different deployed
+ applications independently, you can use one bootstrapped local::lib
+ installation to install modules in different directories directly this way:
+
+ cd ~/mydir1
+ perl -Mlocal::lib=./
+ eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
+ printenv ### You will see that ~/mydir1 is in the PERL5LIB
+ perl -MCPAN -e install ... ### whatever modules you want
+ cd ../mydir2
+ ... REPEAT ...
+
+ When used in a C<.bashrc> file, it is recommended that you protect against
+ re-activating a directory in a sub-shell. This can be done by checking the
+ C<$SHLVL> variable as shown in synopsis. Without this, sub-shells created by
+ the user or other programs will override changes made to the parent shell's
+ environment.
+
+ If you are working with several C<local::lib> environments, you may want to
+ remove some of them from the current environment without disturbing the others.
+ You can deactivate one environment like this (using bourne sh):
+
+ eval $(perl -Mlocal::lib=--deactivate,~/path)
+
+ which will generate and run the commands needed to remove C<~/path> from your
+ various search paths. Whichever environment was B<activated most recently> will
+ remain the target for module installations. That is, if you activate
+ C<~/path_A> and then you activate C<~/path_B>, new modules you install will go
+ in C<~/path_B>. If you deactivate C<~/path_B> then modules will be installed
+ into C<~/pathA> -- but if you deactivate C<~/path_A> then they will still be
+ installed in C<~/pathB> because pathB was activated later.
+
+ You can also ask C<local::lib> to clean itself completely out of the current
+ shell's environment with the C<--deactivate-all> option.
+ For multiple environments for multiple apps you may need to include a modified
+ version of the C<< use FindBin >> instructions in the "In code" sample above.
+ If you did something like the above, you have a set of Perl modules at C<<
+ ~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
+ you need to tell it where to find the modules you installed for it at C<<
+ ~/mydir1/lib >>.
+
+ In C<< ~/mydir1/scripts/myscript.pl >>:
+
+ use strict;
+ use warnings;
+ use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
+ use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
+
+ Put this before any BEGIN { ... } blocks that require the modules you installed.
+
+ =head2 Differences when using this module under Win32
+
+ To set up the proper environment variables for your current session of
+ C<CMD.exe>, you can use this:
+
+ C:\>perl -Mlocal::lib
+ set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5
+ set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
+ set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5
+ set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
+
+ ### To set the environment for this shell alone
+ C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat
+ ### instead of $(perl -Mlocal::lib=./)
+
+ If you want the environment entries to persist, you'll need to add them to the
+ Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
+
+ The "~" is translated to the user's profile directory (the directory named for
+ the user under "Documents and Settings" (Windows XP or earlier) or "Users"
+ (Windows Vista or later)) unless $ENV{HOME} exists. After that, the home
+ directory is translated to a short name (which means the directory must exist)
+ and the subdirectories are created.
+
+ =head3 PowerShell
+
+ local::lib also supports PowerShell, and can be used with the
+ C<Invoke-Expression> cmdlet.
+
+ Invoke-Expression "$(perl -Mlocal::lib)"
+
+ =head1 RATIONALE
+
+ The version of a Perl package on your machine is not always the version you
+ need. Obviously, the best thing to do would be to update to the version you
+ need. However, you might be in a situation where you're prevented from doing
+ this. Perhaps you don't have system administrator privileges; or perhaps you
+ are using a package management system such as Debian, and nobody has yet gotten
+ around to packaging up the version you need.
+
+ local::lib solves this problem by allowing you to create your own directory of
+ Perl packages downloaded from CPAN (in a multi-user system, this would typically
+ be within your own home directory). The existing system Perl installation is
+ not affected; you simply invoke Perl with special options so that Perl uses the
+ packages in your own local package directory rather than the system packages.
+ local::lib arranges things so that your locally installed version of the Perl
+ packages takes precedence over the system installation.
+
+ If you are using a package management system (such as Debian), you don't need to
+ worry about Debian and CPAN stepping on each other's toes. Your local version
+ of the packages will be written to an entirely separate directory from those
+ installed by Debian.
+
+ =head1 DESCRIPTION
+
+ This module provides a quick, convenient way of bootstrapping a user-local Perl
+ module library located within the user's home directory. It also constructs and
+ prints out for the user the list of environment variables using the syntax
+ appropriate for the user's current shell (as specified by the C<SHELL>
+ environment variable), suitable for directly adding to one's shell
+ configuration file.
+
+ More generally, local::lib allows for the bootstrapping and usage of a
+ directory containing Perl modules outside of Perl's C<@INC>. This makes it
+ easier to ship an application with an app-specific copy of a Perl module, or
+ collection of modules. Useful in cases like when an upstream maintainer hasn't
+ applied a patch to a module of theirs that you need for your application.
+
+ On import, local::lib sets the following environment variables to appropriate
+ values:
+
+ =over 4
+
+ =item PERL_MB_OPT
+
+ =item PERL_MM_OPT
+
+ =item PERL5LIB
+
+ =item PATH
+
+ =item PERL_LOCAL_LIB_ROOT
+
+ =back
+
+ When possible, these will be appended to instead of overwritten entirely.
+
+ These values are then available for reference by any code after import.
+
+ =head1 CREATING A SELF-CONTAINED SET OF MODULES
+
+ See L<lib::core::only> for one way to do this - but note that
+ there are a number of caveats, and the best approach is always to perform a
+ build against a clean perl (i.e. site and vendor as close to empty as possible).
+
+ =head1 IMPORT OPTIONS
+
+ Options are values that can be passed to the C<local::lib> import besides the
+ directory to use. They are specified as C<use local::lib '--option'[, path];>
+ or C<perl -Mlocal::lib=--option[,path]>.
+
+ =head2 --deactivate
+
+ Remove the chosen path (or the default path) from the module search paths if it
+ was added by C<local::lib>, instead of adding it.
+
+ =head2 --deactivate-all
+
+ Remove all directories that were added to search paths by C<local::lib> from the
+ search paths.
+
+ =head2 --shelltype
+
+ Specify the shell type to use for output. By default, the shell will be
+ detected based on the environment. Should be one of: C<bourne>, C<csh>,
+ C<cmd>, or C<powershell>.
+
+ =head2 --no-create
+
+ Prevents C<local::lib> from creating directories when activating dirs. This is
+ likely to cause issues on Win32 systems.
+
+ =head1 CLASS METHODS
+
+ =head2 ensure_dir_structure_for
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: None
+
+ =back
+
+ Attempts to create the given path, and all required parent directories. Throws
+ an exception on failure.
+
+ =head2 print_environment_vars_for
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: None
+
+ =back
+
+ Prints to standard output the variables listed above, properly set to use the
+ given path as the base directory.
+
+ =head2 build_environment_vars_for
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: %environment_vars
+
+ =back
+
+ Returns a hash with the variables listed above, properly set to use the
+ given path as the base directory.
+
+ =head2 setup_env_hash_for
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: None
+
+ =back
+
+ Constructs the C<%ENV> keys for the given path, by calling
+ L</build_environment_vars_for>.
+
+ =head2 active_paths
+
+ =over 4
+
+ =item Arguments: None
+
+ =item Return value: @paths
+
+ =back
+
+ Returns a list of active C<local::lib> paths, according to the
+ C<PERL_LOCAL_LIB_ROOT> environment variable and verified against
+ what is really in C<@INC>.
+
+ =head2 install_base_perl_path
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $install_base_perl_path
+
+ =back
+
+ Returns a path describing where to install the Perl modules for this local
+ library installation. Appends the directories C<lib> and C<perl5> to the given
+ path.
+
+ =head2 lib_paths_for
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: @lib_paths
+
+ =back
+
+ Returns the list of paths perl will search for libraries, given a base path.
+ This includes the base path itself, the architecture specific subdirectory, and
+ perl version specific subdirectories. These paths may not all exist.
+
+ =head2 install_base_bin_path
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $install_base_bin_path
+
+ =back
+
+ Returns a path describing where to install the executable programs for this
+ local library installation. Appends the directory C<bin> to the given path.
+
+ =head2 installer_options_for
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: %installer_env_vars
+
+ =back
+
+ Returns a hash of environment variables that should be set to cause
+ installation into the given path.
+
+ =head2 resolve_empty_path
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $base_path
+
+ =back
+
+ Builds and returns the base path into which to set up the local module
+ installation. Defaults to C<~/perl5>.
+
+ =head2 resolve_home_path
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $home_path
+
+ =back
+
+ Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
+ for this purpose. If no definite answer is available, throws an exception.
+
+ =head2 resolve_relative_path
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $absolute_path
+
+ =back
+
+ Translates the given path into an absolute path.
+
+ =head2 resolve_path
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $absolute_path
+
+ =back
+
+ Calls the following in a pipeline, passing the result from the previous to the
+ next, in an attempt to find where to configure the environment for a local
+ library installation: L</resolve_empty_path>, L</resolve_home_path>,
+ L</resolve_relative_path>. Passes the given path argument to
+ L</resolve_empty_path> which then returns a result that is passed to
+ L</resolve_home_path>, which then has its result passed to
+ L</resolve_relative_path>. The result of this final call is returned from
+ L</resolve_path>.
+
+ =head1 OBJECT INTERFACE
+
+ =head2 new
+
+ =over 4
+
+ =item Arguments: %attributes
+
+ =item Return value: $local_lib
+
+ =back
+
+ Constructs a new C<local::lib> object, representing the current state of
+ C<@INC> and the relevant environment variables.
+
+ =head1 ATTRIBUTES
+
+ =head2 roots
+
+ An arrayref representing active C<local::lib> directories.
+
+ =head2 inc
+
+ An arrayref representing C<@INC>.
+
+ =head2 libs
+
+ An arrayref representing the PERL5LIB environment variable.
+
+ =head2 bins
+
+ An arrayref representing the PATH environment variable.
+
+ =head2 extra
+
+ A hashref of extra environment variables (e.g. C<PERL_MM_OPT> and
+ C<PERL_MB_OPT>)
+
+ =head2 no_create
+
+ If set, C<local::lib> will not try to create directories when activating them.
+
+ =head1 OBJECT METHODS
+
+ =head2 clone
+
+ =over 4
+
+ =item Arguments: %attributes
+
+ =item Return value: $local_lib
+
+ =back
+
+ Constructs a new C<local::lib> object based on the existing one, overriding the
+ specified attributes.
+
+ =head2 activate
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $new_local_lib
+
+ =back
+
+ Constructs a new instance with the specified path active.
+
+ =head2 deactivate
+
+ =over 4
+
+ =item Arguments: $path
+
+ =item Return value: $new_local_lib
+
+ =back
+
+ Constructs a new instance with the specified path deactivated.
+
+ =head2 deactivate_all
+
+ =over 4
+
+ =item Arguments: None
+
+ =item Return value: $new_local_lib
+
+ =back
+
+ Constructs a new instance with all C<local::lib> directories deactivated.
+
+ =head2 environment_vars_string
+
+ =over 4
+
+ =item Arguments: [ $shelltype ]
+
+ =item Return value: $shell_env_string
+
+ =back
+
+ Returns a string to set up the C<local::lib>, meant to be run by a shell.
+
+ =head2 build_environment_vars
+
+ =over 4
+
+ =item Arguments: None
+
+ =item Return value: %environment_vars
+
+ =back
+
+ Returns a hash with the variables listed above, properly set to use the
+ given path as the base directory.
+
+ =head2 setup_env_hash
+
+ =over 4
+
+ =item Arguments: None
+
+ =item Return value: None
+
+ =back
+
+ Constructs the C<%ENV> keys for the given path, by calling
+ L</build_environment_vars>.
+
+ =head2 setup_local_lib
+
+ Constructs the C<%ENV> hash using L</setup_env_hash>, and set up C<@INC>.
+
+ =head1 A WARNING ABOUT UNINST=1
+
+ Be careful about using local::lib in combination with "make install UNINST=1".
+ The idea of this feature is that will uninstall an old version of a module
+ before installing a new one. However it lacks a safety check that the old
+ version and the new version will go in the same directory. Used in combination
+ with local::lib, you can potentially delete a globally accessible version of a
+ module while installing the new version in a local place. Only combine "make
+ install UNINST=1" and local::lib if you understand these possible consequences.
+
+ =head1 LIMITATIONS
+
+ =over 4
+
+ =item * Directory names with spaces in them are not well supported by the perl
+ toolchain and the programs it uses. Pure-perl distributions should support
+ spaces, but problems are more likely with dists that require compilation. A
+ workaround you can do is moving your local::lib to a directory with spaces
+ B<after> you installed all modules inside your local::lib bootstrap. But be
+ aware that you can't update or install CPAN modules after the move.
+
+ =item * Rather basic shell detection. Right now anything with csh in its name is
+ assumed to be a C shell or something compatible, and everything else is assumed
+ to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
+ not set, a Bourne-compatible shell is assumed.
+
+ =item * Kills any existing PERL_MM_OPT or PERL_MB_OPT.
+
+ =item * Should probably auto-fixup CPAN config if not already done.
+
+ =item * On VMS and MacOS Classic (pre-OS X), local::lib loads L<File::Spec>.
+ This means any L<File::Spec> version installed in the local::lib will be
+ ignored by scripts using local::lib. A workaround for this is using
+ C<use lib "$local_lib/lib/perl5";> instead of using C<local::lib> directly.
+
+ =item * Conflicts with L<ExtUtils::MakeMaker>'s C<PREFIX> option.
+ C<local::lib> uses the C<INSTALL_BASE> option, as it has more predictable and
+ sane behavior. If something attempts to use the C<PREFIX> option when running
+ a F<Makefile.PL>, L<ExtUtils::MakeMaker> will refuse to run, as the two
+ options conflict. This can be worked around by temporarily unsetting the
+ C<PERL_MM_OPT> environment variable.
+
+ =item * Conflicts with L<Module::Build>'s C<--prefix> option. Similar to the
+ previous limitation, but any C<--prefix> option specified will be ignored.
+ This can be worked around by temporarily unsetting the C<PERL_MB_OPT>
+ environment variable.
+
+ =back
+
+ Patches very much welcome for any of the above.
+
+ =over 4
+
+ =item * On Win32 systems, does not have a way to write the created environment
+ variables to the registry, so that they can persist through a reboot.
+
+ =back
+
+ =head1 TROUBLESHOOTING
+
+ If you've configured local::lib to install CPAN modules somewhere in to your
+ home directory, and at some point later you try to install a module with C<cpan
+ -i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
+ permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
+ /usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
+ error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
+ you've somehow lost your updated ExtUtils::MakeMaker module.
+
+ To remedy this situation, rerun the bootstrapping procedure documented above.
+
+ Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
+
+ Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
+
+ =head1 ENVIRONMENT
+
+ =over 4
+
+ =item SHELL
+
+ =item COMSPEC
+
+ local::lib looks at the user's C<SHELL> environment variable when printing out
+ commands to add to the shell configuration file.
+
+ On Win32 systems, C<COMSPEC> is also examined.
+
+ =back
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item * L<Perl Advent article, 2011|http://perladvent.org/2011/2011-12-01.html>
+
+ =back
+
+ =head1 SUPPORT
+
+ IRC:
+
+ Join #local-lib on irc.perl.org.
+
+ =head1 AUTHOR
+
+ Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
+
+ auto_install fixes kindly sponsored by http://www.takkle.com/
+
+ =head1 CONTRIBUTORS
+
+ Patches to correctly output commands for csh style shells, as well as some
+ documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
+
+ Doc patches for a custom local::lib directory, more cleanups in the english
+ documentation and a L<german documentation|POD2::DE::local::lib> contributed by
+ Torsten Raudssus <torsten@raudssus.de>.
+
+ Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
+ things will install properly, submitted a fix for the bug causing problems with
+ writing Makefiles during bootstrapping, contributed an example program, and
+ submitted yet another fix to ensure that local::lib can install and bootstrap
+ properly. Many, many thanks!
+
+ pattern of Freenode IRC contributed the beginnings of the Troubleshooting
+ section. Many thanks!
+
+ Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
+
+ Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
+ by a patch from Marco Emilio Poleggi.
+
+ Mark Stosberg <mark@summersault.com> provided the code for the now deleted
+ '--self-contained' option.
+
+ Documentation patches to make win32 usage clearer by
+ David Mertens <dcmertens.perl@gmail.com> (run4flat).
+
+ Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc
+ patches contributed by Breno G. de Oliveira <garu@cpan.org>.
+
+ Improvements to stacking multiple local::lib dirs and removing them from the
+ environment later on contributed by Andrew Rodland <arodland@cpan.org>.
+
+ Patch for Carp version mismatch contributed by Hakim Cassimally
+ <osfameron@cpan.org>.
+
+ Rewrite of internals and numerous bug fixes and added features contributed by
+ Graham Knop <haarg@haarg.org>.
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2007 - 2013 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
+ listed above.
+
+ =head1 LICENSE
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+ LOCAL_LIB
+
+ $fatpacked{"parent.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARENT';
+ package parent;
+ use strict;
+ use vars qw($VERSION);
+ $VERSION = '0.228';
+
+ sub import {
+ my $class = shift;
+
+ my $inheritor = caller(0);
+
+ if ( @_ and $_[0] eq '-norequire' ) {
+ shift @_;
+ } else {
+ for ( my @filename = @_ ) {
+ if ( $_ eq $inheritor ) {
+ warn "Class '$inheritor' tried to inherit from itself\n";
+ };
+
+ s{::|'}{/}g;
+ require "$_.pm"; # dies if the file is not found
+ }
+ }
+
+ {
+ no strict 'refs';
+ push @{"$inheritor\::ISA"}, @_;
+ };
+ };
+
+ "All your base are belong to us"
+
+ __END__
+
+ =encoding utf8
+
+ =head1 NAME
+
+ parent - Establish an ISA relationship with base classes at compile time
+
+ =head1 SYNOPSIS
+
+ package Baz;
+ use parent qw(Foo Bar);
+
+ =head1 DESCRIPTION
+
+ Allows you to both load one or more modules, while setting up inheritance from
+ those modules at the same time. Mostly similar in effect to
+
+ package Baz;
+ BEGIN {
+ require Foo;
+ require Bar;
+ push @ISA, qw(Foo Bar);
+ }
+
+ By default, every base class needs to live in a file of its own.
+ If you want to have a subclass and its parent class in the same file, you
+ can tell C<parent> not to load any modules by using the C<-norequire> switch:
+
+ package Foo;
+ sub exclaim { "I CAN HAS PERL" }
+
+ package DoesNotLoadFooBar;
+ use parent -norequire, 'Foo', 'Bar';
+ # will not go looking for Foo.pm or Bar.pm
+
+ This is equivalent to the following code:
+
+ package Foo;
+ sub exclaim { "I CAN HAS PERL" }
+
+ package DoesNotLoadFooBar;
+ push @DoesNotLoadFooBar::ISA, 'Foo', 'Bar';
+
+ This is also helpful for the case where a package lives within
+ a differently named file:
+
+ package MyHash;
+ use Tie::Hash;
+ use parent -norequire, 'Tie::StdHash';
+
+ This is equivalent to the following code:
+
+ package MyHash;
+ require Tie::Hash;
+ push @ISA, 'Tie::StdHash';
+
+ If you want to load a subclass from a file that C<require> would
+ not consider an eligible filename (that is, it does not end in
+ either C<.pm> or C<.pmc>), use the following code:
+
+ package MySecondPlugin;
+ require './plugins/custom.plugin'; # contains Plugin::Custom
+ use parent -norequire, 'Plugin::Custom';
+
+ =head1 DIAGNOSTICS
+
+ =over 4
+
+ =item Class 'Foo' tried to inherit from itself
+
+ Attempting to inherit from yourself generates a warning.
+
+ package Foo;
+ use parent 'Foo';
+
+ =back
+
+ =head1 HISTORY
+
+ This module was forked from L<base> to remove the cruft
+ that had accumulated in it.
+
+ =head1 CAVEATS
+
+ =head1 SEE ALSO
+
+ L<base>
+
+ =head1 AUTHORS AND CONTRIBUTORS
+
+ Rafaël Garcia-Suarez, Bart Lateur, Max Maischein, Anno Siegel, Michael Schwern
+
+ =head1 MAINTAINER
+
+ Max Maischein C< corion@cpan.org >
+
+ Copyright (c) 2007-10 Max Maischein C<< <corion@cpan.org> >>
+ Based on the idea of C<base.pm>, which was introduced with Perl 5.004_04.
+
+ =head1 LICENSE
+
+ This module is released under the same terms as Perl itself.
+
+ =cut
+ PARENT
+
+ $fatpacked{"version.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION';
+ #!perl -w
+ package version;
+
+ use 5.006002;
+ use strict;
+ use warnings::register;
+ if ($] >= 5.015) {
+ warnings::register_categories(qw/version/);
+ }
+
+ use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);
+
+ $VERSION = 0.9912;
+ $CLASS = 'version';
+
+ # !!!!Delete this next block completely when adding to Perl core!!!!
+ {
+ local $SIG{'__DIE__'};
+ if (1) { # always pretend there's no XS
+ eval "use version::vpp $VERSION"; # don't tempt fate
+ die "$@" if ( $@ );
+ push @ISA, "version::vpp";
+ local $^W;
+ *version::qv = \&version::vpp::qv;
+ *version::declare = \&version::vpp::declare;
+ *version::_VERSION = \&version::vpp::_VERSION;
+ *version::vcmp = \&version::vpp::vcmp;
+ *version::new = \&version::vpp::new;
+ *version::numify = \&version::vpp::numify;
+ *version::normal = \&version::vpp::normal;
+ if ($] >= 5.009000) {
+ no strict 'refs';
+ *version::stringify = \&version::vpp::stringify;
+ *{'version::(""'} = \&version::vpp::stringify;
+ *{'version::(<=>'} = \&version::vpp::vcmp;
+ *version::parse = \&version::vpp::parse;
+ }
+ }
+ else { # use XS module
+ push @ISA, "version::vxs";
+ local $^W;
+ *version::declare = \&version::vxs::declare;
+ *version::qv = \&version::vxs::qv;
+ *version::_VERSION = \&version::vxs::_VERSION;
+ *version::vcmp = \&version::vxs::VCMP;
+ *version::new = \&version::vxs::new;
+ *version::numify = \&version::vxs::numify;
+ *version::normal = \&version::vxs::normal;
+ if ($] >= 5.009000) {
+ no strict 'refs';
+ *version::stringify = \&version::vxs::stringify;
+ *{'version::(""'} = \&version::vxs::stringify;
+ *{'version::(<=>'} = \&version::vxs::VCMP;
+ *version::parse = \&version::vxs::parse;
+ }
+ }
+ }
+
+ # avoid using Exporter
+ require version::regex;
+ *version::is_lax = \&version::regex::is_lax;
+ *version::is_strict = \&version::regex::is_strict;
+ *LAX = \$version::regex::LAX;
+ *STRICT = \$version::regex::STRICT;
+
+ sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq $CLASS) {
+ local $^W;
+ *{$class.'::declare'} = \&{$CLASS.'::declare'};
+ *{$class.'::qv'} = \&{$CLASS.'::qv'};
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg.'::declare'} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg.'::qv'} =
+ sub {return $class->qv(shift) }
+ unless defined(&{$callpkg.'::qv'});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ local $^W;
+ *UNIVERSAL::VERSION
+ = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg.'::VERSION'} = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'is_strict'})) {
+ *{$callpkg.'::is_strict'} = \&{$CLASS.'::is_strict'}
+ unless defined(&{$callpkg.'::is_strict'});
+ }
+
+ if (exists($args{'is_lax'})) {
+ *{$callpkg.'::is_lax'} = \&{$CLASS.'::is_lax'}
+ unless defined(&{$callpkg.'::is_lax'});
+ }
+ }
+
+
+ 1;
+ VERSION
+
+ $fatpacked{"version/regex.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION_REGEX';
+ package version::regex;
+
+ use strict;
+
+ use vars qw($VERSION $CLASS $STRICT $LAX);
+
+ $VERSION = 0.9912;
+
+ #--------------------------------------------------------------------------#
+ # Version regexp components
+ #--------------------------------------------------------------------------#
+
+ # Fraction part of a decimal version number. This is a common part of
+ # both strict and lax decimal versions
+
+ my $FRACTION_PART = qr/\.[0-9]+/;
+
+ # First part of either decimal or dotted-decimal strict version number.
+ # Unsigned integer with no leading zeroes (except for zero itself) to
+ # avoid confusion with octal.
+
+ my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/;
+
+ # First part of either decimal or dotted-decimal lax version number.
+ # Unsigned integer, but allowing leading zeros. Always interpreted
+ # as decimal. However, some forms of the resulting syntax give odd
+ # results if used as ordinary Perl expressions, due to how perl treats
+ # octals. E.g.
+ # version->new("010" ) == 10
+ # version->new( 010 ) == 8
+ # version->new( 010.2) == 82 # "8" . "2"
+
+ my $LAX_INTEGER_PART = qr/[0-9]+/;
+
+ # Second and subsequent part of a strict dotted-decimal version number.
+ # Leading zeroes are permitted, and the number is always decimal.
+ # Limited to three digits to avoid overflow when converting to decimal
+ # form and also avoid problematic style with excessive leading zeroes.
+
+ my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/;
+
+ # Second and subsequent part of a lax dotted-decimal version number.
+ # Leading zeroes are permitted, and the number is always decimal. No
+ # limit on the numerical value or number of digits, so there is the
+ # possibility of overflow when converting to decimal form.
+
+ my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/;
+
+ # Alpha suffix part of lax version number syntax. Acts like a
+ # dotted-decimal part.
+
+ my $LAX_ALPHA_PART = qr/_[0-9]+/;
+
+ #--------------------------------------------------------------------------#
+ # Strict version regexp definitions
+ #--------------------------------------------------------------------------#
+
+ # Strict decimal version number.
+
+ my $STRICT_DECIMAL_VERSION =
+ qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x;
+
+ # Strict dotted-decimal version number. Must have both leading "v" and
+ # at least three parts, to avoid confusion with decimal syntax.
+
+ my $STRICT_DOTTED_DECIMAL_VERSION =
+ qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x;
+
+ # Complete strict version number syntax -- should generally be used
+ # anchored: qr/ \A $STRICT \z /x
+
+ $STRICT =
+ qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x;
+
+ #--------------------------------------------------------------------------#
+ # Lax version regexp definitions
+ #--------------------------------------------------------------------------#
+
+ # Lax decimal version number. Just like the strict one except for
+ # allowing an alpha suffix or allowing a leading or trailing
+ # decimal-point
+
+ my $LAX_DECIMAL_VERSION =
+ qr/ $LAX_INTEGER_PART (?: \. | $FRACTION_PART $LAX_ALPHA_PART? )?
+ |
+ $FRACTION_PART $LAX_ALPHA_PART?
+ /x;
+
+ # Lax dotted-decimal version number. Distinguished by having either
+ # leading "v" or at least three non-alpha parts. Alpha part is only
+ # permitted if there are at least two non-alpha parts. Strangely
+ # enough, without the leading "v", Perl takes .1.2 to mean v0.1.2,
+ # so when there is no "v", the leading part is optional
+
+ my $LAX_DOTTED_DECIMAL_VERSION =
+ qr/
+ v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )?
+ |
+ $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART?
+ /x;
+
+ # Complete lax version number syntax -- should generally be used
+ # anchored: qr/ \A $LAX \z /x
+ #
+ # The string 'undef' is a special case to make for easier handling
+ # of return values from ExtUtils::MM->parse_version
+
+ $LAX =
+ qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x;
+
+ #--------------------------------------------------------------------------#
+
+ # Preloaded methods go here.
+ sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x }
+ sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x }
+
+ 1;
+ VERSION_REGEX
+
+ $fatpacked{"version/vpp.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION_VPP';
+ package charstar;
+ # a little helper class to emulate C char* semantics in Perl
+ # so that prescan_version can use the same code as in C
+
+ use overload (
+ '""' => \&thischar,
+ '0+' => \&thischar,
+ '++' => \&increment,
+ '--' => \&decrement,
+ '+' => \&plus,
+ '-' => \&minus,
+ '*' => \&multiply,
+ 'cmp' => \&cmp,
+ '<=>' => \&spaceship,
+ 'bool' => \&thischar,
+ '=' => \&clone,
+ );
+
+ sub new {
+ my ($self, $string) = @_;
+ my $class = ref($self) || $self;
+
+ my $obj = {
+ string => [split(//,$string)],
+ current => 0,
+ };
+ return bless $obj, $class;
+ }
+
+ sub thischar {
+ my ($self) = @_;
+ my $last = $#{$self->{string}};
+ my $curr = $self->{current};
+ if ($curr >= 0 && $curr <= $last) {
+ return $self->{string}->[$curr];
+ }
+ else {
+ return '';
+ }
+ }
+
+ sub increment {
+ my ($self) = @_;
+ $self->{current}++;
+ }
+
+ sub decrement {
+ my ($self) = @_;
+ $self->{current}--;
+ }
+
+ sub plus {
+ my ($self, $offset) = @_;
+ my $rself = $self->clone;
+ $rself->{current} += $offset;
+ return $rself;
+ }
+
+ sub minus {
+ my ($self, $offset) = @_;
+ my $rself = $self->clone;
+ $rself->{current} -= $offset;
+ return $rself;
+ }
+
+ sub multiply {
+ my ($left, $right, $swapped) = @_;
+ my $char = $left->thischar();
+ return $char * $right;
+ }
+
+ sub spaceship {
+ my ($left, $right, $swapped) = @_;
+ unless (ref($right)) { # not an object already
+ $right = $left->new($right);
+ }
+ return $left->{current} <=> $right->{current};
+ }
+
+ sub cmp {
+ my ($left, $right, $swapped) = @_;
+ unless (ref($right)) { # not an object already
+ if (length($right) == 1) { # comparing single character only
+ return $left->thischar cmp $right;
+ }
+ $right = $left->new($right);
+ }
+ return $left->currstr cmp $right->currstr;
+ }
+
+ sub bool {
+ my ($self) = @_;
+ my $char = $self->thischar;
+ return ($char ne '');
+ }
+
+ sub clone {
+ my ($left, $right, $swapped) = @_;
+ $right = {
+ string => [@{$left->{string}}],
+ current => $left->{current},
+ };
+ return bless $right, ref($left);
+ }
+
+ sub currstr {
+ my ($self, $s) = @_;
+ my $curr = $self->{current};
+ my $last = $#{$self->{string}};
+ if (defined($s) && $s->{current} < $last) {
+ $last = $s->{current};
+ }
+
+ my $string = join('', @{$self->{string}}[$curr..$last]);
+ return $string;
+ }
+
+ package version::vpp;
+
+ use 5.006002;
+ use strict;
+ use warnings::register;
+
+ use Config;
+ use vars qw($VERSION $CLASS @ISA $LAX $STRICT $WARN_CATEGORY);
+ $VERSION = 0.9912;
+ $CLASS = 'version::vpp';
+ if ($] > 5.015) {
+ warnings::register_categories(qw/version/);
+ $WARN_CATEGORY = 'version';
+ } else {
+ $WARN_CATEGORY = 'numeric';
+ }
+
+ require version::regex;
+ *version::vpp::is_strict = \&version::regex::is_strict;
+ *version::vpp::is_lax = \&version::regex::is_lax;
+ *LAX = \$version::regex::LAX;
+ *STRICT = \$version::regex::STRICT;
+
+ use overload (
+ '""' => \&stringify,
+ '0+' => \&numify,
+ 'cmp' => \&vcmp,
+ '<=>' => \&vcmp,
+ 'bool' => \&vbool,
+ '+' => \&vnoop,
+ '-' => \&vnoop,
+ '*' => \&vnoop,
+ '/' => \&vnoop,
+ '+=' => \&vnoop,
+ '-=' => \&vnoop,
+ '*=' => \&vnoop,
+ '/=' => \&vnoop,
+ 'abs' => \&vnoop,
+ );
+
+ sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq $CLASS) {
+ local $^W;
+ *{$class.'::declare'} = \&{$CLASS.'::declare'};
+ *{$class.'::qv'} = \&{$CLASS.'::qv'};
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg.'::declare'} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg.'::qv'} =
+ sub {return $class->qv(shift) }
+ unless defined(&{$callpkg.'::qv'});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ no warnings qw/redefine/;
+ *UNIVERSAL::VERSION
+ = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg.'::VERSION'} = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'is_strict'})) {
+ *{$callpkg.'::is_strict'} = \&{$CLASS.'::is_strict'}
+ unless defined(&{$callpkg.'::is_strict'});
+ }
+
+ if (exists($args{'is_lax'})) {
+ *{$callpkg.'::is_lax'} = \&{$CLASS.'::is_lax'}
+ unless defined(&{$callpkg.'::is_lax'});
+ }
+ }
+
+ my $VERSION_MAX = 0x7FFFFFFF;
+
+ # implement prescan_version as closely to the C version as possible
+ use constant TRUE => 1;
+ use constant FALSE => 0;
+
+ sub isDIGIT {
+ my ($char) = shift->thischar();
+ return ($char =~ /\d/);
+ }
+
+ sub isALPHA {
+ my ($char) = shift->thischar();
+ return ($char =~ /[a-zA-Z]/);
+ }
+
+ sub isSPACE {
+ my ($char) = shift->thischar();
+ return ($char =~ /\s/);
+ }
+
+ sub BADVERSION {
+ my ($s, $errstr, $error) = @_;
+ if ($errstr) {
+ $$errstr = $error;
+ }
+ return $s;
+ }
+
+ sub prescan_version {
+ my ($s, $strict, $errstr, $sqv, $ssaw_decimal, $swidth, $salpha) = @_;
+ my $qv = defined $sqv ? $$sqv : FALSE;
+ my $saw_decimal = defined $ssaw_decimal ? $$ssaw_decimal : 0;
+ my $width = defined $swidth ? $$swidth : 3;
+ my $alpha = defined $salpha ? $$salpha : FALSE;
+
+ my $d = $s;
+
+ if ($qv && isDIGIT($d)) {
+ goto dotted_decimal_version;
+ }
+
+ if ($d eq 'v') { # explicit v-string
+ $d++;
+ if (isDIGIT($d)) {
+ $qv = TRUE;
+ }
+ else { # degenerate v-string
+ # requires v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+
+ dotted_decimal_version:
+ if ($strict && $d eq '0' && isDIGIT($d+1)) {
+ # no leading zeros allowed
+ return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)");
+ }
+
+ while (isDIGIT($d)) { # integer part
+ $d++;
+ }
+
+ if ($d eq '.')
+ {
+ $saw_decimal++;
+ $d++; # decimal point
+ }
+ else
+ {
+ if ($strict) {
+ # require v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+ else {
+ goto version_prescan_finish;
+ }
+ }
+
+ {
+ my $i = 0;
+ my $j = 0;
+ while (isDIGIT($d)) { # just keep reading
+ $i++;
+ while (isDIGIT($d)) {
+ $d++; $j++;
+ # maximum 3 digits between decimal
+ if ($strict && $j > 3) {
+ return BADVERSION($s,$errstr,"Invalid version format (maximum 3 digits between decimals)");
+ }
+ }
+ if ($d eq '_') {
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ if ( $alpha ) {
+ return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)");
+ }
+ $d++;
+ $alpha = TRUE;
+ }
+ elsif ($d eq '.') {
+ if ($alpha) {
+ return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)");
+ }
+ $saw_decimal++;
+ $d++;
+ }
+ elsif (!isDIGIT($d)) {
+ last;
+ }
+ $j = 0;
+ }
+
+ if ($strict && $i < 2) {
+ # requires v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+ }
+ } # end if dotted-decimal
+ else
+ { # decimal versions
+ my $j = 0;
+ # special $strict case for leading '.' or '0'
+ if ($strict) {
+ if ($d eq '.') {
+ return BADVERSION($s,$errstr,"Invalid version format (0 before decimal required)");
+ }
+ if ($d eq '0' && isDIGIT($d+1)) {
+ return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)");
+ }
+ }
+
+ # and we never support negative version numbers
+ if ($d eq '-') {
+ return BADVERSION($s,$errstr,"Invalid version format (negative version number)");
+ }
+
+ # consume all of the integer part
+ while (isDIGIT($d)) {
+ $d++;
+ }
+
+ # look for a fractional part
+ if ($d eq '.') {
+ # we found it, so consume it
+ $saw_decimal++;
+ $d++;
+ }
+ elsif (!$d || $d eq ';' || isSPACE($d) || $d eq '}') {
+ if ( $d == $s ) {
+ # found nothing
+ return BADVERSION($s,$errstr,"Invalid version format (version required)");
+ }
+ # found just an integer
+ goto version_prescan_finish;
+ }
+ elsif ( $d == $s ) {
+ # didn't find either integer or period
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+ elsif ($d eq '_') {
+ # underscore can't come after integer part
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ elsif (isDIGIT($d+1)) {
+ return BADVERSION($s,$errstr,"Invalid version format (alpha without decimal)");
+ }
+ else {
+ return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)");
+ }
+ }
+ elsif ($d) {
+ # anything else after integer part is just invalid data
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+
+ # scan the fractional part after the decimal point
+ if ($d && !isDIGIT($d) && ($strict || ! ($d eq ';' || isSPACE($d) || $d eq '}') )) {
+ # $strict or lax-but-not-the-end
+ return BADVERSION($s,$errstr,"Invalid version format (fractional part required)");
+ }
+
+ while (isDIGIT($d)) {
+ $d++; $j++;
+ if ($d eq '.' && isDIGIT($d-1)) {
+ if ($alpha) {
+ return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)");
+ }
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions must begin with 'v')");
+ }
+ $d = $s; # start all over again
+ $qv = TRUE;
+ goto dotted_decimal_version;
+ }
+ if ($d eq '_') {
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ if ( $alpha ) {
+ return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)");
+ }
+ if ( ! isDIGIT($d+1) ) {
+ return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)");
+ }
+ $width = $j;
+ $d++;
+ $alpha = TRUE;
+ }
+ }
+ }
+
+ version_prescan_finish:
+ while (isSPACE($d)) {
+ $d++;
+ }
+
+ if ($d && !isDIGIT($d) && (! ($d eq ';' || $d eq '}') )) {
+ # trailing non-numeric data
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+ if ($saw_decimal > 1 && ($d-1) eq '.') {
+ # no trailing period allowed
+ return BADVERSION($s,$errstr,"Invalid version format (trailing decimal)");
+ }
+
+ if (defined $sqv) {
+ $$sqv = $qv;
+ }
+ if (defined $swidth) {
+ $$swidth = $width;
+ }
+ if (defined $ssaw_decimal) {
+ $$ssaw_decimal = $saw_decimal;
+ }
+ if (defined $salpha) {
+ $$salpha = $alpha;
+ }
+ return $d;
+ }
+
+ sub scan_version {
+ my ($s, $rv, $qv) = @_;
+ my $start;
+ my $pos;
+ my $last;
+ my $errstr;
+ my $saw_decimal = 0;
+ my $width = 3;
+ my $alpha = FALSE;
+ my $vinf = FALSE;
+ my @av;
+
+ $s = new charstar $s;
+
+ while (isSPACE($s)) { # leading whitespace is OK
+ $s++;
+ }
+
+ $last = prescan_version($s, FALSE, \$errstr, \$qv, \$saw_decimal,
+ \$width, \$alpha);
+
+ if ($errstr) {
+ # 'undef' is a special case and not an error
+ if ( $s ne 'undef') {
+ require Carp;
+ Carp::croak($errstr);
+ }
+ }
+
+ $start = $s;
+ if ($s eq 'v') {
+ $s++;
+ }
+ $pos = $s;
+
+ if ( $qv ) {
+ $$rv->{qv} = $qv;
+ }
+ if ( $alpha ) {
+ $$rv->{alpha} = $alpha;
+ }
+ if ( !$qv && $width < 3 ) {
+ $$rv->{width} = $width;
+ }
+
+ while (isDIGIT($pos)) {
+ $pos++;
+ }
+ if (!isALPHA($pos)) {
+ my $rev;
+
+ for (;;) {
+ $rev = 0;
+ {
+ # this is atoi() that delimits on underscores
+ my $end = $pos;
+ my $mult = 1;
+ my $orev;
+
+ # the following if() will only be true after the decimal
+ # point of a version originally created with a bare
+ # floating point number, i.e. not quoted in any way
+ #
+ if ( !$qv && $s > $start && $saw_decimal == 1 ) {
+ $mult *= 100;
+ while ( $s < $end ) {
+ $orev = $rev;
+ $rev += $s * $mult;
+ $mult /= 10;
+ if ( (abs($orev) > abs($rev))
+ || (abs($rev) > $VERSION_MAX )) {
+ warn("Integer overflow in version %d",
+ $VERSION_MAX);
+ $s = $end - 1;
+ $rev = $VERSION_MAX;
+ $vinf = 1;
+ }
+ $s++;
+ if ( $s eq '_' ) {
+ $s++;
+ }
+ }
+ }
+ else {
+ while (--$end >= $s) {
+ $orev = $rev;
+ $rev += $end * $mult;
+ $mult *= 10;
+ if ( (abs($orev) > abs($rev))
+ || (abs($rev) > $VERSION_MAX )) {
+ warn("Integer overflow in version");
+ $end = $s - 1;
+ $rev = $VERSION_MAX;
+ $vinf = 1;
+ }
+ }
+ }
+ }
+
+ # Append revision
+ push @av, $rev;
+ if ( $vinf ) {
+ $s = $last;
+ last;
+ }
+ elsif ( $pos eq '.' ) {
+ $pos++;
+ if ($qv) {
+ # skip leading zeros
+ while ($pos eq '0') {
+ $pos++;
+ }
+ }
+ $s = $pos;
+ }
+ elsif ( $pos eq '_' && isDIGIT($pos+1) ) {
+ $s = ++$pos;
+ }
+ elsif ( $pos eq ',' && isDIGIT($pos+1) ) {
+ $s = ++$pos;
+ }
+ elsif ( isDIGIT($pos) ) {
+ $s = $pos;
+ }
+ else {
+ $s = $pos;
+ last;
+ }
+ if ( $qv ) {
+ while ( isDIGIT($pos) ) {
+ $pos++;
+ }
+ }
+ else {
+ my $digits = 0;
+ while ( ( isDIGIT($pos) || $pos eq '_' ) && $digits < 3 ) {
+ if ( $pos ne '_' ) {
+ $digits++;
+ }
+ $pos++;
+ }
+ }
+ }
+ }
+ if ( $qv ) { # quoted versions always get at least three terms
+ my $len = $#av;
+ # This for loop appears to trigger a compiler bug on OS X, as it
+ # loops infinitely. Yes, len is negative. No, it makes no sense.
+ # Compiler in question is:
+ # gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
+ # for ( len = 2 - len; len > 0; len-- )
+ # av_push(MUTABLE_AV(sv), newSViv(0));
+ #
+ $len = 2 - $len;
+ while ($len-- > 0) {
+ push @av, 0;
+ }
+ }
+
+ # need to save off the current version string for later
+ if ( $vinf ) {
+ $$rv->{original} = "v.Inf";
+ $$rv->{vinf} = 1;
+ }
+ elsif ( $s > $start ) {
+ $$rv->{original} = $start->currstr($s);
+ if ( $qv && $saw_decimal == 1 && $start ne 'v' ) {
+ # need to insert a v to be consistent
+ $$rv->{original} = 'v' . $$rv->{original};
+ }
+ }
+ else {
+ $$rv->{original} = '0';
+ push(@av, 0);
+ }
+
+ # And finally, store the AV in the hash
+ $$rv->{version} = \@av;
+
+ # fix RT#19517 - special case 'undef' as string
+ if ($s eq 'undef') {
+ $s += 5;
+ }
+
+ return $s;
+ }
+
+ sub new {
+ my $class = shift;
+ unless (defined $class or $#_ > 1) {
+ require Carp;
+ Carp::croak('Usage: version::new(class, version)');
+ }
+
+ my $self = bless ({}, ref ($class) || $class);
+ my $qv = FALSE;
+
+ if ( $#_ == 1 ) { # must be CVS-style
+ $qv = TRUE;
+ }
+ my $value = pop; # always going to be the last element
+
+ if ( ref($value) && eval('$value->isa("version")') ) {
+ # Can copy the elements directly
+ $self->{version} = [ @{$value->{version} } ];
+ $self->{qv} = 1 if $value->{qv};
+ $self->{alpha} = 1 if $value->{alpha};
+ $self->{original} = ''.$value->{original};
+ return $self;
+ }
+
+ if ( not defined $value or $value =~ /^undef$/ ) {
+ # RT #19517 - special case for undef comparison
+ # or someone forgot to pass a value
+ push @{$self->{version}}, 0;
+ $self->{original} = "0";
+ return ($self);
+ }
+
+
+ if (ref($value) =~ m/ARRAY|HASH/) {
+ require Carp;
+ Carp::croak("Invalid version format (non-numeric data)");
+ }
+
+ $value = _un_vstring($value);
+
+ if ($Config{d_setlocale}) {
+ use POSIX qw/locale_h/;
+ use if $Config{d_setlocale}, 'locale';
+ my $currlocale = setlocale(LC_ALL);
+
+ # if the current locale uses commas for decimal points, we
+ # just replace commas with decimal places, rather than changing
+ # locales
+ if ( localeconv()->{decimal_point} eq ',' ) {
+ $value =~ tr/,/./;
+ }
+ }
+
+ # exponential notation
+ if ( $value =~ /\d+.?\d*e[-+]?\d+/ ) {
+ $value = sprintf("%.9f",$value);
+ $value =~ s/(0+)$//; # trim trailing zeros
+ }
+
+ my $s = scan_version($value, \$self, $qv);
+
+ if ($s) { # must be something left over
+ warn("Version string '%s' contains invalid data; "
+ ."ignoring: '%s'", $value, $s);
+ }
+
+ return ($self);
+ }
+
+ *parse = \&new;
+
+ sub numify {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $width = $self->{width} || 3;
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("%d.", $digit );
+
+ if ($alpha and warnings::enabled()) {
+ warnings::warn($WARN_CATEGORY, 'alpha->numify() is lossy');
+ }
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ if ( $width < 3 ) {
+ my $denom = 10**(3-$width);
+ my $quot = int($digit/$denom);
+ my $rem = $digit - ($quot * $denom);
+ $string .= sprintf("%0".$width."d_%d", $quot, $rem);
+ }
+ else {
+ $string .= sprintf("%03d", $digit);
+ }
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha && $width == 3 ) {
+ $string .= "_";
+ }
+ $string .= sprintf("%0".$width."d", $digit);
+ }
+ else # $len = 0
+ {
+ $string .= sprintf("000");
+ }
+
+ return $string;
+ }
+
+ sub normal {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $alpha = $self->{alpha} || "";
+ my $qv = $self->{qv} || "";
+
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("v%d", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ $string .= sprintf(".%d", $digit);
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha ) {
+ $string .= sprintf("_%0d", $digit);
+ }
+ else {
+ $string .= sprintf(".%0d", $digit);
+ }
+ }
+
+ if ( $len <= 2 ) {
+ for ( $len = 2 - $len; $len != 0; $len-- ) {
+ $string .= sprintf(".%0d", 0);
+ }
+ }
+
+ return $string;
+ }
+
+ sub stringify {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ return exists $self->{original}
+ ? $self->{original}
+ : exists $self->{qv}
+ ? $self->normal
+ : $self->numify;
+ }
+
+ sub vcmp {
+ require UNIVERSAL;
+ my ($left,$right,$swap) = @_;
+ my $class = ref($left);
+ unless ( UNIVERSAL::isa($right, $class) ) {
+ $right = $class->new($right);
+ }
+
+ if ( $swap ) {
+ ($left, $right) = ($right, $left);
+ }
+ unless (_verify($left)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ unless (_verify($right)) {
+ require Carp;
+ Carp::croak("Invalid version format");
+ }
+ my $l = $#{$left->{version}};
+ my $r = $#{$right->{version}};
+ my $m = $l < $r ? $l : $r;
+ my $lalpha = $left->is_alpha;
+ my $ralpha = $right->is_alpha;
+ my $retval = 0;
+ my $i = 0;
+ while ( $i <= $m && $retval == 0 ) {
+ $retval = $left->{version}[$i] <=> $right->{version}[$i];
+ $i++;
+ }
+
+ # tiebreaker for alpha with identical terms
+ if ( $retval == 0
+ && $l == $r
+ && $left->{version}[$m] == $right->{version}[$m]
+ && ( $lalpha || $ralpha ) ) {
+
+ if ( $lalpha && !$ralpha ) {
+ $retval = -1;
+ }
+ elsif ( $ralpha && !$lalpha) {
+ $retval = +1;
+ }
+ }
+
+ # possible match except for trailing 0's
+ if ( $retval == 0 && $l != $r ) {
+ if ( $l < $r ) {
+ while ( $i <= $r && $retval == 0 ) {
+ if ( $right->{version}[$i] != 0 ) {
+ $retval = -1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ else {
+ while ( $i <= $l && $retval == 0 ) {
+ if ( $left->{version}[$i] != 0 ) {
+ $retval = +1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $retval;
+ }
+
+ sub vbool {
+ my ($self) = @_;
+ return vcmp($self,$self->new("0"),1);
+ }
+
+ sub vnoop {
+ require Carp;
+ Carp::croak("operation not supported with version object");
+ }
+
+ sub is_alpha {
+ my ($self) = @_;
+ return (exists $self->{alpha});
+ }
+
+ sub qv {
+ my $value = shift;
+ my $class = $CLASS;
+ if (@_) {
+ $class = ref($value) || $value;
+ $value = shift;
+ }
+
+ $value = _un_vstring($value);
+ $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/;
+ my $obj = $CLASS->new($value);
+ return bless $obj, $class;
+ }
+
+ *declare = \&qv;
+
+ sub is_qv {
+ my ($self) = @_;
+ return (exists $self->{qv});
+ }
+
+
+ sub _verify {
+ my ($self) = @_;
+ if ( ref($self)
+ && eval { exists $self->{version} }
+ && ref($self->{version}) eq 'ARRAY'
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ sub _is_non_alphanumeric {
+ my $s = shift;
+ $s = new charstar $s;
+ while ($s) {
+ return 0 if isSPACE($s); # early out
+ return 1 unless (isALPHA($s) || isDIGIT($s) || $s =~ /[.-]/);
+ $s++;
+ }
+ return 0;
+ }
+
+ sub _un_vstring {
+ my $value = shift;
+ # may be a v-string
+ if ( length($value) >= 1 && $value !~ /[,._]/
+ && _is_non_alphanumeric($value)) {
+ my $tvalue;
+ if ( $] >= 5.008_001 ) {
+ $tvalue = _find_magic_vstring($value);
+ $value = $tvalue if length $tvalue;
+ }
+ elsif ( $] >= 5.006_000 ) {
+ $tvalue = sprintf("v%vd",$value);
+ if ( $tvalue =~ /^v\d+(\.\d+)*$/ ) {
+ # must be a v-string
+ $value = $tvalue;
+ }
+ }
+ }
+ return $value;
+ }
+
+ sub _find_magic_vstring {
+ my $value = shift;
+ my $tvalue = '';
+ require B;
+ my $sv = B::svref_2object(\$value);
+ my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
+ while ( $magic ) {
+ if ( $magic->TYPE eq 'V' ) {
+ $tvalue = $magic->PTR;
+ $tvalue =~ s/^v?(.+)$/v$1/;
+ last;
+ }
+ else {
+ $magic = $magic->MOREMAGIC;
+ }
+ }
+ return $tvalue;
+ }
+
+ sub _VERSION {
+ my ($obj, $req) = @_;
+ my $class = ref($obj) || $obj;
+
+ no strict 'refs';
+ if ( exists $INC{"$class.pm"} and not %{"$class\::"} and $] >= 5.008) {
+ # file but no package
+ require Carp;
+ Carp::croak( "$class defines neither package nor VERSION"
+ ."--version check failed");
+ }
+
+ my $version = eval "\$$class\::VERSION";
+ if ( defined $version ) {
+ local $^W if $] <= 5.008;
+ $version = version::vpp->new($version);
+ }
+
+ if ( defined $req ) {
+ unless ( defined $version ) {
+ require Carp;
+ my $msg = $] < 5.006
+ ? "$class version $req required--this is only version "
+ : "$class does not define \$$class\::VERSION"
+ ."--version check failed";
+
+ if ( $ENV{VERSION_DEBUG} ) {
+ Carp::confess($msg);
+ }
+ else {
+ Carp::croak($msg);
+ }
+ }
+
+ $req = version::vpp->new($req);
+
+ if ( $req > $version ) {
+ require Carp;
+ if ( $req->is_qv ) {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->normal, $version->normal)
+ );
+ }
+ else {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->stringify, $version->stringify)
+ );
+ }
+ }
+ }
+
+ return defined $version ? $version->stringify : undef;
+ }
+
+ 1; #this line is important and will help the module return a true value
+ VERSION_VPP
+
+ s/^ //mg for values %fatpacked;
+
+ my $class = 'FatPacked::'.(0+\%fatpacked);
+ no strict 'refs';
+ *{"${class}::files"} = sub { keys %{$_[0]} };
+
+ if ($] < 5.008) {
+ *{"${class}::INC"} = sub {
+ if (my $fat = $_[0]{$_[1]}) {
+ return sub {
+ return 0 unless length $fat;
+ $fat =~ s/^([^\n]*\n?)//;
+ $_ = $1;
+ return 1;
+ };
+ }
+ return;
+ };
+ }
+
+ else {
+ *{"${class}::INC"} = sub {
+ if (my $fat = $_[0]{$_[1]}) {
+ open my $fh, '<', \$fat
+ or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
+ return $fh;
+ }
+ return;
+ };
+ }
+
+ unshift @INC, bless \%fatpacked, $class;
+ } # END OF FATPACK CODE
+
+
+
+ use strict;
+ use App::cpanminus::script;
+
+
+ unless (caller) {
+ my $app = App::cpanminus::script->new;
+ $app->parse_options(@ARGV);
+ exit $app->doit;
+ }
+
+ __END__
+
+ =head1 NAME
+
+ cpanm - get, unpack build and install modules from CPAN
+
+ =head1 SYNOPSIS
+
+ cpanm Test::More # install Test::More
+ cpanm MIYAGAWA/Plack-0.99_05.tar.gz # full distribution path
+ cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz # install from URL
+ cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz # install from a local file
+ cpanm --interactive Task::Kensho # Configure interactively
+ cpanm . # install from local directory
+ cpanm --installdeps . # install all the deps for the current directory
+ cpanm -L extlib Plack # install Plack and all non-core deps into extlib
+ cpanm --mirror http://cpan.cpantesters.org/ DBI # use the fast-syncing mirror
+ cpanm --from https://cpan.metacpan.org/ Plack # use only the HTTPS mirror
+
+ =head1 COMMANDS
+
+ =over 4
+
+ =item (arguments)
+
+ Command line arguments can be either a module name, distribution file,
+ local file path, HTTP URL or git repository URL. Following commands
+ will all work as you expect.
+
+ cpanm Plack
+ cpanm Plack/Request.pm
+ cpanm MIYAGAWA/Plack-1.0000.tar.gz
+ cpanm /path/to/Plack-1.0000.tar.gz
+ cpanm http://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/Plack-0.9990.tar.gz
+ cpanm git://github.com/plack/Plack.git
+
+ Additionally, you can use the notation using C<~> and C<@> to specify
+ version for a given module. C<~> specifies the version requirement in
+ the L<CPAN::Meta::Spec> format, while C<@> pins the exact version, and
+ is a shortcut for C<~"== VERSION">.
+
+ cpanm Plack~1.0000 # 1.0000 or later
+ cpanm Plack~">= 1.0000, < 2.0000" # latest of 1.xxxx
+ cpanm Plack@0.9990 # specific version. same as Plack~"== 0.9990"
+
+ The version query including specific version or range will be sent to
+ L<MetaCPAN> to search for previous releases. The query will search for
+ BackPAN archives by default, unless you specify C<--dev> option, in
+ which case, archived versions will be filtered out.
+
+ For a git repository, you can specify a branch, tag, or commit SHA to
+ build. The default is C<master>
+
+ cpanm git://github.com/plack/Plack.git@1.0000 # tag
+ cpanm git://github.com/plack/Plack.git@devel # branch
+
+ =item -i, --install
+
+ Installs the modules. This is a default behavior and this is just a
+ compatibility option to make it work like L<cpan> or L<cpanp>.
+
+ =item --self-upgrade
+
+ Upgrades itself. It's just an alias for:
+
+ cpanm App::cpanminus
+
+ =item --info
+
+ Displays the distribution information in
+ C<AUTHOR/Dist-Name-ver.tar.gz> format in the standard out.
+
+ =item --installdeps
+
+ Installs the dependencies of the target distribution but won't build
+ itself. Handy if you want to try the application from a version
+ controlled repository such as git.
+
+ cpanm --installdeps .
+
+ =item --look
+
+ Download and unpack the distribution and then open the directory with
+ your shell. Handy to poke around the source code or do manual
+ testing.
+
+ =item -h, --help
+
+ Displays the help message.
+
+ =item -V, --version
+
+ Displays the version number.
+
+ =back
+
+ =head1 OPTIONS
+
+ You can specify the default options in C<PERL_CPANM_OPT> environment variable.
+
+ =over 4
+
+ =item -f, --force
+
+ Force install modules even when testing failed.
+
+ =item -n, --notest
+
+ Skip the testing of modules. Use this only when you just want to save
+ time for installing hundreds of distributions to the same perl and
+ architecture you've already tested to make sure it builds fine.
+
+ Defaults to false, and you can say C<--no-notest> to override when it
+ is set in the default options in C<PERL_CPANM_OPT>.
+
+ =item --test-only
+
+ Run the tests only, and do not install the specified module or
+ distributions. Handy if you want to verify the new (or even old)
+ releases pass its unit tests without installing the module.
+
+ Note that if you specify this option with a module or distribution
+ that has dependencies, these dependencies will be installed if you
+ don't currently have them.
+
+ =item -S, --sudo
+
+ Switch to the root user with C<sudo> when installing modules. Use this
+ if you want to install modules to the system perl include path.
+
+ Defaults to false, and you can say C<--no-sudo> to override when it is
+ set in the default options in C<PERL_CPANM_OPT>.
+
+ =item -v, --verbose
+
+ Makes the output verbose. It also enables the interactive
+ configuration. (See --interactive)
+
+ =item -q, --quiet
+
+ Makes the output even more quiet than the default. It only shows the
+ successful/failed dependencies to the output.
+
+ =item -l, --local-lib
+
+ Sets the L<local::lib> compatible path to install modules to. You
+ don't need to set this if you already configure the shell environment
+ variables using L<local::lib>, but this can be used to override that
+ as well.
+
+ =item -L, --local-lib-contained
+
+ Same with C<--local-lib> but with L<--self-contained> set. All
+ non-core dependencies will be installed even if they're already
+ installed.
+
+ For instance,
+
+ cpanm -L extlib Plack
+
+ would install Plack and all of its non-core dependencies into the
+ directory C<extlib>, which can be loaded from your application with:
+
+ use local::lib '/path/to/extlib';
+
+ Note that this option does B<NOT> reliably work with perl installations
+ supplied by operating system vendors that strips standard modules from perl,
+ such as RHEL, Fedora and CentOS, B<UNLESS> you also install packages supplying
+ all the modules that have been stripped. For these systems you will probably
+ want to install the C<perl-core> meta-package which does just that.
+
+ =item --self-contained
+
+ When examining the dependencies, assume no non-core modules are
+ installed on the system. Handy if you want to bundle application
+ dependencies in one directory so you can distribute to other machines.
+
+ =item --exclude-vendor
+
+ Don't include modules installed under the 'vendor' paths when searching for
+ core modules when the C<--self-contained> flag is in effect. This restores
+ the behaviour from before version 1.7023
+
+ =item --mirror
+
+ Specifies the base URL for the CPAN mirror to use, such as
+ C<http://cpan.cpantesters.org/> (you can omit the trailing slash). You
+ can specify multiple mirror URLs by repeating the command line option.
+
+ You can use a local directory that has a CPAN mirror structure
+ (created by tools such as L<OrePAN> or L<Pinto>) by using a special
+ URL scheme C<file://>. If the given URL begins with `/` (without any
+ scheme), it is considered as a file scheme as well.
+
+ cpanm --mirror file:///path/to/mirror
+ cpanm --mirror ~/minicpan # Because shell expands ~ to /home/user
+
+ Defaults to C<http://www.cpan.org/>.
+
+ =item --mirror-only
+
+ Download the mirror's 02packages.details.txt.gz index file instead of
+ querying the CPAN Meta DB. This will also effectively opt out sending
+ your local perl versions to backend database servers such as CPAN Meta
+ DB and MetaCPAN.
+
+ Select this option if you are using a local mirror of CPAN, such as
+ minicpan when you're offline, or your own CPAN index (a.k.a darkpan).
+
+ =item --from, -M
+
+ cpanm -M https://cpan.metacpan.org/
+ cpanm --from https://cpan.metacpan.org/
+
+ Use the given mirror URL and its index as the I<only> source to search
+ and download modules from.
+
+ It works similar to C<--mirror> and C<--mirror-only> combined, with a
+ small difference: unlike C<--mirror> which I<appends> the URL to the
+ list of mirrors, C<--from> (or C<-M> for short) uses the specified URL
+ as its I<only> source to download index and modules from. This makes
+ the option always override the default mirror, which might have been
+ set via global options such as the one set by C<PERL_CPANM_OPT>
+ environment variable.
+
+ B<Tip:> It might be useful if you name these options with your shell
+ aliases, like:
+
+ alias minicpanm='cpanm --from ~/minicpan'
+ alias darkpan='cpanm --from http://mycompany.example.com/DPAN'
+
+ =item --mirror-index
+
+ B<EXPERIMENTAL>: Specifies the file path to C<02packages.details.txt>
+ for module search index.
+
+ =item --cpanmetadb
+
+ B<EXPERIMENTAL>: Specifies an alternate URI for CPAN MetaDB index lookups.
+
+ =item --metacpan
+
+ Prefers MetaCPAN API over CPAN MetaDB.
+
+ =item --cpanfile
+
+ B<EXPERIMENTAL>: Specified an alternate path for cpanfile to search for,
+ when C<--installdeps> command is in use. Defaults to C<cpanfile>.
+
+ =item --prompt
+
+ Prompts when a test fails so that you can skip, force install, retry
+ or look in the shell to see what's going wrong. It also prompts when
+ one of the dependency failed if you want to proceed the installation.
+
+ Defaults to false, and you can say C<--no-prompt> to override if it's
+ set in the default options in C<PERL_CPANM_OPT>.
+
+ =item --dev
+
+ B<EXPERIMENTAL>: search for a newer developer release as well. Defaults to false.
+
+ =item --reinstall
+
+ cpanm, when given a module name in the command line (i.e. C<cpanm
+ Plack>), checks the locally installed version first and skips if it is
+ already installed. This option makes it skip the check, so:
+
+ cpanm --reinstall Plack
+
+ would reinstall L<Plack> even if your locally installed version is
+ latest, or even newer (which would happen if you install a developer
+ release from version control repositories).
+
+ Defaults to false.
+
+ =item --interactive
+
+ Makes the configuration (such as C<Makefile.PL> and C<Build.PL>)
+ interactive, so you can answer questions in the distribution that
+ requires custom configuration or Task:: distributions.
+
+ Defaults to false, and you can say C<--no-interactive> to override
+ when it's set in the default options in C<PERL_CPANM_OPT>.
+
+ =item --pp, --pureperl
+
+ Prefer Pure perl build of modules by setting C<PUREPERL_ONLY=1> for
+ MakeMaker and C<--pureperl-only> for Build.PL based
+ distributions. Note that not all of the CPAN modules support this
+ convention yet.
+
+ =item --with-recommends, --with-suggests
+
+ B<EXPERIMENTAL>: Installs dependencies declared as C<recommends> and
+ C<suggests> respectively, per META spec. When these dependencies fail
+ to install, cpanm continues the installation, since they're just
+ recommendation/suggestion.
+
+ Enabling this could potentially make a circular dependency for a few
+ modules on CPAN, when C<recommends> adds a module that C<recommends>
+ back the module in return.
+
+ There's also C<--without-recommend> and C<--without-suggests> to
+ override the default decision made earlier in C<PERL_CPANM_OPT>.
+
+ Defaults to false for both.
+
+ =item --with-develop
+
+ B<EXPERIMENTAL>: Installs develop phase dependencies in META files or
+ C<cpanfile> when used with C<--installdeps>. Defaults to false.
+
+ =item --with-feature, --without-feature, --with-all-features
+
+ B<EXPERIMENTAL>: Specifies the feature to enable, if a module supports
+ optional features per META spec 2.0.
+
+ cpanm --with-feature=opt_csv Spreadsheet::Read
+
+ the features can also be interactively chosen when C<--interactive>
+ option is enabled.
+
+ C<--with-all-features> enables all the optional features, and
+ C<--without-feature> can select a feature to disable.
+
+ =item --configure-timeout, --build-timeout, --test-timeout
+
+ Specify the timeout length (in seconds) to wait for the configure,
+ build and test process. Current default values are: 60 for configure,
+ 3600 for build and 1800 for test.
+
+ =item --configure-args, --build-args, --test-args, --install-args
+
+ B<EXPERIMENTAL>: Pass arguments for configure/build/test/install
+ commands respectively, for a given module to install.
+
+ cpanm DBD::mysql --configure-args="--cflags=... --libs=..."
+
+ The argument is only enabled for the module passed as a command line
+ argument, not dependencies.
+
+ =item --scandeps
+
+ B<DEPRECATED>: Scans the depencencies of given modules and output the
+ tree in a text format. (See C<--format> below for more options)
+
+ Because this command doesn't actually install any distributions, it
+ will be useful that by typing:
+
+ cpanm --scandeps Catalyst::Runtime
+
+ you can make sure what modules will be installed.
+
+ This command takes into account which modules you already have
+ installed in your system. If you want to see what modules will be
+ installed against a vanilla perl installation, you might want to
+ combine it with C<-L> option.
+
+ =item --format
+
+ B<DEPRECATED>: Determines what format to display the scanned
+ dependency tree. Available options are C<tree>, C<json>, C<yaml> and
+ C<dists>.
+
+ =over 8
+
+ =item tree
+
+ Displays the tree in a plain text format. This is the default value.
+
+ =item json, yaml
+
+ Outputs the tree in a JSON or YAML format. L<JSON> and L<YAML> modules
+ need to be installed respectively. The output tree is represented as a
+ recursive tuple of:
+
+ [ distribution, dependencies ]
+
+ and the container is an array containing the root elements. Note that
+ there may be multiple root nodes, since you can give multiple modules
+ to the C<--scandeps> command.
+
+ =item dists
+
+ C<dists> is a special output format, where it prints the distribution
+ filename in the I<depth first order> after the dependency resolution,
+ like:
+
+ GAAS/MIME-Base64-3.13.tar.gz
+ GAAS/URI-1.58.tar.gz
+ PETDANCE/HTML-Tagset-3.20.tar.gz
+ GAAS/HTML-Parser-3.68.tar.gz
+ GAAS/libwww-perl-5.837.tar.gz
+
+ which means you can install these distributions in this order without
+ extra dependencies. When combined with C<-L> option, it will be useful
+ to replay installations on other machines.
+
+ =back
+
+ =item --save-dists
+
+ Specifies the optional directory path to copy downloaded tarballs in
+ the CPAN mirror compatible directory structure
+ i.e. I<authors/id/A/AU/AUTHORS/Foo-Bar-version.tar.gz>
+
+ If the distro tarball did not come from CPAN, for example from a local
+ file or from GitHub, then it will be saved under
+ I<vendor/Foo-Bar-version.tar.gz>.
+
+ =item --uninst-shadows
+
+ Uninstalls the shadow files of the distribution that you're
+ installing. This eliminates the confusion if you're trying to install
+ core (dual-life) modules from CPAN against perl 5.10 or older, or
+ modules that used to be XS-based but switched to pure perl at some
+ version.
+
+ If you run cpanm as root and use C<INSTALL_BASE> or equivalent to
+ specify custom installation path, you SHOULD disable this option so
+ you won't accidentally uninstall dual-life modules from the core
+ include path.
+
+ Defaults to true if your perl version is smaller than 5.12, and you
+ can disable that with C<--no-uninst-shadows>.
+
+ B<NOTE>: Since version 1.3000 this flag is turned off by default for
+ perl newer than 5.12, since with 5.12 @INC contains site_perl directory
+ I<before> the perl core library path, and uninstalling shadows is not
+ necessary anymore and does more harm by deleting files from the core
+ library path.
+
+ =item --uninstall, -U
+
+ Uninstalls a module from the library path. It finds a packlist for
+ given modules, and removes all the files included in the same
+ distribution.
+
+ If you enable local::lib, it only removes files from the local::lib
+ directory.
+
+ If you try to uninstall a module in C<perl> directory (i.e. core
+ module), an error will be thrown.
+
+ A dialog will be prompted to confirm the files to be deleted. If you pass
+ C<-f> option as well, the dialog will be skipped and uninstallation
+ will be forced.
+
+ =item --cascade-search
+
+ B<EXPERIMENTAL>: Specifies whether to cascade search when you specify
+ multiple mirrors and a mirror doesn't have a module or has a lower
+ version of the module than requested. Defaults to false.
+
+ =item --skip-installed
+
+ Specifies whether a module given in the command line is skipped if its latest
+ version is already installed. Defaults to true.
+
+ B<NOTE>: The C<PERL5LIB> environment variable have to be correctly set
+ for this to work with modules installed using L<local::lib>, unless
+ you always use the C<-l> option.
+
+ =item --skip-satisfied
+
+ B<EXPERIMENTAL>: Specifies whether a module (and version) given in the
+ command line is skipped if it's already installed.
+
+ If you run:
+
+ cpanm --skip-satisfied CGI DBI~1.2
+
+ cpanm won't install them if you already have CGI (for whatever
+ versions) or have DBI with version higher than 1.2. It is similar to
+ C<--skip-installed> but while C<--skip-installed> checks if the
+ I<latest> version of CPAN is installed, C<--skip-satisfied> checks if
+ a requested version (or not, which means any version) is installed.
+
+ Defaults to false.
+
+ =item --verify
+
+ Verify the integrity of distribution files retrieved from PAUSE using
+ CHECKSUMS and SIGNATURES (if found). Defaults to false.
+
+ =item --report-perl-version
+
+ Whether it reports the locally installed perl version to the various
+ web server as part of User-Agent. Defaults to true unless CI related
+ environment variables such as C<TRAVIS>, C<CI> or C<AUTOMATED_TESTING>
+ is enabled. You can disable it by using C<--no-report-perl-version>.
+
+ =item --auto-cleanup
+
+ Specifies the number of days in which cpanm's work directories
+ expire. Defaults to 7, which means old work directories will be
+ cleaned up in one week.
+
+ You can set the value to C<0> to make cpan never cleanup those
+ directories.
+
+ =item --man-pages
+
+ Generates man pages for executables (man1) and libraries (man3).
+
+ Defaults to true (man pages generated) unless C<-L|--local-lib-contained>
+ option is supplied in which case it's set to false. You can disable
+ it with C<--no-man-pages>.
+
+ =item --lwp
+
+ Uses L<LWP> module to download stuff over HTTP. Defaults to true, and
+ you can say C<--no-lwp> to disable using LWP, when you want to upgrade
+ LWP from CPAN on some broken perl systems.
+
+ =item --wget
+
+ Uses GNU Wget (if available) to download stuff. Defaults to true, and
+ you can say C<--no-wget> to disable using Wget (versions of Wget older
+ than 1.9 don't support the C<--retry-connrefused> option used by cpanm).
+
+ =item --curl
+
+ Uses cURL (if available) to download stuff. Defaults to true, and
+ you can say C<--no-curl> to disable using cURL.
+
+ Normally with C<--lwp>, C<--wget> and C<--curl> options set to true
+ (which is the default) cpanm tries L<LWP>, Wget, cURL and L<HTTP::Tiny>
+ (in that order) and uses the first one available.
+
+ =back
+
+ =head1 SEE ALSO
+
+ L<App::cpanminus>
+
+ =head1 COPYRIGHT
+
+ Copyright 2010- Tatsuhiko Miyagawa.
+
+ =head1 AUTHOR
+
+ Tatsuhiko Miyagawa
+
+ =cut
+APP_CPANMINUS_FATSCRIPT
+
+$fatpacked{"CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta;
+ # VERSION
+ $CPAN::Meta::VERSION = '2.143240';
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod use v5.10;
+ #pod use strict;
+ #pod use warnings;
+ #pod use CPAN::Meta;
+ #pod use Module::Load;
+ #pod
+ #pod my $meta = CPAN::Meta->load_file('META.json');
+ #pod
+ #pod printf "testing requirements for %s version %s\n",
+ #pod $meta->name,
+ #pod $meta->version;
+ #pod
+ #pod my $prereqs = $meta->effective_prereqs;
+ #pod
+ #pod for my $phase ( qw/configure runtime build test/ ) {
+ #pod say "Requirements for $phase:";
+ #pod my $reqs = $prereqs->requirements_for($phase, "requires");
+ #pod for my $module ( sort $reqs->required_modules ) {
+ #pod my $status;
+ #pod if ( eval { load $module unless $module eq 'perl'; 1 } ) {
+ #pod my $version = $module eq 'perl' ? $] : $module->VERSION;
+ #pod $status = $reqs->accepts_module($module, $version)
+ #pod ? "$version ok" : "$version not ok";
+ #pod } else {
+ #pod $status = "missing"
+ #pod };
+ #pod say " $module ($status)";
+ #pod }
+ #pod }
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod Software distributions released to the CPAN include a F<META.json> or, for
+ #pod older distributions, F<META.yml>, which describes the distribution, its
+ #pod contents, and the requirements for building and installing the distribution.
+ #pod The data structure stored in the F<META.json> file is described in
+ #pod L<CPAN::Meta::Spec>.
+ #pod
+ #pod CPAN::Meta provides a simple class to represent this distribution metadata (or
+ #pod I<distmeta>), along with some helpful methods for interrogating that data.
+ #pod
+ #pod The documentation below is only for the methods of the CPAN::Meta object. For
+ #pod information on the meaning of individual fields, consult the spec.
+ #pod
+ #pod =cut
+
+ use Carp qw(carp croak);
+ use CPAN::Meta::Feature;
+ use CPAN::Meta::Prereqs;
+ use CPAN::Meta::Converter;
+ use CPAN::Meta::Validator;
+ use Parse::CPAN::Meta 1.4414 ();
+
+ BEGIN { *_dclone = \&CPAN::Meta::Converter::_dclone }
+
+ #pod =head1 STRING DATA
+ #pod
+ #pod The following methods return a single value, which is the value for the
+ #pod corresponding entry in the distmeta structure. Values should be either undef
+ #pod or strings.
+ #pod
+ #pod =for :list
+ #pod * abstract
+ #pod * description
+ #pod * dynamic_config
+ #pod * generated_by
+ #pod * name
+ #pod * release_status
+ #pod * version
+ #pod
+ #pod =cut
+
+ BEGIN {
+ my @STRING_READERS = qw(
+ abstract
+ description
+ dynamic_config
+ generated_by
+ name
+ release_status
+ version
+ );
+
+ no strict 'refs';
+ for my $attr (@STRING_READERS) {
+ *$attr = sub { $_[0]{ $attr } };
+ }
+ }
+
+ #pod =head1 LIST DATA
+ #pod
+ #pod These methods return lists of string values, which might be represented in the
+ #pod distmeta structure as arrayrefs or scalars:
+ #pod
+ #pod =for :list
+ #pod * authors
+ #pod * keywords
+ #pod * licenses
+ #pod
+ #pod The C<authors> and C<licenses> methods may also be called as C<author> and
+ #pod C<license>, respectively, to match the field name in the distmeta structure.
+ #pod
+ #pod =cut
+
+ BEGIN {
+ my @LIST_READERS = qw(
+ author
+ keywords
+ license
+ );
+
+ no strict 'refs';
+ for my $attr (@LIST_READERS) {
+ *$attr = sub {
+ my $value = $_[0]{ $attr };
+ croak "$attr must be called in list context"
+ unless wantarray;
+ return @{ _dclone($value) } if ref $value;
+ return $value;
+ };
+ }
+ }
+
+ sub authors { $_[0]->author }
+ sub licenses { $_[0]->license }
+
+ #pod =head1 MAP DATA
+ #pod
+ #pod These readers return hashrefs of arbitrary unblessed data structures, each
+ #pod described more fully in the specification:
+ #pod
+ #pod =for :list
+ #pod * meta_spec
+ #pod * resources
+ #pod * provides
+ #pod * no_index
+ #pod * prereqs
+ #pod * optional_features
+ #pod
+ #pod =cut
+
+ BEGIN {
+ my @MAP_READERS = qw(
+ meta-spec
+ resources
+ provides
+ no_index
+
+ prereqs
+ optional_features
+ );
+
+ no strict 'refs';
+ for my $attr (@MAP_READERS) {
+ (my $subname = $attr) =~ s/-/_/;
+ *$subname = sub {
+ my $value = $_[0]{ $attr };
+ return _dclone($value) if $value;
+ return {};
+ };
+ }
+ }
+
+ #pod =head1 CUSTOM DATA
+ #pod
+ #pod A list of custom keys are available from the C<custom_keys> method and
+ #pod particular keys may be retrieved with the C<custom> method.
+ #pod
+ #pod say $meta->custom($_) for $meta->custom_keys;
+ #pod
+ #pod If a custom key refers to a data structure, a deep clone is returned.
+ #pod
+ #pod =cut
+
+ sub custom_keys {
+ return grep { /^x_/i } keys %{$_[0]};
+ }
+
+ sub custom {
+ my ($self, $attr) = @_;
+ my $value = $self->{$attr};
+ return _dclone($value) if ref $value;
+ return $value;
+ }
+
+ #pod =method new
+ #pod
+ #pod my $meta = CPAN::Meta->new($distmeta_struct, \%options);
+ #pod
+ #pod Returns a valid CPAN::Meta object or dies if the supplied metadata hash
+ #pod reference fails to validate. Older-format metadata will be up-converted to
+ #pod version 2 if they validate against the original stated specification.
+ #pod
+ #pod It takes an optional hashref of options. Valid options include:
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod lazy_validation -- if true, new will attempt to convert the given metadata
+ #pod to version 2 before attempting to validate it. This means than any
+ #pod fixable errors will be handled by CPAN::Meta::Converter before validation.
+ #pod (Note that this might result in invalid optional data being silently
+ #pod dropped.) The default is false.
+ #pod
+ #pod =back
+ #pod
+ #pod =cut
+
+ sub _new {
+ my ($class, $struct, $options) = @_;
+ my $self;
+
+ if ( $options->{lazy_validation} ) {
+ # try to convert to a valid structure; if succeeds, then return it
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+ $self = $cmc->convert( version => 2 ); # valid or dies
+ return bless $self, $class;
+ }
+ else {
+ # validate original struct
+ my $cmv = CPAN::Meta::Validator->new( $struct );
+ unless ( $cmv->is_valid) {
+ die "Invalid metadata structure. Errors: "
+ . join(", ", $cmv->errors) . "\n";
+ }
+ }
+
+ # up-convert older spec versions
+ my $version = $struct->{'meta-spec'}{version} || '1.0';
+ if ( $version == 2 ) {
+ $self = $struct;
+ }
+ else {
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+ $self = $cmc->convert( version => 2 );
+ }
+
+ return bless $self, $class;
+ }
+
+ sub new {
+ my ($class, $struct, $options) = @_;
+ my $self = eval { $class->_new($struct, $options) };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method create
+ #pod
+ #pod my $meta = CPAN::Meta->create($distmeta_struct, \%options);
+ #pod
+ #pod This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields
+ #pod will be generated if not provided. This means the metadata structure is
+ #pod assumed to otherwise follow the latest L<CPAN::Meta::Spec>.
+ #pod
+ #pod =cut
+
+ sub create {
+ my ($class, $struct, $options) = @_;
+ my $version = __PACKAGE__->VERSION || 2;
+ $struct->{generated_by} ||= __PACKAGE__ . " version $version" ;
+ $struct->{'meta-spec'}{version} ||= int($version);
+ my $self = eval { $class->_new($struct, $options) };
+ croak ($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_file
+ #pod
+ #pod my $meta = CPAN::Meta->load_file($distmeta_file, \%options);
+ #pod
+ #pod Given a pathname to a file containing metadata, this deserializes the file
+ #pod according to its file suffix and constructs a new C<CPAN::Meta> object, just
+ #pod like C<new()>. It will die if the deserialized version fails to validate
+ #pod against its stated specification version.
+ #pod
+ #pod It takes the same options as C<new()> but C<lazy_validation> defaults to
+ #pod true.
+ #pod
+ #pod =cut
+
+ sub load_file {
+ my ($class, $file, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ croak "load_file() requires a valid, readable filename"
+ unless -r $file;
+
+ my $self;
+ eval {
+ my $struct = Parse::CPAN::Meta->load_file( $file );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_yaml_string
+ #pod
+ #pod my $meta = CPAN::Meta->load_yaml_string($yaml, \%options);
+ #pod
+ #pod This method returns a new CPAN::Meta object using the first document in the
+ #pod given YAML string. In other respects it is identical to C<load_file()>.
+ #pod
+ #pod =cut
+
+ sub load_yaml_string {
+ my ($class, $yaml, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ my $self;
+ eval {
+ my ($struct) = Parse::CPAN::Meta->load_yaml_string( $yaml );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_json_string
+ #pod
+ #pod my $meta = CPAN::Meta->load_json_string($json, \%options);
+ #pod
+ #pod This method returns a new CPAN::Meta object using the structure represented by
+ #pod the given JSON string. In other respects it is identical to C<load_file()>.
+ #pod
+ #pod =cut
+
+ sub load_json_string {
+ my ($class, $json, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ my $self;
+ eval {
+ my $struct = Parse::CPAN::Meta->load_json_string( $json );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method load_string
+ #pod
+ #pod my $meta = CPAN::Meta->load_string($string, \%options);
+ #pod
+ #pod If you don't know if a string contains YAML or JSON, this method will use
+ #pod L<Parse::CPAN::Meta> to guess. In other respects it is identical to
+ #pod C<load_file()>.
+ #pod
+ #pod =cut
+
+ sub load_string {
+ my ($class, $string, $options) = @_;
+ $options->{lazy_validation} = 1 unless exists $options->{lazy_validation};
+
+ my $self;
+ eval {
+ my $struct = Parse::CPAN::Meta->load_string( $string );
+ $self = $class->_new($struct, $options);
+ };
+ croak($@) if $@;
+ return $self;
+ }
+
+ #pod =method save
+ #pod
+ #pod $meta->save($distmeta_file, \%options);
+ #pod
+ #pod Serializes the object as JSON and writes it to the given file. The only valid
+ #pod option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file
+ #pod is saved with UTF-8 encoding.
+ #pod
+ #pod For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP>
+ #pod is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or
+ #pod later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate
+ #pod backend like L<JSON::XS>.
+ #pod
+ #pod For C<version> less than 2, the filename should end in '.yml'.
+ #pod L<CPAN::Meta::Converter> is used to generate an older metadata structure, which
+ #pod is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may
+ #pod set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though
+ #pod this is not recommended due to subtle incompatibilities between YAML parsers on
+ #pod CPAN.
+ #pod
+ #pod =cut
+
+ sub save {
+ my ($self, $file, $options) = @_;
+
+ my $version = $options->{version} || '2';
+ my $layer = $] ge '5.008001' ? ':utf8' : '';
+
+ if ( $version ge '2' ) {
+ carp "'$file' should end in '.json'"
+ unless $file =~ m{\.json$};
+ }
+ else {
+ carp "'$file' should end in '.yml'"
+ unless $file =~ m{\.yml$};
+ }
+
+ my $data = $self->as_string( $options );
+ open my $fh, ">$layer", $file
+ or die "Error opening '$file' for writing: $!\n";
+
+ print {$fh} $data;
+ close $fh
+ or die "Error closing '$file': $!\n";
+
+ return 1;
+ }
+
+ #pod =method meta_spec_version
+ #pod
+ #pod This method returns the version part of the C<meta_spec> entry in the distmeta
+ #pod structure. It is equivalent to:
+ #pod
+ #pod $meta->meta_spec->{version};
+ #pod
+ #pod =cut
+
+ sub meta_spec_version {
+ my ($self) = @_;
+ return $self->meta_spec->{version};
+ }
+
+ #pod =method effective_prereqs
+ #pod
+ #pod my $prereqs = $meta->effective_prereqs;
+ #pod
+ #pod my $prereqs = $meta->effective_prereqs( \@feature_identifiers );
+ #pod
+ #pod This method returns a L<CPAN::Meta::Prereqs> object describing all the
+ #pod prereqs for the distribution. If an arrayref of feature identifiers is given,
+ #pod the prereqs for the identified features are merged together with the
+ #pod distribution's core prereqs before the CPAN::Meta::Prereqs object is returned.
+ #pod
+ #pod =cut
+
+ sub effective_prereqs {
+ my ($self, $features) = @_;
+ $features ||= [];
+
+ my $prereq = CPAN::Meta::Prereqs->new($self->prereqs);
+
+ return $prereq unless @$features;
+
+ my @other = map {; $self->feature($_)->prereqs } @$features;
+
+ return $prereq->with_merged_prereqs(\@other);
+ }
+
+ #pod =method should_index_file
+ #pod
+ #pod ... if $meta->should_index_file( $filename );
+ #pod
+ #pod This method returns true if the given file should be indexed. It decides this
+ #pod by checking the C<file> and C<directory> keys in the C<no_index> property of
+ #pod the distmeta structure. Note that neither the version format nor
+ #pod C<release_status> are considered.
+ #pod
+ #pod C<$filename> should be given in unix format.
+ #pod
+ #pod =cut
+
+ sub should_index_file {
+ my ($self, $filename) = @_;
+
+ for my $no_index_file (@{ $self->no_index->{file} || [] }) {
+ return if $filename eq $no_index_file;
+ }
+
+ for my $no_index_dir (@{ $self->no_index->{directory} }) {
+ $no_index_dir =~ s{$}{/} unless $no_index_dir =~ m{/\z};
+ return if index($filename, $no_index_dir) == 0;
+ }
+
+ return 1;
+ }
+
+ #pod =method should_index_package
+ #pod
+ #pod ... if $meta->should_index_package( $package );
+ #pod
+ #pod This method returns true if the given package should be indexed. It decides
+ #pod this by checking the C<package> and C<namespace> keys in the C<no_index>
+ #pod property of the distmeta structure. Note that neither the version format nor
+ #pod C<release_status> are considered.
+ #pod
+ #pod =cut
+
+ sub should_index_package {
+ my ($self, $package) = @_;
+
+ for my $no_index_pkg (@{ $self->no_index->{package} || [] }) {
+ return if $package eq $no_index_pkg;
+ }
+
+ for my $no_index_ns (@{ $self->no_index->{namespace} }) {
+ return if index($package, "${no_index_ns}::") == 0;
+ }
+
+ return 1;
+ }
+
+ #pod =method features
+ #pod
+ #pod my @feature_objects = $meta->features;
+ #pod
+ #pod This method returns a list of L<CPAN::Meta::Feature> objects, one for each
+ #pod optional feature described by the distribution's metadata.
+ #pod
+ #pod =cut
+
+ sub features {
+ my ($self) = @_;
+
+ my $opt_f = $self->optional_features;
+ my @features = map {; CPAN::Meta::Feature->new($_ => $opt_f->{ $_ }) }
+ keys %$opt_f;
+
+ return @features;
+ }
+
+ #pod =method feature
+ #pod
+ #pod my $feature_object = $meta->feature( $identifier );
+ #pod
+ #pod This method returns a L<CPAN::Meta::Feature> object for the optional feature
+ #pod with the given identifier. If no feature with that identifier exists, an
+ #pod exception will be raised.
+ #pod
+ #pod =cut
+
+ sub feature {
+ my ($self, $ident) = @_;
+
+ croak "no feature named $ident"
+ unless my $f = $self->optional_features->{ $ident };
+
+ return CPAN::Meta::Feature->new($ident, $f);
+ }
+
+ #pod =method as_struct
+ #pod
+ #pod my $copy = $meta->as_struct( \%options );
+ #pod
+ #pod This method returns a deep copy of the object's metadata as an unblessed hash
+ #pod reference. It takes an optional hashref of options. If the hashref contains
+ #pod a C<version> argument, the copied metadata will be converted to the version
+ #pod of the specification and returned. For example:
+ #pod
+ #pod my $old_spec = $meta->as_struct( {version => "1.4"} );
+ #pod
+ #pod =cut
+
+ sub as_struct {
+ my ($self, $options) = @_;
+ my $struct = _dclone($self);
+ if ( $options->{version} ) {
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+ $struct = $cmc->convert( version => $options->{version} );
+ }
+ return $struct;
+ }
+
+ #pod =method as_string
+ #pod
+ #pod my $string = $meta->as_string( \%options );
+ #pod
+ #pod This method returns a serialized copy of the object's metadata as a character
+ #pod string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref
+ #pod of options. If the hashref contains a C<version> argument, the copied metadata
+ #pod will be converted to the version of the specification and returned. For
+ #pod example:
+ #pod
+ #pod my $string = $meta->as_string( {version => "1.4"} );
+ #pod
+ #pod For C<version> greater than or equal to 2, the string will be serialized as
+ #pod JSON. For C<version> less than 2, the string will be serialized as YAML. In
+ #pod both cases, the same rules are followed as in the C<save()> method for choosing
+ #pod a serialization backend.
+ #pod
+ #pod =cut
+
+ sub as_string {
+ my ($self, $options) = @_;
+
+ my $version = $options->{version} || '2';
+
+ my $struct;
+ if ( $self->meta_spec_version ne $version ) {
+ my $cmc = CPAN::Meta::Converter->new( $self->as_struct );
+ $struct = $cmc->convert( version => $version );
+ }
+ else {
+ $struct = $self->as_struct;
+ }
+
+ my ($data, $backend);
+ if ( $version ge '2' ) {
+ $backend = Parse::CPAN::Meta->json_backend();
+ $data = $backend->new->pretty->canonical->encode($struct);
+ }
+ else {
+ $backend = Parse::CPAN::Meta->yaml_backend();
+ $data = eval { no strict 'refs'; &{"$backend\::Dump"}($struct) };
+ if ( $@ ) {
+ croak $backend->can('errstr') ? $backend->errstr : $@
+ }
+ }
+
+ return $data;
+ }
+
+ # Used by JSON::PP, etc. for "convert_blessed"
+ sub TO_JSON {
+ return { %{ $_[0] } };
+ }
+
+ 1;
+
+ # ABSTRACT: the distribution metadata for a CPAN dist
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta - the distribution metadata for a CPAN dist
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 SYNOPSIS
+
+ use v5.10;
+ use strict;
+ use warnings;
+ use CPAN::Meta;
+ use Module::Load;
+
+ my $meta = CPAN::Meta->load_file('META.json');
+
+ printf "testing requirements for %s version %s\n",
+ $meta->name,
+ $meta->version;
+
+ my $prereqs = $meta->effective_prereqs;
+
+ for my $phase ( qw/configure runtime build test/ ) {
+ say "Requirements for $phase:";
+ my $reqs = $prereqs->requirements_for($phase, "requires");
+ for my $module ( sort $reqs->required_modules ) {
+ my $status;
+ if ( eval { load $module unless $module eq 'perl'; 1 } ) {
+ my $version = $module eq 'perl' ? $] : $module->VERSION;
+ $status = $reqs->accepts_module($module, $version)
+ ? "$version ok" : "$version not ok";
+ } else {
+ $status = "missing"
+ };
+ say " $module ($status)";
+ }
+ }
+
+ =head1 DESCRIPTION
+
+ Software distributions released to the CPAN include a F<META.json> or, for
+ older distributions, F<META.yml>, which describes the distribution, its
+ contents, and the requirements for building and installing the distribution.
+ The data structure stored in the F<META.json> file is described in
+ L<CPAN::Meta::Spec>.
+
+ CPAN::Meta provides a simple class to represent this distribution metadata (or
+ I<distmeta>), along with some helpful methods for interrogating that data.
+
+ The documentation below is only for the methods of the CPAN::Meta object. For
+ information on the meaning of individual fields, consult the spec.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $meta = CPAN::Meta->new($distmeta_struct, \%options);
+
+ Returns a valid CPAN::Meta object or dies if the supplied metadata hash
+ reference fails to validate. Older-format metadata will be up-converted to
+ version 2 if they validate against the original stated specification.
+
+ It takes an optional hashref of options. Valid options include:
+
+ =over
+
+ =item *
+
+ lazy_validation -- if true, new will attempt to convert the given metadata
+ to version 2 before attempting to validate it. This means than any
+ fixable errors will be handled by CPAN::Meta::Converter before validation.
+ (Note that this might result in invalid optional data being silently
+ dropped.) The default is false.
+
+ =back
+
+ =head2 create
+
+ my $meta = CPAN::Meta->create($distmeta_struct, \%options);
+
+ This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields
+ will be generated if not provided. This means the metadata structure is
+ assumed to otherwise follow the latest L<CPAN::Meta::Spec>.
+
+ =head2 load_file
+
+ my $meta = CPAN::Meta->load_file($distmeta_file, \%options);
+
+ Given a pathname to a file containing metadata, this deserializes the file
+ according to its file suffix and constructs a new C<CPAN::Meta> object, just
+ like C<new()>. It will die if the deserialized version fails to validate
+ against its stated specification version.
+
+ It takes the same options as C<new()> but C<lazy_validation> defaults to
+ true.
+
+ =head2 load_yaml_string
+
+ my $meta = CPAN::Meta->load_yaml_string($yaml, \%options);
+
+ This method returns a new CPAN::Meta object using the first document in the
+ given YAML string. In other respects it is identical to C<load_file()>.
+
+ =head2 load_json_string
+
+ my $meta = CPAN::Meta->load_json_string($json, \%options);
+
+ This method returns a new CPAN::Meta object using the structure represented by
+ the given JSON string. In other respects it is identical to C<load_file()>.
+
+ =head2 load_string
+
+ my $meta = CPAN::Meta->load_string($string, \%options);
+
+ If you don't know if a string contains YAML or JSON, this method will use
+ L<Parse::CPAN::Meta> to guess. In other respects it is identical to
+ C<load_file()>.
+
+ =head2 save
+
+ $meta->save($distmeta_file, \%options);
+
+ Serializes the object as JSON and writes it to the given file. The only valid
+ option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file
+ is saved with UTF-8 encoding.
+
+ For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP>
+ is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or
+ later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate
+ backend like L<JSON::XS>.
+
+ For C<version> less than 2, the filename should end in '.yml'.
+ L<CPAN::Meta::Converter> is used to generate an older metadata structure, which
+ is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may
+ set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though
+ this is not recommended due to subtle incompatibilities between YAML parsers on
+ CPAN.
+
+ =head2 meta_spec_version
+
+ This method returns the version part of the C<meta_spec> entry in the distmeta
+ structure. It is equivalent to:
+
+ $meta->meta_spec->{version};
+
+ =head2 effective_prereqs
+
+ my $prereqs = $meta->effective_prereqs;
+
+ my $prereqs = $meta->effective_prereqs( \@feature_identifiers );
+
+ This method returns a L<CPAN::Meta::Prereqs> object describing all the
+ prereqs for the distribution. If an arrayref of feature identifiers is given,
+ the prereqs for the identified features are merged together with the
+ distribution's core prereqs before the CPAN::Meta::Prereqs object is returned.
+
+ =head2 should_index_file
+
+ ... if $meta->should_index_file( $filename );
+
+ This method returns true if the given file should be indexed. It decides this
+ by checking the C<file> and C<directory> keys in the C<no_index> property of
+ the distmeta structure. Note that neither the version format nor
+ C<release_status> are considered.
+
+ C<$filename> should be given in unix format.
+
+ =head2 should_index_package
+
+ ... if $meta->should_index_package( $package );
+
+ This method returns true if the given package should be indexed. It decides
+ this by checking the C<package> and C<namespace> keys in the C<no_index>
+ property of the distmeta structure. Note that neither the version format nor
+ C<release_status> are considered.
+
+ =head2 features
+
+ my @feature_objects = $meta->features;
+
+ This method returns a list of L<CPAN::Meta::Feature> objects, one for each
+ optional feature described by the distribution's metadata.
+
+ =head2 feature
+
+ my $feature_object = $meta->feature( $identifier );
+
+ This method returns a L<CPAN::Meta::Feature> object for the optional feature
+ with the given identifier. If no feature with that identifier exists, an
+ exception will be raised.
+
+ =head2 as_struct
+
+ my $copy = $meta->as_struct( \%options );
+
+ This method returns a deep copy of the object's metadata as an unblessed hash
+ reference. It takes an optional hashref of options. If the hashref contains
+ a C<version> argument, the copied metadata will be converted to the version
+ of the specification and returned. For example:
+
+ my $old_spec = $meta->as_struct( {version => "1.4"} );
+
+ =head2 as_string
+
+ my $string = $meta->as_string( \%options );
+
+ This method returns a serialized copy of the object's metadata as a character
+ string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref
+ of options. If the hashref contains a C<version> argument, the copied metadata
+ will be converted to the version of the specification and returned. For
+ example:
+
+ my $string = $meta->as_string( {version => "1.4"} );
+
+ For C<version> greater than or equal to 2, the string will be serialized as
+ JSON. For C<version> less than 2, the string will be serialized as YAML. In
+ both cases, the same rules are followed as in the C<save()> method for choosing
+ a serialization backend.
+
+ =head1 STRING DATA
+
+ The following methods return a single value, which is the value for the
+ corresponding entry in the distmeta structure. Values should be either undef
+ or strings.
+
+ =over 4
+
+ =item *
+
+ abstract
+
+ =item *
+
+ description
+
+ =item *
+
+ dynamic_config
+
+ =item *
+
+ generated_by
+
+ =item *
+
+ name
+
+ =item *
+
+ release_status
+
+ =item *
+
+ version
+
+ =back
+
+ =head1 LIST DATA
+
+ These methods return lists of string values, which might be represented in the
+ distmeta structure as arrayrefs or scalars:
+
+ =over 4
+
+ =item *
+
+ authors
+
+ =item *
+
+ keywords
+
+ =item *
+
+ licenses
+
+ =back
+
+ The C<authors> and C<licenses> methods may also be called as C<author> and
+ C<license>, respectively, to match the field name in the distmeta structure.
+
+ =head1 MAP DATA
+
+ These readers return hashrefs of arbitrary unblessed data structures, each
+ described more fully in the specification:
+
+ =over 4
+
+ =item *
+
+ meta_spec
+
+ =item *
+
+ resources
+
+ =item *
+
+ provides
+
+ =item *
+
+ no_index
+
+ =item *
+
+ prereqs
+
+ =item *
+
+ optional_features
+
+ =back
+
+ =head1 CUSTOM DATA
+
+ A list of custom keys are available from the C<custom_keys> method and
+ particular keys may be retrieved with the C<custom> method.
+
+ say $meta->custom($_) for $meta->custom_keys;
+
+ If a custom key refers to a data structure, a deep clone is returned.
+
+ =for Pod::Coverage TO_JSON abstract author authors custom custom_keys description dynamic_config
+ generated_by keywords license licenses meta_spec name no_index
+ optional_features prereqs provides release_status resources version
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ L<CPAN::Meta::Converter>
+
+ =item *
+
+ L<CPAN::Meta::Validator>
+
+ =back
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/Perl-Toolchain-Gang/CPAN-Meta>
+
+ git clone https://github.com/Perl-Toolchain-Gang/CPAN-Meta.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Ansgar Burchardt Avar Arnfjord Bjarmason Christopher J. Madsen Chuck Adams Cory G Watson Damyan Ivanov Eric Wilhelm Graham Knop Gregor Hermann Karen Etheridge Kenichi Ishigaki Ken Williams Lars Dieckow Leon Timmermans majensen Mark Fowler Matt S Trout Michael G. Schwern moznion Olaf Alders Olivier Mengue Randy Sims
+
+ =over 4
+
+ =item *
+
+ Ansgar Burchardt <ansgar@cpan.org>
+
+ =item *
+
+ Avar Arnfjord Bjarmason <avar@cpan.org>
+
+ =item *
+
+ Christopher J. Madsen <cjm@cpan.org>
+
+ =item *
+
+ Chuck Adams <cja987@gmail.com>
+
+ =item *
+
+ Cory G Watson <gphat@cpan.org>
+
+ =item *
+
+ Damyan Ivanov <dam@cpan.org>
+
+ =item *
+
+ Eric Wilhelm <ewilhelm@cpan.org>
+
+ =item *
+
+ Graham Knop <haarg@haarg.org>
+
+ =item *
+
+ Gregor Hermann <gregoa@debian.org>
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Kenichi Ishigaki <ishigaki@cpan.org>
+
+ =item *
+
+ Ken Williams <kwilliams@cpan.org>
+
+ =item *
+
+ Lars Dieckow <daxim@cpan.org>
+
+ =item *
+
+ Leon Timmermans <leont@cpan.org>
+
+ =item *
+
+ majensen <maj@fortinbras.us>
+
+ =item *
+
+ Mark Fowler <markf@cpan.org>
+
+ =item *
+
+ Matt S Trout <mst@shadowcat.co.uk>
+
+ =item *
+
+ Michael G. Schwern <mschwern@cpan.org>
+
+ =item *
+
+ moznion <moznion@gmail.com>
+
+ =item *
+
+ Olaf Alders <olaf@wundersolutions.com>
+
+ =item *
+
+ Olivier Mengue <dolmen@cpan.org>
+
+ =item *
+
+ Randy Sims <randys@thepierianspring.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META
+
+$fatpacked{"CPAN/Meta/Converter.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_CONVERTER';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Converter;
+ # VERSION
+ $CPAN::Meta::Converter::VERSION = '2.143240';
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod my $struct = decode_json_file('META.json');
+ #pod
+ #pod my $cmc = CPAN::Meta::Converter->new( $struct );
+ #pod
+ #pod my $new_struct = $cmc->convert( version => "2" );
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod This module converts CPAN Meta structures from one form to another. The
+ #pod primary use is to convert older structures to the most modern version of
+ #pod the specification, but other transformations may be implemented in the
+ #pod future as needed. (E.g. stripping all custom fields or stripping all
+ #pod optional fields.)
+ #pod
+ #pod =cut
+
+ use CPAN::Meta::Validator;
+ use CPAN::Meta::Requirements;
+ use Parse::CPAN::Meta 1.4400 ();
+
+ # To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls
+ # before 5.10, we fall back to the EUMM bundled compatibility version module if
+ # that's the only thing available. This shouldn't ever happen in a normal CPAN
+ # install of CPAN::Meta::Requirements, as version.pm will be picked up from
+ # prereqs and be available at runtime.
+
+ BEGIN {
+ eval "use version ()"; ## no critic
+ if ( my $err = $@ ) {
+ eval "use ExtUtils::MakeMaker::version" or die $err; ## no critic
+ }
+ }
+
+ # Perl 5.10.0 didn't have "is_qv" in version.pm
+ *_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} };
+
+ sub _dclone {
+ my $ref = shift;
+
+ # if an object is in the data structure and doesn't specify how to
+ # turn itself into JSON, we just stringify the object. That does the
+ # right thing for typical things that might be there, like version objects,
+ # Path::Class objects, etc.
+ no warnings 'once';
+ no warnings 'redefine';
+ local *UNIVERSAL::TO_JSON = sub { "$_[0]" };
+
+ my $json = Parse::CPAN::Meta->json_backend()->new
+ ->utf8
+ ->allow_blessed
+ ->convert_blessed;
+ $json->decode($json->encode($ref))
+ }
+
+ my %known_specs = (
+ '2' => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
+ '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html',
+ '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html',
+ '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html',
+ '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html'
+ );
+
+ my @spec_list = sort { $a <=> $b } keys %known_specs;
+ my ($LOWEST, $HIGHEST) = @spec_list[0,-1];
+
+ #--------------------------------------------------------------------------#
+ # converters
+ #
+ # called as $converter->($element, $field_name, $full_meta, $to_version)
+ #
+ # defined return value used for field
+ # undef return value means field is skipped
+ #--------------------------------------------------------------------------#
+
+ sub _keep { $_[0] }
+
+ sub _keep_or_one { defined($_[0]) ? $_[0] : 1 }
+
+ sub _keep_or_zero { defined($_[0]) ? $_[0] : 0 }
+
+ sub _keep_or_unknown { defined($_[0]) && length($_[0]) ? $_[0] : "unknown" }
+
+ sub _generated_by {
+ my $gen = shift;
+ my $sig = __PACKAGE__ . " version " . (__PACKAGE__->VERSION || "<dev>");
+
+ return $sig unless defined $gen and length $gen;
+ return $gen if $gen =~ /\Q$sig/;
+ return "$gen, $sig";
+ }
+
+ sub _listify { ! defined $_[0] ? undef : ref $_[0] eq 'ARRAY' ? $_[0] : [$_[0]] }
+
+ sub _prefix_custom {
+ my $key = shift;
+ $key =~ s/^(?!x_) # Unless it already starts with x_
+ (?:x-?)? # Remove leading x- or x (if present)
+ /x_/ix; # and prepend x_
+ return $key;
+ }
+
+ sub _ucfirst_custom {
+ my $key = shift;
+ $key = ucfirst $key unless $key =~ /[A-Z]/;
+ return $key;
+ }
+
+ sub _no_prefix_ucfirst_custom {
+ my $key = shift;
+ $key =~ s/^x_//;
+ return _ucfirst_custom($key);
+ }
+
+ sub _change_meta_spec {
+ my ($element, undef, undef, $version) = @_;
+ return {
+ version => $version,
+ url => $known_specs{$version},
+ };
+ }
+
+ my @open_source = (
+ 'perl',
+ 'gpl',
+ 'apache',
+ 'artistic',
+ 'artistic_2',
+ 'lgpl',
+ 'bsd',
+ 'gpl',
+ 'mit',
+ 'mozilla',
+ 'open_source',
+ );
+
+ my %is_open_source = map {; $_ => 1 } @open_source;
+
+ my @valid_licenses_1 = (
+ @open_source,
+ 'unrestricted',
+ 'restrictive',
+ 'unknown',
+ );
+
+ my %license_map_1 = (
+ ( map { $_ => $_ } @valid_licenses_1 ),
+ artistic2 => 'artistic_2',
+ );
+
+ sub _license_1 {
+ my ($element) = @_;
+ return 'unknown' unless defined $element;
+ if ( $license_map_1{lc $element} ) {
+ return $license_map_1{lc $element};
+ }
+ else {
+ return 'unknown';
+ }
+ }
+
+ my @valid_licenses_2 = qw(
+ agpl_3
+ apache_1_1
+ apache_2_0
+ artistic_1
+ artistic_2
+ bsd
+ freebsd
+ gfdl_1_2
+ gfdl_1_3
+ gpl_1
+ gpl_2
+ gpl_3
+ lgpl_2_1
+ lgpl_3_0
+ mit
+ mozilla_1_0
+ mozilla_1_1
+ openssl
+ perl_5
+ qpl_1_0
+ ssleay
+ sun
+ zlib
+ open_source
+ restricted
+ unrestricted
+ unknown
+ );
+
+ # The "old" values were defined by Module::Build, and were often vague. I have
+ # made the decisions below based on reading Module::Build::API and how clearly
+ # it specifies the version of the license.
+ my %license_map_2 = (
+ (map { $_ => $_ } @valid_licenses_2),
+ apache => 'apache_2_0', # clearly stated as 2.0
+ artistic => 'artistic_1', # clearly stated as 1
+ artistic2 => 'artistic_2', # clearly stated as 2
+ gpl => 'open_source', # we don't know which GPL; punt
+ lgpl => 'open_source', # we don't know which LGPL; punt
+ mozilla => 'open_source', # we don't know which MPL; punt
+ perl => 'perl_5', # clearly Perl 5
+ restrictive => 'restricted',
+ );
+
+ sub _license_2 {
+ my ($element) = @_;
+ return [ 'unknown' ] unless defined $element;
+ $element = [ $element ] unless ref $element eq 'ARRAY';
+ my @new_list;
+ for my $lic ( @$element ) {
+ next unless defined $lic;
+ if ( my $new = $license_map_2{lc $lic} ) {
+ push @new_list, $new;
+ }
+ }
+ return @new_list ? \@new_list : [ 'unknown' ];
+ }
+
+ my %license_downgrade_map = qw(
+ agpl_3 open_source
+ apache_1_1 apache
+ apache_2_0 apache
+ artistic_1 artistic
+ artistic_2 artistic_2
+ bsd bsd
+ freebsd open_source
+ gfdl_1_2 open_source
+ gfdl_1_3 open_source
+ gpl_1 gpl
+ gpl_2 gpl
+ gpl_3 gpl
+ lgpl_2_1 lgpl
+ lgpl_3_0 lgpl
+ mit mit
+ mozilla_1_0 mozilla
+ mozilla_1_1 mozilla
+ openssl open_source
+ perl_5 perl
+ qpl_1_0 open_source
+ ssleay open_source
+ sun open_source
+ zlib open_source
+ open_source open_source
+ restricted restrictive
+ unrestricted unrestricted
+ unknown unknown
+ );
+
+ sub _downgrade_license {
+ my ($element) = @_;
+ if ( ! defined $element ) {
+ return "unknown";
+ }
+ elsif( ref $element eq 'ARRAY' ) {
+ if ( @$element > 1) {
+ if (grep { !$is_open_source{ $license_downgrade_map{lc $_} || 'unknown' } } @$element) {
+ return 'unknown';
+ }
+ else {
+ return 'open_source';
+ }
+ }
+ elsif ( @$element == 1 ) {
+ return $license_downgrade_map{lc $element->[0]} || "unknown";
+ }
+ }
+ elsif ( ! ref $element ) {
+ return $license_downgrade_map{lc $element} || "unknown";
+ }
+ return "unknown";
+ }
+
+ my $no_index_spec_1_2 = {
+ 'file' => \&_listify,
+ 'dir' => \&_listify,
+ 'package' => \&_listify,
+ 'namespace' => \&_listify,
+ };
+
+ my $no_index_spec_1_3 = {
+ 'file' => \&_listify,
+ 'directory' => \&_listify,
+ 'package' => \&_listify,
+ 'namespace' => \&_listify,
+ };
+
+ my $no_index_spec_2 = {
+ 'file' => \&_listify,
+ 'directory' => \&_listify,
+ 'package' => \&_listify,
+ 'namespace' => \&_listify,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _no_index_1_2 {
+ my (undef, undef, $meta) = @_;
+ my $no_index = $meta->{no_index} || $meta->{private};
+ return unless $no_index;
+
+ # cleanup wrong format
+ if ( ! ref $no_index ) {
+ my $item = $no_index;
+ $no_index = { dir => [ $item ], file => [ $item ] };
+ }
+ elsif ( ref $no_index eq 'ARRAY' ) {
+ my $list = $no_index;
+ $no_index = { dir => [ @$list ], file => [ @$list ] };
+ }
+
+ # common mistake: files -> file
+ if ( exists $no_index->{files} ) {
+ $no_index->{file} = delete $no_index->{file};
+ }
+ # common mistake: modules -> module
+ if ( exists $no_index->{modules} ) {
+ $no_index->{module} = delete $no_index->{module};
+ }
+ return _convert($no_index, $no_index_spec_1_2);
+ }
+
+ sub _no_index_directory {
+ my ($element, $key, $meta, $version) = @_;
+ return unless $element;
+
+ # cleanup wrong format
+ if ( ! ref $element ) {
+ my $item = $element;
+ $element = { directory => [ $item ], file => [ $item ] };
+ }
+ elsif ( ref $element eq 'ARRAY' ) {
+ my $list = $element;
+ $element = { directory => [ @$list ], file => [ @$list ] };
+ }
+
+ if ( exists $element->{dir} ) {
+ $element->{directory} = delete $element->{dir};
+ }
+ # common mistake: files -> file
+ if ( exists $element->{files} ) {
+ $element->{file} = delete $element->{file};
+ }
+ # common mistake: modules -> module
+ if ( exists $element->{modules} ) {
+ $element->{module} = delete $element->{module};
+ }
+ my $spec = $version == 2 ? $no_index_spec_2 : $no_index_spec_1_3;
+ return _convert($element, $spec);
+ }
+
+ sub _is_module_name {
+ my $mod = shift;
+ return unless defined $mod && length $mod;
+ return $mod =~ m{^[A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z0-9_]+)*$};
+ }
+
+ sub _clean_version {
+ my ($element) = @_;
+ return 0 if ! defined $element;
+
+ $element =~ s{^\s*}{};
+ $element =~ s{\s*$}{};
+ $element =~ s{^\.}{0.};
+
+ return 0 if ! length $element;
+ return 0 if ( $element eq 'undef' || $element eq '<undef>' );
+
+ my $v = eval { version->new($element) };
+ # XXX check defined $v and not just $v because version objects leak memory
+ # in boolean context -- dagolden, 2012-02-03
+ if ( defined $v ) {
+ return _is_qv($v) ? $v->normal : $element;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ sub _bad_version_hook {
+ my ($v) = @_;
+ $v =~ s{[a-z]+$}{}; # strip trailing alphabetics
+ my $vobj = eval { version->new($v) };
+ return defined($vobj) ? $vobj : version->new(0); # or give up
+ }
+
+ sub _version_map {
+ my ($element) = @_;
+ return unless defined $element;
+ if ( ref $element eq 'HASH' ) {
+ # XXX turn this into CPAN::Meta::Requirements with bad version hook
+ # and then turn it back into a hash
+ my $new_map = CPAN::Meta::Requirements->new(
+ { bad_version_hook => \&_bad_version_hook } # punt
+ );
+ while ( my ($k,$v) = each %$element ) {
+ next unless _is_module_name($k);
+ if ( !defined($v) || !length($v) || $v eq 'undef' || $v eq '<undef>' ) {
+ $v = 0;
+ }
+ # some weird, old META have bad yml with module => module
+ # so check if value is like a module name and not like a version
+ if ( _is_module_name($v) && ! version::is_lax($v) ) {
+ $new_map->add_minimum($k => 0);
+ $new_map->add_minimum($v => 0);
+ }
+ $new_map->add_string_requirement($k => $v);
+ }
+ return $new_map->as_string_hash;
+ }
+ elsif ( ref $element eq 'ARRAY' ) {
+ my $hashref = { map { $_ => 0 } @$element };
+ return _version_map($hashref); # cleanup any weird stuff
+ }
+ elsif ( ref $element eq '' && length $element ) {
+ return { $element => 0 }
+ }
+ return;
+ }
+
+ sub _prereqs_from_1 {
+ my (undef, undef, $meta) = @_;
+ my $prereqs = {};
+ for my $phase ( qw/build configure/ ) {
+ my $key = "${phase}_requires";
+ $prereqs->{$phase}{requires} = _version_map($meta->{$key})
+ if $meta->{$key};
+ }
+ for my $rel ( qw/requires recommends conflicts/ ) {
+ $prereqs->{runtime}{$rel} = _version_map($meta->{$rel})
+ if $meta->{$rel};
+ }
+ return $prereqs;
+ }
+
+ my $prereqs_spec = {
+ configure => \&_prereqs_rel,
+ build => \&_prereqs_rel,
+ test => \&_prereqs_rel,
+ runtime => \&_prereqs_rel,
+ develop => \&_prereqs_rel,
+ ':custom' => \&_prefix_custom,
+ };
+
+ my $relation_spec = {
+ requires => \&_version_map,
+ recommends => \&_version_map,
+ suggests => \&_version_map,
+ conflicts => \&_version_map,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _cleanup_prereqs {
+ my ($prereqs, $key, $meta, $to_version) = @_;
+ return unless $prereqs && ref $prereqs eq 'HASH';
+ return _convert( $prereqs, $prereqs_spec, $to_version );
+ }
+
+ sub _prereqs_rel {
+ my ($relation, $key, $meta, $to_version) = @_;
+ return unless $relation && ref $relation eq 'HASH';
+ return _convert( $relation, $relation_spec, $to_version );
+ }
+
+
+ BEGIN {
+ my @old_prereqs = qw(
+ requires
+ configure_requires
+ recommends
+ conflicts
+ );
+
+ for ( @old_prereqs ) {
+ my $sub = "_get_$_";
+ my ($phase,$type) = split qr/_/, $_;
+ if ( ! defined $type ) {
+ $type = $phase;
+ $phase = 'runtime';
+ }
+ no strict 'refs';
+ *{$sub} = sub { _extract_prereqs($_[2]->{prereqs},$phase,$type) };
+ }
+ }
+
+ sub _get_build_requires {
+ my ($data, $key, $meta) = @_;
+
+ my $test_h = _extract_prereqs($_[2]->{prereqs}, qw(test requires)) || {};
+ my $build_h = _extract_prereqs($_[2]->{prereqs}, qw(build requires)) || {};
+
+ my $test_req = CPAN::Meta::Requirements->from_string_hash($test_h);
+ my $build_req = CPAN::Meta::Requirements->from_string_hash($build_h);
+
+ $test_req->add_requirements($build_req)->as_string_hash;
+ }
+
+ sub _extract_prereqs {
+ my ($prereqs, $phase, $type) = @_;
+ return unless ref $prereqs eq 'HASH';
+ return scalar _version_map($prereqs->{$phase}{$type});
+ }
+
+ sub _downgrade_optional_features {
+ my (undef, undef, $meta) = @_;
+ return unless exists $meta->{optional_features};
+ my $origin = $meta->{optional_features};
+ my $features = {};
+ for my $name ( keys %$origin ) {
+ $features->{$name} = {
+ description => $origin->{$name}{description},
+ requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','requires'),
+ configure_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','configure_requires'),
+ build_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','build_requires'),
+ recommends => _extract_prereqs($origin->{$name}{prereqs},'runtime','recommends'),
+ conflicts => _extract_prereqs($origin->{$name}{prereqs},'runtime','conflicts'),
+ };
+ for my $k (keys %{$features->{$name}} ) {
+ delete $features->{$name}{$k} unless defined $features->{$name}{$k};
+ }
+ }
+ return $features;
+ }
+
+ sub _upgrade_optional_features {
+ my (undef, undef, $meta) = @_;
+ return unless exists $meta->{optional_features};
+ my $origin = $meta->{optional_features};
+ my $features = {};
+ for my $name ( keys %$origin ) {
+ $features->{$name} = {
+ description => $origin->{$name}{description},
+ prereqs => _prereqs_from_1(undef, undef, $origin->{$name}),
+ };
+ delete $features->{$name}{prereqs}{configure};
+ }
+ return $features;
+ }
+
+ my $optional_features_2_spec = {
+ description => \&_keep,
+ prereqs => \&_cleanup_prereqs,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _feature_2 {
+ my ($element, $key, $meta, $to_version) = @_;
+ return unless $element && ref $element eq 'HASH';
+ _convert( $element, $optional_features_2_spec, $to_version );
+ }
+
+ sub _cleanup_optional_features_2 {
+ my ($element, $key, $meta, $to_version) = @_;
+ return unless $element && ref $element eq 'HASH';
+ my $new_data = {};
+ for my $k ( keys %$element ) {
+ $new_data->{$k} = _feature_2( $element->{$k}, $k, $meta, $to_version );
+ }
+ return unless keys %$new_data;
+ return $new_data;
+ }
+
+ sub _optional_features_1_4 {
+ my ($element) = @_;
+ return unless $element;
+ $element = _optional_features_as_map($element);
+ for my $name ( keys %$element ) {
+ for my $drop ( qw/requires_packages requires_os excluded_os/ ) {
+ delete $element->{$name}{$drop};
+ }
+ }
+ return $element;
+ }
+
+ sub _optional_features_as_map {
+ my ($element) = @_;
+ return unless $element;
+ if ( ref $element eq 'ARRAY' ) {
+ my %map;
+ for my $feature ( @$element ) {
+ my (@parts) = %$feature;
+ $map{$parts[0]} = $parts[1];
+ }
+ $element = \%map;
+ }
+ return $element;
+ }
+
+ sub _is_urlish { defined $_[0] && $_[0] =~ m{\A[-+.a-z0-9]+:.+}i }
+
+ sub _url_or_drop {
+ my ($element) = @_;
+ return $element if _is_urlish($element);
+ return;
+ }
+
+ sub _url_list {
+ my ($element) = @_;
+ return unless $element;
+ $element = _listify( $element );
+ $element = [ grep { _is_urlish($_) } @$element ];
+ return unless @$element;
+ return $element;
+ }
+
+ sub _author_list {
+ my ($element) = @_;
+ return [ 'unknown' ] unless $element;
+ $element = _listify( $element );
+ $element = [ map { defined $_ && length $_ ? $_ : 'unknown' } @$element ];
+ return [ 'unknown' ] unless @$element;
+ return $element;
+ }
+
+ my $resource2_upgrade = {
+ license => sub { return _is_urlish($_[0]) ? _listify( $_[0] ) : undef },
+ homepage => \&_url_or_drop,
+ bugtracker => sub {
+ my ($item) = @_;
+ return unless $item;
+ if ( $item =~ m{^mailto:(.*)$} ) { return { mailto => $1 } }
+ elsif( _is_urlish($item) ) { return { web => $item } }
+ else { return }
+ },
+ repository => sub { return _is_urlish($_[0]) ? { url => $_[0] } : undef },
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _upgrade_resources_2 {
+ my (undef, undef, $meta, $version) = @_;
+ return unless exists $meta->{resources};
+ return _convert($meta->{resources}, $resource2_upgrade);
+ }
+
+ my $bugtracker2_spec = {
+ web => \&_url_or_drop,
+ mailto => \&_keep,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _repo_type {
+ my ($element, $key, $meta, $to_version) = @_;
+ return $element if defined $element;
+ return unless exists $meta->{url};
+ my $repo_url = $meta->{url};
+ for my $type ( qw/git svn/ ) {
+ return $type if $repo_url =~ m{\A$type};
+ }
+ return;
+ }
+
+ my $repository2_spec = {
+ web => \&_url_or_drop,
+ url => \&_url_or_drop,
+ type => \&_repo_type,
+ ':custom' => \&_prefix_custom,
+ };
+
+ my $resources2_cleanup = {
+ license => \&_url_list,
+ homepage => \&_url_or_drop,
+ bugtracker => sub { ref $_[0] ? _convert( $_[0], $bugtracker2_spec ) : undef },
+ repository => sub { my $data = shift; ref $data ? _convert( $data, $repository2_spec ) : undef },
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _cleanup_resources_2 {
+ my ($resources, $key, $meta, $to_version) = @_;
+ return unless $resources && ref $resources eq 'HASH';
+ return _convert($resources, $resources2_cleanup, $to_version);
+ }
+
+ my $resource1_spec = {
+ license => \&_url_or_drop,
+ homepage => \&_url_or_drop,
+ bugtracker => \&_url_or_drop,
+ repository => \&_url_or_drop,
+ ':custom' => \&_keep,
+ };
+
+ sub _resources_1_3 {
+ my (undef, undef, $meta, $version) = @_;
+ return unless exists $meta->{resources};
+ return _convert($meta->{resources}, $resource1_spec);
+ }
+
+ *_resources_1_4 = *_resources_1_3;
+
+ sub _resources_1_2 {
+ my (undef, undef, $meta) = @_;
+ my $resources = $meta->{resources} || {};
+ if ( $meta->{license_url} && ! $resources->{license} ) {
+ $resources->{license} = $meta->{license_url}
+ if _is_urlish($meta->{license_url});
+ }
+ return unless keys %$resources;
+ return _convert($resources, $resource1_spec);
+ }
+
+ my $resource_downgrade_spec = {
+ license => sub { return ref $_[0] ? $_[0]->[0] : $_[0] },
+ homepage => \&_url_or_drop,
+ bugtracker => sub { return $_[0]->{web} },
+ repository => sub { return $_[0]->{url} || $_[0]->{web} },
+ ':custom' => \&_no_prefix_ucfirst_custom,
+ };
+
+ sub _downgrade_resources {
+ my (undef, undef, $meta, $version) = @_;
+ return unless exists $meta->{resources};
+ return _convert($meta->{resources}, $resource_downgrade_spec);
+ }
+
+ sub _release_status {
+ my ($element, undef, $meta) = @_;
+ return $element if $element && $element =~ m{\A(?:stable|testing|unstable)\z};
+ return _release_status_from_version(undef, undef, $meta);
+ }
+
+ sub _release_status_from_version {
+ my (undef, undef, $meta) = @_;
+ my $version = $meta->{version} || '';
+ return ( $version =~ /_/ ) ? 'testing' : 'stable';
+ }
+
+ my $provides_spec = {
+ file => \&_keep,
+ version => \&_keep,
+ };
+
+ my $provides_spec_2 = {
+ file => \&_keep,
+ version => \&_keep,
+ ':custom' => \&_prefix_custom,
+ };
+
+ sub _provides {
+ my ($element, $key, $meta, $to_version) = @_;
+ return unless defined $element && ref $element eq 'HASH';
+ my $spec = $to_version == 2 ? $provides_spec_2 : $provides_spec;
+ my $new_data = {};
+ for my $k ( keys %$element ) {
+ $new_data->{$k} = _convert($element->{$k}, $spec, $to_version);
+ $new_data->{$k}{version} = _clean_version($element->{$k}{version})
+ if exists $element->{$k}{version};
+ }
+ return $new_data;
+ }
+
+ sub _convert {
+ my ($data, $spec, $to_version, $is_fragment) = @_;
+
+ my $new_data = {};
+ for my $key ( keys %$spec ) {
+ next if $key eq ':custom' || $key eq ':drop';
+ next unless my $fcn = $spec->{$key};
+ if ( $is_fragment && $key eq 'generated_by' ) {
+ $fcn = \&_keep;
+ }
+ die "spec for '$key' is not a coderef"
+ unless ref $fcn && ref $fcn eq 'CODE';
+ my $new_value = $fcn->($data->{$key}, $key, $data, $to_version);
+ $new_data->{$key} = $new_value if defined $new_value;
+ }
+
+ my $drop_list = $spec->{':drop'};
+ my $customizer = $spec->{':custom'} || \&_keep;
+
+ for my $key ( keys %$data ) {
+ next if $drop_list && grep { $key eq $_ } @$drop_list;
+ next if exists $spec->{$key}; # we handled it
+ $new_data->{ $customizer->($key) } = $data->{$key};
+ }
+
+ return $new_data;
+ }
+
+ #--------------------------------------------------------------------------#
+ # define converters for each conversion
+ #--------------------------------------------------------------------------#
+
+ # each converts from prior version
+ # special ":custom" field is used for keys not recognized in spec
+ my %up_convert = (
+ '2-from-1.4' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_2,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'dynamic_config' => \&_keep_or_one,
+ # ADDED MANDATORY
+ 'release_status' => \&_release_status_from_version,
+ # PRIOR OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_upgrade_optional_features,
+ 'provides' => \&_provides,
+ 'resources' => \&_upgrade_resources_2,
+ # ADDED OPTIONAL
+ 'description' => \&_keep,
+ 'prereqs' => \&_prereqs_from_1,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ build_requires
+ configure_requires
+ conflicts
+ distribution_type
+ license_url
+ private
+ recommends
+ requires
+ ) ],
+
+ # other random keys need x_ prefixing
+ ':custom' => \&_prefix_custom,
+ },
+ '1.4-from-1.3' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_1_4,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_4,
+ # ADDED OPTIONAL
+ 'configure_requires' => \&_keep,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ license_url
+ private
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.3-from-1.2' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ license_url
+ private
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.2-from-1.1' => {
+ # PRIOR MANDATORY
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'license' => \&_license_1,
+ 'name' => \&_keep,
+ 'generated_by' => \&_generated_by,
+ # ADDED MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'meta-spec' => \&_change_meta_spec,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_1_2,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'resources' => \&_resources_1_2,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ license_url
+ private
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.1-from-1.0' => {
+ # CHANGED TO MANDATORY
+ 'version' => \&_keep,
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'license_url' => \&_url_or_drop,
+ 'private' => \&_keep,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ );
+
+ my %down_convert = (
+ '1.4-from-2' => {
+ # MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_downgrade_license,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # OPTIONAL
+ 'build_requires' => \&_get_build_requires,
+ 'configure_requires' => \&_get_configure_requires,
+ 'conflicts' => \&_get_conflicts,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_downgrade_optional_features,
+ 'provides' => \&_provides,
+ 'recommends' => \&_get_recommends,
+ 'requires' => \&_get_requires,
+ 'resources' => \&_downgrade_resources,
+
+ # drop these unsupported fields (after conversion)
+ ':drop' => [ qw(
+ description
+ prereqs
+ release_status
+ )],
+
+ # custom keys will be left unchanged
+ ':custom' => \&_keep
+ },
+ '1.3-from-1.4' => {
+ # MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # drop these unsupported fields, but only after we convert
+ ':drop' => [ qw(
+ configure_requires
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ '1.2-from-1.3' => {
+ # MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_1_2,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ '1.1-from-1.2' => {
+ # MANDATORY
+ 'version' => \&_keep,
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ # OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'private' => \&_keep,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+
+ # drop unsupported fields
+ ':drop' => [ qw(
+ abstract
+ author
+ provides
+ no_index
+ keywords
+ resources
+ )],
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ '1.0-from-1.1' => {
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ );
+
+ my %cleanup = (
+ '2' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_2,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'dynamic_config' => \&_keep_or_one,
+ # ADDED MANDATORY
+ 'release_status' => \&_release_status,
+ # PRIOR OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_cleanup_optional_features_2,
+ 'provides' => \&_provides,
+ 'resources' => \&_cleanup_resources_2,
+ # ADDED OPTIONAL
+ 'description' => \&_keep,
+ 'prereqs' => \&_cleanup_prereqs,
+
+ # drop these deprecated fields, but only after we convert
+ ':drop' => [ qw(
+ build_requires
+ configure_requires
+ conflicts
+ distribution_type
+ license_url
+ private
+ recommends
+ requires
+ ) ],
+
+ # other random keys need x_ prefixing
+ ':custom' => \&_prefix_custom,
+ },
+ '1.4' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_1_4,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_4,
+ # ADDED OPTIONAL
+ 'configure_requires' => \&_keep,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.3' => {
+ # PRIOR MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'meta-spec' => \&_change_meta_spec,
+ 'name' => \&_keep,
+ 'version' => \&_keep,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_directory,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ 'resources' => \&_resources_1_3,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.2' => {
+ # PRIOR MANDATORY
+ 'version' => \&_keep,
+ # CHANGED TO MANDATORY
+ 'license' => \&_license_1,
+ 'name' => \&_keep,
+ 'generated_by' => \&_generated_by,
+ # ADDED MANDATORY
+ 'abstract' => \&_keep_or_unknown,
+ 'author' => \&_author_list,
+ 'meta-spec' => \&_change_meta_spec,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'keywords' => \&_keep,
+ 'no_index' => \&_no_index_1_2,
+ 'optional_features' => \&_optional_features_as_map,
+ 'provides' => \&_provides,
+ 'resources' => \&_resources_1_2,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.1' => {
+ # CHANGED TO MANDATORY
+ 'version' => \&_keep,
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ # PRIOR OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+ # ADDED OPTIONAL
+ 'license_url' => \&_url_or_drop,
+ 'private' => \&_keep,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep
+ },
+ '1.0' => {
+ # IMPLIED MANDATORY
+ 'name' => \&_keep,
+ 'meta-spec' => \&_change_meta_spec,
+ 'version' => \&_keep,
+ # IMPLIED OPTIONAL
+ 'build_requires' => \&_version_map,
+ 'conflicts' => \&_version_map,
+ 'distribution_type' => \&_keep,
+ 'dynamic_config' => \&_keep_or_one,
+ 'generated_by' => \&_generated_by,
+ 'license' => \&_license_1,
+ 'recommends' => \&_version_map,
+ 'requires' => \&_version_map,
+
+ # other random keys are OK if already valid
+ ':custom' => \&_keep,
+ },
+ );
+
+ # for a given field in a spec version, what fields will it feed
+ # into in the *latest* spec (i.e. v2); meta-spec omitted because
+ # we always expect a meta-spec to be generated
+ my %fragments_generate = (
+ '2' => {
+ 'abstract' => 'abstract',
+ 'author' => 'author',
+ 'generated_by' => 'generated_by',
+ 'license' => 'license',
+ 'name' => 'name',
+ 'version' => 'version',
+ 'dynamic_config' => 'dynamic_config',
+ 'release_status' => 'release_status',
+ 'keywords' => 'keywords',
+ 'no_index' => 'no_index',
+ 'optional_features' => 'optional_features',
+ 'provides' => 'provides',
+ 'resources' => 'resources',
+ 'description' => 'description',
+ 'prereqs' => 'prereqs',
+ },
+ '1.4' => {
+ 'abstract' => 'abstract',
+ 'author' => 'author',
+ 'generated_by' => 'generated_by',
+ 'license' => 'license',
+ 'name' => 'name',
+ 'version' => 'version',
+ 'build_requires' => 'prereqs',
+ 'conflicts' => 'prereqs',
+ 'distribution_type' => 'distribution_type',
+ 'dynamic_config' => 'dynamic_config',
+ 'keywords' => 'keywords',
+ 'no_index' => 'no_index',
+ 'optional_features' => 'optional_features',
+ 'provides' => 'provides',
+ 'recommends' => 'prereqs',
+ 'requires' => 'prereqs',
+ 'resources' => 'resources',
+ 'configure_requires' => 'prereqs',
+ },
+ );
+ # this is not quite true but will work well enough
+ # as 1.4 is a superset of earlier ones
+ $fragments_generate{$_} = $fragments_generate{'1.4'} for qw/1.3 1.2 1.1 1.0/;
+
+ #--------------------------------------------------------------------------#
+ # Code
+ #--------------------------------------------------------------------------#
+
+ #pod =method new
+ #pod
+ #pod my $cmc = CPAN::Meta::Converter->new( $struct );
+ #pod
+ #pod The constructor should be passed a valid metadata structure but invalid
+ #pod structures are accepted. If no meta-spec version is provided, version 1.0 will
+ #pod be assumed.
+ #pod
+ #pod Optionally, you can provide a C<default_version> argument after C<$struct>:
+ #pod
+ #pod my $cmc = CPAN::Meta::Converter->new( $struct, default_version => "1.4" );
+ #pod
+ #pod This is only needed when converting a metadata fragment that does not include a
+ #pod C<meta-spec> field.
+ #pod
+ #pod =cut
+
+ sub new {
+ my ($class,$data,%args) = @_;
+
+ # create an attributes hash
+ my $self = {
+ 'data' => $data,
+ 'spec' => _extract_spec_version($data, $args{default_version}),
+ };
+
+ # create the object
+ return bless $self, $class;
+ }
+
+ sub _extract_spec_version {
+ my ($data, $default) = @_;
+ my $spec = $data->{'meta-spec'};
+
+ # is meta-spec there and valid?
+ return( $default || "1.0" ) unless defined $spec && ref $spec eq 'HASH'; # before meta-spec?
+
+ # does the version key look like a valid version?
+ my $v = $spec->{version};
+ if ( defined $v && $v =~ /^\d+(?:\.\d+)?$/ ) {
+ return $v if defined $v && grep { $v eq $_ } keys %known_specs; # known spec
+ return $v+0 if defined $v && grep { $v == $_ } keys %known_specs; # 2.0 => 2
+ }
+
+ # otherwise, use heuristics: look for 1.x vs 2.0 fields
+ return "2" if exists $data->{prereqs};
+ return "1.4" if exists $data->{configure_requires};
+ return( $default || "1.2" ); # when meta-spec was first defined
+ }
+
+ #pod =method convert
+ #pod
+ #pod my $new_struct = $cmc->convert( version => "2" );
+ #pod
+ #pod Returns a new hash reference with the metadata converted to a different form.
+ #pod C<convert> will die if any conversion/standardization still results in an
+ #pod invalid structure.
+ #pod
+ #pod Valid parameters include:
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod C<version> -- Indicates the desired specification version (e.g. "1.0", "1.1" ... "1.4", "2").
+ #pod Defaults to the latest version of the CPAN Meta Spec.
+ #pod
+ #pod =back
+ #pod
+ #pod Conversion proceeds through each version in turn. For example, a version 1.2
+ #pod structure might be converted to 1.3 then 1.4 then finally to version 2. The
+ #pod conversion process attempts to clean-up simple errors and standardize data.
+ #pod For example, if C<author> is given as a scalar, it will converted to an array
+ #pod reference containing the item. (Converting a structure to its own version will
+ #pod also clean-up and standardize.)
+ #pod
+ #pod When data are cleaned and standardized, missing or invalid fields will be
+ #pod replaced with sensible defaults when possible. This may be lossy or imprecise.
+ #pod For example, some badly structured META.yml files on CPAN have prerequisite
+ #pod modules listed as both keys and values:
+ #pod
+ #pod requires => { 'Foo::Bar' => 'Bam::Baz' }
+ #pod
+ #pod These would be split and each converted to a prerequisite with a minimum
+ #pod version of zero.
+ #pod
+ #pod When some mandatory fields are missing or invalid, the conversion will attempt
+ #pod to provide a sensible default or will fill them with a value of 'unknown'. For
+ #pod example a missing or unrecognized C<license> field will result in a C<license>
+ #pod field of 'unknown'. Fields that may get an 'unknown' include:
+ #pod
+ #pod =for :list
+ #pod * abstract
+ #pod * author
+ #pod * license
+ #pod
+ #pod =cut
+
+ sub convert {
+ my ($self, %args) = @_;
+ my $args = { %args };
+
+ my $new_version = $args->{version} || $HIGHEST;
+ my $is_fragment = $args->{is_fragment};
+
+ my ($old_version) = $self->{spec};
+ my $converted = _dclone($self->{data});
+
+ if ( $old_version == $new_version ) {
+ $converted = _convert( $converted, $cleanup{$old_version}, $old_version, $is_fragment );
+ unless ( $args->{is_fragment} ) {
+ my $cmv = CPAN::Meta::Validator->new( $converted );
+ unless ( $cmv->is_valid ) {
+ my $errs = join("\n", $cmv->errors);
+ die "Failed to clean-up $old_version metadata. Errors:\n$errs\n";
+ }
+ }
+ return $converted;
+ }
+ elsif ( $old_version > $new_version ) {
+ my @vers = sort { $b <=> $a } keys %known_specs;
+ for my $i ( 0 .. $#vers-1 ) {
+ next if $vers[$i] > $old_version;
+ last if $vers[$i+1] < $new_version;
+ my $spec_string = "$vers[$i+1]-from-$vers[$i]";
+ $converted = _convert( $converted, $down_convert{$spec_string}, $vers[$i+1], $is_fragment );
+ unless ( $args->{is_fragment} ) {
+ my $cmv = CPAN::Meta::Validator->new( $converted );
+ unless ( $cmv->is_valid ) {
+ my $errs = join("\n", $cmv->errors);
+ die "Failed to downconvert metadata to $vers[$i+1]. Errors:\n$errs\n";
+ }
+ }
+ }
+ return $converted;
+ }
+ else {
+ my @vers = sort { $a <=> $b } keys %known_specs;
+ for my $i ( 0 .. $#vers-1 ) {
+ next if $vers[$i] < $old_version;
+ last if $vers[$i+1] > $new_version;
+ my $spec_string = "$vers[$i+1]-from-$vers[$i]";
+ $converted = _convert( $converted, $up_convert{$spec_string}, $vers[$i+1], $is_fragment );
+ unless ( $args->{is_fragment} ) {
+ my $cmv = CPAN::Meta::Validator->new( $converted );
+ unless ( $cmv->is_valid ) {
+ my $errs = join("\n", $cmv->errors);
+ die "Failed to upconvert metadata to $vers[$i+1]. Errors:\n$errs\n";
+ }
+ }
+ }
+ return $converted;
+ }
+ }
+
+ #pod =method upgrade_fragment
+ #pod
+ #pod my $new_struct = $cmc->upgrade_fragment;
+ #pod
+ #pod Returns a new hash reference with the metadata converted to the latest version
+ #pod of the CPAN Meta Spec. No validation is done on the result -- you must
+ #pod validate after merging fragments into a complete metadata document.
+ #pod
+ #pod =cut
+
+ sub upgrade_fragment {
+ my ($self) = @_;
+ my ($old_version) = $self->{spec};
+ my %expected =
+ map {; $_ => 1 }
+ grep { defined }
+ map { $fragments_generate{$old_version}{$_} }
+ keys %{ $self->{data} };
+ my $converted = $self->convert( version => $HIGHEST, is_fragment => 1 );
+ for my $key ( keys %$converted ) {
+ next if $key =~ /^x_/i || $key eq 'meta-spec';
+ delete $converted->{$key} unless $expected{$key};
+ }
+ return $converted;
+ }
+
+ 1;
+
+ # ABSTRACT: Convert CPAN distribution metadata structures
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Converter - Convert CPAN distribution metadata structures
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 SYNOPSIS
+
+ my $struct = decode_json_file('META.json');
+
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+
+ my $new_struct = $cmc->convert( version => "2" );
+
+ =head1 DESCRIPTION
+
+ This module converts CPAN Meta structures from one form to another. The
+ primary use is to convert older structures to the most modern version of
+ the specification, but other transformations may be implemented in the
+ future as needed. (E.g. stripping all custom fields or stripping all
+ optional fields.)
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $cmc = CPAN::Meta::Converter->new( $struct );
+
+ The constructor should be passed a valid metadata structure but invalid
+ structures are accepted. If no meta-spec version is provided, version 1.0 will
+ be assumed.
+
+ Optionally, you can provide a C<default_version> argument after C<$struct>:
+
+ my $cmc = CPAN::Meta::Converter->new( $struct, default_version => "1.4" );
+
+ This is only needed when converting a metadata fragment that does not include a
+ C<meta-spec> field.
+
+ =head2 convert
+
+ my $new_struct = $cmc->convert( version => "2" );
+
+ Returns a new hash reference with the metadata converted to a different form.
+ C<convert> will die if any conversion/standardization still results in an
+ invalid structure.
+
+ Valid parameters include:
+
+ =over
+
+ =item *
+
+ C<version> -- Indicates the desired specification version (e.g. "1.0", "1.1" ... "1.4", "2").
+ Defaults to the latest version of the CPAN Meta Spec.
+
+ =back
+
+ Conversion proceeds through each version in turn. For example, a version 1.2
+ structure might be converted to 1.3 then 1.4 then finally to version 2. The
+ conversion process attempts to clean-up simple errors and standardize data.
+ For example, if C<author> is given as a scalar, it will converted to an array
+ reference containing the item. (Converting a structure to its own version will
+ also clean-up and standardize.)
+
+ When data are cleaned and standardized, missing or invalid fields will be
+ replaced with sensible defaults when possible. This may be lossy or imprecise.
+ For example, some badly structured META.yml files on CPAN have prerequisite
+ modules listed as both keys and values:
+
+ requires => { 'Foo::Bar' => 'Bam::Baz' }
+
+ These would be split and each converted to a prerequisite with a minimum
+ version of zero.
+
+ When some mandatory fields are missing or invalid, the conversion will attempt
+ to provide a sensible default or will fill them with a value of 'unknown'. For
+ example a missing or unrecognized C<license> field will result in a C<license>
+ field of 'unknown'. Fields that may get an 'unknown' include:
+
+ =over 4
+
+ =item *
+
+ abstract
+
+ =item *
+
+ author
+
+ =item *
+
+ license
+
+ =back
+
+ =head2 upgrade_fragment
+
+ my $new_struct = $cmc->upgrade_fragment;
+
+ Returns a new hash reference with the metadata converted to the latest version
+ of the CPAN Meta Spec. No validation is done on the result -- you must
+ validate after merging fragments into a complete metadata document.
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # vim: ts=2 sts=2 sw=2 et:
+CPAN_META_CONVERTER
+
+$fatpacked{"CPAN/Meta/Feature.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_FEATURE';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Feature;
+ # VERSION
+ $CPAN::Meta::Feature::VERSION = '2.143240';
+ use CPAN::Meta::Prereqs;
+
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod A CPAN::Meta::Feature object describes an optional feature offered by a CPAN
+ #pod distribution and specified in the distribution's F<META.json> (or F<META.yml>)
+ #pod file.
+ #pod
+ #pod For the most part, this class will only be used when operating on the result of
+ #pod the C<feature> or C<features> methods on a L<CPAN::Meta> object.
+ #pod
+ #pod =method new
+ #pod
+ #pod my $feature = CPAN::Meta::Feature->new( $identifier => \%spec );
+ #pod
+ #pod This returns a new Feature object. The C<%spec> argument to the constructor
+ #pod should be the same as the value of the C<optional_feature> entry in the
+ #pod distmeta. It must contain entries for C<description> and C<prereqs>.
+ #pod
+ #pod =cut
+
+ sub new {
+ my ($class, $identifier, $spec) = @_;
+
+ my %guts = (
+ identifier => $identifier,
+ description => $spec->{description},
+ prereqs => CPAN::Meta::Prereqs->new($spec->{prereqs}),
+ );
+
+ bless \%guts => $class;
+ }
+
+ #pod =method identifier
+ #pod
+ #pod This method returns the feature's identifier.
+ #pod
+ #pod =cut
+
+ sub identifier { $_[0]{identifier} }
+
+ #pod =method description
+ #pod
+ #pod This method returns the feature's long description.
+ #pod
+ #pod =cut
+
+ sub description { $_[0]{description} }
+
+ #pod =method prereqs
+ #pod
+ #pod This method returns the feature's prerequisites as a L<CPAN::Meta::Prereqs>
+ #pod object.
+ #pod
+ #pod =cut
+
+ sub prereqs { $_[0]{prereqs} }
+
+ 1;
+
+ # ABSTRACT: an optional feature provided by a CPAN distribution
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Feature - an optional feature provided by a CPAN distribution
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 DESCRIPTION
+
+ A CPAN::Meta::Feature object describes an optional feature offered by a CPAN
+ distribution and specified in the distribution's F<META.json> (or F<META.yml>)
+ file.
+
+ For the most part, this class will only be used when operating on the result of
+ the C<feature> or C<features> methods on a L<CPAN::Meta> object.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $feature = CPAN::Meta::Feature->new( $identifier => \%spec );
+
+ This returns a new Feature object. The C<%spec> argument to the constructor
+ should be the same as the value of the C<optional_feature> entry in the
+ distmeta. It must contain entries for C<description> and C<prereqs>.
+
+ =head2 identifier
+
+ This method returns the feature's identifier.
+
+ =head2 description
+
+ This method returns the feature's long description.
+
+ =head2 prereqs
+
+ This method returns the feature's prerequisites as a L<CPAN::Meta::Prereqs>
+ object.
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_FEATURE
+
+$fatpacked{"CPAN/Meta/History.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_HISTORY';
+ # vi:tw=72
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::History;
+ # VERSION
+ $CPAN::Meta::History::VERSION = '2.143240';
+ 1;
+
+ # ABSTRACT: history of CPAN Meta Spec changes
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::History - history of CPAN Meta Spec changes
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 DESCRIPTION
+
+ The CPAN Meta Spec has gone through several iterations. It was
+ originally written in HTML and later revised into POD (though published
+ in HTML generated from the POD). Fields were added, removed or changed,
+ sometimes by design and sometimes to reflect real-world usage after the
+ fact.
+
+ This document reconstructs the history of the CPAN Meta Spec based on
+ change logs, repository commit messages and the published HTML files.
+ In some cases, particularly prior to version 1.2, the exact version
+ when certain fields were introduced or changed is inconsistent between
+ sources. When in doubt, the published HTML files for versions 1.0 to
+ 1.4 as they existed when version 2 was developed are used as the
+ definitive source.
+
+ Starting with version 2, the specification document is part of the
+ CPAN-Meta distribution and will be published on CPAN as
+ L<CPAN::Meta::Spec>.
+
+ Going forward, specification version numbers will be integers and
+ decimal portions will correspond to a release date for the CPAN::Meta
+ library.
+
+ =head1 HISTORY
+
+ =head2 Version 2
+
+ April 2010
+
+ =over
+
+ =item *
+
+ Revised spec examples as perl data structures rather than YAML
+
+ =item *
+
+ Switched to JSON serialization from YAML
+
+ =item *
+
+ Specified allowed version number formats
+
+ =item *
+
+ Replaced 'requires', 'build_requires', 'configure_requires',
+ 'recommends' and 'conflicts' with new 'prereqs' data structure divided
+ by I<phase> (configure, build, test, runtime, etc.) and I<relationship>
+ (requires, recommends, suggests, conflicts)
+
+ =item *
+
+ Added support for 'develop' phase for requirements for maintaining
+ a list of authoring tools
+
+ =item *
+
+ Changed 'license' to a list and revised the set of valid licenses
+
+ =item *
+
+ Made 'dynamic_config' mandatory to reduce confusion
+
+ =item *
+
+ Changed 'resources' subkey 'repository' to a hash that clarifies
+ repository type, url for browsing and url for checkout
+
+ =item *
+
+ Changed 'resources' subkey 'bugtracker' to a hash for either web
+ or mailto resource
+
+ =item *
+
+ Changed specification of 'optional_features':
+
+ =over
+
+ =item *
+
+ Added formal specification and usage guide instead of just example
+
+ =item *
+
+ Changed to use new prereqs data structure instead of individual keys
+
+ =back
+
+ =item *
+
+ Clarified intended use of 'author' as generalized contact list
+
+ =item *
+
+ Added 'release_status' field to indicate stable, testing or unstable
+ status to provide hints to indexers
+
+ =item *
+
+ Added 'description' field for a longer description of the distribution
+
+ =item *
+
+ Formalized use of "x_" or "X_" for all custom keys not listed in the
+ official spec
+
+ =back
+
+ =head2 Version 1.4
+
+ June 2008
+
+ =over
+
+ =item *
+
+ Noted explicit support for 'perl' in prerequisites
+
+ =item *
+
+ Added 'configure_requires' prerequisite type
+
+ =item *
+
+ Changed 'optional_features'
+
+ =over
+
+ =item *
+
+ Example corrected to show map of maps instead of list of maps
+ (though descriptive text said 'map' even in v1.3)
+
+ =item *
+
+ Removed 'requires_packages', 'requires_os' and 'excluded_os'
+ as valid subkeys
+
+ =back
+
+ =back
+
+ =head2 Version 1.3
+
+ November 2006
+
+ =over
+
+ =item *
+
+ Added 'no_index' subkey 'directory' and removed 'dir' to match actual
+ usage in the wild
+
+ =item *
+
+ Added a 'repository' subkey to 'resources'
+
+ =back
+
+ =head2 Version 1.2
+
+ August 2005
+
+ =over
+
+ =item *
+
+ Re-wrote and restructured spec in POD syntax
+
+ =item *
+
+ Changed 'name' to be mandatory
+
+ =item *
+
+ Changed 'generated_by' to be mandatory
+
+ =item *
+
+ Changed 'license' to be mandatory
+
+ =item *
+
+ Added version range specifications for prerequisites
+
+ =item *
+
+ Added required 'abstract' field
+
+ =item *
+
+ Added required 'author' field
+
+ =item *
+
+ Added required 'meta-spec' field to define 'version' (and 'url') of the
+ CPAN Meta Spec used for metadata
+
+ =item *
+
+ Added 'provides' field
+
+ =item *
+
+ Added 'no_index' field and deprecated 'private' field. 'no_index'
+ subkeys include 'file', 'dir', 'package' and 'namespace'
+
+ =item *
+
+ Added 'keywords' field
+
+ =item *
+
+ Added 'resources' field with subkeys 'homepage', 'license', and
+ 'bugtracker'
+
+ =item *
+
+ Added 'optional_features' field as an alternate under 'recommends'.
+ Includes 'description', 'requires', 'build_requires', 'conflicts',
+ 'requires_packages', 'requires_os' and 'excluded_os' as valid subkeys
+
+ =item *
+
+ Removed 'license_uri' field
+
+ =back
+
+ =head2 Version 1.1
+
+ May 2003
+
+ =over
+
+ =item *
+
+ Changed 'version' to be mandatory
+
+ =item *
+
+ Added 'private' field
+
+ =item *
+
+ Added 'license_uri' field
+
+ =back
+
+ =head2 Version 1.0
+
+ March 2003
+
+ =over
+
+ =item *
+
+ Original release (in HTML format only)
+
+ =item *
+
+ Included 'name', 'version', 'license', 'distribution_type', 'requires',
+ 'recommends', 'build_requires', 'conflicts', 'dynamic_config',
+ 'generated_by'
+
+ =back
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_HISTORY
+
+$fatpacked{"CPAN/Meta/Merge.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_MERGE';
+ use strict;
+ use warnings;
+
+ package CPAN::Meta::Merge;
+ # VERSION
+ $CPAN::Meta::Merge::VERSION = '2.143240';
+ use Carp qw/croak/;
+ use Scalar::Util qw/blessed/;
+ use CPAN::Meta::Converter;
+
+ sub _identical {
+ my ($left, $right, $path) = @_;
+ croak sprintf "Can't merge attribute %s: '%s' does not equal '%s'", join('.', @{$path}), $left, $right unless $left eq $right;
+ return $left;
+ }
+
+ sub _merge {
+ my ($current, $next, $mergers, $path) = @_;
+ for my $key (keys %{$next}) {
+ if (not exists $current->{$key}) {
+ $current->{$key} = $next->{$key};
+ }
+ elsif (my $merger = $mergers->{$key}) {
+ $current->{$key} = $merger->($current->{$key}, $next->{$key}, [ @{$path}, $key ]);
+ }
+ elsif ($merger = $mergers->{':default'}) {
+ $current->{$key} = $merger->($current->{$key}, $next->{$key}, [ @{$path}, $key ]);
+ }
+ else {
+ croak sprintf "Can't merge unknown attribute '%s'", join '.', @{$path}, $key;
+ }
+ }
+ return $current;
+ }
+
+ sub _uniq {
+ my %seen = ();
+ return grep { not $seen{$_}++ } @_;
+ }
+
+ sub _set_addition {
+ my ($left, $right) = @_;
+ return [ +_uniq(@{$left}, @{$right}) ];
+ }
+
+ sub _uniq_map {
+ my ($left, $right, $path) = @_;
+ for my $key (keys %{$right}) {
+ if (not exists $left->{$key}) {
+ $left->{$key} = $right->{$key};
+ }
+ else {
+ croak 'Duplication of element ' . join '.', @{$path}, $key;
+ }
+ }
+ return $left;
+ }
+
+ sub _improvize {
+ my ($left, $right, $path) = @_;
+ my ($name) = reverse @{$path};
+ if ($name =~ /^x_/) {
+ if (ref($left) eq 'ARRAY') {
+ return _set_addition($left, $right, $path);
+ }
+ elsif (ref($left) eq 'HASH') {
+ return _uniq_map($left, $right, $path);
+ }
+ else {
+ return _identical($left, $right, $path);
+ }
+ }
+ croak sprintf "Can't merge '%s'", join '.', @{$path};
+ }
+
+ sub _optional_features {
+ my ($left, $right, $path) = @_;
+
+ for my $key (keys %{$right}) {
+ if (not exists $left->{$key}) {
+ $left->{$key} = $right->{$key};
+ }
+ else {
+ for my $subkey (keys %{ $right->{$key} }) {
+ next if $subkey eq 'prereqs';
+ if (not exists $left->{$key}{$subkey}) {
+ $left->{$key}{$subkey} = $right->{$key}{$subkey};
+ }
+ else {
+ Carp::croak "Cannot merge two optional_features named '$key' with different '$subkey' values"
+ if do { no warnings 'uninitialized'; $left->{$key}{$subkey} ne $right->{$key}{$subkey} };
+ }
+ }
+
+ require CPAN::Meta::Prereqs;
+ $left->{$key}{prereqs} =
+ CPAN::Meta::Prereqs->new($left->{$key}{prereqs})
+ ->with_merged_prereqs(CPAN::Meta::Prereqs->new($right->{$key}{prereqs}))
+ ->as_string_hash;
+ }
+ }
+ return $left;
+ }
+
+
+ my %default = (
+ abstract => \&_identical,
+ author => \&_set_addition,
+ dynamic_config => sub {
+ my ($left, $right) = @_;
+ return $left || $right;
+ },
+ generated_by => sub {
+ my ($left, $right) = @_;
+ return join ', ', _uniq(split(/, /, $left), split(/, /, $right));
+ },
+ license => \&_set_addition,
+ 'meta-spec' => {
+ version => \&_identical,
+ url => \&_identical
+ },
+ name => \&_identical,
+ release_status => \&_identical,
+ version => \&_identical,
+ description => \&_identical,
+ keywords => \&_set_addition,
+ no_index => { map { ($_ => \&_set_addition) } qw/file directory package namespace/ },
+ optional_features => \&_optional_features,
+ prereqs => sub {
+ require CPAN::Meta::Prereqs;
+ my ($left, $right) = map { CPAN::Meta::Prereqs->new($_) } @_[0,1];
+ return $left->with_merged_prereqs($right)->as_string_hash;
+ },
+ provides => \&_uniq_map,
+ resources => {
+ license => \&_set_addition,
+ homepage => \&_identical,
+ bugtracker => \&_uniq_map,
+ repository => \&_uniq_map,
+ ':default' => \&_improvize,
+ },
+ ':default' => \&_improvize,
+ );
+
+ sub new {
+ my ($class, %arguments) = @_;
+ croak 'default version required' if not exists $arguments{default_version};
+ my %mapping = %default;
+ my %extra = %{ $arguments{extra_mappings} || {} };
+ for my $key (keys %extra) {
+ if (ref($mapping{$key}) eq 'HASH') {
+ $mapping{$key} = { %{ $mapping{$key} }, %{ $extra{$key} } };
+ }
+ else {
+ $mapping{$key} = $extra{$key};
+ }
+ }
+ return bless {
+ default_version => $arguments{default_version},
+ mapping => _coerce_mapping(\%mapping, []),
+ }, $class;
+ }
+
+ my %coderef_for = (
+ set_addition => \&_set_addition,
+ uniq_map => \&_uniq_map,
+ identical => \&_identical,
+ improvize => \&_improvize,
+ );
+
+ sub _coerce_mapping {
+ my ($orig, $map_path) = @_;
+ my %ret;
+ for my $key (keys %{$orig}) {
+ my $value = $orig->{$key};
+ if (ref($orig->{$key}) eq 'CODE') {
+ $ret{$key} = $value;
+ }
+ elsif (ref($value) eq 'HASH') {
+ my $mapping = _coerce_mapping($value, [ @{$map_path}, $key ]);
+ $ret{$key} = sub {
+ my ($left, $right, $path) = @_;
+ return _merge($left, $right, $mapping, [ @{$path} ]);
+ };
+ }
+ elsif ($coderef_for{$value}) {
+ $ret{$key} = $coderef_for{$value};
+ }
+ else {
+ croak "Don't know what to do with " . join '.', @{$map_path}, $key;
+ }
+ }
+ return \%ret;
+ }
+
+ sub merge {
+ my ($self, @items) = @_;
+ my $current = {};
+ for my $next (@items) {
+ if ( blessed($next) && $next->isa('CPAN::Meta') ) {
+ $next = $next->as_struct;
+ }
+ elsif ( ref($next) eq 'HASH' ) {
+ my $cmc = CPAN::Meta::Converter->new(
+ $next, default_version => $self->{default_version}
+ );
+ $next = $cmc->upgrade_fragment;
+ }
+ else {
+ croak "Don't know how to merge '$next'";
+ }
+ $current = _merge($current, $next, $self->{mapping}, []);
+ }
+ return $current;
+ }
+
+ 1;
+
+ # ABSTRACT: Merging CPAN Meta fragments
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Merge - Merging CPAN Meta fragments
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 SYNOPSIS
+
+ my $merger = CPAN::Meta::Merge->new(default_version => "2");
+ my $meta = $merger->merge($base, @additional);
+
+ =head1 DESCRIPTION
+
+ =head1 METHODS
+
+ =head2 new
+
+ This creates a CPAN::Meta::Merge object. It takes one mandatory named
+ argument, C<version>, declaring the version of the meta-spec that must be
+ used for the merge. It can optionally take an C<extra_mappings> argument
+ that allows one to add additional merging functions for specific elements.
+
+ =head2 merge(@fragments)
+
+ Merge all C<@fragments> together. It will accept both CPAN::Meta objects and
+ (possibly incomplete) hashrefs of metadata.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_MERGE
+
+$fatpacked{"CPAN/Meta/Prereqs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_PREREQS';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Prereqs;
+ # VERSION
+ $CPAN::Meta::Prereqs::VERSION = '2.143240';
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod A CPAN::Meta::Prereqs object represents the prerequisites for a CPAN
+ #pod distribution or one of its optional features. Each set of prereqs is
+ #pod organized by phase and type, as described in L<CPAN::Meta::Prereqs>.
+ #pod
+ #pod =cut
+
+ use Carp qw(confess);
+ use Scalar::Util qw(blessed);
+ use CPAN::Meta::Requirements 2.121;
+
+ #pod =method new
+ #pod
+ #pod my $prereq = CPAN::Meta::Prereqs->new( \%prereq_spec );
+ #pod
+ #pod This method returns a new set of Prereqs. The input should look like the
+ #pod contents of the C<prereqs> field described in L<CPAN::Meta::Spec>, meaning
+ #pod something more or less like this:
+ #pod
+ #pod my $prereq = CPAN::Meta::Prereqs->new({
+ #pod runtime => {
+ #pod requires => {
+ #pod 'Some::Module' => '1.234',
+ #pod ...,
+ #pod },
+ #pod ...,
+ #pod },
+ #pod ...,
+ #pod });
+ #pod
+ #pod You can also construct an empty set of prereqs with:
+ #pod
+ #pod my $prereqs = CPAN::Meta::Prereqs->new;
+ #pod
+ #pod This empty set of prereqs is useful for accumulating new prereqs before finally
+ #pod dumping the whole set into a structure or string.
+ #pod
+ #pod =cut
+
+ sub __legal_phases { qw(configure build test runtime develop) }
+ sub __legal_types { qw(requires recommends suggests conflicts) }
+
+ # expect a prereq spec from META.json -- rjbs, 2010-04-11
+ sub new {
+ my ($class, $prereq_spec) = @_;
+ $prereq_spec ||= {};
+
+ my %is_legal_phase = map {; $_ => 1 } $class->__legal_phases;
+ my %is_legal_type = map {; $_ => 1 } $class->__legal_types;
+
+ my %guts;
+ PHASE: for my $phase (keys %$prereq_spec) {
+ next PHASE unless $phase =~ /\Ax_/i or $is_legal_phase{$phase};
+
+ my $phase_spec = $prereq_spec->{ $phase };
+ next PHASE unless keys %$phase_spec;
+
+ TYPE: for my $type (keys %$phase_spec) {
+ next TYPE unless $type =~ /\Ax_/i or $is_legal_type{$type};
+
+ my $spec = $phase_spec->{ $type };
+
+ next TYPE unless keys %$spec;
+
+ $guts{prereqs}{$phase}{$type} = CPAN::Meta::Requirements->from_string_hash(
+ $spec
+ );
+ }
+ }
+
+ return bless \%guts => $class;
+ }
+
+ #pod =method requirements_for
+ #pod
+ #pod my $requirements = $prereqs->requirements_for( $phase, $type );
+ #pod
+ #pod This method returns a L<CPAN::Meta::Requirements> object for the given
+ #pod phase/type combination. If no prerequisites are registered for that
+ #pod combination, a new CPAN::Meta::Requirements object will be returned, and it may
+ #pod be added to as needed.
+ #pod
+ #pod If C<$phase> or C<$type> are undefined or otherwise invalid, an exception will
+ #pod be raised.
+ #pod
+ #pod =cut
+
+ sub requirements_for {
+ my ($self, $phase, $type) = @_;
+
+ confess "requirements_for called without phase" unless defined $phase;
+ confess "requirements_for called without type" unless defined $type;
+
+ unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) {
+ confess "requested requirements for unknown phase: $phase";
+ }
+
+ unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) {
+ confess "requested requirements for unknown type: $type";
+ }
+
+ my $req = ($self->{prereqs}{$phase}{$type} ||= CPAN::Meta::Requirements->new);
+
+ $req->finalize if $self->is_finalized;
+
+ return $req;
+ }
+
+ #pod =method with_merged_prereqs
+ #pod
+ #pod my $new_prereqs = $prereqs->with_merged_prereqs( $other_prereqs );
+ #pod
+ #pod my $new_prereqs = $prereqs->with_merged_prereqs( \@other_prereqs );
+ #pod
+ #pod This method returns a new CPAN::Meta::Prereqs objects in which all the
+ #pod other prerequisites given are merged into the current set. This is primarily
+ #pod provided for combining a distribution's core prereqs with the prereqs of one of
+ #pod its optional features.
+ #pod
+ #pod The new prereqs object has no ties to the originals, and altering it further
+ #pod will not alter them.
+ #pod
+ #pod =cut
+
+ sub with_merged_prereqs {
+ my ($self, $other) = @_;
+
+ my @other = blessed($other) ? $other : @$other;
+
+ my @prereq_objs = ($self, @other);
+
+ my %new_arg;
+
+ for my $phase ($self->__legal_phases) {
+ for my $type ($self->__legal_types) {
+ my $req = CPAN::Meta::Requirements->new;
+
+ for my $prereq (@prereq_objs) {
+ my $this_req = $prereq->requirements_for($phase, $type);
+ next unless $this_req->required_modules;
+
+ $req->add_requirements($this_req);
+ }
+
+ next unless $req->required_modules;
+
+ $new_arg{ $phase }{ $type } = $req->as_string_hash;
+ }
+ }
+
+ return (ref $self)->new(\%new_arg);
+ }
+
+ #pod =method merged_requirements
+ #pod
+ #pod my $new_reqs = $prereqs->merged_requirements( \@phases, \@types );
+ #pod my $new_reqs = $prereqs->merged_requirements( \@phases );
+ #pod my $new_reqs = $preerqs->merged_requirements();
+ #pod
+ #pod This method joins together all requirements across a number of phases
+ #pod and types into a new L<CPAN::Meta::Requirements> object. If arguments
+ #pod are omitted, it defaults to "runtime", "build" and "test" for phases
+ #pod and "requires" and "recommends" for types.
+ #pod
+ #pod =cut
+
+ sub merged_requirements {
+ my ($self, $phases, $types) = @_;
+ $phases = [qw/runtime build test/] unless defined $phases;
+ $types = [qw/requires recommends/] unless defined $types;
+
+ confess "merged_requirements phases argument must be an arrayref"
+ unless ref $phases eq 'ARRAY';
+ confess "merged_requirements types argument must be an arrayref"
+ unless ref $types eq 'ARRAY';
+
+ my $req = CPAN::Meta::Requirements->new;
+
+ for my $phase ( @$phases ) {
+ unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) {
+ confess "requested requirements for unknown phase: $phase";
+ }
+ for my $type ( @$types ) {
+ unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) {
+ confess "requested requirements for unknown type: $type";
+ }
+ $req->add_requirements( $self->requirements_for($phase, $type) );
+ }
+ }
+
+ $req->finalize if $self->is_finalized;
+
+ return $req;
+ }
+
+
+ #pod =method as_string_hash
+ #pod
+ #pod This method returns a hashref containing structures suitable for dumping into a
+ #pod distmeta data structure. It is made up of hashes and strings, only; there will
+ #pod be no Prereqs, CPAN::Meta::Requirements, or C<version> objects inside it.
+ #pod
+ #pod =cut
+
+ sub as_string_hash {
+ my ($self) = @_;
+
+ my %hash;
+
+ for my $phase ($self->__legal_phases) {
+ for my $type ($self->__legal_types) {
+ my $req = $self->requirements_for($phase, $type);
+ next unless $req->required_modules;
+
+ $hash{ $phase }{ $type } = $req->as_string_hash;
+ }
+ }
+
+ return \%hash;
+ }
+
+ #pod =method is_finalized
+ #pod
+ #pod This method returns true if the set of prereqs has been marked "finalized," and
+ #pod cannot be altered.
+ #pod
+ #pod =cut
+
+ sub is_finalized { $_[0]{finalized} }
+
+ #pod =method finalize
+ #pod
+ #pod Calling C<finalize> on a Prereqs object will close it for further modification.
+ #pod Attempting to make any changes that would actually alter the prereqs will
+ #pod result in an exception being thrown.
+ #pod
+ #pod =cut
+
+ sub finalize {
+ my ($self) = @_;
+
+ $self->{finalized} = 1;
+
+ for my $phase (keys %{ $self->{prereqs} }) {
+ $_->finalize for values %{ $self->{prereqs}{$phase} };
+ }
+ }
+
+ #pod =method clone
+ #pod
+ #pod my $cloned_prereqs = $prereqs->clone;
+ #pod
+ #pod This method returns a Prereqs object that is identical to the original object,
+ #pod but can be altered without affecting the original object. Finalization does
+ #pod not survive cloning, meaning that you may clone a finalized set of prereqs and
+ #pod then modify the clone.
+ #pod
+ #pod =cut
+
+ sub clone {
+ my ($self) = @_;
+
+ my $clone = (ref $self)->new( $self->as_string_hash );
+ }
+
+ 1;
+
+ # ABSTRACT: a set of distribution prerequisites by phase and type
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Prereqs - a set of distribution prerequisites by phase and type
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 DESCRIPTION
+
+ A CPAN::Meta::Prereqs object represents the prerequisites for a CPAN
+ distribution or one of its optional features. Each set of prereqs is
+ organized by phase and type, as described in L<CPAN::Meta::Prereqs>.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $prereq = CPAN::Meta::Prereqs->new( \%prereq_spec );
+
+ This method returns a new set of Prereqs. The input should look like the
+ contents of the C<prereqs> field described in L<CPAN::Meta::Spec>, meaning
+ something more or less like this:
+
+ my $prereq = CPAN::Meta::Prereqs->new({
+ runtime => {
+ requires => {
+ 'Some::Module' => '1.234',
+ ...,
+ },
+ ...,
+ },
+ ...,
+ });
+
+ You can also construct an empty set of prereqs with:
+
+ my $prereqs = CPAN::Meta::Prereqs->new;
+
+ This empty set of prereqs is useful for accumulating new prereqs before finally
+ dumping the whole set into a structure or string.
+
+ =head2 requirements_for
+
+ my $requirements = $prereqs->requirements_for( $phase, $type );
+
+ This method returns a L<CPAN::Meta::Requirements> object for the given
+ phase/type combination. If no prerequisites are registered for that
+ combination, a new CPAN::Meta::Requirements object will be returned, and it may
+ be added to as needed.
+
+ If C<$phase> or C<$type> are undefined or otherwise invalid, an exception will
+ be raised.
+
+ =head2 with_merged_prereqs
+
+ my $new_prereqs = $prereqs->with_merged_prereqs( $other_prereqs );
+
+ my $new_prereqs = $prereqs->with_merged_prereqs( \@other_prereqs );
+
+ This method returns a new CPAN::Meta::Prereqs objects in which all the
+ other prerequisites given are merged into the current set. This is primarily
+ provided for combining a distribution's core prereqs with the prereqs of one of
+ its optional features.
+
+ The new prereqs object has no ties to the originals, and altering it further
+ will not alter them.
+
+ =head2 merged_requirements
+
+ my $new_reqs = $prereqs->merged_requirements( \@phases, \@types );
+ my $new_reqs = $prereqs->merged_requirements( \@phases );
+ my $new_reqs = $preerqs->merged_requirements();
+
+ This method joins together all requirements across a number of phases
+ and types into a new L<CPAN::Meta::Requirements> object. If arguments
+ are omitted, it defaults to "runtime", "build" and "test" for phases
+ and "requires" and "recommends" for types.
+
+ =head2 as_string_hash
+
+ This method returns a hashref containing structures suitable for dumping into a
+ distmeta data structure. It is made up of hashes and strings, only; there will
+ be no Prereqs, CPAN::Meta::Requirements, or C<version> objects inside it.
+
+ =head2 is_finalized
+
+ This method returns true if the set of prereqs has been marked "finalized," and
+ cannot be altered.
+
+ =head2 finalize
+
+ Calling C<finalize> on a Prereqs object will close it for further modification.
+ Attempting to make any changes that would actually alter the prereqs will
+ result in an exception being thrown.
+
+ =head2 clone
+
+ my $cloned_prereqs = $prereqs->clone;
+
+ This method returns a Prereqs object that is identical to the original object,
+ but can be altered without affecting the original object. Finalization does
+ not survive cloning, meaning that you may clone a finalized set of prereqs and
+ then modify the clone.
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_PREREQS
+
+$fatpacked{"CPAN/Meta/Requirements.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_REQUIREMENTS';
+ use strict;
+ use warnings;
+ package CPAN::Meta::Requirements;
+ # ABSTRACT: a set of version requirements for a CPAN dist
+
+ our $VERSION = '2.131';
+
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod use CPAN::Meta::Requirements;
+ #pod
+ #pod my $build_requires = CPAN::Meta::Requirements->new;
+ #pod
+ #pod $build_requires->add_minimum('Library::Foo' => 1.208);
+ #pod
+ #pod $build_requires->add_minimum('Library::Foo' => 2.602);
+ #pod
+ #pod $build_requires->add_minimum('Module::Bar' => 'v1.2.3');
+ #pod
+ #pod $METAyml->{build_requires} = $build_requires->as_string_hash;
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod A CPAN::Meta::Requirements object models a set of version constraints like
+ #pod those specified in the F<META.yml> or F<META.json> files in CPAN distributions,
+ #pod and as defined by L<CPAN::Meta::Spec>;
+ #pod It can be built up by adding more and more constraints, and it will reduce them
+ #pod to the simplest representation.
+ #pod
+ #pod Logically impossible constraints will be identified immediately by thrown
+ #pod exceptions.
+ #pod
+ #pod =cut
+
+ use Carp ();
+
+ # To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls
+ # before 5.10, we fall back to the EUMM bundled compatibility version module if
+ # that's the only thing available. This shouldn't ever happen in a normal CPAN
+ # install of CPAN::Meta::Requirements, as version.pm will be picked up from
+ # prereqs and be available at runtime.
+
+ BEGIN {
+ eval "use version ()"; ## no critic
+ if ( my $err = $@ ) {
+ eval "require ExtUtils::MakeMaker::version" or die $err; ## no critic
+ }
+ }
+
+ # Perl 5.10.0 didn't have "is_qv" in version.pm
+ *_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} };
+
+ # construct once, reuse many times
+ my $V0 = version->new(0);
+
+ #pod =method new
+ #pod
+ #pod my $req = CPAN::Meta::Requirements->new;
+ #pod
+ #pod This returns a new CPAN::Meta::Requirements object. It takes an optional
+ #pod hash reference argument. Currently, only one key is supported:
+ #pod
+ #pod =for :list
+ #pod * C<bad_version_hook> -- if provided, when a version cannot be parsed into
+ #pod a version object, this code reference will be called with the invalid
+ #pod version string as first argument, and the module name as second
+ #pod argument. It must return a valid version object.
+ #pod
+ #pod All other keys are ignored.
+ #pod
+ #pod =cut
+
+ my @valid_options = qw( bad_version_hook );
+
+ sub new {
+ my ($class, $options) = @_;
+ $options ||= {};
+ Carp::croak "Argument to $class\->new() must be a hash reference"
+ unless ref $options eq 'HASH';
+ my %self = map {; $_ => $options->{$_}} @valid_options;
+
+ return bless \%self => $class;
+ }
+
+ # from version::vpp
+ sub _find_magic_vstring {
+ my $value = shift;
+ my $tvalue = '';
+ require B;
+ my $sv = B::svref_2object(\$value);
+ my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
+ while ( $magic ) {
+ if ( $magic->TYPE eq 'V' ) {
+ $tvalue = $magic->PTR;
+ $tvalue =~ s/^v?(.+)$/v$1/;
+ last;
+ }
+ else {
+ $magic = $magic->MOREMAGIC;
+ }
+ }
+ return $tvalue;
+ }
+
+ # safe if given an unblessed reference
+ sub _isa_version {
+ UNIVERSAL::isa( $_[0], 'UNIVERSAL' ) && $_[0]->isa('version')
+ }
+
+ sub _version_object {
+ my ($self, $module, $version) = @_;
+
+ my $vobj;
+
+ # hack around version::vpp not handling <3 character vstring literals
+ if ( $INC{'version/vpp.pm'} || $INC{'ExtUtils/MakeMaker/version/vpp.pm'} ) {
+ my $magic = _find_magic_vstring( $version );
+ $version = $magic if length $magic;
+ }
+
+ eval {
+ if (not defined $version or $version eq '0') {
+ $vobj = $V0;
+ }
+ elsif ( ref($version) eq 'version' || _isa_version($version) ) {
+ $vobj = $version;
+ }
+ else {
+ local $SIG{__WARN__} = sub { die "Invalid version: $_[0]" };
+ $vobj = version->new($version);
+ }
+ };
+
+ if ( my $err = $@ ) {
+ my $hook = $self->{bad_version_hook};
+ $vobj = eval { $hook->($version, $module) }
+ if ref $hook eq 'CODE';
+ unless (eval { $vobj->isa("version") }) {
+ $err =~ s{ at .* line \d+.*$}{};
+ die "Can't convert '$version': $err";
+ }
+ }
+
+ # ensure no leading '.'
+ if ( $vobj =~ m{\A\.} ) {
+ $vobj = version->new("0$vobj");
+ }
+
+ # ensure normal v-string form
+ if ( _is_qv($vobj) ) {
+ $vobj = version->new($vobj->normal);
+ }
+
+ return $vobj;
+ }
+
+ #pod =method add_minimum
+ #pod
+ #pod $req->add_minimum( $module => $version );
+ #pod
+ #pod This adds a new minimum version requirement. If the new requirement is
+ #pod redundant to the existing specification, this has no effect.
+ #pod
+ #pod Minimum requirements are inclusive. C<$version> is required, along with any
+ #pod greater version number.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =method add_maximum
+ #pod
+ #pod $req->add_maximum( $module => $version );
+ #pod
+ #pod This adds a new maximum version requirement. If the new requirement is
+ #pod redundant to the existing specification, this has no effect.
+ #pod
+ #pod Maximum requirements are inclusive. No version strictly greater than the given
+ #pod version is allowed.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =method add_exclusion
+ #pod
+ #pod $req->add_exclusion( $module => $version );
+ #pod
+ #pod This adds a new excluded version. For example, you might use these three
+ #pod method calls:
+ #pod
+ #pod $req->add_minimum( $module => '1.00' );
+ #pod $req->add_maximum( $module => '1.82' );
+ #pod
+ #pod $req->add_exclusion( $module => '1.75' );
+ #pod
+ #pod Any version between 1.00 and 1.82 inclusive would be acceptable, except for
+ #pod 1.75.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =method exact_version
+ #pod
+ #pod $req->exact_version( $module => $version );
+ #pod
+ #pod This sets the version required for the given module to I<exactly> the given
+ #pod version. No other version would be considered acceptable.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =cut
+
+ BEGIN {
+ for my $type (qw(maximum exclusion exact_version)) {
+ my $method = "with_$type";
+ my $to_add = $type eq 'exact_version' ? $type : "add_$type";
+
+ my $code = sub {
+ my ($self, $name, $version) = @_;
+
+ $version = $self->_version_object( $name, $version );
+
+ $self->__modify_entry_for($name, $method, $version);
+
+ return $self;
+ };
+
+ no strict 'refs';
+ *$to_add = $code;
+ }
+ }
+
+ sub add_minimum {
+ my ($self, $name, $version) = @_;
+
+ if (not defined $version or $version eq '0') {
+ return $self if $self->__entry_for($name);
+ Carp::confess("can't add new requirements to finalized requirements")
+ if $self->is_finalized;
+
+ $self->{requirements}{ $name } =
+ CPAN::Meta::Requirements::_Range::Range->with_minimum($V0);
+ }
+ else {
+ $version = $self->_version_object( $name, $version );
+
+ $self->__modify_entry_for($name, 'with_minimum', $version);
+ }
+ return $self;
+ }
+
+ #pod =method add_requirements
+ #pod
+ #pod $req->add_requirements( $another_req_object );
+ #pod
+ #pod This method adds all the requirements in the given CPAN::Meta::Requirements object
+ #pod to the requirements object on which it was called. If there are any conflicts,
+ #pod an exception is thrown.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =cut
+
+ sub add_requirements {
+ my ($self, $req) = @_;
+
+ for my $module ($req->required_modules) {
+ my $modifiers = $req->__entry_for($module)->as_modifiers;
+ for my $modifier (@$modifiers) {
+ my ($method, @args) = @$modifier;
+ $self->$method($module => @args);
+ };
+ }
+
+ return $self;
+ }
+
+ #pod =method accepts_module
+ #pod
+ #pod my $bool = $req->accepts_module($module => $version);
+ #pod
+ #pod Given an module and version, this method returns true if the version
+ #pod specification for the module accepts the provided version. In other words,
+ #pod given:
+ #pod
+ #pod Module => '>= 1.00, < 2.00'
+ #pod
+ #pod We will accept 1.00 and 1.75 but not 0.50 or 2.00.
+ #pod
+ #pod For modules that do not appear in the requirements, this method will return
+ #pod true.
+ #pod
+ #pod =cut
+
+ sub accepts_module {
+ my ($self, $module, $version) = @_;
+
+ $version = $self->_version_object( $module, $version );
+
+ return 1 unless my $range = $self->__entry_for($module);
+ return $range->_accepts($version);
+ }
+
+ #pod =method clear_requirement
+ #pod
+ #pod $req->clear_requirement( $module );
+ #pod
+ #pod This removes the requirement for a given module from the object.
+ #pod
+ #pod This method returns the requirements object.
+ #pod
+ #pod =cut
+
+ sub clear_requirement {
+ my ($self, $module) = @_;
+
+ return $self unless $self->__entry_for($module);
+
+ Carp::confess("can't clear requirements on finalized requirements")
+ if $self->is_finalized;
+
+ delete $self->{requirements}{ $module };
+
+ return $self;
+ }
+
+ #pod =method requirements_for_module
+ #pod
+ #pod $req->requirements_for_module( $module );
+ #pod
+ #pod This returns a string containing the version requirements for a given module in
+ #pod the format described in L<CPAN::Meta::Spec> or undef if the given module has no
+ #pod requirements. This should only be used for informational purposes such as error
+ #pod messages and should not be interpreted or used for comparison (see
+ #pod L</accepts_module> instead.)
+ #pod
+ #pod =cut
+
+ sub requirements_for_module {
+ my ($self, $module) = @_;
+ my $entry = $self->__entry_for($module);
+ return unless $entry;
+ return $entry->as_string;
+ }
+
+ #pod =method required_modules
+ #pod
+ #pod This method returns a list of all the modules for which requirements have been
+ #pod specified.
+ #pod
+ #pod =cut
+
+ sub required_modules { keys %{ $_[0]{requirements} } }
+
+ #pod =method clone
+ #pod
+ #pod $req->clone;
+ #pod
+ #pod This method returns a clone of the invocant. The clone and the original object
+ #pod can then be changed independent of one another.
+ #pod
+ #pod =cut
+
+ sub clone {
+ my ($self) = @_;
+ my $new = (ref $self)->new;
+
+ return $new->add_requirements($self);
+ }
+
+ sub __entry_for { $_[0]{requirements}{ $_[1] } }
+
+ sub __modify_entry_for {
+ my ($self, $name, $method, $version) = @_;
+
+ my $fin = $self->is_finalized;
+ my $old = $self->__entry_for($name);
+
+ Carp::confess("can't add new requirements to finalized requirements")
+ if $fin and not $old;
+
+ my $new = ($old || 'CPAN::Meta::Requirements::_Range::Range')
+ ->$method($version);
+
+ Carp::confess("can't modify finalized requirements")
+ if $fin and $old->as_string ne $new->as_string;
+
+ $self->{requirements}{ $name } = $new;
+ }
+
+ #pod =method is_simple
+ #pod
+ #pod This method returns true if and only if all requirements are inclusive minimums
+ #pod -- that is, if their string expression is just the version number.
+ #pod
+ #pod =cut
+
+ sub is_simple {
+ my ($self) = @_;
+ for my $module ($self->required_modules) {
+ # XXX: This is a complete hack, but also entirely correct.
+ return if $self->__entry_for($module)->as_string =~ /\s/;
+ }
+
+ return 1;
+ }
+
+ #pod =method is_finalized
+ #pod
+ #pod This method returns true if the requirements have been finalized by having the
+ #pod C<finalize> method called on them.
+ #pod
+ #pod =cut
+
+ sub is_finalized { $_[0]{finalized} }
+
+ #pod =method finalize
+ #pod
+ #pod This method marks the requirements finalized. Subsequent attempts to change
+ #pod the requirements will be fatal, I<if> they would result in a change. If they
+ #pod would not alter the requirements, they have no effect.
+ #pod
+ #pod If a finalized set of requirements is cloned, the cloned requirements are not
+ #pod also finalized.
+ #pod
+ #pod =cut
+
+ sub finalize { $_[0]{finalized} = 1 }
+
+ #pod =method as_string_hash
+ #pod
+ #pod This returns a reference to a hash describing the requirements using the
+ #pod strings in the L<CPAN::Meta::Spec> specification.
+ #pod
+ #pod For example after the following program:
+ #pod
+ #pod my $req = CPAN::Meta::Requirements->new;
+ #pod
+ #pod $req->add_minimum('CPAN::Meta::Requirements' => 0.102);
+ #pod
+ #pod $req->add_minimum('Library::Foo' => 1.208);
+ #pod
+ #pod $req->add_maximum('Library::Foo' => 2.602);
+ #pod
+ #pod $req->add_minimum('Module::Bar' => 'v1.2.3');
+ #pod
+ #pod $req->add_exclusion('Module::Bar' => 'v1.2.8');
+ #pod
+ #pod $req->exact_version('Xyzzy' => '6.01');
+ #pod
+ #pod my $hashref = $req->as_string_hash;
+ #pod
+ #pod C<$hashref> would contain:
+ #pod
+ #pod {
+ #pod 'CPAN::Meta::Requirements' => '0.102',
+ #pod 'Library::Foo' => '>= 1.208, <= 2.206',
+ #pod 'Module::Bar' => '>= v1.2.3, != v1.2.8',
+ #pod 'Xyzzy' => '== 6.01',
+ #pod }
+ #pod
+ #pod =cut
+
+ sub as_string_hash {
+ my ($self) = @_;
+
+ my %hash = map {; $_ => $self->{requirements}{$_}->as_string }
+ $self->required_modules;
+
+ return \%hash;
+ }
+
+ #pod =method add_string_requirement
+ #pod
+ #pod $req->add_string_requirement('Library::Foo' => '>= 1.208, <= 2.206');
+ #pod $req->add_string_requirement('Library::Foo' => v1.208);
+ #pod
+ #pod This method parses the passed in string and adds the appropriate requirement
+ #pod for the given module. A version can be a Perl "v-string". It understands
+ #pod version ranges as described in the L<CPAN::Meta::Spec/Version Ranges>. For
+ #pod example:
+ #pod
+ #pod =over 4
+ #pod
+ #pod =item 1.3
+ #pod
+ #pod =item >= 1.3
+ #pod
+ #pod =item <= 1.3
+ #pod
+ #pod =item == 1.3
+ #pod
+ #pod =item != 1.3
+ #pod
+ #pod =item > 1.3
+ #pod
+ #pod =item < 1.3
+ #pod
+ #pod =item >= 1.3, != 1.5, <= 2.0
+ #pod
+ #pod A version number without an operator is equivalent to specifying a minimum
+ #pod (C<E<gt>=>). Extra whitespace is allowed.
+ #pod
+ #pod =back
+ #pod
+ #pod =cut
+
+ my %methods_for_op = (
+ '==' => [ qw(exact_version) ],
+ '!=' => [ qw(add_exclusion) ],
+ '>=' => [ qw(add_minimum) ],
+ '<=' => [ qw(add_maximum) ],
+ '>' => [ qw(add_minimum add_exclusion) ],
+ '<' => [ qw(add_maximum add_exclusion) ],
+ );
+
+ sub add_string_requirement {
+ my ($self, $module, $req) = @_;
+
+ unless ( defined $req && length $req ) {
+ $req = 0;
+ $self->_blank_carp($module);
+ }
+
+ my $magic = _find_magic_vstring( $req );
+ if (length $magic) {
+ $self->add_minimum($module => $magic);
+ return;
+ }
+
+ my @parts = split qr{\s*,\s*}, $req;
+
+ for my $part (@parts) {
+ my ($op, $ver) = $part =~ m{\A\s*(==|>=|>|<=|<|!=)\s*(.*)\z};
+
+ if (! defined $op) {
+ $self->add_minimum($module => $part);
+ } else {
+ Carp::confess("illegal requirement string: $req")
+ unless my $methods = $methods_for_op{ $op };
+
+ $self->$_($module => $ver) for @$methods;
+ }
+ }
+ }
+
+ #pod =method from_string_hash
+ #pod
+ #pod my $req = CPAN::Meta::Requirements->from_string_hash( \%hash );
+ #pod my $req = CPAN::Meta::Requirements->from_string_hash( \%hash, \%opts );
+ #pod
+ #pod This is an alternate constructor for a CPAN::Meta::Requirements
+ #pod object. It takes a hash of module names and version requirement
+ #pod strings and returns a new CPAN::Meta::Requirements object. As with
+ #pod add_string_requirement, a version can be a Perl "v-string". Optionally,
+ #pod you can supply a hash-reference of options, exactly as with the L</new>
+ #pod method.
+ #pod
+ #pod =cut
+
+ sub _blank_carp {
+ my ($self, $module) = @_;
+ Carp::carp("Undefined requirement for $module treated as '0'");
+ }
+
+ sub from_string_hash {
+ my ($class, $hash, $options) = @_;
+
+ my $self = $class->new($options);
+
+ for my $module (keys %$hash) {
+ my $req = $hash->{$module};
+ unless ( defined $req && length $req ) {
+ $req = 0;
+ $class->_blank_carp($module);
+ }
+ $self->add_string_requirement($module, $req);
+ }
+
+ return $self;
+ }
+
+ ##############################################################
+
+ {
+ package
+ CPAN::Meta::Requirements::_Range::Exact;
+ sub _new { bless { version => $_[1] } => $_[0] }
+
+ sub _accepts { return $_[0]{version} == $_[1] }
+
+ sub as_string { return "== $_[0]{version}" }
+
+ sub as_modifiers { return [ [ exact_version => $_[0]{version} ] ] }
+
+ sub _clone {
+ (ref $_[0])->_new( version->new( $_[0]{version} ) )
+ }
+
+ sub with_exact_version {
+ my ($self, $version) = @_;
+
+ return $self->_clone if $self->_accepts($version);
+
+ Carp::confess("illegal requirements: unequal exact version specified");
+ }
+
+ sub with_minimum {
+ my ($self, $minimum) = @_;
+ return $self->_clone if $self->{version} >= $minimum;
+ Carp::confess("illegal requirements: minimum above exact specification");
+ }
+
+ sub with_maximum {
+ my ($self, $maximum) = @_;
+ return $self->_clone if $self->{version} <= $maximum;
+ Carp::confess("illegal requirements: maximum below exact specification");
+ }
+
+ sub with_exclusion {
+ my ($self, $exclusion) = @_;
+ return $self->_clone unless $exclusion == $self->{version};
+ Carp::confess("illegal requirements: excluded exact specification");
+ }
+ }
+
+ ##############################################################
+
+ {
+ package
+ CPAN::Meta::Requirements::_Range::Range;
+
+ sub _self { ref($_[0]) ? $_[0] : (bless { } => $_[0]) }
+
+ sub _clone {
+ return (bless { } => $_[0]) unless ref $_[0];
+
+ my ($s) = @_;
+ my %guts = (
+ (exists $s->{minimum} ? (minimum => version->new($s->{minimum})) : ()),
+ (exists $s->{maximum} ? (maximum => version->new($s->{maximum})) : ()),
+
+ (exists $s->{exclusions}
+ ? (exclusions => [ map { version->new($_) } @{ $s->{exclusions} } ])
+ : ()),
+ );
+
+ bless \%guts => ref($s);
+ }
+
+ sub as_modifiers {
+ my ($self) = @_;
+ my @mods;
+ push @mods, [ add_minimum => $self->{minimum} ] if exists $self->{minimum};
+ push @mods, [ add_maximum => $self->{maximum} ] if exists $self->{maximum};
+ push @mods, map {; [ add_exclusion => $_ ] } @{$self->{exclusions} || []};
+ return \@mods;
+ }
+
+ sub as_string {
+ my ($self) = @_;
+
+ return 0 if ! keys %$self;
+
+ return "$self->{minimum}" if (keys %$self) == 1 and exists $self->{minimum};
+
+ my @exclusions = @{ $self->{exclusions} || [] };
+
+ my @parts;
+
+ for my $pair (
+ [ qw( >= > minimum ) ],
+ [ qw( <= < maximum ) ],
+ ) {
+ my ($op, $e_op, $k) = @$pair;
+ if (exists $self->{$k}) {
+ my @new_exclusions = grep { $_ != $self->{ $k } } @exclusions;
+ if (@new_exclusions == @exclusions) {
+ push @parts, "$op $self->{ $k }";
+ } else {
+ push @parts, "$e_op $self->{ $k }";
+ @exclusions = @new_exclusions;
+ }
+ }
+ }
+
+ push @parts, map {; "!= $_" } @exclusions;
+
+ return join q{, }, @parts;
+ }
+
+ sub with_exact_version {
+ my ($self, $version) = @_;
+ $self = $self->_clone;
+
+ Carp::confess("illegal requirements: exact specification outside of range")
+ unless $self->_accepts($version);
+
+ return CPAN::Meta::Requirements::_Range::Exact->_new($version);
+ }
+
+ sub _simplify {
+ my ($self) = @_;
+
+ if (defined $self->{minimum} and defined $self->{maximum}) {
+ if ($self->{minimum} == $self->{maximum}) {
+ Carp::confess("illegal requirements: excluded all values")
+ if grep { $_ == $self->{minimum} } @{ $self->{exclusions} || [] };
+
+ return CPAN::Meta::Requirements::_Range::Exact->_new($self->{minimum})
+ }
+
+ Carp::confess("illegal requirements: minimum exceeds maximum")
+ if $self->{minimum} > $self->{maximum};
+ }
+
+ # eliminate irrelevant exclusions
+ if ($self->{exclusions}) {
+ my %seen;
+ @{ $self->{exclusions} } = grep {
+ (! defined $self->{minimum} or $_ >= $self->{minimum})
+ and
+ (! defined $self->{maximum} or $_ <= $self->{maximum})
+ and
+ ! $seen{$_}++
+ } @{ $self->{exclusions} };
+ }
+
+ return $self;
+ }
+
+ sub with_minimum {
+ my ($self, $minimum) = @_;
+ $self = $self->_clone;
+
+ if (defined (my $old_min = $self->{minimum})) {
+ $self->{minimum} = (sort { $b cmp $a } ($minimum, $old_min))[0];
+ } else {
+ $self->{minimum} = $minimum;
+ }
+
+ return $self->_simplify;
+ }
+
+ sub with_maximum {
+ my ($self, $maximum) = @_;
+ $self = $self->_clone;
+
+ if (defined (my $old_max = $self->{maximum})) {
+ $self->{maximum} = (sort { $a cmp $b } ($maximum, $old_max))[0];
+ } else {
+ $self->{maximum} = $maximum;
+ }
+
+ return $self->_simplify;
+ }
+
+ sub with_exclusion {
+ my ($self, $exclusion) = @_;
+ $self = $self->_clone;
+
+ push @{ $self->{exclusions} ||= [] }, $exclusion;
+
+ return $self->_simplify;
+ }
+
+ sub _accepts {
+ my ($self, $version) = @_;
+
+ return if defined $self->{minimum} and $version < $self->{minimum};
+ return if defined $self->{maximum} and $version > $self->{maximum};
+ return if defined $self->{exclusions}
+ and grep { $version == $_ } @{ $self->{exclusions} };
+
+ return 1;
+ }
+ }
+
+ 1;
+ # vim: ts=2 sts=2 sw=2 et:
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Requirements - a set of version requirements for a CPAN dist
+
+ =head1 VERSION
+
+ version 2.131
+
+ =head1 SYNOPSIS
+
+ use CPAN::Meta::Requirements;
+
+ my $build_requires = CPAN::Meta::Requirements->new;
+
+ $build_requires->add_minimum('Library::Foo' => 1.208);
+
+ $build_requires->add_minimum('Library::Foo' => 2.602);
+
+ $build_requires->add_minimum('Module::Bar' => 'v1.2.3');
+
+ $METAyml->{build_requires} = $build_requires->as_string_hash;
+
+ =head1 DESCRIPTION
+
+ A CPAN::Meta::Requirements object models a set of version constraints like
+ those specified in the F<META.yml> or F<META.json> files in CPAN distributions,
+ and as defined by L<CPAN::Meta::Spec>;
+ It can be built up by adding more and more constraints, and it will reduce them
+ to the simplest representation.
+
+ Logically impossible constraints will be identified immediately by thrown
+ exceptions.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $req = CPAN::Meta::Requirements->new;
+
+ This returns a new CPAN::Meta::Requirements object. It takes an optional
+ hash reference argument. Currently, only one key is supported:
+
+ =over 4
+
+ =item *
+
+ C<bad_version_hook> -- if provided, when a version cannot be parsed into a version object, this code reference will be called with the invalid version string as first argument, and the module name as second argument. It must return a valid version object.
+
+ =back
+
+ All other keys are ignored.
+
+ =head2 add_minimum
+
+ $req->add_minimum( $module => $version );
+
+ This adds a new minimum version requirement. If the new requirement is
+ redundant to the existing specification, this has no effect.
+
+ Minimum requirements are inclusive. C<$version> is required, along with any
+ greater version number.
+
+ This method returns the requirements object.
+
+ =head2 add_maximum
+
+ $req->add_maximum( $module => $version );
+
+ This adds a new maximum version requirement. If the new requirement is
+ redundant to the existing specification, this has no effect.
+
+ Maximum requirements are inclusive. No version strictly greater than the given
+ version is allowed.
+
+ This method returns the requirements object.
+
+ =head2 add_exclusion
+
+ $req->add_exclusion( $module => $version );
+
+ This adds a new excluded version. For example, you might use these three
+ method calls:
+
+ $req->add_minimum( $module => '1.00' );
+ $req->add_maximum( $module => '1.82' );
+
+ $req->add_exclusion( $module => '1.75' );
+
+ Any version between 1.00 and 1.82 inclusive would be acceptable, except for
+ 1.75.
+
+ This method returns the requirements object.
+
+ =head2 exact_version
+
+ $req->exact_version( $module => $version );
+
+ This sets the version required for the given module to I<exactly> the given
+ version. No other version would be considered acceptable.
+
+ This method returns the requirements object.
+
+ =head2 add_requirements
+
+ $req->add_requirements( $another_req_object );
+
+ This method adds all the requirements in the given CPAN::Meta::Requirements object
+ to the requirements object on which it was called. If there are any conflicts,
+ an exception is thrown.
+
+ This method returns the requirements object.
+
+ =head2 accepts_module
+
+ my $bool = $req->accepts_module($module => $version);
+
+ Given an module and version, this method returns true if the version
+ specification for the module accepts the provided version. In other words,
+ given:
+
+ Module => '>= 1.00, < 2.00'
+
+ We will accept 1.00 and 1.75 but not 0.50 or 2.00.
+
+ For modules that do not appear in the requirements, this method will return
+ true.
+
+ =head2 clear_requirement
+
+ $req->clear_requirement( $module );
+
+ This removes the requirement for a given module from the object.
+
+ This method returns the requirements object.
+
+ =head2 requirements_for_module
+
+ $req->requirements_for_module( $module );
+
+ This returns a string containing the version requirements for a given module in
+ the format described in L<CPAN::Meta::Spec> or undef if the given module has no
+ requirements. This should only be used for informational purposes such as error
+ messages and should not be interpreted or used for comparison (see
+ L</accepts_module> instead.)
+
+ =head2 required_modules
+
+ This method returns a list of all the modules for which requirements have been
+ specified.
+
+ =head2 clone
+
+ $req->clone;
+
+ This method returns a clone of the invocant. The clone and the original object
+ can then be changed independent of one another.
+
+ =head2 is_simple
+
+ This method returns true if and only if all requirements are inclusive minimums
+ -- that is, if their string expression is just the version number.
+
+ =head2 is_finalized
+
+ This method returns true if the requirements have been finalized by having the
+ C<finalize> method called on them.
+
+ =head2 finalize
+
+ This method marks the requirements finalized. Subsequent attempts to change
+ the requirements will be fatal, I<if> they would result in a change. If they
+ would not alter the requirements, they have no effect.
+
+ If a finalized set of requirements is cloned, the cloned requirements are not
+ also finalized.
+
+ =head2 as_string_hash
+
+ This returns a reference to a hash describing the requirements using the
+ strings in the L<CPAN::Meta::Spec> specification.
+
+ For example after the following program:
+
+ my $req = CPAN::Meta::Requirements->new;
+
+ $req->add_minimum('CPAN::Meta::Requirements' => 0.102);
+
+ $req->add_minimum('Library::Foo' => 1.208);
+
+ $req->add_maximum('Library::Foo' => 2.602);
+
+ $req->add_minimum('Module::Bar' => 'v1.2.3');
+
+ $req->add_exclusion('Module::Bar' => 'v1.2.8');
+
+ $req->exact_version('Xyzzy' => '6.01');
+
+ my $hashref = $req->as_string_hash;
+
+ C<$hashref> would contain:
+
+ {
+ 'CPAN::Meta::Requirements' => '0.102',
+ 'Library::Foo' => '>= 1.208, <= 2.206',
+ 'Module::Bar' => '>= v1.2.3, != v1.2.8',
+ 'Xyzzy' => '== 6.01',
+ }
+
+ =head2 add_string_requirement
+
+ $req->add_string_requirement('Library::Foo' => '>= 1.208, <= 2.206');
+ $req->add_string_requirement('Library::Foo' => v1.208);
+
+ This method parses the passed in string and adds the appropriate requirement
+ for the given module. A version can be a Perl "v-string". It understands
+ version ranges as described in the L<CPAN::Meta::Spec/Version Ranges>. For
+ example:
+
+ =over 4
+
+ =item 1.3
+
+ =item >= 1.3
+
+ =item <= 1.3
+
+ =item == 1.3
+
+ =item != 1.3
+
+ =item > 1.3
+
+ =item < 1.3
+
+ =item >= 1.3, != 1.5, <= 2.0
+
+ A version number without an operator is equivalent to specifying a minimum
+ (C<E<gt>=>). Extra whitespace is allowed.
+
+ =back
+
+ =head2 from_string_hash
+
+ my $req = CPAN::Meta::Requirements->from_string_hash( \%hash );
+ my $req = CPAN::Meta::Requirements->from_string_hash( \%hash, \%opts );
+
+ This is an alternate constructor for a CPAN::Meta::Requirements
+ object. It takes a hash of module names and version requirement
+ strings and returns a new CPAN::Meta::Requirements object. As with
+ add_string_requirement, a version can be a Perl "v-string". Optionally,
+ you can supply a hash-reference of options, exactly as with the L</new>
+ method.
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/dagolden/CPAN-Meta-Requirements/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/dagolden/CPAN-Meta-Requirements>
+
+ git clone https://github.com/dagolden/CPAN-Meta-Requirements.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Ed J Karen Etheridge Leon Timmermans robario
+
+ =over 4
+
+ =item *
+
+ Ed J <mohawk2@users.noreply.github.com>
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Leon Timmermans <fawaka@gmail.com>
+
+ =item *
+
+ robario <webmaster@robario.com>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_REQUIREMENTS
+
+$fatpacked{"CPAN/Meta/Spec.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_SPEC';
+ # XXX RULES FOR PATCHING THIS FILE XXX
+ # Patches that fix typos or formatting are acceptable. Patches
+ # that change semantics are not acceptable without prior approval
+ # by David Golden or Ricardo Signes.
+
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Spec;
+ # VERSION
+ $CPAN::Meta::Spec::VERSION = '2.143240';
+ 1;
+
+ # ABSTRACT: specification for CPAN distribution metadata
+
+
+ # vi:tw=72
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Spec - specification for CPAN distribution metadata
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 SYNOPSIS
+
+ my $distmeta = {
+ name => 'Module-Build',
+ abstract => 'Build and install Perl modules',
+ description => "Module::Build is a system for "
+ . "building, testing, and installing Perl modules. "
+ . "It is meant to ... blah blah blah ...",
+ version => '0.36',
+ release_status => 'stable',
+ author => [
+ 'Ken Williams <kwilliams@cpan.org>',
+ 'Module-Build List <module-build@perl.org>', # additional contact
+ ],
+ license => [ 'perl_5' ],
+ prereqs => {
+ runtime => {
+ requires => {
+ 'perl' => '5.006',
+ 'ExtUtils::Install' => '0',
+ 'File::Basename' => '0',
+ 'File::Compare' => '0',
+ 'IO::File' => '0',
+ },
+ recommends => {
+ 'Archive::Tar' => '1.00',
+ 'ExtUtils::Install' => '0.3',
+ 'ExtUtils::ParseXS' => '2.02',
+ },
+ },
+ build => {
+ requires => {
+ 'Test::More' => '0',
+ },
+ }
+ },
+ resources => {
+ license => ['http://dev.perl.org/licenses/'],
+ },
+ optional_features => {
+ domination => {
+ description => 'Take over the world',
+ prereqs => {
+ develop => { requires => { 'Genius::Evil' => '1.234' } },
+ runtime => { requires => { 'Machine::Weather' => '2.0' } },
+ },
+ },
+ },
+ dynamic_config => 1,
+ keywords => [ qw/ toolchain cpan dual-life / ],
+ 'meta-spec' => {
+ version => '2',
+ url => 'https://metacpan.org/pod/CPAN::Meta::Spec',
+ },
+ generated_by => 'Module::Build version 0.36',
+ };
+
+ =head1 DESCRIPTION
+
+ This document describes version 2 of the CPAN distribution metadata
+ specification, also known as the "CPAN Meta Spec".
+
+ Revisions of this specification for typo corrections and prose
+ clarifications may be issued as CPAN::Meta::Spec 2.I<x>. These
+ revisions will never change semantics or add or remove specified
+ behavior.
+
+ Distribution metadata describe important properties of Perl
+ distributions. Distribution building tools like Module::Build,
+ Module::Install, ExtUtils::MakeMaker or Dist::Zilla should create a
+ metadata file in accordance with this specification and include it with
+ the distribution for use by automated tools that index, examine, package
+ or install Perl distributions.
+
+ =head1 TERMINOLOGY
+
+ =over 4
+
+ =item distribution
+
+ This is the primary object described by the metadata. In the context of
+ this document it usually refers to a collection of modules, scripts,
+ and/or documents that are distributed together for other developers to
+ use. Examples of distributions are C<Class-Container>, C<libwww-perl>,
+ or C<DBI>.
+
+ =item module
+
+ This refers to a reusable library of code contained in a single file.
+ Modules usually contain one or more packages and are often referred
+ to by the name of a primary package that can be mapped to the file
+ name. For example, one might refer to C<File::Spec> instead of
+ F<File/Spec.pm>
+
+ =item package
+
+ This refers to a namespace declared with the Perl C<package> statement.
+ In Perl, packages often have a version number property given by the
+ C<$VERSION> variable in the namespace.
+
+ =item consumer
+
+ This refers to code that reads a metadata file, deserializes it into a
+ data structure in memory, or interprets a data structure of metadata
+ elements.
+
+ =item producer
+
+ This refers to code that constructs a metadata data structure,
+ serializes into a bytestream and/or writes it to disk.
+
+ =item must, should, may, etc.
+
+ These terms are interpreted as described in IETF RFC 2119.
+
+ =back
+
+ =head1 DATA TYPES
+
+ Fields in the L</STRUCTURE> section describe data elements, each of
+ which has an associated data type as described herein. There are four
+ primitive types: Boolean, String, List and Map. Other types are
+ subtypes of primitives and define compound data structures or define
+ constraints on the values of a data element.
+
+ =head2 Boolean
+
+ A I<Boolean> is used to provide a true or false value. It B<must> be
+ represented as a defined value.
+
+ =head2 String
+
+ A I<String> is data element containing a non-zero length sequence of
+ Unicode characters, such as an ordinary Perl scalar that is not a
+ reference.
+
+ =head2 List
+
+ A I<List> is an ordered collection of zero or more data elements.
+ Elements of a List may be of mixed types.
+
+ Producers B<must> represent List elements using a data structure which
+ unambiguously indicates that multiple values are possible, such as a
+ reference to a Perl array (an "arrayref").
+
+ Consumers expecting a List B<must> consider a String as equivalent to a
+ List of length 1.
+
+ =head2 Map
+
+ A I<Map> is an unordered collection of zero or more data elements
+ ("values"), indexed by associated String elements ("keys"). The Map's
+ value elements may be of mixed types.
+
+ =head2 License String
+
+ A I<License String> is a subtype of String with a restricted set of
+ values. Valid values are described in detail in the description of
+ the L</license> field.
+
+ =head2 URL
+
+ I<URL> is a subtype of String containing a Uniform Resource Locator or
+ Identifier. [ This type is called URL and not URI for historical reasons. ]
+
+ =head2 Version
+
+ A I<Version> is a subtype of String containing a value that describes
+ the version number of packages or distributions. Restrictions on format
+ are described in detail in the L</Version Formats> section.
+
+ =head2 Version Range
+
+ The I<Version Range> type is a subtype of String. It describes a range
+ of Versions that may be present or installed to fulfill prerequisites.
+ It is specified in detail in the L</Version Ranges> section.
+
+ =head1 STRUCTURE
+
+ The metadata structure is a data element of type Map. This section
+ describes valid keys within the Map.
+
+ Any keys not described in this specification document (whether top-level
+ or within compound data structures described herein) are considered
+ I<custom keys> and B<must> begin with an "x" or "X" and be followed by an
+ underscore; i.e. they must match the pattern: C<< qr{\Ax_}i >>. If a
+ custom key refers to a compound data structure, subkeys within it do not
+ need an "x_" or "X_" prefix.
+
+ Consumers of metadata may ignore any or all custom keys. All other keys
+ not described herein are invalid and should be ignored by consumers.
+ Producers must not generate or output invalid keys.
+
+ For each key, an example is provided followed by a description. The
+ description begins with the version of spec in which the key was added
+ or in which the definition was modified, whether the key is I<required>
+ or I<optional> and the data type of the corresponding data element.
+ These items are in parentheses, brackets and braces, respectively.
+
+ If a data type is a Map or Map subtype, valid subkeys will be described
+ as well.
+
+ Some fields are marked I<Deprecated>. These are shown for historical
+ context and must not be produced in or consumed from any metadata structure
+ of version 2 or higher.
+
+ =head2 REQUIRED FIELDS
+
+ =head3 abstract
+
+ Example:
+
+ abstract => 'Build and install Perl modules'
+
+ (Spec 1.2) [required] {String}
+
+ This is a short description of the purpose of the distribution.
+
+ =head3 author
+
+ Example:
+
+ author => [ 'Ken Williams <kwilliams@cpan.org>' ]
+
+ (Spec 1.2) [required] {List of one or more Strings}
+
+ This List indicates the person(s) to contact concerning the
+ distribution. The preferred form of the contact string is:
+
+ contact-name <email-address>
+
+ This field provides a general contact list independent of other
+ structured fields provided within the L</resources> field, such as
+ C<bugtracker>. The addressee(s) can be contacted for any purpose
+ including but not limited to (security) problems with the distribution,
+ questions about the distribution or bugs in the distribution.
+
+ A distribution's original author is usually the contact listed within
+ this field. Co-maintainers, successor maintainers or mailing lists
+ devoted to the distribution may also be listed in addition to or instead
+ of the original author.
+
+ =head3 dynamic_config
+
+ Example:
+
+ dynamic_config => 1
+
+ (Spec 2) [required] {Boolean}
+
+ A boolean flag indicating whether a F<Build.PL> or F<Makefile.PL> (or
+ similar) must be executed to determine prerequisites.
+
+ This field should be set to a true value if the distribution performs
+ some dynamic configuration (asking questions, sensing the environment,
+ etc.) as part of its configuration. This field should be set to a false
+ value to indicate that prerequisites included in metadata may be
+ considered final and valid for static analysis.
+
+ Note: when this field is true, post-configuration prerequisites are not
+ guaranteed to bear any relation whatsoever to those stated in the metadata,
+ and relying on them doing so is an error. See also
+ L</Prerequisites for dynamically configured distributions> in the implementors'
+ notes.
+
+ This field explicitly B<does not> indicate whether installation may be
+ safely performed without using a Makefile or Build file, as there may be
+ special files to install or custom installation targets (e.g. for
+ dual-life modules that exist on CPAN as well as in the Perl core). This
+ field only defines whether or not prerequisites are exactly as given in the
+ metadata.
+
+ =head3 generated_by
+
+ Example:
+
+ generated_by => 'Module::Build version 0.36'
+
+ (Spec 1.0) [required] {String}
+
+ This field indicates the tool that was used to create this metadata.
+ There are no defined semantics for this field, but it is traditional to
+ use a string in the form "Generating::Package version 1.23" or the
+ author's name, if the file was generated by hand.
+
+ =head3 license
+
+ Example:
+
+ license => [ 'perl_5' ]
+
+ license => [ 'apache_2_0', 'mozilla_1_0' ]
+
+ (Spec 2) [required] {List of one or more License Strings}
+
+ One or more licenses that apply to some or all of the files in the
+ distribution. If multiple licenses are listed, the distribution
+ documentation should be consulted to clarify the interpretation of
+ multiple licenses.
+
+ The following list of license strings are valid:
+
+ string description
+ ------------- -----------------------------------------------
+ agpl_3 GNU Affero General Public License, Version 3
+ apache_1_1 Apache Software License, Version 1.1
+ apache_2_0 Apache License, Version 2.0
+ artistic_1 Artistic License, (Version 1)
+ artistic_2 Artistic License, Version 2.0
+ bsd BSD License (three-clause)
+ freebsd FreeBSD License (two-clause)
+ gfdl_1_2 GNU Free Documentation License, Version 1.2
+ gfdl_1_3 GNU Free Documentation License, Version 1.3
+ gpl_1 GNU General Public License, Version 1
+ gpl_2 GNU General Public License, Version 2
+ gpl_3 GNU General Public License, Version 3
+ lgpl_2_1 GNU Lesser General Public License, Version 2.1
+ lgpl_3_0 GNU Lesser General Public License, Version 3.0
+ mit MIT (aka X11) License
+ mozilla_1_0 Mozilla Public License, Version 1.0
+ mozilla_1_1 Mozilla Public License, Version 1.1
+ openssl OpenSSL License
+ perl_5 The Perl 5 License (Artistic 1 & GPL 1 or later)
+ qpl_1_0 Q Public License, Version 1.0
+ ssleay Original SSLeay License
+ sun Sun Internet Standards Source License (SISSL)
+ zlib zlib License
+
+ The following license strings are also valid and indicate other
+ licensing not described above:
+
+ string description
+ ------------- -----------------------------------------------
+ open_source Other Open Source Initiative (OSI) approved license
+ restricted Requires special permission from copyright holder
+ unrestricted Not an OSI approved license, but not restricted
+ unknown License not provided in metadata
+
+ All other strings are invalid in the license field.
+
+ =head3 meta-spec
+
+ Example:
+
+ 'meta-spec' => {
+ version => '2',
+ url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
+ }
+
+ (Spec 1.2) [required] {Map}
+
+ This field indicates the version of the CPAN Meta Spec that should be
+ used to interpret the metadata. Consumers must check this key as soon
+ as possible and abort further metadata processing if the meta-spec
+ version is not supported by the consumer.
+
+ The following keys are valid, but only C<version> is required.
+
+ =over
+
+ =item version
+
+ This subkey gives the integer I<Version> of the CPAN Meta Spec against
+ which the document was generated.
+
+ =item url
+
+ This is a I<URL> of the metadata specification document corresponding to
+ the given version. This is strictly for human-consumption and should
+ not impact the interpretation of the document.
+
+ For the version 2 spec, either of these are recommended:
+
+ =over 4
+
+ =item *
+
+ C<https://metacpan.org/pod/CPAN::Meta::Spec>
+
+ =item *
+
+ C<http://search.cpan.org/perldoc?CPAN::Meta::Spec>
+
+ =back
+
+ =back
+
+ =head3 name
+
+ Example:
+
+ name => 'Module-Build'
+
+ (Spec 1.0) [required] {String}
+
+ This field is the name of the distribution. This is often created by
+ taking the "main package" in the distribution and changing C<::> to
+ C<->, but the name may be completely unrelated to the packages within
+ the distribution. For example, L<LWP::UserAgent> is distributed as part
+ of the distribution name "libwww-perl".
+
+ =head3 release_status
+
+ Example:
+
+ release_status => 'stable'
+
+ (Spec 2) [required] {String}
+
+ This field provides the release status of this distribution. If the
+ C<version> field contains an underscore character, then
+ C<release_status> B<must not> be "stable."
+
+ The C<release_status> field B<must> have one of the following values:
+
+ =over
+
+ =item stable
+
+ This indicates an ordinary, "final" release that should be indexed by PAUSE
+ or other indexers.
+
+ =item testing
+
+ This indicates a "beta" release that is substantially complete, but has an
+ elevated risk of bugs and requires additional testing. The distribution
+ should not be installed over a stable release without an explicit request
+ or other confirmation from a user. This release status may also be used
+ for "release candidate" versions of a distribution.
+
+ =item unstable
+
+ This indicates an "alpha" release that is under active development, but has
+ been released for early feedback or testing and may be missing features or
+ may have serious bugs. The distribution should not be installed over a
+ stable release without an explicit request or other confirmation from a
+ user.
+
+ =back
+
+ Consumers B<may> use this field to determine how to index the
+ distribution for CPAN or other repositories in addition to or in
+ replacement of heuristics based on version number or file name.
+
+ =head3 version
+
+ Example:
+
+ version => '0.36'
+
+ (Spec 1.0) [required] {Version}
+
+ This field gives the version of the distribution to which the metadata
+ structure refers.
+
+ =head2 OPTIONAL FIELDS
+
+ =head3 description
+
+ Example:
+
+ description => "Module::Build is a system for "
+ . "building, testing, and installing Perl modules. "
+ . "It is meant to ... blah blah blah ...",
+
+ (Spec 2) [optional] {String}
+
+ A longer, more complete description of the purpose or intended use of
+ the distribution than the one provided by the C<abstract> key.
+
+ =head3 keywords
+
+ Example:
+
+ keywords => [ qw/ toolchain cpan dual-life / ]
+
+ (Spec 1.1) [optional] {List of zero or more Strings}
+
+ A List of keywords that describe this distribution. Keywords
+ B<must not> include whitespace.
+
+ =head3 no_index
+
+ Example:
+
+ no_index => {
+ file => [ 'My/Module.pm' ],
+ directory => [ 'My/Private' ],
+ package => [ 'My::Module::Secret' ],
+ namespace => [ 'My::Module::Sample' ],
+ }
+
+ (Spec 1.2) [optional] {Map}
+
+ This Map describes any files, directories, packages, and namespaces that
+ are private to the packaging or implementation of the distribution and
+ should be ignored by indexing or search tools. Note that this is a list of
+ exclusions, and the spec does not define what to I<include> - see
+ L</Indexing distributions a la PAUSE> in the implementors notes for more
+ information.
+
+ Valid subkeys are as follows:
+
+ =over
+
+ =item file
+
+ A I<List> of relative paths to files. Paths B<must be> specified with
+ unix conventions.
+
+ =item directory
+
+ A I<List> of relative paths to directories. Paths B<must be> specified
+ with unix conventions.
+
+ [ Note: previous editions of the spec had C<dir> instead of C<directory> ]
+
+ =item package
+
+ A I<List> of package names.
+
+ =item namespace
+
+ A I<List> of package namespaces, where anything below the namespace
+ must be ignored, but I<not> the namespace itself.
+
+ In the example above for C<no_index>, C<My::Module::Sample::Foo> would
+ be ignored, but C<My::Module::Sample> would not.
+
+ =back
+
+ =head3 optional_features
+
+ Example:
+
+ optional_features => {
+ sqlite => {
+ description => 'Provides SQLite support',
+ prereqs => {
+ runtime => {
+ requires => {
+ 'DBD::SQLite' => '1.25'
+ }
+ }
+ }
+ }
+ }
+
+ (Spec 2) [optional] {Map}
+
+ This Map describes optional features with incremental prerequisites.
+ Each key of the C<optional_features> Map is a String used to identify
+ the feature and each value is a Map with additional information about
+ the feature. Valid subkeys include:
+
+ =over
+
+ =item description
+
+ This is a String describing the feature. Every optional feature
+ should provide a description
+
+ =item prereqs
+
+ This entry is required and has the same structure as that of the
+ C<L</prereqs>> key. It provides a list of package requirements
+ that must be satisfied for the feature to be supported or enabled.
+
+ There is one crucial restriction: the prereqs of an optional feature
+ B<must not> include C<configure> phase prereqs.
+
+ =back
+
+ Consumers B<must not> include optional features as prerequisites without
+ explicit instruction from users (whether via interactive prompting,
+ a function parameter or a configuration value, etc. ).
+
+ If an optional feature is used by a consumer to add additional
+ prerequisites, the consumer should merge the optional feature
+ prerequisites into those given by the C<prereqs> key using the same
+ semantics. See L</Merging and Resolving Prerequisites> for details on
+ merging prerequisites.
+
+ I<Suggestion for disuse:> Because there is currently no way for a
+ distribution to specify a dependency on an optional feature of another
+ dependency, the use of C<optional_feature> is discouraged. Instead,
+ create a separate, installable distribution that ensures the desired
+ feature is available. For example, if C<Foo::Bar> has a C<Baz> feature,
+ release a separate C<Foo-Bar-Baz> distribution that satisfies
+ requirements for the feature.
+
+ =head3 prereqs
+
+ Example:
+
+ prereqs => {
+ runtime => {
+ requires => {
+ 'perl' => '5.006',
+ 'File::Spec' => '0.86',
+ 'JSON' => '2.16',
+ },
+ recommends => {
+ 'JSON::XS' => '2.26',
+ },
+ suggests => {
+ 'Archive::Tar' => '0',
+ },
+ },
+ build => {
+ requires => {
+ 'Alien::SDL' => '1.00',
+ },
+ },
+ test => {
+ recommends => {
+ 'Test::Deep' => '0.10',
+ },
+ }
+ }
+
+ (Spec 2) [optional] {Map}
+
+ This is a Map that describes all the prerequisites of the distribution.
+ The keys are phases of activity, such as C<configure>, C<build>, C<test>
+ or C<runtime>. Values are Maps in which the keys name the type of
+ prerequisite relationship such as C<requires>, C<recommends>, or
+ C<suggests> and the value provides a set of prerequisite relations. The
+ set of relations B<must> be specified as a Map of package names to
+ version ranges.
+
+ The full definition for this field is given in the L</Prereq Spec>
+ section.
+
+ =head3 provides
+
+ Example:
+
+ provides => {
+ 'Foo::Bar' => {
+ file => 'lib/Foo/Bar.pm',
+ version => '0.27_02',
+ },
+ 'Foo::Bar::Blah' => {
+ file => 'lib/Foo/Bar/Blah.pm',
+ },
+ 'Foo::Bar::Baz' => {
+ file => 'lib/Foo/Bar/Baz.pm',
+ version => '0.3',
+ },
+ }
+
+ (Spec 1.2) [optional] {Map}
+
+ This describes all packages provided by this distribution. This
+ information is used by distribution and automation mechanisms like
+ PAUSE, CPAN, metacpan.org and search.cpan.org to build indexes saying in
+ which distribution various packages can be found.
+
+ The keys of C<provides> are package names that can be found within
+ the distribution. If a package name key is provided, it must
+ have a Map with the following valid subkeys:
+
+ =over
+
+ =item file
+
+ This field is required. It must contain a Unix-style relative file path
+ from the root of the distribution directory to a file that contains or
+ generates the package. It may be given as C<META.yml> or C<META.json>
+ to claim a package for indexing without needing a C<*.pm>.
+
+ =item version
+
+ If it exists, this field must contains a I<Version> String for the
+ package. If the package does not have a C<$VERSION>, this field must
+ be omitted.
+
+ =back
+
+ =head3 resources
+
+ Example:
+
+ resources => {
+ license => [ 'http://dev.perl.org/licenses/' ],
+ homepage => 'http://sourceforge.net/projects/module-build',
+ bugtracker => {
+ web => 'http://rt.cpan.org/Public/Dist/Display.html?Name=CPAN-Meta',
+ mailto => 'meta-bugs@example.com',
+ },
+ repository => {
+ url => 'git://github.com/dagolden/cpan-meta.git',
+ web => 'http://github.com/dagolden/cpan-meta',
+ type => 'git',
+ },
+ x_twitter => 'http://twitter.com/cpan_linked/',
+ }
+
+ (Spec 2) [optional] {Map}
+
+ This field describes resources related to this distribution.
+
+ Valid subkeys include:
+
+ =over
+
+ =item homepage
+
+ The official home of this project on the web.
+
+ =item license
+
+ A List of I<URL>'s that relate to this distribution's license. As with the
+ top-level C<license> field, distribution documentation should be consulted
+ to clarify the interpretation of multiple licenses provided here.
+
+ =item bugtracker
+
+ This entry describes the bug tracking system for this distribution. It
+ is a Map with the following valid keys:
+
+ web - a URL pointing to a web front-end for the bug tracker
+ mailto - an email address to which bugs can be sent
+
+ =item repository
+
+ This entry describes the source control repository for this distribution. It
+ is a Map with the following valid keys:
+
+ url - a URL pointing to the repository itself
+ web - a URL pointing to a web front-end for the repository
+ type - a lowercase string indicating the VCS used
+
+ Because a url like C<http://myrepo.example.com/> is ambiguous as to
+ type, producers should provide a C<type> whenever a C<url> key is given.
+ The C<type> field should be the name of the most common program used
+ to work with the repository, e.g. C<git>, C<svn>, C<cvs>, C<darcs>,
+ C<bzr> or C<hg>.
+
+ =back
+
+ =head2 DEPRECATED FIELDS
+
+ =head3 build_requires
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 configure_requires
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 conflicts
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 distribution_type
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ This field indicated 'module' or 'script' but was considered
+ meaningless, since many distributions are hybrids of several kinds of
+ things.
+
+ =head3 license_uri
+
+ I<(Deprecated in Spec 1.2)> [optional] {URL}
+
+ Replaced by C<license> in C<resources>
+
+ =head3 private
+
+ I<(Deprecated in Spec 1.2)> [optional] {Map}
+
+ This field has been renamed to L</"no_index">.
+
+ =head3 recommends
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head3 requires
+
+ I<(Deprecated in Spec 2)> [optional] {String}
+
+ Replaced by C<prereqs>
+
+ =head1 VERSION NUMBERS
+
+ =head2 Version Formats
+
+ This section defines the Version type, used by several fields in the
+ CPAN Meta Spec.
+
+ Version numbers must be treated as strings, not numbers. For
+ example, C<1.200> B<must not> be serialized as C<1.2>. Version
+ comparison should be delegated to the Perl L<version> module, version
+ 0.80 or newer.
+
+ Unless otherwise specified, version numbers B<must> appear in one of two
+ formats:
+
+ =over
+
+ =item Decimal versions
+
+ Decimal versions are regular "decimal numbers", with some limitations.
+ They B<must> be non-negative and B<must> begin and end with a digit. A
+ single underscore B<may> be included, but B<must> be between two digits.
+ They B<must not> use exponential notation ("1.23e-2").
+
+ version => '1.234' # OK
+ version => '1.23_04' # OK
+
+ version => '1.23_04_05' # Illegal
+ version => '1.' # Illegal
+ version => '.1' # Illegal
+
+ =item Dotted-integer versions
+
+ Dotted-integer (also known as dotted-decimal) versions consist of
+ positive integers separated by full stop characters (i.e. "dots",
+ "periods" or "decimal points"). This are equivalent in format to Perl
+ "v-strings", with some additional restrictions on form. They must be
+ given in "normal" form, which has a leading "v" character and at least
+ three integer components. To retain a one-to-one mapping with decimal
+ versions, all components after the first B<should> be restricted to the
+ range 0 to 999. The final component B<may> be separated by an
+ underscore character instead of a period.
+
+ version => 'v1.2.3' # OK
+ version => 'v1.2_3' # OK
+ version => 'v1.2.3.4' # OK
+ version => 'v1.2.3_4' # OK
+ version => 'v2009.10.31' # OK
+
+ version => 'v1.2' # Illegal
+ version => '1.2.3' # Illegal
+ version => 'v1.2_3_4' # Illegal
+ version => 'v1.2009.10.31' # Not recommended
+
+ =back
+
+ =head2 Version Ranges
+
+ Some fields (prereq, optional_features) indicate the particular
+ version(s) of some other module that may be required as a prerequisite.
+ This section details the Version Range type used to provide this
+ information.
+
+ The simplest format for a Version Range is just the version
+ number itself, e.g. C<2.4>. This means that B<at least> version 2.4
+ must be present. To indicate that B<any> version of a prerequisite is
+ okay, even if the prerequisite doesn't define a version at all, use
+ the version C<0>.
+
+ Alternatively, a version range B<may> use the operators E<lt> (less than),
+ E<lt>= (less than or equal), E<gt> (greater than), E<gt>= (greater than
+ or equal), == (equal), and != (not equal). For example, the
+ specification C<E<lt> 2.0> means that any version of the prerequisite
+ less than 2.0 is suitable.
+
+ For more complicated situations, version specifications B<may> be AND-ed
+ together using commas. The specification C<E<gt>= 1.2, != 1.5, E<lt>
+ 2.0> indicates a version that must be B<at least> 1.2, B<less than> 2.0,
+ and B<not equal to> 1.5.
+
+ =head1 PREREQUISITES
+
+ =head2 Prereq Spec
+
+ The C<prereqs> key in the top-level metadata and within
+ C<optional_features> define the relationship between a distribution and
+ other packages. The prereq spec structure is a hierarchical data
+ structure which divides prerequisites into I<Phases> of activity in the
+ installation process and I<Relationships> that indicate how
+ prerequisites should be resolved.
+
+ For example, to specify that C<Data::Dumper> is C<required> during the
+ C<test> phase, this entry would appear in the distribution metadata:
+
+ prereqs => {
+ test => {
+ requires => {
+ 'Data::Dumper' => '2.00'
+ }
+ }
+ }
+
+ =head3 Phases
+
+ Requirements for regular use must be listed in the C<runtime> phase.
+ Other requirements should be listed in the earliest stage in which they
+ are required and consumers must accumulate and satisfy requirements
+ across phases before executing the activity. For example, C<build>
+ requirements must also be available during the C<test> phase.
+
+ before action requirements that must be met
+ ---------------- --------------------------------
+ perl Build.PL configure
+ perl Makefile.PL
+
+ make configure, runtime, build
+ Build
+
+ make test configure, runtime, build, test
+ Build test
+
+ Consumers that install the distribution must ensure that
+ I<runtime> requirements are also installed and may install
+ dependencies from other phases.
+
+ after action requirements that must be met
+ ---------------- --------------------------------
+ make install runtime
+ Build install
+
+ =over
+
+ =item configure
+
+ The configure phase occurs before any dynamic configuration has been
+ attempted. Libraries required by the configure phase B<must> be
+ available for use before the distribution building tool has been
+ executed.
+
+ =item build
+
+ The build phase is when the distribution's source code is compiled (if
+ necessary) and otherwise made ready for installation.
+
+ =item test
+
+ The test phase is when the distribution's automated test suite is run.
+ Any library that is needed only for testing and not for subsequent use
+ should be listed here.
+
+ =item runtime
+
+ The runtime phase refers not only to when the distribution's contents
+ are installed, but also to its continued use. Any library that is a
+ prerequisite for regular use of this distribution should be indicated
+ here.
+
+ =item develop
+
+ The develop phase's prereqs are libraries needed to work on the
+ distribution's source code as its author does. These tools might be
+ needed to build a release tarball, to run author-only tests, or to
+ perform other tasks related to developing new versions of the
+ distribution.
+
+ =back
+
+ =head3 Relationships
+
+ =over
+
+ =item requires
+
+ These dependencies B<must> be installed for proper completion of the
+ phase.
+
+ =item recommends
+
+ Recommended dependencies are I<strongly> encouraged and should be
+ satisfied except in resource constrained environments.
+
+ =item suggests
+
+ These dependencies are optional, but are suggested for enhanced operation
+ of the described distribution.
+
+ =item conflicts
+
+ These libraries cannot be installed when the phase is in operation.
+ This is a very rare situation, and the C<conflicts> relationship should
+ be used with great caution, or not at all.
+
+ =back
+
+ =head2 Merging and Resolving Prerequisites
+
+ Whenever metadata consumers merge prerequisites, either from different
+ phases or from C<optional_features>, they should merged in a way which
+ preserves the intended semantics of the prerequisite structure. Generally,
+ this means concatenating the version specifications using commas, as
+ described in the L<Version Ranges> section.
+
+ Another subtle error that can occur in resolving prerequisites comes from
+ the way that modules in prerequisites are indexed to distribution files on
+ CPAN. When a module is deleted from a distribution, prerequisites calling
+ for that module could indicate an older distribution should be installed,
+ potentially overwriting files from a newer distribution.
+
+ For example, as of Oct 31, 2009, the CPAN index file contained these
+ module-distribution mappings:
+
+ Class::MOP 0.94 D/DR/DROLSKY/Class-MOP-0.94.tar.gz
+ Class::MOP::Class 0.94 D/DR/DROLSKY/Class-MOP-0.94.tar.gz
+ Class::MOP::Class::Immutable 0.04 S/ST/STEVAN/Class-MOP-0.36.tar.gz
+
+ Consider the case where "Class::MOP" 0.94 is installed. If a
+ distribution specified "Class::MOP::Class::Immutable" as a prerequisite,
+ it could result in Class-MOP-0.36.tar.gz being installed, overwriting
+ any files from Class-MOP-0.94.tar.gz.
+
+ Consumers of metadata B<should> test whether prerequisites would result
+ in installed module files being "downgraded" to an older version and
+ B<may> warn users or ignore the prerequisite that would cause such a
+ result.
+
+ =head1 SERIALIZATION
+
+ Distribution metadata should be serialized (as a hashref) as
+ JSON-encoded data and packaged with distributions as the file
+ F<META.json>.
+
+ In the past, the distribution metadata structure had been packed with
+ distributions as F<META.yml>, a file in the YAML Tiny format (for which,
+ see L<YAML::Tiny>). Tools that consume distribution metadata from disk
+ should be capable of loading F<META.yml>, but should prefer F<META.json>
+ if both are found.
+
+ =head1 NOTES FOR IMPLEMENTORS
+
+ =head2 Extracting Version Numbers from Perl Modules
+
+ To get the version number from a Perl module, consumers should use the
+ C<< MM->parse_version($file) >> method provided by
+ L<ExtUtils::MakeMaker> or L<Module::Metadata>. For example, for the
+ module given by C<$mod>, the version may be retrieved in one of the
+ following ways:
+
+ # via ExtUtils::MakeMaker
+ my $file = MM->_installed_file_for_module($mod);
+ my $version = MM->parse_version($file)
+
+ The private C<_installed_file_for_module> method may be replaced with
+ other methods for locating a module in C<@INC>.
+
+ # via Module::Metadata
+ my $info = Module::Metadata->new_from_module($mod);
+ my $version = $info->version;
+
+ If only a filename is available, the following approach may be used:
+
+ # via Module::Build
+ my $info = Module::Metadata->new_from_file($file);
+ my $version = $info->version;
+
+ =head2 Comparing Version Numbers
+
+ The L<version> module provides the most reliable way to compare version
+ numbers in all the various ways they might be provided or might exist
+ within modules. Given two strings containing version numbers, C<$v1> and
+ C<$v2>, they should be converted to C<version> objects before using
+ ordinary comparison operators. For example:
+
+ use version;
+ if ( version->new($v1) <=> version->new($v2) ) {
+ print "Versions are not equal\n";
+ }
+
+ If the only comparison needed is whether an installed module is of a
+ sufficiently high version, a direct test may be done using the string
+ form of C<eval> and the C<use> function. For example, for module C<$mod>
+ and version prerequisite C<$prereq>:
+
+ if ( eval "use $mod $prereq (); 1" ) {
+ print "Module $mod version is OK.\n";
+ }
+
+ If the values of C<$mod> and C<$prereq> have not been scrubbed, however,
+ this presents security implications.
+
+ =head2 Prerequisites for dynamically configured distributions
+
+ When C<dynamic_config> is true, it is an error to presume that the
+ prerequisites given in distribution metadata will have any relationship
+ whatsoever to the actual prerequisites of the distribution.
+
+ In practice, however, one can generally expect such prerequisites to be
+ one of two things:
+
+ =over 4
+
+ =item *
+
+ The minimum prerequisites for the distribution, to which dynamic configuration will only add items
+
+ =item *
+
+ Whatever the distribution configured with on the releaser's machine at release time
+
+ =back
+
+ The second case often turns out to have identical results to the first case,
+ albeit only by accident.
+
+ As such, consumers may use this data for informational analysis, but
+ presenting it to the user as canonical or relying on it as such is
+ invariably the height of folly.
+
+ =head2 Indexing distributions a la PAUSE
+
+ While no_index tells you what must be ignored when indexing, this spec holds
+ no opinion on how you should get your initial candidate list of things to
+ possibly index. For "normal" distributions you might consider simply indexing
+ the contents of lib/, but there are many fascinating oddities on CPAN and
+ many dists from the days when it was normal to put the main .pm file in the
+ root of the distribution archive - so PAUSE currently indexes all .pm and .PL
+ files that are not either (a) specifically excluded by no_index (b) in
+ C<inc>, C<xt>, or C<t> directories, or common 'mistake' directories such as
+ C<perl5>.
+
+ Or: If you're trying to be PAUSE-like, make sure you skip C<inc>, C<xt> and
+ C<t> as well as anything marked as no_index.
+
+ Also remember: If the META file contains a provides field, you shouldn't be
+ indexing anything in the first place - just use that.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ CPAN, L<http://www.cpan.org/>
+
+ =item *
+
+ JSON, L<http://json.org/>
+
+ =item *
+
+ YAML, L<http://www.yaml.org/>
+
+ =item *
+
+ L<CPAN>
+
+ =item *
+
+ L<CPANPLUS>
+
+ =item *
+
+ L<ExtUtils::MakeMaker>
+
+ =item *
+
+ L<Module::Build>
+
+ =item *
+
+ L<Module::Install>
+
+ =back
+
+ =head1 HISTORY
+
+ Ken Williams wrote the original CPAN Meta Spec (also known as the
+ "META.yml spec") in 2003 and maintained it through several revisions
+ with input from various members of the community. In 2005, Randy
+ Sims redrafted it from HTML to POD for the version 1.2 release. Ken
+ continued to maintain the spec through version 1.4.
+
+ In late 2009, David Golden organized the version 2 proposal review
+ process. David and Ricardo Signes drafted the final version 2 spec
+ in April 2010 based on the version 1.4 spec and patches contributed
+ during the proposal process.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_SPEC
+
+$fatpacked{"CPAN/Meta/Validator.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_VALIDATOR';
+ use 5.006;
+ use strict;
+ use warnings;
+ package CPAN::Meta::Validator;
+ # VERSION
+ $CPAN::Meta::Validator::VERSION = '2.143240';
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod my $struct = decode_json_file('META.json');
+ #pod
+ #pod my $cmv = CPAN::Meta::Validator->new( $struct );
+ #pod
+ #pod unless ( $cmv->is_valid ) {
+ #pod my $msg = "Invalid META structure. Errors found:\n";
+ #pod $msg .= join( "\n", $cmv->errors );
+ #pod die $msg;
+ #pod }
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod This module validates a CPAN Meta structure against the version of the
+ #pod the specification claimed in the C<meta-spec> field of the structure.
+ #pod
+ #pod =cut
+
+ #--------------------------------------------------------------------------#
+ # This code copied and adapted from Test::CPAN::Meta
+ # by Barbie, <barbie@cpan.org> for Miss Barbell Productions,
+ # L<http://www.missbarbell.co.uk>
+ #--------------------------------------------------------------------------#
+
+ #--------------------------------------------------------------------------#
+ # Specification Definitions
+ #--------------------------------------------------------------------------#
+
+ my %known_specs = (
+ '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html',
+ '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html',
+ '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html',
+ '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html'
+ );
+ my %known_urls = map {$known_specs{$_} => $_} keys %known_specs;
+
+ my $module_map1 = { 'map' => { ':key' => { name => \&module, value => \&exversion } } };
+
+ my $module_map2 = { 'map' => { ':key' => { name => \&module, value => \&version } } };
+
+ my $no_index_2 = {
+ 'map' => { file => { list => { value => \&string } },
+ directory => { list => { value => \&string } },
+ 'package' => { list => { value => \&string } },
+ namespace => { list => { value => \&string } },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ };
+
+ my $no_index_1_3 = {
+ 'map' => { file => { list => { value => \&string } },
+ directory => { list => { value => \&string } },
+ 'package' => { list => { value => \&string } },
+ namespace => { list => { value => \&string } },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ };
+
+ my $no_index_1_2 = {
+ 'map' => { file => { list => { value => \&string } },
+ dir => { list => { value => \&string } },
+ 'package' => { list => { value => \&string } },
+ namespace => { list => { value => \&string } },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ };
+
+ my $no_index_1_1 = {
+ 'map' => { ':key' => { name => \&string, list => { value => \&string } },
+ }
+ };
+
+ my $prereq_map = {
+ map => {
+ ':key' => {
+ name => \&phase,
+ 'map' => {
+ ':key' => {
+ name => \&relation,
+ %$module_map1,
+ },
+ },
+ }
+ },
+ };
+
+ my %definitions = (
+ '2' => {
+ # REQUIRED
+ 'abstract' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'dynamic_config' => { mandatory => 1, value => \&boolean },
+ 'generated_by' => { mandatory => 1, value => \&string },
+ 'license' => { mandatory => 1, list => { value => \&license } },
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { value => \&url },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ },
+ 'name' => { mandatory => 1, value => \&string },
+ 'release_status' => { mandatory => 1, value => \&release_status },
+ 'version' => { mandatory => 1, value => \&version },
+
+ # OPTIONAL
+ 'description' => { value => \&string },
+ 'keywords' => { list => { value => \&string } },
+ 'no_index' => $no_index_2,
+ 'optional_features' => {
+ 'map' => {
+ ':key' => {
+ name => \&string,
+ 'map' => {
+ description => { value => \&string },
+ prereqs => $prereq_map,
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ }
+ }
+ },
+ 'prereqs' => $prereq_map,
+ 'provides' => {
+ 'map' => {
+ ':key' => {
+ name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ }
+ }
+ },
+ 'resources' => {
+ 'map' => {
+ license => { list => { value => \&url } },
+ homepage => { value => \&url },
+ bugtracker => {
+ 'map' => {
+ web => { value => \&url },
+ mailto => { value => \&string},
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ },
+ repository => {
+ 'map' => {
+ web => { value => \&url },
+ url => { value => \&url },
+ type => { value => \&string },
+ ':key' => { name => \&custom_2, value => \&anything },
+ }
+ },
+ ':key' => { value => \&string, name => \&custom_2 },
+ }
+ },
+
+ # CUSTOM -- additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&custom_2, value => \&anything },
+ },
+
+ '1.4' => {
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { mandatory => 1, value => \&urlspec },
+ ':key' => { name => \&string, value => \&anything },
+ },
+ },
+
+ 'name' => { mandatory => 1, value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'abstract' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'license' => { mandatory => 1, value => \&license },
+ 'generated_by' => { mandatory => 1, value => \&string },
+
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'configure_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ 'optional_features' => {
+ 'map' => {
+ ':key' => { name => \&string,
+ 'map' => { description => { value => \&string },
+ requires => $module_map1,
+ recommends => $module_map1,
+ build_requires => $module_map1,
+ conflicts => $module_map2,
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'provides' => {
+ 'map' => {
+ ':key' => { name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'no_index' => $no_index_1_3,
+ 'private' => $no_index_1_3,
+
+ 'keywords' => { list => { value => \&string } },
+
+ 'resources' => {
+ 'map' => { license => { value => \&url },
+ homepage => { value => \&url },
+ bugtracker => { value => \&url },
+ repository => { value => \&url },
+ ':key' => { value => \&string, name => \&custom_1 },
+ }
+ },
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ '1.3' => {
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { mandatory => 1, value => \&urlspec },
+ ':key' => { name => \&string, value => \&anything },
+ },
+ },
+
+ 'name' => { mandatory => 1, value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'abstract' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'license' => { mandatory => 1, value => \&license },
+ 'generated_by' => { mandatory => 1, value => \&string },
+
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ 'optional_features' => {
+ 'map' => {
+ ':key' => { name => \&string,
+ 'map' => { description => { value => \&string },
+ requires => $module_map1,
+ recommends => $module_map1,
+ build_requires => $module_map1,
+ conflicts => $module_map2,
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'provides' => {
+ 'map' => {
+ ':key' => { name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+
+ 'no_index' => $no_index_1_3,
+ 'private' => $no_index_1_3,
+
+ 'keywords' => { list => { value => \&string } },
+
+ 'resources' => {
+ 'map' => { license => { value => \&url },
+ homepage => { value => \&url },
+ bugtracker => { value => \&url },
+ repository => { value => \&url },
+ ':key' => { value => \&string, name => \&custom_1 },
+ }
+ },
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ # v1.2 is misleading, it seems to assume that a number of fields where created
+ # within v1.1, when they were created within v1.2. This may have been an
+ # original mistake, and that a v1.1 was retro fitted into the timeline, when
+ # v1.2 was originally slated as v1.1. But I could be wrong ;)
+ '1.2' => {
+ 'meta-spec' => {
+ mandatory => 1,
+ 'map' => {
+ version => { mandatory => 1, value => \&version},
+ url => { mandatory => 1, value => \&urlspec },
+ ':key' => { name => \&string, value => \&anything },
+ },
+ },
+
+
+ 'name' => { mandatory => 1, value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'license' => { mandatory => 1, value => \&license },
+ 'generated_by' => { mandatory => 1, value => \&string },
+ 'author' => { mandatory => 1, list => { value => \&string } },
+ 'abstract' => { mandatory => 1, value => \&string },
+
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'keywords' => { list => { value => \&string } },
+
+ 'private' => $no_index_1_2,
+ '$no_index' => $no_index_1_2,
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ 'optional_features' => {
+ 'map' => {
+ ':key' => { name => \&string,
+ 'map' => { description => { value => \&string },
+ requires => $module_map1,
+ recommends => $module_map1,
+ build_requires => $module_map1,
+ conflicts => $module_map2,
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'provides' => {
+ 'map' => {
+ ':key' => { name => \&module,
+ 'map' => {
+ file => { mandatory => 1, value => \&file },
+ version => { value => \&version },
+ ':key' => { name => \&string, value => \&anything },
+ }
+ }
+ }
+ },
+
+ 'resources' => {
+ 'map' => { license => { value => \&url },
+ homepage => { value => \&url },
+ bugtracker => { value => \&url },
+ repository => { value => \&url },
+ ':key' => { value => \&string, name => \&custom_1 },
+ }
+ },
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ # note that the 1.1 spec only specifies 'version' as mandatory
+ '1.1' => {
+ 'name' => { value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'license' => { value => \&license },
+ 'generated_by' => { value => \&string },
+
+ 'license_uri' => { value => \&url },
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'private' => $no_index_1_1,
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+
+ # note that the 1.0 spec doesn't specify optional or mandatory fields
+ # but we will treat version as mandatory since otherwise META 1.0 is
+ # completely arbitrary and pointless
+ '1.0' => {
+ 'name' => { value => \&string },
+ 'version' => { mandatory => 1, value => \&version },
+ 'license' => { value => \&license },
+ 'generated_by' => { value => \&string },
+
+ 'license_uri' => { value => \&url },
+ 'distribution_type' => { value => \&string },
+ 'dynamic_config' => { value => \&boolean },
+
+ 'requires' => $module_map1,
+ 'recommends' => $module_map1,
+ 'build_requires' => $module_map1,
+ 'conflicts' => $module_map2,
+
+ # additional user defined key/value pairs
+ # note we can only validate the key name, as the structure is user defined
+ ':key' => { name => \&string, value => \&anything },
+ },
+ );
+
+ #--------------------------------------------------------------------------#
+ # Code
+ #--------------------------------------------------------------------------#
+
+ #pod =method new
+ #pod
+ #pod my $cmv = CPAN::Meta::Validator->new( $struct )
+ #pod
+ #pod The constructor must be passed a metadata structure.
+ #pod
+ #pod =cut
+
+ sub new {
+ my ($class,$data) = @_;
+
+ # create an attributes hash
+ my $self = {
+ 'data' => $data,
+ 'spec' => eval { $data->{'meta-spec'}{'version'} } || "1.0",
+ 'errors' => undef,
+ };
+
+ # create the object
+ return bless $self, $class;
+ }
+
+ #pod =method is_valid
+ #pod
+ #pod if ( $cmv->is_valid ) {
+ #pod ...
+ #pod }
+ #pod
+ #pod Returns a boolean value indicating whether the metadata provided
+ #pod is valid.
+ #pod
+ #pod =cut
+
+ sub is_valid {
+ my $self = shift;
+ my $data = $self->{data};
+ my $spec_version = $self->{spec};
+ $self->check_map($definitions{$spec_version},$data);
+ return ! $self->errors;
+ }
+
+ #pod =method errors
+ #pod
+ #pod warn( join "\n", $cmv->errors );
+ #pod
+ #pod Returns a list of errors seen during validation.
+ #pod
+ #pod =cut
+
+ sub errors {
+ my $self = shift;
+ return () unless(defined $self->{errors});
+ return @{$self->{errors}};
+ }
+
+ #pod =begin :internals
+ #pod
+ #pod =head2 Check Methods
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod check_map($spec,$data)
+ #pod
+ #pod Checks whether a map (or hash) part of the data structure conforms to the
+ #pod appropriate specification definition.
+ #pod
+ #pod =item *
+ #pod
+ #pod check_list($spec,$data)
+ #pod
+ #pod Checks whether a list (or array) part of the data structure conforms to
+ #pod the appropriate specification definition.
+ #pod
+ #pod =item *
+ #pod
+ #pod =back
+ #pod
+ #pod =cut
+
+ my $spec_error = "Missing validation action in specification. "
+ . "Must be one of 'map', 'list', or 'value'";
+
+ sub check_map {
+ my ($self,$spec,$data) = @_;
+
+ if(ref($spec) ne 'HASH') {
+ $self->_error( "Unknown META specification, cannot validate." );
+ return;
+ }
+
+ if(ref($data) ne 'HASH') {
+ $self->_error( "Expected a map structure from string or file." );
+ return;
+ }
+
+ for my $key (keys %$spec) {
+ next unless($spec->{$key}->{mandatory});
+ next if(defined $data->{$key});
+ push @{$self->{stack}}, $key;
+ $self->_error( "Missing mandatory field, '$key'" );
+ pop @{$self->{stack}};
+ }
+
+ for my $key (keys %$data) {
+ push @{$self->{stack}}, $key;
+ if($spec->{$key}) {
+ if($spec->{$key}{value}) {
+ $spec->{$key}{value}->($self,$key,$data->{$key});
+ } elsif($spec->{$key}{'map'}) {
+ $self->check_map($spec->{$key}{'map'},$data->{$key});
+ } elsif($spec->{$key}{'list'}) {
+ $self->check_list($spec->{$key}{'list'},$data->{$key});
+ } else {
+ $self->_error( "$spec_error for '$key'" );
+ }
+
+ } elsif ($spec->{':key'}) {
+ $spec->{':key'}{name}->($self,$key,$key);
+ if($spec->{':key'}{value}) {
+ $spec->{':key'}{value}->($self,$key,$data->{$key});
+ } elsif($spec->{':key'}{'map'}) {
+ $self->check_map($spec->{':key'}{'map'},$data->{$key});
+ } elsif($spec->{':key'}{'list'}) {
+ $self->check_list($spec->{':key'}{'list'},$data->{$key});
+ } else {
+ $self->_error( "$spec_error for ':key'" );
+ }
+
+
+ } else {
+ $self->_error( "Unknown key, '$key', found in map structure" );
+ }
+ pop @{$self->{stack}};
+ }
+ }
+
+ sub check_list {
+ my ($self,$spec,$data) = @_;
+
+ if(ref($data) ne 'ARRAY') {
+ $self->_error( "Expected a list structure" );
+ return;
+ }
+
+ if(defined $spec->{mandatory}) {
+ if(!defined $data->[0]) {
+ $self->_error( "Missing entries from mandatory list" );
+ }
+ }
+
+ for my $value (@$data) {
+ push @{$self->{stack}}, $value || "<undef>";
+ if(defined $spec->{value}) {
+ $spec->{value}->($self,'list',$value);
+ } elsif(defined $spec->{'map'}) {
+ $self->check_map($spec->{'map'},$value);
+ } elsif(defined $spec->{'list'}) {
+ $self->check_list($spec->{'list'},$value);
+ } elsif ($spec->{':key'}) {
+ $self->check_map($spec,$value);
+ } else {
+ $self->_error( "$spec_error associated with '$self->{stack}[-2]'" );
+ }
+ pop @{$self->{stack}};
+ }
+ }
+
+ #pod =head2 Validator Methods
+ #pod
+ #pod =over
+ #pod
+ #pod =item *
+ #pod
+ #pod header($self,$key,$value)
+ #pod
+ #pod Validates that the header is valid.
+ #pod
+ #pod Note: No longer used as we now read the data structure, not the file.
+ #pod
+ #pod =item *
+ #pod
+ #pod url($self,$key,$value)
+ #pod
+ #pod Validates that a given value is in an acceptable URL format
+ #pod
+ #pod =item *
+ #pod
+ #pod urlspec($self,$key,$value)
+ #pod
+ #pod Validates that the URL to a META specification is a known one.
+ #pod
+ #pod =item *
+ #pod
+ #pod string_or_undef($self,$key,$value)
+ #pod
+ #pod Validates that the value is either a string or an undef value. Bit of a
+ #pod catchall function for parts of the data structure that are completely user
+ #pod defined.
+ #pod
+ #pod =item *
+ #pod
+ #pod string($self,$key,$value)
+ #pod
+ #pod Validates that a string exists for the given key.
+ #pod
+ #pod =item *
+ #pod
+ #pod file($self,$key,$value)
+ #pod
+ #pod Validate that a file is passed for the given key. This may be made more
+ #pod thorough in the future. For now it acts like \&string.
+ #pod
+ #pod =item *
+ #pod
+ #pod exversion($self,$key,$value)
+ #pod
+ #pod Validates a list of versions, e.g. '<= 5, >=2, ==3, !=4, >1, <6, 0'.
+ #pod
+ #pod =item *
+ #pod
+ #pod version($self,$key,$value)
+ #pod
+ #pod Validates a single version string. Versions of the type '5.8.8' and '0.00_00'
+ #pod are both valid. A leading 'v' like 'v1.2.3' is also valid.
+ #pod
+ #pod =item *
+ #pod
+ #pod boolean($self,$key,$value)
+ #pod
+ #pod Validates for a boolean value. Currently these values are '1', '0', 'true',
+ #pod 'false', however the latter 2 may be removed.
+ #pod
+ #pod =item *
+ #pod
+ #pod license($self,$key,$value)
+ #pod
+ #pod Validates that a value is given for the license. Returns 1 if an known license
+ #pod type, or 2 if a value is given but the license type is not a recommended one.
+ #pod
+ #pod =item *
+ #pod
+ #pod custom_1($self,$key,$value)
+ #pod
+ #pod Validates that the given key is in CamelCase, to indicate a user defined
+ #pod keyword and only has characters in the class [-_a-zA-Z]. In version 1.X
+ #pod of the spec, this was only explicitly stated for 'resources'.
+ #pod
+ #pod =item *
+ #pod
+ #pod custom_2($self,$key,$value)
+ #pod
+ #pod Validates that the given key begins with 'x_' or 'X_', to indicate a user
+ #pod defined keyword and only has characters in the class [-_a-zA-Z]
+ #pod
+ #pod =item *
+ #pod
+ #pod identifier($self,$key,$value)
+ #pod
+ #pod Validates that key is in an acceptable format for the META specification,
+ #pod for an identifier, i.e. any that matches the regular expression
+ #pod qr/[a-z][a-z_]/i.
+ #pod
+ #pod =item *
+ #pod
+ #pod module($self,$key,$value)
+ #pod
+ #pod Validates that a given key is in an acceptable module name format, e.g.
+ #pod 'Test::CPAN::Meta::Version'.
+ #pod
+ #pod =back
+ #pod
+ #pod =end :internals
+ #pod
+ #pod =cut
+
+ sub header {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value && $value =~ /^--- #YAML:1.0/);
+ }
+ $self->_error( "file does not have a valid YAML header." );
+ return 0;
+ }
+
+ sub release_status {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ my $version = $self->{data}{version} || '';
+ if ( $version =~ /_/ ) {
+ return 1 if ( $value =~ /\A(?:testing|unstable)\z/ );
+ $self->_error( "'$value' for '$key' is invalid for version '$version'" );
+ }
+ else {
+ return 1 if ( $value =~ /\A(?:stable|testing|unstable)\z/ );
+ $self->_error( "'$value' for '$key' is invalid" );
+ }
+ }
+ else {
+ $self->_error( "'$key' is not defined" );
+ }
+ return 0;
+ }
+
+ # _uri_split taken from URI::Split by Gisle Aas, Copyright 2003
+ sub _uri_split {
+ return $_[0] =~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,;
+ }
+
+ sub url {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ my ($scheme, $auth, $path, $query, $frag) = _uri_split($value);
+ unless ( defined $scheme && length $scheme ) {
+ $self->_error( "'$value' for '$key' does not have a URL scheme" );
+ return 0;
+ }
+ unless ( defined $auth && length $auth ) {
+ $self->_error( "'$value' for '$key' does not have a URL authority" );
+ return 0;
+ }
+ return 1;
+ }
+ $value ||= '';
+ $self->_error( "'$value' for '$key' is not a valid URL." );
+ return 0;
+ }
+
+ sub urlspec {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value && $known_specs{$self->{spec}} eq $value);
+ if($value && $known_urls{$value}) {
+ $self->_error( 'META specification URL does not match version' );
+ return 0;
+ }
+ }
+ $self->_error( 'Unknown META specification' );
+ return 0;
+ }
+
+ sub anything { return 1 }
+
+ sub string {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value || $value =~ /^0$/);
+ }
+ $self->_error( "value is an undefined string" );
+ return 0;
+ }
+
+ sub string_or_undef {
+ my ($self,$key,$value) = @_;
+ return 1 unless(defined $value);
+ return 1 if($value || $value =~ /^0$/);
+ $self->_error( "No string defined for '$key'" );
+ return 0;
+ }
+
+ sub file {
+ my ($self,$key,$value) = @_;
+ return 1 if(defined $value);
+ $self->_error( "No file defined for '$key'" );
+ return 0;
+ }
+
+ sub exversion {
+ my ($self,$key,$value) = @_;
+ if(defined $value && ($value || $value =~ /0/)) {
+ my $pass = 1;
+ for(split(",",$value)) { $self->version($key,$_) or ($pass = 0); }
+ return $pass;
+ }
+ $value = '<undef>' unless(defined $value);
+ $self->_error( "'$value' for '$key' is not a valid version." );
+ return 0;
+ }
+
+ sub version {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 0 unless($value || $value =~ /0/);
+ return 1 if($value =~ /^\s*((<|<=|>=|>|!=|==)\s*)?v?\d+((\.\d+((_|\.)\d+)?)?)/);
+ } else {
+ $value = '<undef>';
+ }
+ $self->_error( "'$value' for '$key' is not a valid version." );
+ return 0;
+ }
+
+ sub boolean {
+ my ($self,$key,$value) = @_;
+ if(defined $value) {
+ return 1 if($value =~ /^(0|1|true|false)$/);
+ } else {
+ $value = '<undef>';
+ }
+ $self->_error( "'$value' for '$key' is not a boolean value." );
+ return 0;
+ }
+
+ my %v1_licenses = (
+ 'perl' => 'http://dev.perl.org/licenses/',
+ 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php',
+ 'apache' => 'http://apache.org/licenses/LICENSE-2.0',
+ 'artistic' => 'http://opensource.org/licenses/artistic-license.php',
+ 'artistic_2' => 'http://opensource.org/licenses/artistic-license-2.0.php',
+ 'lgpl' => 'http://www.opensource.org/licenses/lgpl-license.php',
+ 'bsd' => 'http://www.opensource.org/licenses/bsd-license.php',
+ 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php',
+ 'mit' => 'http://opensource.org/licenses/mit-license.php',
+ 'mozilla' => 'http://opensource.org/licenses/mozilla1.1.php',
+ 'open_source' => undef,
+ 'unrestricted' => undef,
+ 'restrictive' => undef,
+ 'unknown' => undef,
+ );
+
+ my %v2_licenses = map { $_ => 1 } qw(
+ agpl_3
+ apache_1_1
+ apache_2_0
+ artistic_1
+ artistic_2
+ bsd
+ freebsd
+ gfdl_1_2
+ gfdl_1_3
+ gpl_1
+ gpl_2
+ gpl_3
+ lgpl_2_1
+ lgpl_3_0
+ mit
+ mozilla_1_0
+ mozilla_1_1
+ openssl
+ perl_5
+ qpl_1_0
+ ssleay
+ sun
+ zlib
+ open_source
+ restricted
+ unrestricted
+ unknown
+ );
+
+ sub license {
+ my ($self,$key,$value) = @_;
+ my $licenses = $self->{spec} < 2 ? \%v1_licenses : \%v2_licenses;
+ if(defined $value) {
+ return 1 if($value && exists $licenses->{$value});
+ } else {
+ $value = '<undef>';
+ }
+ $self->_error( "License '$value' is invalid" );
+ return 0;
+ }
+
+ sub custom_1 {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ # a valid user defined key should be alphabetic
+ # and contain at least one capital case letter.
+ return 1 if($key && $key =~ /^[_a-z]+$/i && $key =~ /[A-Z]/);
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Custom resource '$key' must be in CamelCase." );
+ return 0;
+ }
+
+ sub custom_2 {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if($key && $key =~ /^x_/i); # user defined
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Custom key '$key' must begin with 'x_' or 'X_'." );
+ return 0;
+ }
+
+ sub identifier {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if($key && $key =~ /^([a-z][_a-z]+)$/i); # spec 2.0 defined
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal identifier." );
+ return 0;
+ }
+
+ sub module {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if($key && $key =~ /^[A-Za-z0-9_]+(::[A-Za-z0-9_]+)*$/);
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal module name." );
+ return 0;
+ }
+
+ my @valid_phases = qw/ configure build test runtime develop /;
+ sub phase {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if( length $key && grep { $key eq $_ } @valid_phases );
+ return 1 if $key =~ /x_/i;
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal phase." );
+ return 0;
+ }
+
+ my @valid_relations = qw/ requires recommends suggests conflicts /;
+ sub relation {
+ my ($self,$key) = @_;
+ if(defined $key) {
+ return 1 if( length $key && grep { $key eq $_ } @valid_relations );
+ return 1 if $key =~ /x_/i;
+ } else {
+ $key = '<undef>';
+ }
+ $self->_error( "Key '$key' is not a legal prereq relationship." );
+ return 0;
+ }
+
+ sub _error {
+ my $self = shift;
+ my $mess = shift;
+
+ $mess .= ' ('.join(' -> ',@{$self->{stack}}).')' if($self->{stack});
+ $mess .= " [Validation: $self->{spec}]";
+
+ push @{$self->{errors}}, $mess;
+ }
+
+ 1;
+
+ # ABSTRACT: validate CPAN distribution metadata structures
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::Validator - validate CPAN distribution metadata structures
+
+ =head1 VERSION
+
+ version 2.143240
+
+ =head1 SYNOPSIS
+
+ my $struct = decode_json_file('META.json');
+
+ my $cmv = CPAN::Meta::Validator->new( $struct );
+
+ unless ( $cmv->is_valid ) {
+ my $msg = "Invalid META structure. Errors found:\n";
+ $msg .= join( "\n", $cmv->errors );
+ die $msg;
+ }
+
+ =head1 DESCRIPTION
+
+ This module validates a CPAN Meta structure against the version of the
+ the specification claimed in the C<meta-spec> field of the structure.
+
+ =head1 METHODS
+
+ =head2 new
+
+ my $cmv = CPAN::Meta::Validator->new( $struct )
+
+ The constructor must be passed a metadata structure.
+
+ =head2 is_valid
+
+ if ( $cmv->is_valid ) {
+ ...
+ }
+
+ Returns a boolean value indicating whether the metadata provided
+ is valid.
+
+ =head2 errors
+
+ warn( join "\n", $cmv->errors );
+
+ Returns a list of errors seen during validation.
+
+ =begin :internals
+
+ =head2 Check Methods
+
+ =over
+
+ =item *
+
+ check_map($spec,$data)
+
+ Checks whether a map (or hash) part of the data structure conforms to the
+ appropriate specification definition.
+
+ =item *
+
+ check_list($spec,$data)
+
+ Checks whether a list (or array) part of the data structure conforms to
+ the appropriate specification definition.
+
+ =item *
+
+ =back
+
+ =head2 Validator Methods
+
+ =over
+
+ =item *
+
+ header($self,$key,$value)
+
+ Validates that the header is valid.
+
+ Note: No longer used as we now read the data structure, not the file.
+
+ =item *
+
+ url($self,$key,$value)
+
+ Validates that a given value is in an acceptable URL format
+
+ =item *
+
+ urlspec($self,$key,$value)
+
+ Validates that the URL to a META specification is a known one.
+
+ =item *
+
+ string_or_undef($self,$key,$value)
+
+ Validates that the value is either a string or an undef value. Bit of a
+ catchall function for parts of the data structure that are completely user
+ defined.
+
+ =item *
+
+ string($self,$key,$value)
+
+ Validates that a string exists for the given key.
+
+ =item *
+
+ file($self,$key,$value)
+
+ Validate that a file is passed for the given key. This may be made more
+ thorough in the future. For now it acts like \&string.
+
+ =item *
+
+ exversion($self,$key,$value)
+
+ Validates a list of versions, e.g. '<= 5, >=2, ==3, !=4, >1, <6, 0'.
+
+ =item *
+
+ version($self,$key,$value)
+
+ Validates a single version string. Versions of the type '5.8.8' and '0.00_00'
+ are both valid. A leading 'v' like 'v1.2.3' is also valid.
+
+ =item *
+
+ boolean($self,$key,$value)
+
+ Validates for a boolean value. Currently these values are '1', '0', 'true',
+ 'false', however the latter 2 may be removed.
+
+ =item *
+
+ license($self,$key,$value)
+
+ Validates that a value is given for the license. Returns 1 if an known license
+ type, or 2 if a value is given but the license type is not a recommended one.
+
+ =item *
+
+ custom_1($self,$key,$value)
+
+ Validates that the given key is in CamelCase, to indicate a user defined
+ keyword and only has characters in the class [-_a-zA-Z]. In version 1.X
+ of the spec, this was only explicitly stated for 'resources'.
+
+ =item *
+
+ custom_2($self,$key,$value)
+
+ Validates that the given key begins with 'x_' or 'X_', to indicate a user
+ defined keyword and only has characters in the class [-_a-zA-Z]
+
+ =item *
+
+ identifier($self,$key,$value)
+
+ Validates that key is in an acceptable format for the META specification,
+ for an identifier, i.e. any that matches the regular expression
+ qr/[a-z][a-z_]/i.
+
+ =item *
+
+ module($self,$key,$value)
+
+ Validates that a given key is in an acceptable module name format, e.g.
+ 'Test::CPAN::Meta::Version'.
+
+ =back
+
+ =end :internals
+
+ =for Pod::Coverage anything boolean check_list custom_1 custom_2 exversion file
+ identifier license module phase relation release_status string string_or_undef
+ url urlspec version header check_map
+
+ =head1 BUGS
+
+ Please report any bugs or feature using the CPAN Request Tracker.
+ Bugs can be submitted through the web interface at
+ L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta>
+
+ When submitting a bug or request, please include a test-file or a patch to an
+ existing test-file that illustrates the bug or desired feature.
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+CPAN_META_VALIDATOR
+
+$fatpacked{"CPAN/Meta/YAML.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CPAN_META_YAML';
+ use 5.008001; # sane UTF-8 support
+ use strict;
+ use warnings;
+ package CPAN::Meta::YAML;
+ $CPAN::Meta::YAML::VERSION = '0.011';
+ BEGIN {
+ $CPAN::Meta::YAML::AUTHORITY = 'cpan:ADAMK';
+ }
+ # git description: v1.59-TRIAL-1-g33d9cd2
+ ; # original $VERSION removed by Doppelgaenger
+ # XXX-INGY is 5.8.1 too old/broken for utf8?
+ # XXX-XDG Lancaster consensus was that it was sufficient until
+ # proven otherwise
+
+
+ #####################################################################
+ # The CPAN::Meta::YAML API.
+ #
+ # These are the currently documented API functions/methods and
+ # exports:
+
+ use Exporter;
+ our @ISA = qw{ Exporter };
+ our @EXPORT = qw{ Load Dump };
+ our @EXPORT_OK = qw{ LoadFile DumpFile freeze thaw };
+
+ ###
+ # Functional/Export API:
+
+ sub Dump {
+ return CPAN::Meta::YAML->new(@_)->_dump_string;
+ }
+
+ # XXX-INGY Returning last document seems a bad behavior.
+ # XXX-XDG I think first would seem more natural, but I don't know
+ # that it's worth changing now
+ sub Load {
+ my $self = CPAN::Meta::YAML->_load_string(@_);
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # To match YAML.pm, return the last document
+ return $self->[-1];
+ }
+ }
+
+ # XXX-INGY Do we really need freeze and thaw?
+ # XXX-XDG I don't think so. I'd support deprecating them.
+ BEGIN {
+ *freeze = \&Dump;
+ *thaw = \&Load;
+ }
+
+ sub DumpFile {
+ my $file = shift;
+ return CPAN::Meta::YAML->new(@_)->_dump_file($file);
+ }
+
+ sub LoadFile {
+ my $file = shift;
+ my $self = CPAN::Meta::YAML->_load_file($file);
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # Return only the last document to match YAML.pm,
+ return $self->[-1];
+ }
+ }
+
+
+ ###
+ # Object Oriented API:
+
+ # Create an empty CPAN::Meta::YAML object
+ # XXX-INGY Why do we use ARRAY object?
+ # NOTE: I get it now, but I think it's confusing and not needed.
+ # Will change it on a branch later, for review.
+ #
+ # XXX-XDG I don't support changing it yet. It's a very well-documented
+ # "API" of CPAN::Meta::YAML. I'd support deprecating it, but Adam suggested
+ # we not change it until YAML.pm's own OO API is established so that
+ # users only have one API change to digest, not two
+ sub new {
+ my $class = shift;
+ bless [ @_ ], $class;
+ }
+
+ # XXX-INGY It probably doesn't matter, and it's probably too late to
+ # change, but 'read/write' are the wrong names. Read and Write
+ # are actions that take data from storage to memory
+ # characters/strings. These take the data to/from storage to native
+ # Perl objects, which the terms dump and load are meant. As long as
+ # this is a legacy quirk to CPAN::Meta::YAML it's ok, but I'd prefer not
+ # to add new {read,write}_* methods to this API.
+
+ sub read_string {
+ my $self = shift;
+ $self->_load_string(@_);
+ }
+
+ sub write_string {
+ my $self = shift;
+ $self->_dump_string(@_);
+ }
+
+ sub read {
+ my $self = shift;
+ $self->_load_file(@_);
+ }
+
+ sub write {
+ my $self = shift;
+ $self->_dump_file(@_);
+ }
+
+
+
+
+ #####################################################################
+ # Constants
+
+ # Printed form of the unprintable characters in the lowest range
+ # of ASCII characters, listed by ASCII ordinal position.
+ my @UNPRINTABLE = qw(
+ 0 x01 x02 x03 x04 x05 x06 a
+ b t n v f r x0E x0F
+ x10 x11 x12 x13 x14 x15 x16 x17
+ x18 x19 x1A e x1C x1D x1E x1F
+ );
+
+ # Printable characters for escapes
+ my %UNESCAPES = (
+ 0 => "\x00", z => "\x00", N => "\x85",
+ a => "\x07", b => "\x08", t => "\x09",
+ n => "\x0a", v => "\x0b", f => "\x0c",
+ r => "\x0d", e => "\x1b", '\\' => '\\',
+ );
+
+ # XXX-INGY
+ # I(ngy) need to decide if these values should be quoted in
+ # CPAN::Meta::YAML or not. Probably yes.
+
+ # These 3 values have special meaning when unquoted and using the
+ # default YAML schema. They need quotes if they are strings.
+ my %QUOTE = map { $_ => 1 } qw{
+ null true false
+ };
+
+ # The commented out form is simpler, but overloaded the Perl regex
+ # engine due to recursion and backtracking problems on strings
+ # larger than 32,000ish characters. Keep it for reference purposes.
+ # qr/\"((?:\\.|[^\"])*)\"/
+ my $re_capture_double_quoted = qr/\"([^\\"]*(?:\\.[^\\"]*)*)\"/;
+ my $re_capture_single_quoted = qr/\'([^\']*(?:\'\'[^\']*)*)\'/;
+ # unquoted re gets trailing space that needs to be stripped
+ my $re_capture_unquoted_key = qr/([^:]+(?::+\S[^:]*)*)(?=\s*\:(?:\s+|$))/;
+ my $re_trailing_comment = qr/(?:\s+\#.*)?/;
+ my $re_key_value_separator = qr/\s*:(?:\s+(?:\#.*)?|$)/;
+
+
+
+
+
+ #####################################################################
+ # CPAN::Meta::YAML Implementation.
+ #
+ # These are the private methods that do all the work. They may change
+ # at any time.
+
+
+ ###
+ # Loader functions:
+
+ # Create an object from a file
+ sub _load_file {
+ my $class = ref $_[0] ? ref shift : shift;
+
+ # Check the file
+ my $file = shift or $class->_error( 'You did not specify a file name' );
+ $class->_error( "File '$file' does not exist" )
+ unless -e $file;
+ $class->_error( "'$file' is a directory, not a file" )
+ unless -f _;
+ $class->_error( "Insufficient permissions to read '$file'" )
+ unless -r _;
+
+ # Open unbuffered with strict UTF-8 decoding and no translation layers
+ open( my $fh, "<:unix:encoding(UTF-8)", $file );
+ unless ( $fh ) {
+ $class->_error("Failed to open file '$file': $!");
+ }
+
+ # flock if available (or warn if not possible for OS-specific reasons)
+ if ( _can_flock() ) {
+ flock( $fh, Fcntl::LOCK_SH() )
+ or warn "Couldn't lock '$file' for reading: $!";
+ }
+
+ # slurp the contents
+ my $contents = eval {
+ use warnings FATAL => 'utf8';
+ local $/;
+ <$fh>
+ };
+ if ( my $err = $@ ) {
+ $class->_error("Error reading from file '$file': $err");
+ }
+
+ # close the file (release the lock)
+ unless ( close $fh ) {
+ $class->_error("Failed to close file '$file': $!");
+ }
+
+ $class->_load_string( $contents );
+ }
+
+ # Create an object from a string
+ sub _load_string {
+ my $class = ref $_[0] ? ref shift : shift;
+ my $self = bless [], $class;
+ my $string = $_[0];
+ eval {
+ unless ( defined $string ) {
+ die \"Did not provide a string to load";
+ }
+
+ # Check if Perl has it marked as characters, but it's internally
+ # inconsistent. E.g. maybe latin1 got read on a :utf8 layer
+ if ( utf8::is_utf8($string) && ! utf8::valid($string) ) {
+ die \<<'...';
+ Read an invalid UTF-8 string (maybe mixed UTF-8 and 8-bit character set).
+ Did you decode with lax ":utf8" instead of strict ":encoding(UTF-8)"?
+ ...
+ }
+
+ # Ensure Unicode character semantics, even for 0x80-0xff
+ utf8::upgrade($string);
+
+ # Check for and strip any leading UTF-8 BOM
+ $string =~ s/^\x{FEFF}//;
+
+ # Check for some special cases
+ return $self unless length $string;
+
+ # Split the file into lines
+ my @lines = grep { ! /^\s*(?:\#.*)?\z/ }
+ split /(?:\015{1,2}\012|\015|\012)/, $string;
+
+ # Strip the initial YAML header
+ @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines;
+
+ # A nibbling parser
+ my $in_document = 0;
+ while ( @lines ) {
+ # Do we have a document header?
+ if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) {
+ # Handle scalar documents
+ shift @lines;
+ if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) {
+ push @$self,
+ $self->_load_scalar( "$1", [ undef ], \@lines );
+ next;
+ }
+ $in_document = 1;
+ }
+
+ if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) {
+ # A naked document
+ push @$self, undef;
+ while ( @lines and $lines[0] !~ /^---/ ) {
+ shift @lines;
+ }
+ $in_document = 0;
+
+ # XXX The final '-+$' is to look for -- which ends up being an
+ # error later.
+ } elsif ( ! $in_document && @$self ) {
+ # only the first document can be explicit
+ die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'";
+ } elsif ( $lines[0] =~ /^\s*\-(?:\s|$|-+$)/ ) {
+ # An array at the root
+ my $document = [ ];
+ push @$self, $document;
+ $self->_load_array( $document, [ 0 ], \@lines );
+
+ } elsif ( $lines[0] =~ /^(\s*)\S/ ) {
+ # A hash at the root
+ my $document = { };
+ push @$self, $document;
+ $self->_load_hash( $document, [ length($1) ], \@lines );
+
+ } else {
+ # Shouldn't get here. @lines have whitespace-only lines
+ # stripped, and previous match is a line with any
+ # non-whitespace. So this clause should only be reachable via
+ # a perlbug where \s is not symmetric with \S
+
+ # uncoverable statement
+ die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'";
+ }
+ }
+ };
+ if ( ref $@ eq 'SCALAR' ) {
+ $self->_error(${$@});
+ } elsif ( $@ ) {
+ $self->_error($@);
+ }
+
+ return $self;
+ }
+
+ sub _unquote_single {
+ my ($self, $string) = @_;
+ return '' unless length $string;
+ $string =~ s/\'\'/\'/g;
+ return $string;
+ }
+
+ sub _unquote_double {
+ my ($self, $string) = @_;
+ return '' unless length $string;
+ $string =~ s/\\"/"/g;
+ $string =~
+ s{\\([Nnever\\fartz0b]|x([0-9a-fA-F]{2}))}
+ {(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}}gex;
+ return $string;
+ }
+
+ # Load a YAML scalar string to the actual Perl scalar
+ sub _load_scalar {
+ my ($self, $string, $indent, $lines) = @_;
+
+ # Trim trailing whitespace
+ $string =~ s/\s*\z//;
+
+ # Explitic null/undef
+ return undef if $string eq '~';
+
+ # Single quote
+ if ( $string =~ /^$re_capture_single_quoted$re_trailing_comment\z/ ) {
+ return $self->_unquote_single($1);
+ }
+
+ # Double quote.
+ if ( $string =~ /^$re_capture_double_quoted$re_trailing_comment\z/ ) {
+ return $self->_unquote_double($1);
+ }
+
+ # Special cases
+ if ( $string =~ /^[\'\"!&]/ ) {
+ die \"CPAN::Meta::YAML does not support a feature in line '$string'";
+ }
+ return {} if $string =~ /^{}(?:\s+\#.*)?\z/;
+ return [] if $string =~ /^\[\](?:\s+\#.*)?\z/;
+
+ # Regular unquoted string
+ if ( $string !~ /^[>|]/ ) {
+ die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'"
+ if $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or
+ $string =~ /:(?:\s|$)/;
+ $string =~ s/\s+#.*\z//;
+ return $string;
+ }
+
+ # Error
+ die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines;
+
+ # Check the indent depth
+ $lines->[0] =~ /^(\s*)/;
+ $indent->[-1] = length("$1");
+ if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) {
+ die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'";
+ }
+
+ # Pull the lines
+ my @multiline = ();
+ while ( @$lines ) {
+ $lines->[0] =~ /^(\s*)/;
+ last unless length($1) >= $indent->[-1];
+ push @multiline, substr(shift(@$lines), length($1));
+ }
+
+ my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n";
+ my $t = (substr($string, 1, 1) eq '-') ? '' : "\n";
+ return join( $j, @multiline ) . $t;
+ }
+
+ # Load an array
+ sub _load_array {
+ my ($self, $array, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'";
+ }
+
+ if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) {
+ # Inline nested hash
+ my $indent2 = length("$1");
+ $lines->[0] =~ s/-/ /;
+ push @$array, { };
+ $self->_load_hash( $array->[-1], [ @$indent, $indent2 ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) {
+ shift @$lines;
+ unless ( @$lines ) {
+ push @$array, undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)\-/ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] == $indent2 ) {
+ # Null array entry
+ push @$array, undef;
+ } else {
+ # Naked indenter
+ push @$array, [ ];
+ $self->_load_array(
+ $array->[-1], [ @$indent, $indent2 ], $lines
+ );
+ }
+
+ } elsif ( $lines->[0] =~ /^(\s*)\S/ ) {
+ push @$array, { };
+ $self->_load_hash(
+ $array->[-1], [ @$indent, length("$1") ], $lines
+ );
+
+ } else {
+ die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'";
+ }
+
+ } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) {
+ # Array entry with a value
+ shift @$lines;
+ push @$array, $self->_load_scalar(
+ "$2", [ @$indent, undef ], $lines
+ );
+
+ } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) {
+ # This is probably a structure like the following...
+ # ---
+ # foo:
+ # - list
+ # bar: value
+ #
+ # ... so lets return and let the hash parser handle it
+ return 1;
+
+ } else {
+ die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'";
+ }
+ }
+
+ return 1;
+ }
+
+ # Load a hash
+ sub _load_hash {
+ my ($self, $hash, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'";
+ }
+
+ # Find the key
+ my $key;
+
+ # Quoted keys
+ if ( $lines->[0] =~
+ s/^\s*$re_capture_single_quoted$re_key_value_separator//
+ ) {
+ $key = $self->_unquote_single($1);
+ }
+ elsif ( $lines->[0] =~
+ s/^\s*$re_capture_double_quoted$re_key_value_separator//
+ ) {
+ $key = $self->_unquote_double($1);
+ }
+ elsif ( $lines->[0] =~
+ s/^\s*$re_capture_unquoted_key$re_key_value_separator//
+ ) {
+ $key = $1;
+ $key =~ s/\s+$//;
+ }
+ elsif ( $lines->[0] =~ /^\s*\?/ ) {
+ die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'";
+ }
+ else {
+ die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'";
+ }
+
+ # Do we have a value?
+ if ( length $lines->[0] ) {
+ # Yes
+ $hash->{$key} = $self->_load_scalar(
+ shift(@$lines), [ @$indent, undef ], $lines
+ );
+ } else {
+ # An indent
+ shift @$lines;
+ unless ( @$lines ) {
+ $hash->{$key} = undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)-/ ) {
+ $hash->{$key} = [];
+ $self->_load_array(
+ $hash->{$key}, [ @$indent, length($1) ], $lines
+ );
+ } elsif ( $lines->[0] =~ /^(\s*)./ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] >= $indent2 ) {
+ # Null hash entry
+ $hash->{$key} = undef;
+ } else {
+ $hash->{$key} = {};
+ $self->_load_hash(
+ $hash->{$key}, [ @$indent, length($1) ], $lines
+ );
+ }
+ }
+ }
+ }
+
+ return 1;
+ }
+
+
+ ###
+ # Dumper functions:
+
+ # Save an object to a file
+ sub _dump_file {
+ my $self = shift;
+
+ require Fcntl;
+
+ # Check the file
+ my $file = shift or $self->_error( 'You did not specify a file name' );
+
+ my $fh;
+ # flock if available (or warn if not possible for OS-specific reasons)
+ if ( _can_flock() ) {
+ # Open without truncation (truncate comes after lock)
+ my $flags = Fcntl::O_WRONLY()|Fcntl::O_CREAT();
+ sysopen( $fh, $file, $flags );
+ unless ( $fh ) {
+ $self->_error("Failed to open file '$file' for writing: $!");
+ }
+
+ # Use no translation and strict UTF-8
+ binmode( $fh, ":raw:encoding(UTF-8)");
+
+ flock( $fh, Fcntl::LOCK_EX() )
+ or warn "Couldn't lock '$file' for reading: $!";
+
+ # truncate and spew contents
+ truncate $fh, 0;
+ seek $fh, 0, 0;
+ }
+ else {
+ open $fh, ">:unix:encoding(UTF-8)", $file;
+ }
+
+ # serialize and spew to the handle
+ print {$fh} $self->_dump_string;
+
+ # close the file (release the lock)
+ unless ( close $fh ) {
+ $self->_error("Failed to close file '$file': $!");
+ }
+
+ return 1;
+ }
+
+ # Save an object to a string
+ sub _dump_string {
+ my $self = shift;
+ return '' unless ref $self && @$self;
+
+ # Iterate over the documents
+ my $indent = 0;
+ my @lines = ();
+
+ eval {
+ foreach my $cursor ( @$self ) {
+ push @lines, '---';
+
+ # An empty document
+ if ( ! defined $cursor ) {
+ # Do nothing
+
+ # A scalar document
+ } elsif ( ! ref $cursor ) {
+ $lines[-1] .= ' ' . $self->_dump_scalar( $cursor );
+
+ # A list at the root
+ } elsif ( ref $cursor eq 'ARRAY' ) {
+ unless ( @$cursor ) {
+ $lines[-1] .= ' []';
+ next;
+ }
+ push @lines, $self->_dump_array( $cursor, $indent, {} );
+
+ # A hash at the root
+ } elsif ( ref $cursor eq 'HASH' ) {
+ unless ( %$cursor ) {
+ $lines[-1] .= ' {}';
+ next;
+ }
+ push @lines, $self->_dump_hash( $cursor, $indent, {} );
+
+ } else {
+ die \("Cannot serialize " . ref($cursor));
+ }
+ }
+ };
+ if ( ref $@ eq 'SCALAR' ) {
+ $self->_error(${$@});
+ } elsif ( $@ ) {
+ $self->_error($@);
+ }
+
+ join '', map { "$_\n" } @lines;
+ }
+
+ sub _has_internal_string_value {
+ my $value = shift;
+ my $b_obj = B::svref_2object(\$value); # for round trip problem
+ return $b_obj->FLAGS & B::SVf_POK();
+ }
+
+ sub _dump_scalar {
+ my $string = $_[1];
+ my $is_key = $_[2];
+ # Check this before checking length or it winds up looking like a string!
+ my $has_string_flag = _has_internal_string_value($string);
+ return '~' unless defined $string;
+ return "''" unless length $string;
+ if (Scalar::Util::looks_like_number($string)) {
+ # keys and values that have been used as strings get quoted
+ if ( $is_key || $has_string_flag ) {
+ return qq['$string'];
+ }
+ else {
+ return $string;
+ }
+ }
+ if ( $string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/ ) {
+ $string =~ s/\\/\\\\/g;
+ $string =~ s/"/\\"/g;
+ $string =~ s/\n/\\n/g;
+ $string =~ s/[\x85]/\\N/g;
+ $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;
+ $string =~ s/([\x7f-\x9f])/'\x' . sprintf("%X",ord($1))/ge;
+ return qq|"$string"|;
+ }
+ if ( $string =~ /(?:^[~!@#%&*|>?:,'"`{}\[\]]|^-+$|\s|:\z)/ or
+ $QUOTE{$string}
+ ) {
+ return "'$string'";
+ }
+ return $string;
+ }
+
+ sub _dump_array {
+ my ($self, $array, $indent, $seen) = @_;
+ if ( $seen->{refaddr($array)}++ ) {
+ die \"CPAN::Meta::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $el ( @$array ) {
+ my $line = (' ' x $indent) . '-';
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_dump_scalar( $el );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die \"CPAN::Meta::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+ }
+
+ sub _dump_hash {
+ my ($self, $hash, $indent, $seen) = @_;
+ if ( $seen->{refaddr($hash)}++ ) {
+ die \"CPAN::Meta::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $name ( sort keys %$hash ) {
+ my $el = $hash->{$name};
+ my $line = (' ' x $indent) . $self->_dump_scalar($name, 1) . ":";
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_dump_scalar( $el );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_dump_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die \"CPAN::Meta::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+ }
+
+
+
+ #####################################################################
+ # DEPRECATED API methods:
+
+ # Error storage (DEPRECATED as of 1.57)
+ our $errstr = '';
+
+ # Set error
+ sub _error {
+ require Carp;
+ $errstr = $_[1];
+ $errstr =~ s/ at \S+ line \d+.*//;
+ Carp::croak( $errstr );
+ }
+
+ # Retrieve error
+ my $errstr_warned;
+ sub errstr {
+ require Carp;
+ Carp::carp( "CPAN::Meta::YAML->errstr and \$CPAN::Meta::YAML::errstr is deprecated" )
+ unless $errstr_warned++;
+ $errstr;
+ }
+
+
+
+
+ #####################################################################
+ # Helper functions. Possibly not needed.
+
+
+ # Use to detect nv or iv
+ use B;
+
+ # XXX-INGY Is flock CPAN::Meta::YAML's responsibility?
+ # Some platforms can't flock :-(
+ # XXX-XDG I think it is. When reading and writing files, we ought
+ # to be locking whenever possible. People (foolishly) use YAML
+ # files for things like session storage, which has race issues.
+ my $HAS_FLOCK;
+ sub _can_flock {
+ if ( defined $HAS_FLOCK ) {
+ return $HAS_FLOCK;
+ }
+ else {
+ require Config;
+ my $c = \%Config::Config;
+ $HAS_FLOCK = grep { $c->{$_} } qw/d_flock d_fcntl_can_lock d_lockf/;
+ require Fcntl if $HAS_FLOCK;
+ return $HAS_FLOCK;
+ }
+ }
+
+
+ # XXX-INGY Is this core in 5.8.1? Can we remove this?
+ # XXX-XDG Scalar::Util 1.18 didn't land until 5.8.8, so we need this
+ #####################################################################
+ # Use Scalar::Util if possible, otherwise emulate it
+
+ BEGIN {
+ local $@;
+ if ( eval { require Scalar::Util }
+ && $Scalar::Util::VERSION
+ && eval($Scalar::Util::VERSION) >= 1.18
+ ) {
+ *refaddr = *Scalar::Util::refaddr;
+ }
+ else {
+ eval <<'END_PERL';
+ # Scalar::Util failed to load or too old
+ sub refaddr {
+ my $pkg = ref($_[0]) or return undef;
+ if ( !! UNIVERSAL::can($_[0], 'can') ) {
+ bless $_[0], 'Scalar::Util::Fake';
+ } else {
+ $pkg = undef;
+ }
+ "$_[0]" =~ /0x(\w+)/;
+ my $i = do { no warnings 'portable'; hex $1 };
+ bless $_[0], $pkg if defined $pkg;
+ $i;
+ }
+ END_PERL
+ }
+ }
+
+
+
+
+ 1;
+
+ # XXX-INGY Doc notes I'm putting up here. Changing the doc when it's wrong
+ # but leaving grey area stuff up here.
+ #
+ # I would like to change Read/Write to Load/Dump below without
+ # changing the actual API names.
+ #
+ # It might be better to put Load/Dump API in the SYNOPSIS instead of the
+ # dubious OO API.
+ #
+ # null and bool explanations may be outdated.
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ CPAN::Meta::YAML - Read and write a subset of YAML for CPAN Meta files
+
+ =head1 VERSION
+
+ version 0.011
+
+ =head1 SYNOPSIS
+
+ use CPAN::Meta::YAML;
+
+ # reading a META file
+ open $fh, "<:utf8", "META.yml";
+ $yaml_text = do { local $/; <$fh> };
+ $yaml = CPAN::Meta::YAML->read_string($yaml_text)
+ or die CPAN::Meta::YAML->errstr;
+
+ # finding the metadata
+ $meta = $yaml->[0];
+
+ # writing a META file
+ $yaml_text = $yaml->write_string
+ or die CPAN::Meta::YAML->errstr;
+ open $fh, ">:utf8", "META.yml";
+ print $fh $yaml_text;
+
+ =head1 DESCRIPTION
+
+ This module implements a subset of the YAML specification for use in reading
+ and writing CPAN metadata files like F<META.yml> and F<MYMETA.yml>. It should
+ not be used for any other general YAML parsing or generation task.
+
+ NOTE: F<META.yml> (and F<MYMETA.yml>) files should be UTF-8 encoded. Users are
+ responsible for proper encoding and decoding. In particular, the C<read> and
+ C<write> methods do B<not> support UTF-8 and should not be used.
+
+ =head1 SUPPORT
+
+ This module is currently derived from L<YAML::Tiny> by Adam Kennedy. If
+ there are bugs in how it parses a particular META.yml file, please file
+ a bug report in the YAML::Tiny bugtracker:
+ L<https://rt.cpan.org/Public/Dist/Display.html?Name=YAML-Tiny>
+
+ =head1 SEE ALSO
+
+ L<YAML::Tiny>, L<YAML>, L<YAML::XS>
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/dagolden/CPAN-Meta-YAML/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/dagolden/CPAN-Meta-YAML>
+
+ git clone https://github.com/dagolden/CPAN-Meta-YAML.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ Adam Kennedy <adamk@cpan.org>
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2010 by Adam Kennedy.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ __END__
+
+
+ # ABSTRACT: Read and write a subset of YAML for CPAN Meta files
+
+
+CPAN_META_YAML
+
+$fatpacked{"Carton.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON';
+ package Carton;
+ use strict;
+ use 5.008_005;
+ use version; our $VERSION = version->declare("v1.0.22");
+
+ 1;
+ __END__
+
+ =head1 NAME
+
+ Carton - Perl module dependency manager (aka Bundler for Perl)
+
+ =head1 SYNOPSIS
+
+ # On your development environment
+ > cat cpanfile
+ requires 'Plack', '0.9980';
+ requires 'Starman', '0.2000';
+
+ > carton install
+ > git add cpanfile cpanfile.snapshot
+ > git commit -m "add Plack and Starman"
+
+ # Other developer's machine, or on a deployment box
+ > carton install
+ > carton exec starman -p 8080 myapp.psgi
+
+ =head1 AVAILABILITY
+
+ Carton only works with perl installation with the complete set of core
+ modules. If you use perl installed by a vendor package with modules
+ stripped from core, Carton is not expected to work correctly.
+
+ Also, Carton requires you to run your command/application with
+ C<carton exec> command, which means it's difficult or impossible to
+ run in an embedded perl use case such as mod_perl.
+
+ =head1 DESCRIPTION
+
+ carton is a command line tool to track the Perl module dependencies
+ for your Perl application. Dependencies are declared using L<cpanfile>
+ format, and the managed dependencies are tracked in a
+ I<cpanfile.snapshot> file, which is meant to be version controlled,
+ and the snapshot file allows other developers of your application will
+ have the exact same versions of the modules.
+
+ For C<cpanfile> syntax, see L<cpanfile> documentation.
+
+ =head1 TUTORIAL
+
+ =head2 Initializing the environment
+
+ carton will use the I<local> directory to install modules into. You're
+ recommended to exclude these directories from the version control
+ system.
+
+ > echo local/ >> .gitignore
+ > git add cpanfile cpanfile.snapshot
+ > git commit -m "Start using carton"
+
+ =head2 Tracking the dependencies
+
+ You can manage the dependencies of your application via C<cpanfile>.
+
+ # cpanfile
+ requires 'Plack', '0.9980';
+ requires 'Starman', '0.2000';
+
+ And then you can install these dependencies via:
+
+ > carton install
+
+ The modules are installed into your I<local> directory, and the
+ dependencies tree and version information are analyzed and saved into
+ I<cpanfile.snapshot> in your directory.
+
+ Make sure you add I<cpanfile> and I<cpanfile.snapshot> to your version
+ controlled repository and commit changes as you update
+ dependencies. This will ensure that other developers on your app, as
+ well as your deployment environment, use exactly the same versions of
+ the modules you just installed.
+
+ > git add cpanfile cpanfile.snapshot
+ > git commit -m "Added Plack and Starman"
+
+ =head2 Deploying your application
+
+ Once you've done installing all the dependencies, you can push your
+ application directory to a remote machine (excluding I<local> and
+ I<.carton>) and run the following command:
+
+ > carton install --deployment
+
+ This will look at the I<cpanfile.snapshot> and install the exact same
+ versions of the dependencies into I<local>, and now your application
+ is ready to run.
+
+ The C<--deployment> flag makes sure that carton will only install
+ modules and versions available in your snapshot, and won't fallback to
+ query for CPAN Meta DB for missing modules.
+
+ =head2 Bundling modules
+
+ carton can bundle all the tarballs for your dependencies into a
+ directory so that you can even install dependencies that are not
+ available on CPAN, such as internal distribution aka DarkPAN.
+
+ > carton bundle
+
+ will bundle these tarballs into I<vendor/cache> directory, and
+
+ > carton install --cached
+
+ will install modules using this local cache. Combined with
+ C<--deployment> option, you can avoid querying for a database like
+ CPAN Meta DB or downloading files from CPAN mirrors upon deployment
+ time.
+
+ =head1 PERL VERSIONS
+
+ When you take a snapshot in one perl version and deploy on another
+ (different) version, you might have troubles with core modules.
+
+ The simplest solution, which might not work for everybody, is to use
+ the same version of perl in the development and deployment.
+
+ To enforce that, you're recommended to use L<plenv> and
+ C<.perl-version> to lock perl versions in development.
+
+ You can also specify the minimum perl required in C<cpanfile>:
+
+ requires 'perl', '5.16.3';
+
+ and carton (and cpanm) will give you errors when deployed on hosts
+ with perl lower than the specified version.
+
+ =head1 COMMUNITY
+
+ =over 4
+
+ =item L<https://github.com/miyagawa/carton>
+
+ Code repository, Wiki and Issue Tracker
+
+ =item L<irc://irc.perl.org/#cpanm>
+
+ IRC chat room
+
+ =back
+
+ =head1 AUTHOR
+
+ Tatsuhiko Miyagawa
+
+ =head1 COPYRIGHT
+
+ Tatsuhiko Miyagawa 2011-
+
+ =head1 LICENSE
+
+ This software is licensed under the same terms as Perl itself.
+
+ =head1 SEE ALSO
+
+ L<cpanm>
+
+ L<cpanfile>
+
+ L<Bundler|http://gembundler.com/>
+
+ L<pip|http://pypi.python.org/pypi/pip>
+
+ L<npm|http://npmjs.org/>
+
+ L<perlrocks|https://github.com/gugod/perlrocks>
+
+ L<only>
+
+ =cut
+CARTON
+
+$fatpacked{"Carton/Builder.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_BUILDER';
+ package Carton::Builder;
+ use strict;
+ use Class::Tiny {
+ mirror => undef,
+ index => undef,
+ cascade => sub { 1 },
+ without => sub { [] },
+ cpanfile => undef,
+ fatscript => sub { $_[0]->_build_fatscript },
+ };
+
+ sub effective_mirrors {
+ my $self = shift;
+
+ # push default CPAN mirror always, as a fallback
+ # TODO don't pass fallback if --cached is set?
+
+ my @mirrors = ($self->mirror);
+ push @mirrors, Carton::Mirror->default if $self->custom_mirror;
+ push @mirrors, Carton::Mirror->new('http://backpan.perl.org/');
+
+ @mirrors;
+ }
+
+ sub custom_mirror {
+ my $self = shift;
+ ! $self->mirror->is_default;
+ }
+
+ sub bundle {
+ my($self, $path, $cache_path, $snapshot) = @_;
+
+ for my $dist ($snapshot->distributions) {
+ my $source = $path->child("cache/authors/id/" . $dist->pathname);
+ my $target = $cache_path->child("authors/id/" . $dist->pathname);
+
+ if ($source->exists) {
+ warn "Copying ", $dist->pathname, "\n";
+ $target->parent->mkpath;
+ $source->copy($target) or warn "$target: $!";
+ } else {
+ warn "Couldn't find @{[ $dist->pathname ]}\n";
+ }
+ }
+ }
+
+ sub install {
+ my($self, $path) = @_;
+
+ $self->run_cpanm(
+ "-L", $path,
+ (map { ("--mirror", $_->url) } $self->effective_mirrors),
+ ( $self->index ? ("--mirror-index", $self->index) : () ),
+ ( $self->cascade ? "--cascade-search" : () ),
+ ( $self->custom_mirror ? "--mirror-only" : () ),
+ "--save-dists", "$path/cache",
+ $self->groups,
+ "--cpanfile", $self->cpanfile,
+ "--installdeps", $self->cpanfile->dirname,
+ ) or die "Installing modules failed\n";
+ }
+
+ sub groups {
+ my $self = shift;
+
+ # TODO support --without test (don't need test on deployment)
+ my @options = ('--with-all-features', '--with-develop');
+
+ for my $group (@{$self->without}) {
+ push @options, '--without-develop' if $group eq 'develop';
+ push @options, "--without-feature=$group";
+ }
+
+ return @options;
+ }
+
+ sub update {
+ my($self, $path, @modules) = @_;
+
+ $self->run_cpanm(
+ "-L", $path,
+ (map { ("--mirror", $_->url) } $self->effective_mirrors),
+ ( $self->custom_mirror ? "--mirror-only" : () ),
+ "--save-dists", "$path/cache",
+ @modules
+ ) or die "Updating modules failed\n";
+ }
+
+ sub _build_fatscript {
+ my $self = shift;
+
+ my $fatscript;
+ if ($Carton::Fatpacked) {
+ require Module::Reader;
+ my $content = Module::Reader::module_content('App::cpanminus::fatscript')
+ or die "Can't locate App::cpanminus::fatscript";
+ $fatscript = Path::Tiny->tempfile;
+ $fatscript->spew($content);
+ } else {
+ require Module::Metadata;
+ $fatscript = Module::Metadata->find_module_by_name("App::cpanminus::fatscript")
+ or die "Can't locate App::cpanminus::fatscript";
+ }
+
+ return $fatscript;
+ }
+
+ sub run_cpanm {
+ my($self, @args) = @_;
+ local $ENV{PERL_CPANM_OPT};
+ !system $^X, $self->fatscript, "--quiet", "--notest", @args;
+ }
+
+ 1;
+CARTON_BUILDER
+
+$fatpacked{"Carton/CLI.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_CLI';
+ package Carton::CLI;
+ use strict;
+ use warnings;
+ use Config;
+ use Getopt::Long;
+ use Path::Tiny;
+ use Try::Tiny;
+ use Module::CoreList;
+ use Scalar::Util qw(blessed);
+
+ use Carton;
+ use Carton::Builder;
+ use Carton::Mirror;
+ use Carton::Snapshot;
+ use Carton::Util;
+ use Carton::Environment;
+ use Carton::Error;
+
+ use constant { SUCCESS => 0, INFO => 1, WARN => 2, ERROR => 3 };
+
+ our $UseSystem = 0; # 1 for unit testing
+
+ use Class::Tiny {
+ verbose => undef,
+ carton => sub { $_[0]->_build_carton },
+ mirror => sub { $_[0]->_build_mirror },
+ };
+
+ sub _build_mirror {
+ my $self = shift;
+ Carton::Mirror->new($ENV{PERL_CARTON_MIRROR} || $Carton::Mirror::DefaultMirror);
+ }
+
+ sub run {
+ my($self, @args) = @_;
+
+ my @commands;
+ my $p = Getopt::Long::Parser->new(
+ config => [ "no_ignore_case", "pass_through" ],
+ );
+ $p->getoptionsfromarray(
+ \@args,
+ "h|help" => sub { unshift @commands, 'help' },
+ "v|version" => sub { unshift @commands, 'version' },
+ "verbose!" => sub { $self->verbose($_[1]) },
+ );
+
+ push @commands, @args;
+
+ my $cmd = shift @commands || 'install';
+
+ my $code = try {
+ my $call = $self->can("cmd_$cmd")
+ or Carton::Error::CommandNotFound->throw(error => "Could not find command '$cmd'");
+ $self->$call(@commands);
+ return 0;
+ } catch {
+ die $_ unless blessed $_ && $_->can('rethrow');
+
+ if ($_->isa('Carton::Error::CommandExit')) {
+ return $_->code || 255;
+ } elsif ($_->isa('Carton::Error::CommandNotFound')) {
+ warn $_->error, "\n\n";
+ $self->cmd_usage;
+ return 255;
+ } elsif ($_->isa('Carton::Error')) {
+ warn $_->error, "\n";
+ return 255;
+ }
+ };
+
+ return $code;
+ }
+
+ sub commands {
+ my $self = shift;
+
+ no strict 'refs';
+ map { s/^cmd_//; $_ }
+ grep { /^cmd_.*/ && $self->can($_) } sort keys %{__PACKAGE__."::"};
+ }
+
+ sub cmd_usage {
+ my $self = shift;
+ $self->print(<<HELP);
+ Usage: carton <command>
+
+ where <command> is one of:
+ @{[ join ", ", $self->commands ]}
+
+ Run carton -h <command> for help.
+ HELP
+ }
+
+ sub parse_options {
+ my($self, $args, @spec) = @_;
+ my $p = Getopt::Long::Parser->new(
+ config => [ "no_auto_abbrev", "no_ignore_case" ],
+ );
+ $p->getoptionsfromarray($args, @spec);
+ }
+
+ sub parse_options_pass_through {
+ my($self, $args, @spec) = @_;
+
+ my $p = Getopt::Long::Parser->new(
+ config => [ "no_auto_abbrev", "no_ignore_case", "pass_through" ],
+ );
+ $p->getoptionsfromarray($args, @spec);
+
+ # with pass_through keeps -- in args
+ shift @$args if $args->[0] && $args->[0] eq '--';
+ }
+
+ sub printf {
+ my $self = shift;
+ my $type = pop;
+ my($temp, @args) = @_;
+ $self->print(sprintf($temp, @args), $type);
+ }
+
+ sub print {
+ my($self, $msg, $type) = @_;
+ my $fh = $type && $type >= WARN ? *STDERR : *STDOUT;
+ print {$fh} $msg;
+ }
+
+ sub error {
+ my($self, $msg) = @_;
+ $self->print($msg, ERROR);
+ Carton::Error::CommandExit->throw;
+ }
+
+ sub cmd_help {
+ my $self = shift;
+ my $module = $_[0] ? ("Carton::Doc::" . ucfirst $_[0]) : "Carton.pm";
+ system "perldoc", $module;
+ }
+
+ sub cmd_version {
+ my $self = shift;
+ $self->print("carton $Carton::VERSION\n");
+ }
+
+ sub cmd_bundle {
+ my($self, @args) = @_;
+
+ my $env = Carton::Environment->build;
+ $env->snapshot->load;
+
+ $self->print("Bundling modules using @{[$env->cpanfile]}\n");
+
+ my $builder = Carton::Builder->new(
+ mirror => $self->mirror,
+ cpanfile => $env->cpanfile,
+ );
+ $builder->bundle($env->install_path, $env->vendor_cache, $env->snapshot);
+
+ $self->printf("Complete! Modules were bundled into %s\n", $env->vendor_cache, SUCCESS);
+ }
+
+ sub cmd_fatpack {
+ my($self, @args) = @_;
+
+ my $env = Carton::Environment->build;
+ require Carton::Packer;
+ Carton::Packer->new->fatpack_carton($env->vendor_bin);
+ }
+
+ sub cmd_install {
+ my($self, @args) = @_;
+
+ my($install_path, $cpanfile_path, @without);
+
+ $self->parse_options(
+ \@args,
+ "p|path=s" => \$install_path,
+ "cpanfile=s" => \$cpanfile_path,
+ "without=s" => sub { push @without, split /,/, $_[1] },
+ "deployment!" => \my $deployment,
+ "cached!" => \my $cached,
+ );
+
+ my $env = Carton::Environment->build($cpanfile_path, $install_path);
+ $env->snapshot->load_if_exists;
+
+ if ($deployment && !$env->snapshot->loaded) {
+ $self->error("--deployment requires cpanfile.snapshot: Run `carton install` and make sure cpanfile.snapshot is checked into your version control.\n");
+ }
+
+ my $builder = Carton::Builder->new(
+ cascade => 1,
+ mirror => $self->mirror,
+ without => \@without,
+ cpanfile => $env->cpanfile,
+ );
+
+ # TODO: --without with no .lock won't fetch the groups, resulting in insufficient requirements
+
+ if ($deployment) {
+ $self->print("Installing modules using @{[$env->cpanfile]} (deployment mode)\n");
+ $builder->cascade(0);
+ } else {
+ $self->print("Installing modules using @{[$env->cpanfile]}\n");
+ }
+
+ # TODO merge CPANfile git to mirror even if lock doesn't exist
+ if ($env->snapshot->loaded) {
+ my $index_file = $env->install_path->child("cache/modules/02packages.details.txt");
+ $index_file->parent->mkpath;
+
+ $env->snapshot->write_index($index_file);
+ $builder->index($index_file);
+ }
+
+ if ($cached) {
+ $builder->mirror(Carton::Mirror->new($env->vendor_cache));
+ }
+
+ $builder->install($env->install_path);
+
+ unless ($deployment) {
+ $env->cpanfile->load;
+ $env->snapshot->find_installs($env->install_path, $env->cpanfile->requirements);
+ $env->snapshot->save;
+ }
+
+ $self->print("Complete! Modules were installed into @{[$env->install_path]}\n", SUCCESS);
+ }
+
+ sub cmd_show {
+ my($self, @args) = @_;
+
+ my $env = Carton::Environment->build;
+ $env->snapshot->load;
+
+ for my $module (@args) {
+ my $dist = $env->snapshot->find($module)
+ or $self->error("Couldn't locate $module in cpanfile.snapshot\n");
+ $self->print( $dist->name . "\n" );
+ }
+ }
+
+ sub cmd_list {
+ my($self, @args) = @_;
+
+ my $format = 'name';
+
+ $self->parse_options(
+ \@args,
+ "distfile" => sub { $format = 'distfile' },
+ );
+
+ my $env = Carton::Environment->build;
+ $env->snapshot->load;
+
+ for my $dist ($env->snapshot->distributions) {
+ $self->print($dist->$format . "\n");
+ }
+ }
+
+ sub cmd_tree {
+ my($self, @args) = @_;
+
+ my $env = Carton::Environment->build;
+ $env->snapshot->load;
+ $env->cpanfile->load;
+
+ my %seen;
+ my $dumper = sub {
+ my($dependency, $reqs, $level) = @_;
+ return if $level == 0;
+ return Carton::Tree::STOP if $dependency->dist->is_core;
+ return Carton::Tree::STOP if $seen{$dependency->distname}++;
+ $self->printf( "%s%s (%s)\n", " " x ($level - 1), $dependency->module, $dependency->distname, INFO );
+ };
+
+ $env->tree->walk_down($dumper);
+ }
+
+ sub cmd_check {
+ my($self, @args) = @_;
+
+ my $cpanfile_path;
+ $self->parse_options(
+ \@args,
+ "cpanfile=s" => \$cpanfile_path,
+ );
+
+ my $env = Carton::Environment->build($cpanfile_path);
+ $env->snapshot->load;
+ $env->cpanfile->load;
+
+ # TODO remove snapshot
+ # TODO pass git spec to Requirements?
+ my $merged_reqs = $env->tree->merged_requirements;
+
+ my @missing;
+ for my $module ($merged_reqs->required_modules) {
+ my $install = $env->snapshot->find_or_core($module);
+ if ($install) {
+ unless ($merged_reqs->accepts_module($module => $install->version_for($module))) {
+ push @missing, [ $module, 1, $install->version_for($module) ];
+ }
+ } else {
+ push @missing, [ $module, 0 ];
+ }
+ }
+
+ if (@missing) {
+ $self->print("Following dependencies are not satisfied.\n", INFO);
+ for my $missing (@missing) {
+ my($module, $unsatisfied, $version) = @$missing;
+ if ($unsatisfied) {
+ $self->printf(" %s has version %s. Needs %s\n",
+ $module, $version, $merged_reqs->requirements_for_module($module), INFO);
+ } else {
+ $self->printf(" %s is not installed. Needs %s\n",
+ $module, $merged_reqs->requirements_for_module($module), INFO);
+ }
+ }
+ $self->printf("Run `carton install` to install them.\n", INFO);
+ Carton::Error::CommandExit->throw;
+ } else {
+ $self->print("cpanfile's dependencies are satisfied.\n", INFO);
+ }
+ }
+
+ sub cmd_update {
+ my($self, @args) = @_;
+
+ my $env = Carton::Environment->build;
+ $env->cpanfile->load;
+
+
+ my $cpanfile = Module::CPANfile->load($env->cpanfile);
+ @args = grep { $_ ne 'perl' } $env->cpanfile->required_modules unless @args;
+
+ $env->snapshot->load;
+
+ my @modules;
+ for my $module (@args) {
+ my $dist = $env->snapshot->find_or_core($module)
+ or $self->error("Could not find module $module.\n");
+ next if $dist->is_core;
+ push @modules, "$module~" . $env->cpanfile->requirements_for_module($module);
+ }
+
+ return unless @modules;
+
+ my $builder = Carton::Builder->new(
+ mirror => $self->mirror,
+ cpanfile => $env->cpanfile,
+ );
+ $builder->update($env->install_path, @modules);
+
+ $env->snapshot->find_installs($env->install_path, $env->cpanfile->requirements);
+ $env->snapshot->save;
+ }
+
+ sub cmd_exec {
+ my($self, @args) = @_;
+
+ my $env = Carton::Environment->build;
+ $env->snapshot->load;
+
+ # allows -Ilib
+ @args = map { /^(-[I])(.+)/ ? ($1,$2) : $_ } @args;
+
+ while (@args) {
+ if ($args[0] eq '-I') {
+ warn "exec -Ilib is deprecated. You might want to run: carton exec perl -Ilib ...\n";
+ splice(@args, 0, 2);
+ } else {
+ last;
+ }
+ }
+
+ $self->parse_options_pass_through(\@args); # to handle --
+
+ unless (@args) {
+ $self->error("carton exec needs a command to run.\n");
+ }
+
+ # PERL5LIB takes care of arch
+ my $path = $env->install_path;
+ local $ENV{PERL5LIB} = "$path/lib/perl5";
+ local $ENV{PATH} = "$path/bin:$ENV{PATH}";
+
+ if ($UseSystem) {
+ system @args;
+ } else {
+ exec @args;
+ exit 127; # command not found
+ }
+ }
+
+ 1;
+CARTON_CLI
+
+$fatpacked{"Carton/CPANfile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_CPANFILE';
+ package Carton::CPANfile;
+ use Path::Tiny ();
+ use Module::CPANfile;
+
+ use overload q{""} => sub { $_[0]->stringify }, fallback => 1;
+
+ use subs 'path';
+
+ use Class::Tiny {
+ path => undef,
+ _cpanfile => undef,
+ requirements => sub { $_[0]->_build_requirements },
+ };
+
+ sub stringify { shift->path->stringify(@_) }
+ sub dirname { shift->path->dirname(@_) }
+ sub prereqs { shift->_cpanfile->prereqs(@_) }
+ sub required_modules { shift->requirements->required_modules(@_) }
+ sub requirements_for_module { shift->requirements->requirements_for_module(@_) }
+
+ sub path {
+ my $self = shift;
+ if (@_) {
+ $self->{path} = Path::Tiny->new($_[0]);
+ } else {
+ $self->{path};
+ }
+ }
+
+ sub load {
+ my $self = shift;
+ $self->_cpanfile( Module::CPANfile->load($self->path) );
+ }
+
+ sub _build_requirements {
+ my $self = shift;
+ my $reqs = CPAN::Meta::Requirements->new;
+ $reqs->add_requirements($self->prereqs->requirements_for($_, 'requires'))
+ for qw( configure build runtime test develop );
+ $reqs->clear_requirement('perl');
+ $reqs;
+ }
+
+ 1;
+CARTON_CPANFILE
+
+$fatpacked{"Carton/Dependency.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_DEPENDENCY';
+ package Carton::Dependency;
+ use strict;
+ use Class::Tiny {
+ module => undef,
+ requirement => undef,
+ dist => undef,
+ };
+
+ sub requirements { shift->dist->requirements(@_) }
+
+ sub distname {
+ my $self = shift;
+ $self->dist->name;
+ }
+
+ sub version {
+ my $self = shift;
+ $self->dist->version_for($self->module);
+ }
+
+ 1;
+CARTON_DEPENDENCY
+
+$fatpacked{"Carton/Dist.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_DIST';
+ package Carton::Dist;
+ use strict;
+ use Class::Tiny {
+ name => undef,
+ pathname => undef,
+ provides => sub { +{} },
+ requirements => sub { $_[0]->_build_requirements },
+ };
+
+ use CPAN::Meta;
+
+ sub add_string_requirement { shift->requirements->add_string_requirement(@_) }
+ sub required_modules { shift->requirements->required_modules(@_) }
+ sub requirements_for_module { shift->requirements->requirements_for_module(@_) }
+
+ sub is_core { 0 }
+
+ sub distfile {
+ my $self = shift;
+ $self->pathname;
+ }
+
+ sub _build_requirements {
+ CPAN::Meta::Requirements->new;
+ }
+
+ sub provides_module {
+ my($self, $module) = @_;
+ exists $self->provides->{$module};
+ }
+
+ sub version_for {
+ my($self, $module) = @_;
+ $self->provides->{$module}{version};
+ }
+
+ 1;
+CARTON_DIST
+
+$fatpacked{"Carton/Dist/Core.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_DIST_CORE';
+ package Carton::Dist::Core;
+ use strict;
+ use parent 'Carton::Dist';
+
+ use Class::Tiny qw( module_version );
+
+ sub BUILDARGS {
+ my($class, %args) = @_;
+
+ # TODO represent dual-life
+ $args{name} =~ s/::/-/g;
+
+ \%args;
+ }
+
+ sub is_core { 1 }
+
+ sub version_for {
+ my($self, $module) = @_;
+ $self->module_version;
+ }
+
+ 1;
+CARTON_DIST_CORE
+
+$fatpacked{"Carton/Environment.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_ENVIRONMENT';
+ package Carton::Environment;
+ use strict;
+ use Carton::CPANfile;
+ use Carton::Snapshot;
+ use Carton::Error;
+ use Carton::Tree;
+ use Path::Tiny;
+
+ use Class::Tiny {
+ cpanfile => undef,
+ snapshot => sub { $_[0]->_build_snapshot },
+ install_path => sub { $_[0]->_build_install_path },
+ vendor_cache => sub { $_[0]->_build_vendor_cache },
+ tree => sub { $_[0]->_build_tree },
+ };
+
+ sub _build_snapshot {
+ my $self = shift;
+ Carton::Snapshot->new(path => $self->cpanfile . ".snapshot");
+ }
+
+ sub _build_install_path {
+ my $self = shift;
+ if ($ENV{PERL_CARTON_PATH}) {
+ return Path::Tiny->new($ENV{PERL_CARTON_PATH});
+ } else {
+ return $self->cpanfile->path->parent->child("local");
+ }
+ }
+
+ sub _build_vendor_cache {
+ my $self = shift;
+ Path::Tiny->new($self->install_path->dirname . "/vendor/cache");
+ }
+
+ sub _build_tree {
+ my $self = shift;
+ Carton::Tree->new(cpanfile => $self->cpanfile, snapshot => $self->snapshot);
+ }
+
+ sub vendor_bin {
+ my $self = shift;
+ $self->vendor_cache->parent->child('bin');
+ }
+
+ sub build_with {
+ my($class, $cpanfile) = @_;
+
+ $cpanfile = Path::Tiny->new($cpanfile)->absolute;
+ if ($cpanfile->is_file) {
+ return $class->new(cpanfile => Carton::CPANfile->new(path => $cpanfile));
+ } else {
+ Carton::Error::CPANfileNotFound->throw(error => "Can't locate cpanfile: $cpanfile");
+ }
+ }
+
+ sub build {
+ my($class, $cpanfile_path, $install_path) = @_;
+
+ my $self = $class->new;
+
+ $cpanfile_path &&= Path::Tiny->new($cpanfile_path)->absolute;
+
+ my $cpanfile = $self->locate_cpanfile($cpanfile_path || $ENV{PERL_CARTON_CPANFILE});
+ if ($cpanfile && $cpanfile->is_file) {
+ $self->cpanfile( Carton::CPANfile->new(path => $cpanfile) );
+ } else {
+ Carton::Error::CPANfileNotFound->throw(error => "Can't locate cpanfile: (@{[ $cpanfile_path || 'cpanfile' ]})");
+ }
+
+ $self->install_path( Path::Tiny->new($install_path)->absolute ) if $install_path;
+
+ $self;
+ }
+
+ sub locate_cpanfile {
+ my($self, $path) = @_;
+
+ if ($path) {
+ return Path::Tiny->new($path)->absolute;
+ }
+
+ my $current = Path::Tiny->cwd;
+ my $previous = '';
+
+ until ($current eq '/' or $current eq $previous) {
+ # TODO support PERL_CARTON_CPANFILE
+ my $try = $current->child('cpanfile');
+ if ($try->is_file) {
+ return $try->absolute;
+ }
+
+ ($previous, $current) = ($current, $current->parent);
+ }
+
+ return;
+ }
+
+ 1;
+
+CARTON_ENVIRONMENT
+
+$fatpacked{"Carton/Error.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_ERROR';
+ package Carton::Error;
+ use strict;
+ use overload '""' => sub { $_[0]->error };
+ use Carp;
+
+ sub throw {
+ my($class, @args) = @_;
+ die $class->new(@args);
+ }
+
+ sub rethrow {
+ die $_[0];
+ }
+
+ sub new {
+ my($class, %args) = @_;
+ bless \%args, $class;
+ }
+
+ sub error {
+ $_[0]->{error} || ref $_[0];
+ }
+
+ package Carton::Error::CommandNotFound;
+ use parent 'Carton::Error';
+
+ package Carton::Error::CommandExit;
+ use parent 'Carton::Error';
+ sub code { $_[0]->{code} }
+
+ package Carton::Error::CPANfileNotFound;
+ use parent 'Carton::Error';
+
+ package Carton::Error::SnapshotParseError;
+ use parent 'Carton::Error';
+ sub path { $_[0]->{path} }
+
+ package Carton::Error::SnapshotNotFound;
+ use parent 'Carton::Error';
+ sub path { $_[0]->{path} }
+
+ 1;
+CARTON_ERROR
+
+$fatpacked{"Carton/Index.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_INDEX';
+ package Carton::Index;
+ use strict;
+ use Class::Tiny {
+ _packages => sub { +{} },
+ generator => sub { require Carton; "Carton $Carton::VERSION" },
+ };
+
+ sub add_package {
+ my($self, $package) = @_;
+ $self->_packages->{$package->name} = $package; # XXX ||=
+ }
+
+ sub count {
+ my $self = shift;
+ scalar keys %{$self->_packages};
+ }
+
+ sub packages {
+ my $self = shift;
+ sort { lc $a->name cmp lc $b->name } values %{$self->_packages};
+ }
+
+ sub write {
+ my($self, $fh) = @_;
+
+ print $fh <<EOF;
+ File: 02packages.details.txt
+ URL: http://www.perl.com/CPAN/modules/02packages.details.txt
+ Description: Package names found in cpanfile.snapshot
+ Columns: package name, version, path
+ Intended-For: Automated fetch routines, namespace documentation.
+ Written-By: @{[ $self->generator ]}
+ Line-Count: @{[ $self->count ]}
+ Last-Updated: @{[ scalar localtime ]}
+
+ EOF
+ for my $p ($self->packages) {
+ print $fh $self->_format_line($p->name, $p->version || 'undef', $p->pathname);
+ }
+ }
+
+ sub _format_line {
+ my($self, @row) = @_;
+
+ # from PAUSE::mldistwatch::rewrite02
+ my $one = 30;
+ my $two = 8;
+
+ if (length $row[0] > $one) {
+ $one += 8 - length $row[1];
+ $two = length $row[1];
+ }
+
+ sprintf "%-${one}s %${two}s %s\n", @row;
+ }
+
+ sub pad {
+ my($str, $len, $left) = @_;
+
+ my $howmany = $len - length($str);
+ return $str if $howmany <= 0;
+
+ my $pad = " " x $howmany;
+ return $left ? "$pad$str" : "$str$pad";
+ }
+
+
+ 1;
+CARTON_INDEX
+
+$fatpacked{"Carton/Mirror.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_MIRROR';
+ package Carton::Mirror;
+ use strict;
+ use Class::Tiny qw( url );
+
+ our $DefaultMirror = 'http://cpan.metacpan.org/';
+
+ sub BUILDARGS {
+ my($class, $url) = @_;
+ return { url => $url };
+ }
+
+ sub default {
+ my $class = shift;
+ $class->new($DefaultMirror);
+ }
+
+ sub is_default {
+ my $self = shift;
+ $self->url eq $DefaultMirror;
+ }
+
+ 1;
+
+CARTON_MIRROR
+
+$fatpacked{"Carton/Package.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_PACKAGE';
+ package Carton::Package;
+ use strict;
+ use Class::Tiny qw( name version pathname );
+
+ sub BUILDARGS {
+ my($class, @args) = @_;
+ return { name => $args[0], version => $args[1], pathname => $args[2] };
+ }
+
+ 1;
+
+
+CARTON_PACKAGE
+
+$fatpacked{"Carton/Packer.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_PACKER';
+ package Carton::Packer;
+ use Class::Tiny;
+ use warnings NONFATAL => 'all';
+ use App::FatPacker;
+ use File::pushd ();
+ use Path::Tiny ();
+ use CPAN::Meta ();
+ use File::Find ();
+
+ sub fatpack_carton {
+ my($self, $dir) = @_;
+
+ my $temp = Path::Tiny->tempdir;
+ my $pushd = File::pushd::pushd $temp;
+
+ my $file = $temp->child('carton.pre.pl');
+
+ $file->spew(<<'EOF');
+ #!/usr/bin/env perl
+ use strict;
+ use 5.008001;
+ use Carton::CLI;
+ $Carton::Fatpacked = 1;
+ exit Carton::CLI->new->run(@ARGV);
+ EOF
+
+ my $fatpacked = $self->do_fatpack($file);
+
+ my $executable = $dir->child('carton');
+ warn "Bundling $executable\n";
+
+ $dir->mkpath;
+ $executable->spew($fatpacked);
+ chmod 0755, $executable;
+ }
+
+ sub do_fatpack {
+ my($self, $file) = @_;
+
+ my $packer = App::FatPacker->new;
+
+ my @modules = split /\r?\n/, $packer->trace(args => [$file], use => $self->required_modules);
+ my @packlists = $packer->packlists_containing(\@modules);
+ $packer->packlists_to_tree(Path::Tiny->new('fatlib')->absolute, \@packlists);
+
+ my $fatpacked = do {
+ local $SIG{__WARN__} = sub {};
+ $packer->fatpack_file($file);
+ };
+
+ # HACK: File::Spec bundled into arch in < 5.16, but is loadable as pure-perl
+ use Config;
+ $fatpacked =~ s/\$fatpacked{"$Config{archname}\/(Cwd|File)/\$fatpacked{"$1/g;
+
+ $fatpacked;
+ }
+
+ sub required_modules {
+ my($self, $packer) = @_;
+
+ my $meta = $self->installed_meta('Carton')
+ or die "Couldn't find install metadata for Carton";
+
+ my %excludes = (
+ perl => 1,
+ 'ExtUtils::MakeMaker' => 1,
+ 'Module::Build' => 1,
+ );
+
+ my @requirements = grep !$excludes{$_},
+ $meta->effective_prereqs->requirements_for('runtime', 'requires')->required_modules;
+
+ return \@requirements;
+ }
+
+ sub installed_meta {
+ my($self, $dist) = @_;
+
+ my @meta;
+ my $finder = sub {
+ if (m!\b$dist-.*[\\/]MYMETA.json!) {
+ my $meta = CPAN::Meta->load_file($_);
+ push @meta, $meta if $meta->name eq $dist;
+ }
+ };
+
+ my @meta_dirs = grep -d, map "$_/.meta", @INC;
+ File::Find::find({ wanted => $finder, no_chdir => 1 }, @meta_dirs)
+ if @meta_dirs;
+
+ # return the latest version
+ @meta = sort { version->new($b->version) cmp version->new($a->version) } @meta;
+
+ return $meta[0];
+ }
+
+ 1;
+CARTON_PACKER
+
+$fatpacked{"Carton/Snapshot.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_SNAPSHOT';
+ package Carton::Snapshot;
+ use strict;
+ use Config;
+ use Carton::Dist;
+ use Carton::Dist::Core;
+ use Carton::Error;
+ use Carton::Package;
+ use Carton::Index;
+ use Carton::Util;
+ use Carton::Snapshot::Emitter;
+ use Carton::Snapshot::Parser;
+ use CPAN::Meta;
+ use CPAN::Meta::Requirements;
+ use File::Find ();
+ use Try::Tiny;
+ use Path::Tiny ();
+ use Module::CoreList;
+
+ use constant CARTON_SNAPSHOT_VERSION => '1.0';
+
+ use subs 'path';
+ use Class::Tiny {
+ path => undef,
+ version => sub { CARTON_SNAPSHOT_VERSION },
+ loaded => undef,
+ _distributions => sub { +[] },
+ };
+
+ sub BUILD {
+ my $self = shift;
+ $self->path( $self->{path} );
+ }
+
+ sub path {
+ my $self = shift;
+ if (@_) {
+ $self->{path} = Path::Tiny->new($_[0]);
+ } else {
+ $self->{path};
+ }
+ }
+
+ sub load_if_exists {
+ my $self = shift;
+ $self->load if $self->path->is_file;
+ }
+
+ sub load {
+ my $self = shift;
+
+ return 1 if $self->loaded;
+
+ if ($self->path->is_file) {
+ my $parser = Carton::Snapshot::Parser->new;
+ $parser->parse($self->path->slurp_utf8, $self);
+ $self->loaded(1);
+
+ return 1;
+ } else {
+ Carton::Error::SnapshotNotFound->throw(
+ error => "Can't find cpanfile.snapshot: Run `carton install` to build the snapshot file.",
+ path => $self->path,
+ );
+ }
+ }
+
+ sub save {
+ my $self = shift;
+ $self->path->spew_utf8( Carton::Snapshot::Emitter->new->emit($self) );
+ }
+
+ sub find {
+ my($self, $module) = @_;
+ (grep $_->provides_module($module), $self->distributions)[0];
+ }
+
+ sub find_or_core {
+ my($self, $module) = @_;
+ $self->find($module) || $self->find_in_core($module);
+ }
+
+ sub find_in_core {
+ my($self, $module) = @_;
+
+ if (exists $Module::CoreList::version{$]}{$module}) {
+ my $version = $Module::CoreList::version{$]}{$module}; # maybe undef
+ return Carton::Dist::Core->new(name => $module, module_version => $version);
+ }
+
+ return;
+ }
+
+ sub index {
+ my $self = shift;
+
+ my $index = Carton::Index->new;
+ for my $package ($self->packages) {
+ $index->add_package($package);
+ }
+
+ return $index;
+ }
+
+ sub distributions {
+ @{$_[0]->_distributions};
+ }
+
+ sub add_distribution {
+ my($self, $dist) = @_;
+ push @{$self->_distributions}, $dist;
+ }
+
+ sub packages {
+ my $self = shift;
+
+ my @packages;
+ for my $dist ($self->distributions) {
+ while (my($package, $provides) = each %{$dist->provides}) {
+ # TODO what if duplicates?
+ push @packages, Carton::Package->new($package, $provides->{version}, $dist->pathname);
+ }
+ }
+
+ return @packages;
+ }
+
+ sub write_index {
+ my($self, $file) = @_;
+
+ open my $fh, ">", $file or die $!;
+ $self->index->write($fh);
+ }
+
+ sub find_installs {
+ my($self, $path, $reqs) = @_;
+
+ my $libdir = "$path/lib/perl5/$Config{archname}/.meta";
+ return {} unless -e $libdir;
+
+ my @installs;
+ my $wanted = sub {
+ if ($_ eq 'install.json') {
+ push @installs, [ $File::Find::name, "$File::Find::dir/MYMETA.json" ];
+ }
+ };
+ File::Find::find($wanted, $libdir);
+
+ my %installs;
+
+ my $accepts = sub {
+ my $module = shift;
+
+ return 0 unless $reqs->accepts_module($module->{name}, $module->{provides}{$module->{name}}{version});
+
+ if (my $exist = $installs{$module->{name}}) {
+ my $old_ver = version::->new($exist->{provides}{$module->{name}}{version});
+ my $new_ver = version::->new($module->{provides}{$module->{name}}{version});
+ return $new_ver >= $old_ver;
+ } else {
+ return 1;
+ }
+ };
+
+ for my $file (@installs) {
+ my $module = Carton::Util::load_json($file->[0]);
+ my $prereqs = -f $file->[1] ? CPAN::Meta->load_file($file->[1])->effective_prereqs : CPAN::Meta::Prereqs->new;
+
+ my $reqs = CPAN::Meta::Requirements->new;
+ $reqs->add_requirements($prereqs->requirements_for($_, 'requires'))
+ for qw( configure build runtime );
+
+ if ($accepts->($module)) {
+ $installs{$module->{name}} = Carton::Dist->new(
+ name => $module->{dist},
+ pathname => $module->{pathname},
+ provides => $module->{provides},
+ version => $module->{version},
+ requirements => $reqs,
+ );
+ }
+ }
+
+ my @new_dists;
+ for my $module (sort keys %installs) {
+ push @new_dists, $installs{$module};
+ }
+
+ $self->_distributions(\@new_dists);
+ }
+
+ 1;
+CARTON_SNAPSHOT
+
+$fatpacked{"Carton/Snapshot/Emitter.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_SNAPSHOT_EMITTER';
+ package Carton::Snapshot::Emitter;
+ use Class::Tiny;
+ use warnings NONFATAL => 'all';
+
+ sub emit {
+ my($self, $snapshot) = @_;
+
+ my $data = '';
+ $data .= "# carton snapshot format: version @{[$snapshot->version]}\n";
+ $data .= "DISTRIBUTIONS\n";
+
+ for my $dist (sort { $a->name cmp $b->name } $snapshot->distributions) {
+ $data .= " @{[$dist->name]}\n";
+ $data .= " pathname: @{[$dist->pathname]}\n";
+
+ $data .= " provides:\n";
+ for my $package (sort keys %{$dist->provides}) {
+ $data .= " $package @{[$dist->provides->{$package}{version} || 'undef' ]}\n";
+ }
+
+ $data .= " requirements:\n";
+ for my $module (sort $dist->required_modules) {
+ $data .= " $module @{[ $dist->requirements_for_module($module) || '0' ]}\n";
+ }
+ }
+
+ $data;
+ }
+
+ 1;
+CARTON_SNAPSHOT_EMITTER
+
+$fatpacked{"Carton/Snapshot/Parser.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_SNAPSHOT_PARSER';
+ package Carton::Snapshot::Parser;
+ use Class::Tiny;
+ use warnings NONFATAL => 'all';
+ use Carton::Dist;
+ use Carton::Error;
+
+ my $machine = {
+ init => [
+ {
+ re => qr/^\# carton snapshot format: version (1\.0)/,
+ code => sub {
+ my($stash, $snapshot, $ver) = @_;
+ $snapshot->version($ver);
+ },
+ goto => 'section',
+ },
+ # TODO support pasing error and version mismatch etc.
+ ],
+ section => [
+ {
+ re => qr/^DISTRIBUTIONS$/,
+ goto => 'dists',
+ },
+ {
+ re => qr/^__EOF__$/,
+ done => 1,
+ },
+ ],
+ dists => [
+ {
+ re => qr/^ (\S+)$/,
+ code => sub { $_[0]->{dist} = Carton::Dist->new(name => $1) },
+ goto => 'distmeta',
+ },
+ {
+ re => qr/^\S/,
+ goto => 'section',
+ redo => 1,
+ },
+ ],
+ distmeta => [
+ {
+ re => qr/^ pathname: (.*)$/,
+ code => sub { $_[0]->{dist}->pathname($1) },
+ },
+ {
+ re => qr/^\s{4}provides:$/,
+ code => sub { $_[0]->{property} = 'provides' },
+ goto => 'properties',
+ },
+ {
+ re => qr/^\s{4}requirements:$/,
+ code => sub {
+ $_[0]->{property} = 'requirements';
+ },
+ goto => 'properties',
+ },
+ {
+ re => qr/^\s{0,2}\S/,
+ code => sub {
+ my($stash, $snapshot) = @_;
+ $snapshot->add_distribution($stash->{dist});
+ %$stash = (); # clear
+ },
+ goto => 'dists',
+ redo => 1,
+ },
+ ],
+ properties => [
+ {
+ re => qr/^\s{6}([0-9A-Za-z_:]+) ([v0-9\._,=\!<>\s]+|undef)/,
+ code => sub {
+ my($stash, $snapshot, $module, $version) = @_;
+
+ if ($stash->{property} eq 'provides') {
+ $stash->{dist}->provides->{$module} = { version => $version };
+ } else {
+ $stash->{dist}->add_string_requirement($module, $version);
+ }
+ },
+ },
+ {
+ re => qr/^\s{0,4}\S/,
+ goto => 'distmeta',
+ redo => 1,
+ },
+ ],
+ };
+
+ sub parse {
+ my($self, $data, $snapshot) = @_;
+
+ my @lines = split /\r?\n/, $data;
+
+ my $state = $machine->{init};
+ my $stash = {};
+
+ LINE:
+ for my $line (@lines, '__EOF__') {
+ last LINE unless @$state;
+
+ STATE: {
+ for my $trans (@{$state}) {
+ if (my @match = $line =~ $trans->{re}) {
+ if (my $code = $trans->{code}) {
+ $code->($stash, $snapshot, @match);
+ }
+ if (my $goto = $trans->{goto}) {
+ $state = $machine->{$goto};
+ if ($trans->{redo}) {
+ redo STATE;
+ } else {
+ next LINE;
+ }
+ }
+
+ last STATE;
+ }
+ }
+
+ Carton::Error::SnapshotParseError->throw(error => "Could not parse snapshot file.");
+ }
+ }
+ }
+
+ 1;
+CARTON_SNAPSHOT_PARSER
+
+$fatpacked{"Carton/Tree.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_TREE';
+ package Carton::Tree;
+ use strict;
+ use Carton::Dependency;
+
+ use Class::Tiny qw( cpanfile snapshot );
+
+ use constant STOP => -1;
+
+ sub walk_down {
+ my($self, $cb) = @_;
+
+ my $dumper; $dumper = sub {
+ my($dependency, $reqs, $level, $parent) = @_;
+
+ my $ret = $cb->($dependency, $reqs, $level);
+ return if $ret && $ret == STOP;
+
+ local $parent->{$dependency->distname} = 1 if $dependency;
+
+ for my $module (sort $reqs->required_modules) {
+ my $dependency = $self->dependency_for($module, $reqs);
+ if ($dependency->dist) {
+ next if $parent->{$dependency->distname};
+ $dumper->($dependency, $dependency->requirements, $level + 1, $parent);
+ } else {
+ # no dist found in lock
+ }
+ }
+ };
+
+ $dumper->(undef, $self->cpanfile->requirements, 0, {});
+ undef $dumper;
+ }
+
+ sub dependency_for {
+ my($self, $module, $reqs) = @_;
+
+ my $requirement = $reqs->requirements_for_module($module);
+
+ my $dep = Carton::Dependency->new;
+ $dep->module($module);
+ $dep->requirement($requirement);
+
+ if (my $dist = $self->snapshot->find_or_core($module)) {
+ $dep->dist($dist);
+ }
+
+ return $dep;
+ }
+
+ sub merged_requirements {
+ my $self = shift;
+
+ my $merged_reqs = CPAN::Meta::Requirements->new;
+
+ my %seen;
+ $self->walk_down(sub {
+ my($dependency, $reqs, $level) = @_;
+ return Carton::Tree::STOP if $dependency && $seen{$dependency->distname}++;
+ $merged_reqs->add_requirements($reqs);
+ });
+
+ $merged_reqs->clear_requirement('perl');
+ $merged_reqs->finalize;
+
+ $merged_reqs;
+ }
+
+ 1;
+CARTON_TREE
+
+$fatpacked{"Carton/Util.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARTON_UTIL';
+ package Carton::Util;
+ use strict;
+ use warnings;
+
+ sub load_json {
+ my $file = shift;
+
+ open my $fh, "<", $file or die "$file: $!";
+ from_json(join '', <$fh>);
+ }
+
+ sub dump_json {
+ my($data, $file) = @_;
+
+ open my $fh, ">", $file or die "$file: $!";
+ binmode $fh;
+ print $fh to_json($data);
+ }
+
+ sub from_json {
+ require JSON;
+ JSON::decode_json(@_);
+ }
+
+ sub to_json {
+ my($data) = @_;
+ require JSON;
+ JSON->new->utf8->pretty->canonical->encode($data);
+ }
+
+ 1;
+CARTON_UTIL
+
+$fatpacked{"Class/Tiny.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CLASS_TINY';
+ use 5.006;
+ use strict;
+ no strict 'refs';
+ use warnings;
+
+ package Class::Tiny;
+ # ABSTRACT: Minimalist class construction
+
+ our $VERSION = '1.001';
+
+ use Carp ();
+
+ # load as .pm to hide from min version scanners
+ require( $] >= 5.010 ? "mro.pm" : "MRO/Compat.pm" ); ## no critic:
+
+ my %CLASS_ATTRIBUTES;
+
+ sub import {
+ my $class = shift;
+ my $pkg = caller;
+ $class->prepare_class($pkg);
+ $class->create_attributes( $pkg, @_ ) if @_;
+ }
+
+ sub prepare_class {
+ my ( $class, $pkg ) = @_;
+ @{"${pkg}::ISA"} = "Class::Tiny::Object" unless @{"${pkg}::ISA"};
+ }
+
+ # adapted from Object::Tiny and Object::Tiny::RW
+ sub create_attributes {
+ my ( $class, $pkg, @spec ) = @_;
+ my %defaults = map { ref $_ eq 'HASH' ? %$_ : ( $_ => undef ) } @spec;
+ my @attr = grep {
+ defined and !ref and /^[^\W\d]\w*$/s
+ or Carp::croak "Invalid accessor name '$_'"
+ } keys %defaults;
+ $CLASS_ATTRIBUTES{$pkg}{$_} = $defaults{$_} for @attr;
+ _gen_accessor( $pkg, $_ ) for grep { !*{"$pkg\::$_"}{CODE} } @attr;
+ Carp::croak("Failed to generate attributes for $pkg: $@\n") if $@;
+ }
+
+ sub _gen_accessor {
+ my ( $pkg, $name ) = @_;
+ my $outer_default = $CLASS_ATTRIBUTES{$pkg}{$name};
+
+ my $sub = "sub $name { if (\@_ == 1) {";
+ if ( defined $outer_default && ref $outer_default eq 'CODE' ) {
+ $sub .= "if ( !exists \$_[0]{$name} ) { \$_[0]{$name} = \$default->(\$_[0]) }";
+ }
+ elsif ( defined $outer_default ) {
+ $sub .= "if ( !exists \$_[0]{$name} ) { \$_[0]{$name} = \$default }";
+ }
+ $sub .= "return \$_[0]{$name} } else { return \$_[0]{$name}=\$_[1] } }";
+
+ # default = outer_default avoids "won't stay shared" bug
+ eval "package $pkg; my \$default=\$outer_default; $sub"; ## no critic
+ Carp::croak("Failed to generate attributes for $pkg: $@\n") if $@;
+ }
+
+ sub get_all_attributes_for {
+ my ( $class, $pkg ) = @_;
+ my %attr =
+ map { $_ => undef }
+ map { keys %{ $CLASS_ATTRIBUTES{$_} || {} } } @{ mro::get_linear_isa($pkg) };
+ return keys %attr;
+ }
+
+ sub get_all_attribute_defaults_for {
+ my ( $class, $pkg ) = @_;
+ my $defaults = {};
+ for my $p ( reverse @{ mro::get_linear_isa($pkg) } ) {
+ while ( my ( $k, $v ) = each %{ $CLASS_ATTRIBUTES{$p} || {} } ) {
+ $defaults->{$k} = $v;
+ }
+ }
+ return $defaults;
+ }
+
+ package Class::Tiny::Object;
+ # ABSTRACT: Base class for classes built with Class::Tiny
+
+ our $VERSION = '1.001';
+
+ my ( %HAS_BUILDARGS, %BUILD_CACHE, %DEMOLISH_CACHE, %ATTR_CACHE );
+
+ my $_PRECACHE = sub {
+ no warnings 'once'; # needed to avoid downstream warnings
+ my ($class) = @_;
+ my $linear_isa =
+ @{"$class\::ISA"} == 1 && ${"$class\::ISA"}[0] eq "Class::Tiny::Object"
+ ? [$class]
+ : mro::get_linear_isa($class);
+ $DEMOLISH_CACHE{$class} = [
+ map { ( *{$_}{CODE} ) ? ( *{$_}{CODE} ) : () }
+ map { "$_\::DEMOLISH" } @$linear_isa
+ ];
+ $BUILD_CACHE{$class} = [
+ map { ( *{$_}{CODE} ) ? ( *{$_}{CODE} ) : () }
+ map { "$_\::BUILD" } reverse @$linear_isa
+ ];
+ $HAS_BUILDARGS{$class} = $class->can("BUILDARGS");
+ return $ATTR_CACHE{$class} =
+ { map { $_ => 1 } Class::Tiny->get_all_attributes_for($class) };
+ };
+
+ sub new {
+ my $class = shift;
+ my $valid_attrs = $ATTR_CACHE{$class} || $_PRECACHE->($class);
+
+ # handle hash ref or key/value arguments
+ my $args;
+ if ( $HAS_BUILDARGS{$class} ) {
+ $args = $class->BUILDARGS(@_);
+ }
+ else {
+ if ( @_ == 1 && ref $_[0] ) {
+ my %copy = eval { %{ $_[0] } }; # try shallow copy
+ Carp::croak("Argument to $class->new() could not be dereferenced as a hash") if $@;
+ $args = \%copy;
+ }
+ elsif ( @_ % 2 == 0 ) {
+ $args = {@_};
+ }
+ else {
+ Carp::croak("$class->new() got an odd number of elements");
+ }
+ }
+
+ # create object and invoke BUILD (unless we were given __no_BUILD__)
+ my $self =
+ bless { map { $_ => $args->{$_} } grep { exists $valid_attrs->{$_} } keys %$args },
+ $class;
+ $self->BUILDALL($args) if !delete $args->{__no_BUILD__} && @{ $BUILD_CACHE{$class} };
+
+ return $self;
+ }
+
+ sub BUILDALL { $_->(@_) for @{ $BUILD_CACHE{ ref $_[0] } } }
+
+ # Adapted from Moo and its dependencies
+ require Devel::GlobalDestruction unless defined ${^GLOBAL_PHASE};
+
+ sub DESTROY {
+ my $self = shift;
+ my $class = ref $self;
+ my $in_global_destruction =
+ defined ${^GLOBAL_PHASE}
+ ? ${^GLOBAL_PHASE} eq 'DESTRUCT'
+ : Devel::GlobalDestruction::in_global_destruction();
+ for my $demolisher ( @{ $DEMOLISH_CACHE{$class} } ) {
+ my $e = do {
+ local ( $?, $@ );
+ eval { $demolisher->( $self, $in_global_destruction ) };
+ $@;
+ };
+ no warnings 'misc'; # avoid (in cleanup) warnings
+ die $e if $e; # rethrow
+ }
+ }
+
+ 1;
+
+
+ # vim: ts=4 sts=4 sw=4 et:
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ Class::Tiny - Minimalist class construction
+
+ =head1 VERSION
+
+ version 1.001
+
+ =head1 SYNOPSIS
+
+ In F<Person.pm>:
+
+ package Person;
+
+ use Class::Tiny qw( name );
+
+ 1;
+
+ In F<Employee.pm>:
+
+ package Employee;
+ use parent 'Person';
+
+ use Class::Tiny qw( ssn ), {
+ timestamp => sub { time } # attribute with default
+ };
+
+ 1;
+
+ In F<example.pl>:
+
+ use Employee;
+
+ my $obj = Employee->new( name => "Larry", ssn => "111-22-3333" );
+
+ # unknown attributes are ignored
+ my $obj = Employee->new( name => "Larry", OS => "Linux" );
+ # $obj->{OS} does not exist
+
+ =head1 DESCRIPTION
+
+ This module offers a minimalist class construction kit in around 120 lines of
+ code. Here is a list of features:
+
+ =over 4
+
+ =item *
+
+ defines attributes via import arguments
+
+ =item *
+
+ generates read-write accessors
+
+ =item *
+
+ supports lazy attribute defaults
+
+ =item *
+
+ supports custom accessors
+
+ =item *
+
+ superclass provides a standard C<new> constructor
+
+ =item *
+
+ C<new> takes a hash reference or list of key/value pairs
+
+ =item *
+
+ C<new> supports providing C<BUILDARGS> to customize constructor options
+
+ =item *
+
+ C<new> calls C<BUILD> for each class from parent to child
+
+ =item *
+
+ superclass provides a C<DESTROY> method
+
+ =item *
+
+ C<DESTROY> calls C<DEMOLISH> for each class from child to parent
+
+ =back
+
+ Multiple-inheritance is possible, with superclass order determined via
+ L<mro::get_linear_isa|mro/Functions>.
+
+ It uses no non-core modules for any recent Perl. On Perls older than v5.10 it
+ requires L<MRO::Compat>. On Perls older than v5.14, it requires
+ L<Devel::GlobalDestruction>.
+
+ =head1 USAGE
+
+ =head2 Defining attributes
+
+ Define attributes as a list of import arguments:
+
+ package Foo::Bar;
+
+ use Class::Tiny qw(
+ name
+ id
+ height
+ weight
+ );
+
+ For each attribute, a read-write accessor is created unless a subroutine of that
+ name already exists:
+
+ $obj->name; # getter
+ $obj->name( "John Doe" ); # setter
+
+ Attribute names must be valid subroutine identifiers or an exception will
+ be thrown.
+
+ You can specify lazy defaults by defining attributes with a hash reference.
+ Keys define attribute names and values are constants or code references that
+ will be evaluated when the attribute is first accessed if no value has been
+ set. The object is passed as an argument to a code reference.
+
+ package Foo::WithDefaults;
+
+ use Class::Tiny qw/name id/, {
+ title => 'Peon',
+ skills => sub { [] },
+ hire_date => sub { $_[0]->_build_hire_date },
+ };
+
+ When subclassing, if multiple accessors of the same name exist in different
+ classes, any default (or lack of default) is determined by standard
+ method resolution order.
+
+ To make your own custom accessors, just pre-declare the method name before
+ loading Class::Tiny:
+
+ package Foo::Bar;
+
+ use subs 'id';
+
+ use Class::Tiny qw( name id );
+
+ sub id { ... }
+
+ Even if you pre-declare a method name, you must include it in the attribute
+ list for Class::Tiny to register it as a valid attribute.
+
+ If you set a default for a custom accessor, your accessor will need to retrieve
+ the default and do something with it:
+
+ package Foo::Bar;
+
+ use subs 'id';
+
+ use Class::Tiny qw( name ), { id => sub { int(rand(2*31)) } };
+
+ sub id {
+ my $self = shift;
+ if (@_) {
+ return $self->{id} = shift;
+ }
+ elsif ( exists $self->{id} ) {
+ return $self->{id};
+ }
+ else {
+ my $defaults =
+ Class::Tiny->get_all_attribute_defaults_for( ref $self );
+ return $self->{id} = $defaults->{id}->();
+ }
+ }
+
+ =head2 Class::Tiny::Object is your base class
+
+ If your class B<does not> already inherit from some class, then
+ Class::Tiny::Object will be added to your C<@ISA> to provide C<new> and
+ C<DESTROY>.
+
+ If your class B<does> inherit from something, then no additional inheritance is
+ set up. If the parent subclasses Class::Tiny::Object, then all is well. If
+ not, then you'll get accessors set up but no constructor or destructor. Don't
+ do that unless you really have a special need for it.
+
+ Define subclasses as normal. It's best to define them with L<base>, L<parent>
+ or L<superclass> before defining attributes with Class::Tiny so the C<@ISA>
+ array is already populated at compile-time:
+
+ package Foo::Bar::More;
+
+ use parent 'Foo::Bar';
+
+ use Class::Tiny qw( shoe_size );
+
+ =head2 Object construction
+
+ If your class inherits from Class::Tiny::Object (as it should if you followed
+ the advice above), it provides the C<new> constructor for you.
+
+ Objects can be created with attributes given as a hash reference or as a list
+ of key/value pairs:
+
+ $obj = Foo::Bar->new( name => "David" );
+
+ $obj = Foo::Bar->new( { name => "David" } );
+
+ If a reference is passed as a single argument, it must be able to be
+ dereferenced as a hash or an exception is thrown.
+
+ Unknown attributes in the constructor arguments will be ignored. Prior to
+ version 1.000, unknown attributes were an error, but this made it harder for
+ people to cleanly subclass Class::Tiny classes so this feature was removed.
+
+ You can define a C<BUILDARGS> method to change how arguments to new are
+ handled. It will receive the constructor arguments as they were provided and
+ must return a hash reference of key/value pairs (or else throw an
+ exception).
+
+ sub BUILDARGS {
+ my $class = shift;
+ my $name = shift || "John Doe";
+ return { name => $name };
+ };
+
+ Foo::Bar->new( "David" );
+ Foo::Bar->new(); # "John Doe"
+
+ Unknown attributes returned from C<BUILDARGS> will be ignored.
+
+ =head2 BUILD
+
+ If your class or any superclass defines a C<BUILD> method, it will be called
+ by the constructor from the furthest parent class down to the child class after
+ the object has been created.
+
+ It is passed the constructor arguments as a hash reference. The return value
+ is ignored. Use C<BUILD> for validation, checking required attributes or
+ setting default values that depend on other attributes.
+
+ sub BUILD {
+ my ($self, $args) = @_;
+
+ for my $req ( qw/name age/ ) {
+ croak "$req attribute required" unless defined $self->$req;
+ }
+
+ croak "Age must be non-negative" if $self->age < 0;
+
+ $self->msg( "Hello " . $self->name );
+ }
+
+ The argument reference is a copy, so deleting elements won't affect data in the
+ original (but changes will be passed to other BUILD methods in C<@ISA>).
+
+ =head2 DEMOLISH
+
+ Class::Tiny provides a C<DESTROY> method. If your class or any superclass
+ defines a C<DEMOLISH> method, they will be called from the child class to the
+ furthest parent class during object destruction. It is provided a single
+ boolean argument indicating whether Perl is in global destruction. Return
+ values and errors are ignored.
+
+ sub DEMOLISH {
+ my ($self, $global_destruct) = @_;
+ $self->cleanup();
+ }
+
+ =head2 Introspection and internals
+
+ You can retrieve an unsorted list of valid attributes known to Class::Tiny
+ for a class and its superclasses with the C<get_all_attributes_for> class
+ method.
+
+ my @attrs = Class::Tiny->get_all_attributes_for("Employee");
+ # returns qw/name ssn timestamp/
+
+ Likewise, a hash reference of all valid attributes and default values (or code
+ references) may be retrieved with the C<get_all_attribute_defaults_for> class
+ method. Any attributes without a default will be C<undef>.
+
+ my $def = Class::Tiny->get_all_attribute_defaults_for("Employee");
+ # returns {
+ # name => undef,
+ # ssn => undef
+ # timestamp => $coderef
+ # }
+
+ The C<import> method uses two class methods, C<prepare_class> and
+ C<create_attributes> to set up the C<@ISA> array and attributes. Anyone
+ attempting to extend Class::Tiny itself should use these instead of mocking up
+ a call to C<import>.
+
+ When the first object is created, linearized C<@ISA>, the valid attribute list
+ and various subroutine references are cached for speed. Ensure that all
+ inheritance and methods are in place before creating objects. (You don't want
+ to be changing that once you create objects anyway, right?)
+
+ =for Pod::Coverage new get_all_attributes_for get_all_attribute_defaults_for
+ prepare_class create_attributes
+
+ =head1 RATIONALE
+
+ =head2 Why this instead of Object::Tiny or Class::Accessor or something else?
+
+ I wanted something so simple that it could potentially be used by core Perl
+ modules I help maintain (or hope to write), most of which either use
+ L<Class::Struct> or roll-their-own OO framework each time.
+
+ L<Object::Tiny> and L<Object::Tiny::RW> were close to what I wanted, but
+ lacking some features I deemed necessary, and their maintainers have an even
+ more strict philosophy against feature creep than I have.
+
+ I also considered L<Class::Accessor>, which has been around a long time and is
+ heavily used, but it, too, lacked features I wanted and did things in ways I
+ considered poor design.
+
+ I looked for something else on CPAN, but after checking a dozen class creators
+ I realized I could implement exactly what I wanted faster than I could search
+ CPAN for something merely sufficient.
+
+ In general, compared to most things on CPAN (other than Object::Tiny),
+ Class::Tiny is smaller in implementation and simpler in API.
+
+ Specifically, here is how Class::Tiny ("C::T") compares to Object::Tiny
+ ("O::T") and Class::Accessor ("C::A"):
+
+ FEATURE C::T O::T C::A
+ --------------------------------------------------------------
+ attributes defined via import yes yes no
+ read/write accessors yes no yes
+ lazy attribute defaults yes no no
+ provides new yes yes yes
+ provides DESTROY yes no no
+ new takes either hashref or list yes no (list) no (hash)
+ Moo(se)-like BUILD/DEMOLISH yes no no
+ Moo(se)-like BUILDARGS yes no no
+ no extraneous methods via @ISA yes yes no
+
+ =head2 Why this instead of Moose or Moo?
+
+ L<Moose> and L<Moo> are both excellent OO frameworks. Moose offers a powerful
+ meta-object protocol (MOP), but is slow to start up and has about 30 non-core
+ dependencies including XS modules. Moo is faster to start up and has about 10
+ pure Perl dependencies but provides no true MOP, relying instead on its ability
+ to transparently upgrade Moo to Moose when Moose's full feature set is
+ required.
+
+ By contrast, Class::Tiny has no MOP and has B<zero> non-core dependencies for
+ Perls in the L<support window|perlpolicy>. It has far less code, less
+ complexity and no learning curve. If you don't need or can't afford what Moo or
+ Moose offer, this is intended to be a reasonable fallback.
+
+ That said, Class::Tiny offers Moose-like conventions for things like C<BUILD>
+ and C<DEMOLISH> for some minimal interoperability and an easier upgrade path.
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/dagolden/Class-Tiny/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/dagolden/Class-Tiny>
+
+ git clone https://github.com/dagolden/Class-Tiny.git
+
+ =head1 AUTHOR
+
+ David Golden <dagolden@cpan.org>
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Dagfinn Ilmari Mannsåker Gelu Lupas Karen Etheridge Matt S Trout Olivier Mengué Toby Inkster
+
+ =over 4
+
+ =item *
+
+ Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
+
+ =item *
+
+ Gelu Lupas <gelu@devnull.ro>
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Matt S Trout <mstrout@cpan.org>
+
+ =item *
+
+ Olivier Mengué <dolmen@cpan.org>
+
+ =item *
+
+ Toby Inkster <tobyink@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is Copyright (c) 2013 by David Golden.
+
+ This is free software, licensed under:
+
+ The Apache License, Version 2.0, January 2004
+
+ =cut
+CLASS_TINY
+
+$fatpacked{"Devel/GlobalDestruction.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DEVEL_GLOBALDESTRUCTION';
+ package Devel::GlobalDestruction;
+
+ use strict;
+ use warnings;
+
+ our $VERSION = '0.13';
+
+ use Sub::Exporter::Progressive -setup => {
+ exports => [ qw(in_global_destruction) ],
+ groups => { default => [ -all ] },
+ };
+
+ # we run 5.14+ - everything is in core
+ #
+ if (defined ${^GLOBAL_PHASE}) {
+ eval 'sub in_global_destruction () { ${^GLOBAL_PHASE} eq q[DESTRUCT] }; 1'
+ or die $@;
+ }
+ # try to load the xs version if it was compiled
+ #
+ elsif (eval {
+ require Devel::GlobalDestruction::XS;
+ no warnings 'once';
+ *in_global_destruction = \&Devel::GlobalDestruction::XS::in_global_destruction;
+ 1;
+ }) {
+ # the eval already installed everything, nothing to do
+ }
+ else {
+ # internally, PL_main_cv is set to Nullcv immediately before entering
+ # global destruction and we can use B to detect that. B::main_cv will
+ # only ever be a B::CV or a B::SPECIAL that is a reference to 0
+ require B;
+ eval 'sub in_global_destruction () { ${B::main_cv()} == 0 }; 1'
+ or die $@;
+ }
+
+ 1; # keep require happy
+
+
+ __END__
+
+ =head1 NAME
+
+ Devel::GlobalDestruction - Provides function returning the equivalent of
+ C<${^GLOBAL_PHASE} eq 'DESTRUCT'> for older perls.
+
+ =head1 SYNOPSIS
+
+ package Foo;
+ use Devel::GlobalDestruction;
+
+ use namespace::clean; # to avoid having an "in_global_destruction" method
+
+ sub DESTROY {
+ return if in_global_destruction;
+
+ do_something_a_little_tricky();
+ }
+
+ =head1 DESCRIPTION
+
+ Perl's global destruction is a little tricky to deal with WRT finalizers
+ because it's not ordered and objects can sometimes disappear.
+
+ Writing defensive destructors is hard and annoying, and usually if global
+ destruction is happening you only need the destructors that free up non
+ process local resources to actually execute.
+
+ For these constructors you can avoid the mess by simply bailing out if global
+ destruction is in effect.
+
+ =head1 EXPORTS
+
+ This module uses L<Sub::Exporter::Progressive> so the exports may be renamed,
+ aliased, etc. if L<Sub::Exporter> is present.
+
+ =over 4
+
+ =item in_global_destruction
+
+ Returns true if the interpreter is in global destruction. In perl 5.14+, this
+ returns C<${^GLOBAL_PHASE} eq 'DESTRUCT'>, and on earlier perls, detects it using
+ the value of C<PL_main_cv> or C<PL_dirty>.
+
+ =back
+
+ =head1 AUTHORS
+
+ Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
+
+ Florian Ragwitz E<lt>rafl@debian.orgE<gt>
+
+ Jesse Luehrs E<lt>doy@tozt.netE<gt>
+
+ Peter Rabbitson E<lt>ribasushi@cpan.orgE<gt>
+
+ Arthur Axel 'fREW' Schmidt E<lt>frioux@gmail.comE<gt>
+
+ Elizabeth Mattijsen E<lt>liz@dijkmat.nlE<gt>
+
+ Greham Knop E<lt>haarg@haarg.orgE<gt>
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2008 Yuval Kogman. All rights reserved
+ This program is free software; you can redistribute
+ it and/or modify it under the same terms as Perl itself.
+
+ =cut
+DEVEL_GLOBALDESTRUCTION
+
+$fatpacked{"ExtUtils/Command.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_COMMAND';
+ package ExtUtils::Command;
+
+ use 5.00503;
+ use strict;
+ require Exporter;
+ use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+ @ISA = qw(Exporter);
+ @EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod
+ dos2unix);
+ $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ my $Is_VMS = $^O eq 'VMS';
+ my $Is_VMS_mode = $Is_VMS;
+ my $Is_VMS_noefs = $Is_VMS;
+ my $Is_Win32 = $^O eq 'MSWin32';
+
+ if( $Is_VMS ) {
+ my $vms_unix_rpt;
+ my $vms_efs;
+ my $vms_case;
+
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $vms_unix_rpt = VMS::Feature::current("filename_unix_report");
+ $vms_efs = VMS::Feature::current("efs_charset");
+ $vms_case = VMS::Feature::current("efs_case_preserve");
+ } else {
+ my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || '';
+ my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+ $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i;
+ $vms_efs = $efs_charset =~ /^[ET1]/i;
+ $vms_case = $efs_case =~ /^[ET1]/i;
+ }
+ $Is_VMS_mode = 0 if $vms_unix_rpt;
+ $Is_VMS_noefs = 0 if ($vms_efs);
+ }
+
+
+ =head1 NAME
+
+ ExtUtils::Command - utilities to replace common UNIX commands in Makefiles etc.
+
+ =head1 SYNOPSIS
+
+ perl -MExtUtils::Command -e cat files... > destination
+ perl -MExtUtils::Command -e mv source... destination
+ perl -MExtUtils::Command -e cp source... destination
+ perl -MExtUtils::Command -e touch files...
+ perl -MExtUtils::Command -e rm_f files...
+ perl -MExtUtils::Command -e rm_rf directories...
+ perl -MExtUtils::Command -e mkpath directories...
+ perl -MExtUtils::Command -e eqtime source destination
+ perl -MExtUtils::Command -e test_f file
+ perl -MExtUtils::Command -e test_d directory
+ perl -MExtUtils::Command -e chmod mode files...
+ ...
+
+ =head1 DESCRIPTION
+
+ The module is used to replace common UNIX commands. In all cases the
+ functions work from @ARGV rather than taking arguments. This makes
+ them easier to deal with in Makefiles. Call them like this:
+
+ perl -MExtUtils::Command -e some_command some files to work on
+
+ and I<NOT> like this:
+
+ perl -MExtUtils::Command -e 'some_command qw(some files to work on)'
+
+ For that use L<Shell::Command>.
+
+ Filenames with * and ? will be glob expanded.
+
+
+ =head2 FUNCTIONS
+
+ =over 4
+
+ =cut
+
+ # VMS uses % instead of ? to mean "one character"
+ my $wild_regex = $Is_VMS ? '*%' : '*?';
+ sub expand_wildcards
+ {
+ @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV);
+ }
+
+
+ =item cat
+
+ cat file ...
+
+ Concatenates all files mentioned on command line to STDOUT.
+
+ =cut
+
+ sub cat ()
+ {
+ expand_wildcards();
+ print while (<>);
+ }
+
+ =item eqtime
+
+ eqtime source destination
+
+ Sets modified time of destination to that of source.
+
+ =cut
+
+ sub eqtime
+ {
+ my ($src,$dst) = @ARGV;
+ local @ARGV = ($dst); touch(); # in case $dst doesn't exist
+ utime((stat($src))[8,9],$dst);
+ }
+
+ =item rm_rf
+
+ rm_rf files or directories ...
+
+ Removes files and directories - recursively (even if readonly)
+
+ =cut
+
+ sub rm_rf
+ {
+ expand_wildcards();
+ require File::Path;
+ File::Path::rmtree([grep -e $_,@ARGV],0,0);
+ }
+
+ =item rm_f
+
+ rm_f file ...
+
+ Removes files (even if readonly)
+
+ =cut
+
+ sub rm_f {
+ expand_wildcards();
+
+ foreach my $file (@ARGV) {
+ next unless -f $file;
+
+ next if _unlink($file);
+
+ chmod(0777, $file);
+
+ next if _unlink($file);
+
+ require Carp;
+ Carp::carp("Cannot delete $file: $!");
+ }
+ }
+
+ sub _unlink {
+ my $files_unlinked = 0;
+ foreach my $file (@_) {
+ my $delete_count = 0;
+ $delete_count++ while unlink $file;
+ $files_unlinked++ if $delete_count;
+ }
+ return $files_unlinked;
+ }
+
+
+ =item touch
+
+ touch file ...
+
+ Makes files exist, with current timestamp
+
+ =cut
+
+ sub touch {
+ my $t = time;
+ expand_wildcards();
+ foreach my $file (@ARGV) {
+ open(FILE,">>$file") || die "Cannot write $file:$!";
+ close(FILE);
+ utime($t,$t,$file);
+ }
+ }
+
+ =item mv
+
+ mv source_file destination_file
+ mv source_file source_file destination_dir
+
+ Moves source to destination. Multiple sources are allowed if
+ destination is an existing directory.
+
+ Returns true if all moves succeeded, false otherwise.
+
+ =cut
+
+ sub mv {
+ expand_wildcards();
+ my @src = @ARGV;
+ my $dst = pop @src;
+
+ if (@src > 1 && ! -d $dst) {
+ require Carp;
+ Carp::croak("Too many arguments");
+ }
+
+ require File::Copy;
+ my $nok = 0;
+ foreach my $src (@src) {
+ $nok ||= !File::Copy::move($src,$dst);
+ }
+ return !$nok;
+ }
+
+ =item cp
+
+ cp source_file destination_file
+ cp source_file source_file destination_dir
+
+ Copies sources to the destination. Multiple sources are allowed if
+ destination is an existing directory.
+
+ Returns true if all copies succeeded, false otherwise.
+
+ =cut
+
+ sub cp {
+ expand_wildcards();
+ my @src = @ARGV;
+ my $dst = pop @src;
+
+ if (@src > 1 && ! -d $dst) {
+ require Carp;
+ Carp::croak("Too many arguments");
+ }
+
+ require File::Copy;
+ my $nok = 0;
+ foreach my $src (@src) {
+ $nok ||= !File::Copy::copy($src,$dst);
+
+ # Win32 does not update the mod time of a copied file, just the
+ # created time which make does not look at.
+ utime(time, time, $dst) if $Is_Win32;
+ }
+ return $nok;
+ }
+
+ =item chmod
+
+ chmod mode files ...
+
+ Sets UNIX like permissions 'mode' on all the files. e.g. 0666
+
+ =cut
+
+ sub chmod {
+ local @ARGV = @ARGV;
+ my $mode = shift(@ARGV);
+ expand_wildcards();
+
+ if( $Is_VMS_mode && $Is_VMS_noefs) {
+ require File::Spec;
+ foreach my $idx (0..$#ARGV) {
+ my $path = $ARGV[$idx];
+ next unless -d $path;
+
+ # chmod 0777, [.foo.bar] doesn't work on VMS, you have to do
+ # chmod 0777, [.foo]bar.dir
+ my @dirs = File::Spec->splitdir( $path );
+ $dirs[-1] .= '.dir';
+ $path = File::Spec->catfile(@dirs);
+
+ $ARGV[$idx] = $path;
+ }
+ }
+
+ chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!";
+ }
+
+ =item mkpath
+
+ mkpath directory ...
+
+ Creates directories, including any parent directories.
+
+ =cut
+
+ sub mkpath
+ {
+ expand_wildcards();
+ require File::Path;
+ File::Path::mkpath([@ARGV],0,0777);
+ }
+
+ =item test_f
+
+ test_f file
+
+ Tests if a file exists. I<Exits> with 0 if it does, 1 if it does not (ie.
+ shell's idea of true and false).
+
+ =cut
+
+ sub test_f
+ {
+ exit(-f $ARGV[0] ? 0 : 1);
+ }
+
+ =item test_d
+
+ test_d directory
+
+ Tests if a directory exists. I<Exits> with 0 if it does, 1 if it does
+ not (ie. shell's idea of true and false).
+
+ =cut
+
+ sub test_d
+ {
+ exit(-d $ARGV[0] ? 0 : 1);
+ }
+
+ =item dos2unix
+
+ dos2unix files or dirs ...
+
+ Converts DOS and OS/2 linefeeds to Unix style recursively.
+
+ =cut
+
+ sub dos2unix {
+ require File::Find;
+ File::Find::find(sub {
+ return if -d;
+ return unless -w _;
+ return unless -r _;
+ return if -B _;
+
+ local $\;
+
+ my $orig = $_;
+ my $temp = '.dos2unix_tmp';
+ open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return };
+ open TEMP, ">$temp" or
+ do { warn "dos2unix can't create .dos2unix_tmp: $!"; return };
+ while (my $line = <ORIG>) {
+ $line =~ s/\015\012/\012/g;
+ print TEMP $line;
+ }
+ close ORIG;
+ close TEMP;
+ rename $temp, $orig;
+
+ }, @ARGV);
+ }
+
+ =back
+
+ =head1 SEE ALSO
+
+ Shell::Command which is these same functions but take arguments normally.
+
+
+ =head1 AUTHOR
+
+ Nick Ing-Simmons C<ni-s@cpan.org>
+
+ Maintained by Michael G Schwern C<schwern@pobox.com> within the
+ ExtUtils-MakeMaker package and, as a separate CPAN package, by
+ Randy Kobes C<r.kobes@uwinnipeg.ca>.
+
+ =cut
+
+EXTUTILS_COMMAND
+
+$fatpacked{"ExtUtils/Command/MM.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_COMMAND_MM';
+ package ExtUtils::Command::MM;
+
+ require 5.006;
+
+ use strict;
+ use warnings;
+
+ require Exporter;
+ our @ISA = qw(Exporter);
+
+ our @EXPORT = qw(test_harness pod2man perllocal_install uninstall
+ warn_if_old_packlist test_s cp_nonempty);
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ my $Is_VMS = $^O eq 'VMS';
+
+ eval { require Time::HiRes; die unless Time::HiRes->can("stat"); };
+ *mtime = $@ ?
+ sub { [ stat($_[0])]->[9] } :
+ sub { [Time::HiRes::stat($_[0])]->[9] } ;
+
+ =head1 NAME
+
+ ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
+
+ =head1 SYNOPSIS
+
+ perl "-MExtUtils::Command::MM" -e "function" "--" arguments...
+
+
+ =head1 DESCRIPTION
+
+ B<FOR INTERNAL USE ONLY!> The interface is not stable.
+
+ ExtUtils::Command::MM encapsulates code which would otherwise have to
+ be done with large "one" liners.
+
+ Any $(FOO) used in the examples are make variables, not Perl.
+
+ =over 4
+
+ =item B<test_harness>
+
+ test_harness($verbose, @test_libs);
+
+ Runs the tests on @ARGV via Test::Harness passing through the $verbose
+ flag. Any @test_libs will be unshifted onto the test's @INC.
+
+ @test_libs are run in alphabetical order.
+
+ =cut
+
+ sub test_harness {
+ require Test::Harness;
+ require File::Spec;
+
+ $Test::Harness::verbose = shift;
+
+ # Because Windows doesn't do this for us and listing all the *.t files
+ # out on the command line can blow over its exec limit.
+ require ExtUtils::Command;
+ my @argv = ExtUtils::Command::expand_wildcards(@ARGV);
+
+ local @INC = @INC;
+ unshift @INC, map { File::Spec->rel2abs($_) } @_;
+ Test::Harness::runtests(sort { lc $a cmp lc $b } @argv);
+ }
+
+
+
+ =item B<pod2man>
+
+ pod2man( '--option=value',
+ $podfile1 => $manpage1,
+ $podfile2 => $manpage2,
+ ...
+ );
+
+ # or args on @ARGV
+
+ pod2man() is a function performing most of the duties of the pod2man
+ program. Its arguments are exactly the same as pod2man as of 5.8.0
+ with the addition of:
+
+ --perm_rw octal permission to set the resulting manpage to
+
+ And the removal of:
+
+ --verbose/-v
+ --help/-h
+
+ If no arguments are given to pod2man it will read from @ARGV.
+
+ If Pod::Man is unavailable, this function will warn and return undef.
+
+ =cut
+
+ sub pod2man {
+ local @ARGV = @_ ? @_ : @ARGV;
+
+ {
+ local $@;
+ if( !eval { require Pod::Man } ) {
+ warn "Pod::Man is not available: $@".
+ "Man pages will not be generated during this install.\n";
+ return 0;
+ }
+ }
+ require Getopt::Long;
+
+ # We will cheat and just use Getopt::Long. We fool it by putting
+ # our arguments into @ARGV. Should be safe.
+ my %options = ();
+ Getopt::Long::config ('bundling_override');
+ Getopt::Long::GetOptions (\%options,
+ 'section|s=s', 'release|r=s', 'center|c=s',
+ 'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+ 'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l',
+ 'name|n=s', 'perm_rw=i', 'utf8|u'
+ );
+ delete $options{utf8} unless $Pod::Man::VERSION >= 2.17;
+
+ # If there's no files, don't bother going further.
+ return 0 unless @ARGV;
+
+ # Official sets --center, but don't override things explicitly set.
+ if ($options{official} && !defined $options{center}) {
+ $options{center} = q[Perl Programmer's Reference Guide];
+ }
+
+ # This isn't a valid Pod::Man option and is only accepted for backwards
+ # compatibility.
+ delete $options{lax};
+ my $count = scalar @ARGV / 2;
+ my $plural = $count == 1 ? 'document' : 'documents';
+ print "Manifying $count pod $plural\n";
+
+ do {{ # so 'next' works
+ my ($pod, $man) = splice(@ARGV, 0, 2);
+
+ next if ((-e $man) &&
+ (mtime($man) > mtime($pod)) &&
+ (mtime($man) > mtime("Makefile")));
+
+ my $parser = Pod::Man->new(%options);
+ $parser->parse_from_file($pod, $man)
+ or do { warn("Could not install $man\n"); next };
+
+ if (exists $options{perm_rw}) {
+ chmod(oct($options{perm_rw}), $man)
+ or do { warn("chmod $options{perm_rw} $man: $!\n"); next };
+ }
+ }} while @ARGV;
+
+ return 1;
+ }
+
+
+ =item B<warn_if_old_packlist>
+
+ perl "-MExtUtils::Command::MM" -e warn_if_old_packlist <somefile>
+
+ Displays a warning that an old packlist file was found. Reads the
+ filename from @ARGV.
+
+ =cut
+
+ sub warn_if_old_packlist {
+ my $packlist = $ARGV[0];
+
+ return unless -f $packlist;
+ print <<"PACKLIST_WARNING";
+ WARNING: I have found an old package in
+ $packlist.
+ Please make sure the two installations are not conflicting
+ PACKLIST_WARNING
+
+ }
+
+
+ =item B<perllocal_install>
+
+ perl "-MExtUtils::Command::MM" -e perllocal_install
+ <type> <module name> <key> <value> ...
+
+ # VMS only, key|value pairs come on STDIN
+ perl "-MExtUtils::Command::MM" -e perllocal_install
+ <type> <module name> < <key>|<value> ...
+
+ Prints a fragment of POD suitable for appending to perllocal.pod.
+ Arguments are read from @ARGV.
+
+ 'type' is the type of what you're installing. Usually 'Module'.
+
+ 'module name' is simply the name of your module. (Foo::Bar)
+
+ Key/value pairs are extra information about the module. Fields include:
+
+ installed into which directory your module was out into
+ LINKTYPE dynamic or static linking
+ VERSION module version number
+ EXE_FILES any executables installed in a space seperated
+ list
+
+ =cut
+
+ sub perllocal_install {
+ my($type, $name) = splice(@ARGV, 0, 2);
+
+ # VMS feeds args as a piped file on STDIN since it usually can't
+ # fit all the args on a single command line.
+ my @mod_info = $Is_VMS ? split /\|/, <STDIN>
+ : @ARGV;
+
+ my $pod;
+ $pod = sprintf <<'POD', scalar(localtime), $type, $name;
+ =head2 %s: C<%s> L<%3$s|%3$s>
+
+ =over 4
+
+ POD
+
+ do {
+ my($key, $val) = splice(@mod_info, 0, 2);
+
+ $pod .= <<POD
+ =item *
+
+ C<$key: $val>
+
+ POD
+
+ } while(@mod_info);
+
+ $pod .= "=back\n\n";
+ $pod =~ s/^ //mg;
+ print $pod;
+
+ return 1;
+ }
+
+ =item B<uninstall>
+
+ perl "-MExtUtils::Command::MM" -e uninstall <packlist>
+
+ A wrapper around ExtUtils::Install::uninstall(). Warns that
+ uninstallation is deprecated and doesn't actually perform the
+ uninstallation.
+
+ =cut
+
+ sub uninstall {
+ my($packlist) = shift @ARGV;
+
+ require ExtUtils::Install;
+
+ print <<'WARNING';
+
+ Uninstall is unsafe and deprecated, the uninstallation was not performed.
+ We will show what would have been done.
+
+ WARNING
+
+ ExtUtils::Install::uninstall($packlist, 1, 1);
+
+ print <<'WARNING';
+
+ Uninstall is unsafe and deprecated, the uninstallation was not performed.
+ Please check the list above carefully, there may be errors.
+ Remove the appropriate files manually.
+ Sorry for the inconvenience.
+
+ WARNING
+
+ }
+
+ =item B<test_s>
+
+ perl "-MExtUtils::Command::MM" -e test_s <file>
+
+ Tests if a file exists and is not empty (size > 0).
+ I<Exits> with 0 if it does, 1 if it does not.
+
+ =cut
+
+ sub test_s {
+ exit(-s $ARGV[0] ? 0 : 1);
+ }
+
+ =item B<cp_nonempty>
+
+ perl "-MExtUtils::Command::MM" -e cp_nonempty <srcfile> <dstfile> <perm>
+
+ Tests if the source file exists and is not empty (size > 0). If it is not empty
+ it copies it to the given destination with the given permissions.
+
+ =back
+
+ =cut
+
+ sub cp_nonempty {
+ my @args = @ARGV;
+ return 0 unless -s $args[0];
+ require ExtUtils::Command;
+ {
+ local @ARGV = @args[0,1];
+ ExtUtils::Command::cp(@ARGV);
+ }
+ {
+ local @ARGV = @args[2,1];
+ ExtUtils::Command::chmod(@ARGV);
+ }
+ }
+
+
+ 1;
+EXTUTILS_COMMAND_MM
+
+$fatpacked{"ExtUtils/Liblist.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_LIBLIST';
+ package ExtUtils::Liblist;
+
+ use strict;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ use File::Spec;
+ require ExtUtils::Liblist::Kid;
+ our @ISA = qw(ExtUtils::Liblist::Kid File::Spec);
+
+ # Backwards compatibility with old interface.
+ sub ext {
+ goto &ExtUtils::Liblist::Kid::ext;
+ }
+
+ sub lsdir {
+ shift;
+ my $rex = qr/$_[1]/;
+ opendir my $dir_fh, $_[0];
+ my @out = grep /$rex/, readdir $dir_fh;
+ closedir $dir_fh;
+ return @out;
+ }
+
+ __END__
+
+ =head1 NAME
+
+ ExtUtils::Liblist - determine libraries to use and how to use them
+
+ =head1 SYNOPSIS
+
+ require ExtUtils::Liblist;
+
+ $MM->ext($potential_libs, $verbose, $need_names);
+
+ # Usually you can get away with:
+ ExtUtils::Liblist->ext($potential_libs, $verbose, $need_names)
+
+ =head1 DESCRIPTION
+
+ This utility takes a list of libraries in the form C<-llib1 -llib2
+ -llib3> and returns lines suitable for inclusion in an extension
+ Makefile. Extra library paths may be included with the form
+ C<-L/another/path> this will affect the searches for all subsequent
+ libraries.
+
+ It returns an array of four or five scalar values: EXTRALIBS,
+ BSLOADLIBS, LDLOADLIBS, LD_RUN_PATH, and, optionally, a reference to
+ the array of the filenames of actual libraries. Some of these don't
+ mean anything unless on Unix. See the details about those platform
+ specifics below. The list of the filenames is returned only if
+ $need_names argument is true.
+
+ Dependent libraries can be linked in one of three ways:
+
+ =over 2
+
+ =item * For static extensions
+
+ by the ld command when the perl binary is linked with the extension
+ library. See EXTRALIBS below.
+
+ =item * For dynamic extensions at build/link time
+
+ by the ld command when the shared object is built/linked. See
+ LDLOADLIBS below.
+
+ =item * For dynamic extensions at load time
+
+ by the DynaLoader when the shared object is loaded. See BSLOADLIBS
+ below.
+
+ =back
+
+ =head2 EXTRALIBS
+
+ List of libraries that need to be linked with when linking a perl
+ binary which includes this extension. Only those libraries that
+ actually exist are included. These are written to a file and used
+ when linking perl.
+
+ =head2 LDLOADLIBS and LD_RUN_PATH
+
+ List of those libraries which can or must be linked into the shared
+ library when created using ld. These may be static or dynamic
+ libraries. LD_RUN_PATH is a colon separated list of the directories
+ in LDLOADLIBS. It is passed as an environment variable to the process
+ that links the shared library.
+
+ =head2 BSLOADLIBS
+
+ List of those libraries that are needed but can be linked in
+ dynamically at run time on this platform. SunOS/Solaris does not need
+ this because ld records the information (from LDLOADLIBS) into the
+ object file. This list is used to create a .bs (bootstrap) file.
+
+ =head1 PORTABILITY
+
+ This module deals with a lot of system dependencies and has quite a
+ few architecture specific C<if>s in the code.
+
+ =head2 VMS implementation
+
+ The version of ext() which is executed under VMS differs from the
+ Unix-OS/2 version in several respects:
+
+ =over 2
+
+ =item *
+
+ Input library and path specifications are accepted with or without the
+ C<-l> and C<-L> prefixes used by Unix linkers. If neither prefix is
+ present, a token is considered a directory to search if it is in fact
+ a directory, and a library to search for otherwise. Authors who wish
+ their extensions to be portable to Unix or OS/2 should use the Unix
+ prefixes, since the Unix-OS/2 version of ext() requires them.
+
+ =item *
+
+ Wherever possible, shareable images are preferred to object libraries,
+ and object libraries to plain object files. In accordance with VMS
+ naming conventions, ext() looks for files named I<lib>shr and I<lib>rtl;
+ it also looks for I<lib>lib and libI<lib> to accommodate Unix conventions
+ used in some ported software.
+
+ =item *
+
+ For each library that is found, an appropriate directive for a linker options
+ file is generated. The return values are space-separated strings of
+ these directives, rather than elements used on the linker command line.
+
+ =item *
+
+ LDLOADLIBS contains both the libraries found based on C<$potential_libs> and
+ the CRTLs, if any, specified in Config.pm. EXTRALIBS contains just those
+ libraries found based on C<$potential_libs>. BSLOADLIBS and LD_RUN_PATH
+ are always empty.
+
+ =back
+
+ In addition, an attempt is made to recognize several common Unix library
+ names, and filter them out or convert them to their VMS equivalents, as
+ appropriate.
+
+ In general, the VMS version of ext() should properly handle input from
+ extensions originally designed for a Unix or VMS environment. If you
+ encounter problems, or discover cases where the search could be improved,
+ please let us know.
+
+ =head2 Win32 implementation
+
+ The version of ext() which is executed under Win32 differs from the
+ Unix-OS/2 version in several respects:
+
+ =over 2
+
+ =item *
+
+ If C<$potential_libs> is empty, the return value will be empty.
+ Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
+ will be appended to the list of C<$potential_libs>. The libraries
+ will be searched for in the directories specified in C<$potential_libs>,
+ C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
+ For each library that is found, a space-separated list of fully qualified
+ library pathnames is generated.
+
+ =item *
+
+ Input library and path specifications are accepted with or without the
+ C<-l> and C<-L> prefixes used by Unix linkers.
+
+ An entry of the form C<-La:\foo> specifies the C<a:\foo> directory to look
+ for the libraries that follow.
+
+ An entry of the form C<-lfoo> specifies the library C<foo>, which may be
+ spelled differently depending on what kind of compiler you are using. If
+ you are using GCC, it gets translated to C<libfoo.a>, but for other win32
+ compilers, it becomes C<foo.lib>. If no files are found by those translated
+ names, one more attempt is made to find them using either C<foo.a> or
+ C<libfoo.lib>, depending on whether GCC or some other win32 compiler is
+ being used, respectively.
+
+ If neither the C<-L> or C<-l> prefix is present in an entry, the entry is
+ considered a directory to search if it is in fact a directory, and a
+ library to search for otherwise. The C<$Config{lib_ext}> suffix will
+ be appended to any entries that are not directories and don't already have
+ the suffix.
+
+ Note that the C<-L> and C<-l> prefixes are B<not required>, but authors
+ who wish their extensions to be portable to Unix or OS/2 should use the
+ prefixes, since the Unix-OS/2 version of ext() requires them.
+
+ =item *
+
+ Entries cannot be plain object files, as many Win32 compilers will
+ not handle object files in the place of libraries.
+
+ =item *
+
+ Entries in C<$potential_libs> beginning with a colon and followed by
+ alphanumeric characters are treated as flags. Unknown flags will be ignored.
+
+ An entry that matches C</:nodefault/i> disables the appending of default
+ libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
+
+ An entry that matches C</:nosearch/i> disables all searching for
+ the libraries specified after it. Translation of C<-Lfoo> and
+ C<-lfoo> still happens as appropriate (depending on compiler being used,
+ as reflected by C<$Config{cc}>), but the entries are not verified to be
+ valid files or directories.
+
+ An entry that matches C</:search/i> reenables searching for
+ the libraries specified after it. You can put it at the end to
+ enable searching for default libraries specified by C<$Config{perllibs}>.
+
+ =item *
+
+ The libraries specified may be a mixture of static libraries and
+ import libraries (to link with DLLs). Since both kinds are used
+ pretty transparently on the Win32 platform, we do not attempt to
+ distinguish between them.
+
+ =item *
+
+ LDLOADLIBS and EXTRALIBS are always identical under Win32, and BSLOADLIBS
+ and LD_RUN_PATH are always empty (this may change in future).
+
+ =item *
+
+ You must make sure that any paths and path components are properly
+ surrounded with double-quotes if they contain spaces. For example,
+ C<$potential_libs> could be (literally):
+
+ "-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
+
+ Note how the first and last entries are protected by quotes in order
+ to protect the spaces.
+
+ =item *
+
+ Since this module is most often used only indirectly from extension
+ C<Makefile.PL> files, here is an example C<Makefile.PL> entry to add
+ a library to the build process for an extension:
+
+ LIBS => ['-lgl']
+
+ When using GCC, that entry specifies that MakeMaker should first look
+ for C<libgl.a> (followed by C<gl.a>) in all the locations specified by
+ C<$Config{libpth}>.
+
+ When using a compiler other than GCC, the above entry will search for
+ C<gl.lib> (followed by C<libgl.lib>).
+
+ If the library happens to be in a location not in C<$Config{libpth}>,
+ you need:
+
+ LIBS => ['-Lc:\gllibs -lgl']
+
+ Here is a less often used example:
+
+ LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
+
+ This specifies a search for library C<gl> as before. If that search
+ fails to find the library, it looks at the next item in the list. The
+ C<:nosearch> flag will prevent searching for the libraries that follow,
+ so it simply returns the value as C<-Ld:\mesalibs -lmesa -luser32>,
+ since GCC can use that value as is with its linker.
+
+ When using the Visual C compiler, the second item is returned as
+ C<-libpath:d:\mesalibs mesa.lib user32.lib>.
+
+ When using the Borland compiler, the second item is returned as
+ C<-Ld:\mesalibs mesa.lib user32.lib>, and MakeMaker takes care of
+ moving the C<-Ld:\mesalibs> to the correct place in the linker
+ command line.
+
+ =back
+
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MakeMaker>
+
+ =cut
+
+EXTUTILS_LIBLIST
+
+$fatpacked{"ExtUtils/Liblist/Kid.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_LIBLIST_KID';
+ package ExtUtils::Liblist::Kid;
+
+ # XXX Splitting this out into its own .pm is a temporary solution.
+
+ # This kid package is to be used by MakeMaker. It will not work if
+ # $self is not a Makemaker.
+
+ use 5.006;
+
+ # Broken out of MakeMaker from version 4.11
+
+ use strict;
+ use warnings;
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ use ExtUtils::MakeMaker::Config;
+ use Cwd 'cwd';
+ use File::Basename;
+ use File::Spec;
+
+ sub ext {
+ if ( $^O eq 'VMS' ) { return &_vms_ext; }
+ elsif ( $^O eq 'MSWin32' ) { return &_win32_ext; }
+ else { return &_unix_os2_ext; }
+ }
+
+ sub _unix_os2_ext {
+ my ( $self, $potential_libs, $verbose, $give_libs ) = @_;
+ $verbose ||= 0;
+
+ if ( $^O =~ /os2|android/ and $Config{perllibs} ) {
+
+ # Dynamic libraries are not transitive, so we may need including
+ # the libraries linked against perl.dll/libperl.so again.
+
+ $potential_libs .= " " if $potential_libs;
+ $potential_libs .= $Config{perllibs};
+ }
+ return ( "", "", "", "", ( $give_libs ? [] : () ) ) unless $potential_libs;
+ warn "Potential libraries are '$potential_libs':\n" if $verbose;
+
+ my ( $so ) = $Config{so};
+ my ( $libs ) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs};
+ my $Config_libext = $Config{lib_ext} || ".a";
+ my $Config_dlext = $Config{dlext};
+
+ # compute $extralibs, $bsloadlibs and $ldloadlibs from
+ # $potential_libs
+ # this is a rewrite of Andy Dougherty's extliblist in perl
+
+ my ( @searchpath ); # from "-L/path" entries in $potential_libs
+ my ( @libpath ) = split " ", $Config{'libpth'} || '';
+ my ( @ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen );
+ my ( @libs, %libs_seen );
+ my ( $fullname, @fullname );
+ my ( $pwd ) = cwd(); # from Cwd.pm
+ my ( $found ) = 0;
+
+ foreach my $thislib ( split ' ', $potential_libs ) {
+ my ( $custom_name ) = '';
+
+ # Handle possible linker path arguments.
+ if ( $thislib =~ s/^(-[LR]|-Wl,-R|-Wl,-rpath,)// ) { # save path flag type
+ my ( $ptype ) = $1;
+ unless ( -d $thislib ) {
+ warn "$ptype$thislib ignored, directory does not exist\n"
+ if $verbose;
+ next;
+ }
+ my ( $rtype ) = $ptype;
+ if ( ( $ptype eq '-R' ) or ( $ptype =~ m!^-Wl,-[Rr]! ) ) {
+ if ( $Config{'lddlflags'} =~ /-Wl,-[Rr]/ ) {
+ $rtype = '-Wl,-R';
+ }
+ elsif ( $Config{'lddlflags'} =~ /-R/ ) {
+ $rtype = '-R';
+ }
+ }
+ unless ( File::Spec->file_name_is_absolute( $thislib ) ) {
+ warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
+ $thislib = $self->catdir( $pwd, $thislib );
+ }
+ push( @searchpath, $thislib );
+ push( @extralibs, "$ptype$thislib" );
+ push( @ldloadlibs, "$rtype$thislib" );
+ next;
+ }
+
+ if ( $thislib =~ m!^-Wl,! ) {
+ push( @extralibs, $thislib );
+ push( @ldloadlibs, $thislib );
+ next;
+ }
+
+ # Handle possible library arguments.
+ if ( $thislib =~ s/^-l(:)?// ) {
+ # Handle -l:foo.so, which means that the library will
+ # actually be called foo.so, not libfoo.so. This
+ # is used in Android by ExtUtils::Depends to allow one XS
+ # module to link to another.
+ $custom_name = $1 || '';
+ }
+ else {
+ warn "Unrecognized argument in LIBS ignored: '$thislib'\n";
+ next;
+ }
+
+ my ( $found_lib ) = 0;
+ foreach my $thispth ( @searchpath, @libpath ) {
+
+ # Try to find the full name of the library. We need this to
+ # determine whether it's a dynamically-loadable library or not.
+ # This tends to be subject to various os-specific quirks.
+ # For gcc-2.6.2 on linux (March 1995), DLD can not load
+ # .sa libraries, with the exception of libm.sa, so we
+ # deliberately skip them.
+ if ((@fullname =
+ $self->lsdir($thispth, "^\Qlib$thislib.$so.\E[0-9]+")) ||
+ (@fullname =
+ $self->lsdir($thispth, "^\Qlib$thislib.\E[0-9]+\Q\.$so"))) {
+ # Take care that libfoo.so.10 wins against libfoo.so.9.
+ # Compare two libraries to find the most recent version
+ # number. E.g. if you have libfoo.so.9.0.7 and
+ # libfoo.so.10.1, first convert all digits into two
+ # decimal places. Then we'll add ".00" to the shorter
+ # strings so that we're comparing strings of equal length
+ # Thus we'll compare libfoo.so.09.07.00 with
+ # libfoo.so.10.01.00. Some libraries might have letters
+ # in the version. We don't know what they mean, but will
+ # try to skip them gracefully -- we'll set any letter to
+ # '0'. Finally, sort in reverse so we can take the
+ # first element.
+
+ #TODO: iterate through the directory instead of sorting
+
+ $fullname = "$thispth/" . (
+ sort {
+ my ( $ma ) = $a;
+ my ( $mb ) = $b;
+ $ma =~ tr/A-Za-z/0/s;
+ $ma =~ s/\b(\d)\b/0$1/g;
+ $mb =~ tr/A-Za-z/0/s;
+ $mb =~ s/\b(\d)\b/0$1/g;
+ while ( length( $ma ) < length( $mb ) ) { $ma .= ".00"; }
+ while ( length( $mb ) < length( $ma ) ) { $mb .= ".00"; }
+
+ # Comparison deliberately backwards
+ $mb cmp $ma;
+ } @fullname
+ )[0];
+ }
+ elsif ( -f ( $fullname = "$thispth/lib$thislib.$so" )
+ && ( ( $Config{'dlsrc'} ne "dl_dld.xs" ) || ( $thislib eq "m" ) ) )
+ {
+ }
+ elsif (-f ( $fullname = "$thispth/lib${thislib}_s$Config_libext" )
+ && ( $Config{'archname'} !~ /RM\d\d\d-svr4/ )
+ && ( $thislib .= "_s" ) )
+ { # we must explicitly use _s version
+ }
+ elsif ( -f ( $fullname = "$thispth/lib$thislib$Config_libext" ) ) {
+ }
+ elsif ( defined( $Config_dlext )
+ && -f ( $fullname = "$thispth/lib$thislib.$Config_dlext" ) )
+ {
+ }
+ elsif ( -f ( $fullname = "$thispth/$thislib$Config_libext" ) ) {
+ }
+ elsif ( -f ( $fullname = "$thispth/lib$thislib.dll$Config_libext" ) ) {
+ }
+ elsif ( $^O eq 'cygwin' && -f ( $fullname = "$thispth/$thislib.dll" ) ) {
+ }
+ elsif ( -f ( $fullname = "$thispth/Slib$thislib$Config_libext" ) ) {
+ }
+ elsif ($^O eq 'dgux'
+ && -l ( $fullname = "$thispth/lib$thislib$Config_libext" )
+ && readlink( $fullname ) =~ /^elink:/s )
+ {
+
+ # Some of DG's libraries look like misconnected symbolic
+ # links, but development tools can follow them. (They
+ # look like this:
+ #
+ # libm.a -> elink:${SDE_PATH:-/usr}/sde/\
+ # ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a
+ #
+ # , the compilation tools expand the environment variables.)
+ }
+ elsif ( $custom_name && -f ( $fullname = "$thispth/$thislib" ) ) {
+ }
+ else {
+ warn "$thislib not found in $thispth\n" if $verbose;
+ next;
+ }
+ warn "'-l$thislib' found at $fullname\n" if $verbose;
+ push @libs, $fullname unless $libs_seen{$fullname}++;
+ $found++;
+ $found_lib++;
+
+ # Now update library lists
+
+ # what do we know about this library...
+ my $is_dyna = ( $fullname !~ /\Q$Config_libext\E\z/ );
+ my $in_perl = ( $libs =~ /\B-l:?\Q${thislib}\E\b/s );
+
+ # include the path to the lib once in the dynamic linker path
+ # but only if it is a dynamic lib and not in Perl itself
+ my ( $fullnamedir ) = dirname( $fullname );
+ push @ld_run_path, $fullnamedir
+ if $is_dyna
+ && !$in_perl
+ && !$ld_run_path_seen{$fullnamedir}++;
+
+ # Do not add it into the list if it is already linked in
+ # with the main perl executable.
+ # We have to special-case the NeXT, because math and ndbm
+ # are both in libsys_s
+ unless (
+ $in_perl
+ || ( $Config{'osname'} eq 'next'
+ && ( $thislib eq 'm' || $thislib eq 'ndbm' ) )
+ )
+ {
+ push( @extralibs, "-l$custom_name$thislib" );
+ }
+
+ # We might be able to load this archive file dynamically
+ if ( ( $Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0' )
+ || ( $Config{'dlsrc'} =~ /dl_dld/ ) )
+ {
+
+ # We push -l$thislib instead of $fullname because
+ # it avoids hardwiring a fixed path into the .bs file.
+ # Mkbootstrap will automatically add dl_findfile() to
+ # the .bs file if it sees a name in the -l format.
+ # USE THIS, when dl_findfile() is fixed:
+ # push(@bsloadlibs, "-l$thislib");
+ # OLD USE WAS while checking results against old_extliblist
+ push( @bsloadlibs, "$fullname" );
+ }
+ else {
+ if ( $is_dyna ) {
+
+ # For SunOS4, do not add in this shared library if
+ # it is already linked in the main perl executable
+ push( @ldloadlibs, "-l$custom_name$thislib" )
+ unless ( $in_perl and $^O eq 'sunos' );
+ }
+ else {
+ push( @ldloadlibs, "-l$custom_name$thislib" );
+ }
+ }
+ last; # found one here so don't bother looking further
+ }
+ warn "Warning (mostly harmless): " . "No library found for -l$thislib\n"
+ unless $found_lib > 0;
+ }
+
+ unless ( $found ) {
+ return ( '', '', '', '', ( $give_libs ? \@libs : () ) );
+ }
+ else {
+ return ( "@extralibs", "@bsloadlibs", "@ldloadlibs", join( ":", @ld_run_path ), ( $give_libs ? \@libs : () ) );
+ }
+ }
+
+ sub _win32_ext {
+
+ require Text::ParseWords;
+
+ my ( $self, $potential_libs, $verbose, $give_libs ) = @_;
+ $verbose ||= 0;
+
+ # If user did not supply a list, we punt.
+ # (caller should probably use the list in $Config{libs})
+ return ( "", "", "", "", ( $give_libs ? [] : () ) ) unless $potential_libs;
+
+ # TODO: make this use MM_Win32.pm's compiler detection
+ my %libs_seen;
+ my @extralibs;
+ my $cc = $Config{cc} || '';
+ my $VC = $cc =~ /\bcl\b/i;
+ my $GC = $cc =~ /\bgcc\b/i;
+
+ my $libext = _win32_lib_extensions();
+ my @searchpath = ( '' ); # from "-L/path" entries in $potential_libs
+ my @libpath = _win32_default_search_paths( $VC, $GC );
+ my $pwd = cwd(); # from Cwd.pm
+ my $search = 1;
+
+ # compute @extralibs from $potential_libs
+ my @lib_search_list = _win32_make_lib_search_list( $potential_libs, $verbose );
+ for ( @lib_search_list ) {
+
+ my $thislib = $_;
+
+ # see if entry is a flag
+ if ( /^:\w+$/ ) {
+ $search = 0 if lc eq ':nosearch';
+ $search = 1 if lc eq ':search';
+ _debug( "Ignoring unknown flag '$thislib'\n", $verbose ) if !/^:(no)?(search|default)$/i;
+ next;
+ }
+
+ # if searching is disabled, do compiler-specific translations
+ unless ( $search ) {
+ s/^-l(.+)$/$1.lib/ unless $GC;
+ s/^-L/-libpath:/ if $VC;
+ push( @extralibs, $_ );
+ next;
+ }
+
+ # handle possible linker path arguments
+ if ( s/^-L// and not -d ) {
+ _debug( "$thislib ignored, directory does not exist\n", $verbose );
+ next;
+ }
+ elsif ( -d ) {
+ unless ( File::Spec->file_name_is_absolute( $_ ) ) {
+ warn "Warning: '$thislib' changed to '-L$pwd/$_'\n";
+ $_ = $self->catdir( $pwd, $_ );
+ }
+ push( @searchpath, $_ );
+ next;
+ }
+
+ my @paths = ( @searchpath, @libpath );
+ my ( $fullname, $path ) = _win32_search_file( $thislib, $libext, \@paths, $verbose, $GC );
+
+ if ( !$fullname ) {
+ warn "Warning (mostly harmless): No library found for $thislib\n";
+ next;
+ }
+
+ _debug( "'$thislib' found as '$fullname'\n", $verbose );
+ push( @extralibs, $fullname );
+ $libs_seen{$fullname} = 1 if $path; # why is this a special case?
+ }
+
+ my @libs = keys %libs_seen;
+
+ return ( '', '', '', '', ( $give_libs ? \@libs : () ) ) unless @extralibs;
+
+ # make sure paths with spaces are properly quoted
+ @extralibs = map { qq["$_"] } @extralibs;
+ @libs = map { qq["$_"] } @libs;
+
+ my $lib = join( ' ', @extralibs );
+
+ # normalize back to backward slashes (to help braindead tools)
+ # XXX this may break equally braindead GNU tools that don't understand
+ # backslashes, either. Seems like one can't win here. Cursed be CP/M.
+ $lib =~ s,/,\\,g;
+
+ _debug( "Result: $lib\n", $verbose );
+ wantarray ? ( $lib, '', $lib, '', ( $give_libs ? \@libs : () ) ) : $lib;
+ }
+
+ sub _win32_make_lib_search_list {
+ my ( $potential_libs, $verbose ) = @_;
+
+ # If Config.pm defines a set of default libs, we always
+ # tack them on to the user-supplied list, unless the user
+ # specified :nodefault
+ my $libs = $Config{'perllibs'};
+ $potential_libs = join( ' ', $potential_libs, $libs ) if $libs and $potential_libs !~ /:nodefault/i;
+ _debug( "Potential libraries are '$potential_libs':\n", $verbose );
+
+ $potential_libs =~ s,\\,/,g; # normalize to forward slashes
+
+ my @list = Text::ParseWords::quotewords( '\s+', 0, $potential_libs );
+
+ return @list;
+ }
+
+ sub _win32_default_search_paths {
+ my ( $VC, $GC ) = @_;
+
+ my $libpth = $Config{'libpth'} || '';
+ $libpth =~ s,\\,/,g; # normalize to forward slashes
+
+ my @libpath = Text::ParseWords::quotewords( '\s+', 0, $libpth );
+ push @libpath, "$Config{installarchlib}/CORE"; # add "$Config{installarchlib}/CORE" to default search path
+
+ push @libpath, split /;/, $ENV{LIB} if $VC and $ENV{LIB};
+ push @libpath, split /;/, $ENV{LIBRARY_PATH} if $GC and $ENV{LIBRARY_PATH};
+
+ return @libpath;
+ }
+
+ sub _win32_search_file {
+ my ( $thislib, $libext, $paths, $verbose, $GC ) = @_;
+
+ my @file_list = _win32_build_file_list( $thislib, $GC, $libext );
+
+ for my $lib_file ( @file_list ) {
+ for my $path ( @{$paths} ) {
+ my $fullname = $lib_file;
+ $fullname = "$path\\$fullname" if $path;
+
+ return ( $fullname, $path ) if -f $fullname;
+
+ _debug( "'$thislib' not found as '$fullname'\n", $verbose );
+ }
+ }
+
+ return;
+ }
+
+ sub _win32_build_file_list {
+ my ( $lib, $GC, $extensions ) = @_;
+
+ my @pre_fixed = _win32_build_prefixed_list( $lib, $GC );
+ return map _win32_attach_extensions( $_, $extensions ), @pre_fixed;
+ }
+
+ sub _win32_build_prefixed_list {
+ my ( $lib, $GC ) = @_;
+
+ return $lib if $lib !~ s/^-l//;
+ return $lib if $lib =~ /^lib/ and !$GC;
+
+ ( my $no_prefix = $lib ) =~ s/^lib//i;
+ $lib = "lib$lib" if $no_prefix eq $lib;
+
+ return ( $lib, $no_prefix ) if $GC;
+ return ( $no_prefix, $lib );
+ }
+
+ sub _win32_attach_extensions {
+ my ( $lib, $extensions ) = @_;
+ return map _win32_try_attach_extension( $lib, $_ ), @{$extensions};
+ }
+
+ sub _win32_try_attach_extension {
+ my ( $lib, $extension ) = @_;
+
+ return $lib if $lib =~ /\Q$extension\E$/i;
+ return "$lib$extension";
+ }
+
+ sub _win32_lib_extensions {
+ my @extensions;
+ push @extensions, $Config{'lib_ext'} if $Config{'lib_ext'};
+ push @extensions, '.dll.a' if grep { m!^\.a$! } @extensions;
+ push @extensions, '.lib' unless grep { m!^\.lib$! } @extensions;
+ return \@extensions;
+ }
+
+ sub _debug {
+ my ( $message, $verbose ) = @_;
+ return if !$verbose;
+ warn $message;
+ return;
+ }
+
+ sub _vms_ext {
+ my ( $self, $potential_libs, $verbose, $give_libs ) = @_;
+ $verbose ||= 0;
+
+ my ( @crtls, $crtlstr );
+ @crtls = ( ( $Config{'ldflags'} =~ m-/Debug-i ? $Config{'dbgprefix'} : '' ) . 'PerlShr/Share' );
+ push( @crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'} );
+ push( @crtls, grep { not /\(/ } split /\s+/, $Config{'libc'} );
+
+ # In general, we pass through the basic libraries from %Config unchanged.
+ # The one exception is that if we're building in the Perl source tree, and
+ # a library spec could be resolved via a logical name, we go to some trouble
+ # to insure that the copy in the local tree is used, rather than one to
+ # which a system-wide logical may point.
+ if ( $self->{PERL_SRC} ) {
+ my ( $locspec, $type );
+ foreach my $lib ( @crtls ) {
+ if ( ( $locspec, $type ) = $lib =~ m{^([\w\$-]+)(/\w+)?} and $locspec =~ /perl/i ) {
+ if ( lc $type eq '/share' ) { $locspec .= $Config{'exe_ext'}; }
+ elsif ( lc $type eq '/library' ) { $locspec .= $Config{'lib_ext'}; }
+ else { $locspec .= $Config{'obj_ext'}; }
+ $locspec = $self->catfile( $self->{PERL_SRC}, $locspec );
+ $lib = "$locspec$type" if -e $locspec;
+ }
+ }
+ }
+ $crtlstr = @crtls ? join( ' ', @crtls ) : '';
+
+ unless ( $potential_libs ) {
+ warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
+ return ( '', '', $crtlstr, '', ( $give_libs ? [] : () ) );
+ }
+
+ my ( %found, @fndlibs, $ldlib );
+ my $cwd = cwd();
+ my ( $so, $lib_ext, $obj_ext ) = @Config{ 'so', 'lib_ext', 'obj_ext' };
+
+ # List of common Unix library names and their VMS equivalents
+ # (VMS equivalent of '' indicates that the library is automatically
+ # searched by the linker, and should be skipped here.)
+ my ( @flibs, %libs_seen );
+ my %libmap = (
+ 'm' => '',
+ 'f77' => '',
+ 'F77' => '',
+ 'V77' => '',
+ 'c' => '',
+ 'malloc' => '',
+ 'crypt' => '',
+ 'resolv' => '',
+ 'c_s' => '',
+ 'socket' => '',
+ 'X11' => 'DECW$XLIBSHR',
+ 'Xt' => 'DECW$XTSHR',
+ 'Xm' => 'DECW$XMLIBSHR',
+ 'Xmu' => 'DECW$XMULIBSHR'
+ );
+
+ warn "Potential libraries are '$potential_libs'\n" if $verbose;
+
+ # First, sort out directories and library names in the input
+ my ( @dirs, @libs );
+ foreach my $lib ( split ' ', $potential_libs ) {
+ push( @dirs, $1 ), next if $lib =~ /^-L(.*)/;
+ push( @dirs, $lib ), next if $lib =~ /[:>\]]$/;
+ push( @dirs, $lib ), next if -d $lib;
+ push( @libs, $1 ), next if $lib =~ /^-l(.*)/;
+ push( @libs, $lib );
+ }
+ push( @dirs, split( ' ', $Config{'libpth'} ) );
+
+ # Now make sure we've got VMS-syntax absolute directory specs
+ # (We don't, however, check whether someone's hidden a relative
+ # path in a logical name.)
+ foreach my $dir ( @dirs ) {
+ unless ( -d $dir ) {
+ warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
+ $dir = '';
+ next;
+ }
+ warn "Resolving directory $dir\n" if $verbose;
+ if ( File::Spec->file_name_is_absolute( $dir ) ) {
+ $dir = VMS::Filespec::vmspath( $dir );
+ }
+ else {
+ $dir = $self->catdir( $cwd, $dir );
+ }
+ }
+ @dirs = grep { length( $_ ) } @dirs;
+ unshift( @dirs, '' ); # Check each $lib without additions first
+
+ LIB: foreach my $lib ( @libs ) {
+ if ( exists $libmap{$lib} ) {
+ next unless length $libmap{$lib};
+ $lib = $libmap{$lib};
+ }
+
+ my ( @variants, $cand );
+ my ( $ctype ) = '';
+
+ # If we don't have a file type, consider it a possibly abbreviated name and
+ # check for common variants. We try these first to grab libraries before
+ # a like-named executable image (e.g. -lperl resolves to perlshr.exe
+ # before perl.exe).
+ if ( $lib !~ /\.[^:>\]]*$/ ) {
+ push( @variants, "${lib}shr", "${lib}rtl", "${lib}lib" );
+ push( @variants, "lib$lib" ) if $lib !~ /[:>\]]/;
+ }
+ push( @variants, $lib );
+ warn "Looking for $lib\n" if $verbose;
+ foreach my $variant ( @variants ) {
+ my ( $fullname, $name );
+
+ foreach my $dir ( @dirs ) {
+ my ( $type );
+
+ $name = "$dir$variant";
+ warn "\tChecking $name\n" if $verbose > 2;
+ $fullname = VMS::Filespec::rmsexpand( $name );
+ if ( defined $fullname and -f $fullname ) {
+
+ # It's got its own suffix, so we'll have to figure out the type
+ if ( $fullname =~ /(?:$so|exe)$/i ) { $type = 'SHR'; }
+ elsif ( $fullname =~ /(?:$lib_ext|olb)$/i ) { $type = 'OLB'; }
+ elsif ( $fullname =~ /(?:$obj_ext|obj)$/i ) {
+ warn "Warning (mostly harmless): " . "Plain object file $fullname found in library list\n";
+ $type = 'OBJ';
+ }
+ else {
+ warn "Warning (mostly harmless): " . "Unknown library type for $fullname; assuming shared\n";
+ $type = 'SHR';
+ }
+ }
+ elsif (-f ( $fullname = VMS::Filespec::rmsexpand( $name, $so ) )
+ or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.exe' ) ) )
+ {
+ $type = 'SHR';
+ $name = $fullname unless $fullname =~ /exe;?\d*$/i;
+ }
+ elsif (
+ not length( $ctype ) and # If we've got a lib already,
+ # don't bother
+ ( -f ( $fullname = VMS::Filespec::rmsexpand( $name, $lib_ext ) ) or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.olb' ) ) )
+ )
+ {
+ $type = 'OLB';
+ $name = $fullname unless $fullname =~ /olb;?\d*$/i;
+ }
+ elsif (
+ not length( $ctype ) and # If we've got a lib already,
+ # don't bother
+ ( -f ( $fullname = VMS::Filespec::rmsexpand( $name, $obj_ext ) ) or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.obj' ) ) )
+ )
+ {
+ warn "Warning (mostly harmless): " . "Plain object file $fullname found in library list\n";
+ $type = 'OBJ';
+ $name = $fullname unless $fullname =~ /obj;?\d*$/i;
+ }
+ if ( defined $type ) {
+ $ctype = $type;
+ $cand = $name;
+ last if $ctype eq 'SHR';
+ }
+ }
+ if ( $ctype ) {
+
+ push @{ $found{$ctype} }, $cand;
+ warn "\tFound as $cand (really $fullname), type $ctype\n"
+ if $verbose > 1;
+ push @flibs, $name unless $libs_seen{$fullname}++;
+ next LIB;
+ }
+ }
+ warn "Warning (mostly harmless): " . "No library found for $lib\n";
+ }
+
+ push @fndlibs, @{ $found{OBJ} } if exists $found{OBJ};
+ push @fndlibs, map { "$_/Library" } @{ $found{OLB} } if exists $found{OLB};
+ push @fndlibs, map { "$_/Share" } @{ $found{SHR} } if exists $found{SHR};
+ my $lib = join( ' ', @fndlibs );
+
+ $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
+ $ldlib =~ s/^\s+|\s+$//g;
+ warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
+ wantarray ? ( $lib, '', $ldlib, '', ( $give_libs ? \@flibs : () ) ) : $lib;
+ }
+
+ 1;
+EXTUTILS_LIBLIST_KID
+
+$fatpacked{"ExtUtils/MM.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM';
+ package ExtUtils::MM;
+
+ use strict;
+ use ExtUtils::MakeMaker::Config;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::Liblist;
+ require ExtUtils::MakeMaker;
+ our @ISA = qw(ExtUtils::Liblist ExtUtils::MakeMaker);
+
+ =head1 NAME
+
+ ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
+
+ =head1 SYNOPSIS
+
+ require ExtUtils::MM;
+ my $mm = MM->new(...);
+
+ =head1 DESCRIPTION
+
+ B<FOR INTERNAL USE ONLY>
+
+ ExtUtils::MM is a subclass of ExtUtils::MakeMaker which automatically
+ chooses the appropriate OS specific subclass for you
+ (ie. ExtUils::MM_Unix, etc...).
+
+ It also provides a convenient alias via the MM class (I didn't want
+ MakeMaker modules outside of ExtUtils/).
+
+ This class might turn out to be a temporary solution, but MM won't go
+ away.
+
+ =cut
+
+ {
+ # Convenient alias.
+ package MM;
+ our @ISA = qw(ExtUtils::MM);
+ sub DESTROY {}
+ }
+
+ sub _is_win95 {
+ # miniperl might not have the Win32 functions available and we need
+ # to run in miniperl.
+ my $have_win32 = eval { require Win32 };
+ return $have_win32 && defined &Win32::IsWin95 ? Win32::IsWin95()
+ : ! defined $ENV{SYSTEMROOT};
+ }
+
+ my %Is = ();
+ $Is{VMS} = $^O eq 'VMS';
+ $Is{OS2} = $^O eq 'os2';
+ $Is{MacOS} = $^O eq 'MacOS';
+ if( $^O eq 'MSWin32' ) {
+ _is_win95() ? $Is{Win95} = 1 : $Is{Win32} = 1;
+ }
+ $Is{UWIN} = $^O =~ /^uwin(-nt)?$/;
+ $Is{Cygwin} = $^O eq 'cygwin';
+ $Is{NW5} = $Config{osname} eq 'NetWare'; # intentional
+ $Is{BeOS} = ($^O =~ /beos/i or $^O eq 'haiku');
+ $Is{DOS} = $^O eq 'dos';
+ if( $Is{NW5} ) {
+ $^O = 'NetWare';
+ delete $Is{Win32};
+ }
+ $Is{VOS} = $^O eq 'vos';
+ $Is{QNX} = $^O eq 'qnx';
+ $Is{AIX} = $^O eq 'aix';
+ $Is{Darwin} = $^O eq 'darwin';
+
+ $Is{Unix} = !grep { $_ } values %Is;
+
+ map { delete $Is{$_} unless $Is{$_} } keys %Is;
+ _assert( keys %Is == 1 );
+ my($OS) = keys %Is;
+
+
+ my $class = "ExtUtils::MM_$OS";
+ eval "require $class" unless $INC{"ExtUtils/MM_$OS.pm"}; ## no critic
+ die $@ if $@;
+ unshift @ISA, $class;
+
+
+ sub _assert {
+ my $sanity = shift;
+ die sprintf "Assert failed at %s line %d\n", (caller)[1,2] unless $sanity;
+ return;
+ }
+EXTUTILS_MM
+
+$fatpacked{"ExtUtils/MM_AIX.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_AIX';
+ package ExtUtils::MM_AIX;
+
+ use strict;
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Unix;
+ our @ISA = qw(ExtUtils::MM_Unix);
+
+ =head1 NAME
+
+ ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
+
+ =head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+ =head1 DESCRIPTION
+
+ This is a subclass of ExtUtils::MM_Unix which contains functionality for
+ AIX.
+
+ Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+ =head2 Overridden methods
+
+ =head3 dlsyms
+
+ Define DL_FUNCS and DL_VARS and write the *.exp files.
+
+ =cut
+
+ sub dlsyms {
+ my($self,%attribs) = @_;
+ return '' unless $self->needs_linking;
+ my @m;
+ # these will need XSMULTI-fying but maybe that already happens
+ push @m,"\ndynamic :: $self->{BASEEXT}.exp\n\n"
+ unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
+ push @m,"\nstatic :: $self->{BASEEXT}.exp\n\n"
+ unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
+ join "\n", @m, $self->xs_dlsyms_iterator(\%attribs);
+ }
+
+ =head3 xs_dlsyms_ext
+
+ On AIX, is C<.exp>.
+
+ =cut
+
+ sub xs_dlsyms_ext {
+ '.exp';
+ }
+
+ =head1 AUTHOR
+
+ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MakeMaker>
+
+ =cut
+
+
+ 1;
+EXTUTILS_MM_AIX
+
+$fatpacked{"ExtUtils/MM_Any.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_ANY';
+ package ExtUtils::MM_Any;
+
+ use strict;
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ use Carp;
+ use File::Spec;
+ use File::Basename;
+ BEGIN { our @ISA = qw(File::Spec); }
+
+ # We need $Verbose
+ use ExtUtils::MakeMaker qw($Verbose write_file_via_tmp neatvalue _sprintf562);
+
+ use ExtUtils::MakeMaker::Config;
+
+
+ # So we don't have to keep calling the methods over and over again,
+ # we have these globals to cache the values. Faster and shrtr.
+ my $Curdir = __PACKAGE__->curdir;
+ my $Rootdir = __PACKAGE__->rootdir;
+ my $Updir = __PACKAGE__->updir;
+
+ my $METASPEC_URL = 'https://metacpan.org/pod/CPAN::Meta::Spec';
+ my $METASPEC_V = 2;
+ my $STASHDIR = File::Spec->catdir('blib', '_eumm');
+
+ =head1 NAME
+
+ ExtUtils::MM_Any - Platform-agnostic MM methods
+
+ =head1 SYNOPSIS
+
+ FOR INTERNAL USE ONLY!
+
+ package ExtUtils::MM_SomeOS;
+
+ # Temporarily, you have to subclass both. Put MM_Any first.
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+ @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
+
+ =head1 DESCRIPTION
+
+ B<FOR INTERNAL USE ONLY!>
+
+ ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
+ modules. It contains methods which are either inherently
+ cross-platform or are written in a cross-platform manner.
+
+ Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix. This is a
+ temporary solution.
+
+ B<THIS MAY BE TEMPORARY!>
+
+
+ =head1 METHODS
+
+ Any methods marked I<Abstract> must be implemented by subclasses.
+
+
+ =head2 Cross-platform helper methods
+
+ These are methods which help writing cross-platform code.
+
+
+
+ =head3 os_flavor I<Abstract>
+
+ my @os_flavor = $mm->os_flavor;
+
+ @os_flavor is the style of operating system this is, usually
+ corresponding to the MM_*.pm file we're using.
+
+ The first element of @os_flavor is the major family (ie. Unix,
+ Windows, VMS, OS/2, etc...) and the rest are sub families.
+
+ Some examples:
+
+ Cygwin98 ('Unix', 'Cygwin', 'Cygwin9x')
+ Windows ('Win32')
+ Win98 ('Win32', 'Win9x')
+ Linux ('Unix', 'Linux')
+ MacOS X ('Unix', 'Darwin', 'MacOS', 'MacOS X')
+ OS/2 ('OS/2')
+
+ This is used to write code for styles of operating system.
+ See os_flavor_is() for use.
+
+
+ =head3 os_flavor_is
+
+ my $is_this_flavor = $mm->os_flavor_is($this_flavor);
+ my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
+
+ Checks to see if the current operating system is one of the given flavors.
+
+ This is useful for code like:
+
+ if( $mm->os_flavor_is('Unix') ) {
+ $out = `foo 2>&1`;
+ }
+ else {
+ $out = `foo`;
+ }
+
+ =cut
+
+ sub os_flavor_is {
+ my $self = shift;
+ my %flavors = map { ($_ => 1) } $self->os_flavor;
+ return (grep { $flavors{$_} } @_) ? 1 : 0;
+ }
+
+
+ =head3 can_load_xs
+
+ my $can_load_xs = $self->can_load_xs;
+
+ Returns true if we have the ability to load XS.
+
+ This is important because miniperl, used to build XS modules in the
+ core, can not load XS.
+
+ =cut
+
+ sub can_load_xs {
+ return defined &DynaLoader::boot_DynaLoader ? 1 : 0;
+ }
+
+
+ =head3 can_run
+
+ use ExtUtils::MM;
+ my $runnable = MM->can_run($Config{make});
+
+ If called in a scalar context it will return the full path to the binary
+ you asked for if it was found, or C<undef> if it was not.
+
+ If called in a list context, it will return a list of the full paths to instances
+ of the binary where found in C<PATH>, or an empty list if it was not found.
+
+ Copied from L<IPC::Cmd|IPC::Cmd/"$path = can_run( PROGRAM );">, but modified into
+ a method (and removed C<$INSTANCES> capability).
+
+ =cut
+
+ sub can_run {
+ my ($self, $command) = @_;
+
+ # a lot of VMS executables have a symbol defined
+ # check those first
+ if ( $^O eq 'VMS' ) {
+ require VMS::DCLsym;
+ my $syms = VMS::DCLsym->new;
+ return $command if scalar $syms->getsym( uc $command );
+ }
+
+ my @possibles;
+
+ if( File::Spec->file_name_is_absolute($command) ) {
+ return $self->maybe_command($command);
+
+ } else {
+ for my $dir (
+ File::Spec->path,
+ File::Spec->curdir
+ ) {
+ next if ! $dir || ! -d $dir;
+ my $abs = File::Spec->catfile($self->os_flavor_is('Win32') ? Win32::GetShortPathName( $dir ) : $dir, $command);
+ push @possibles, $abs if $abs = $self->maybe_command($abs);
+ }
+ }
+ return @possibles if wantarray;
+ return shift @possibles;
+ }
+
+
+ =head3 can_redirect_error
+
+ $useredirect = MM->can_redirect_error;
+
+ True if on an OS where qx operator (or backticks) can redirect C<STDERR>
+ onto C<STDOUT>.
+
+ =cut
+
+ sub can_redirect_error {
+ my $self = shift;
+ $self->os_flavor_is('Unix')
+ or ($self->os_flavor_is('Win32') and !$self->os_flavor_is('Win9x'))
+ or $self->os_flavor_is('OS/2')
+ }
+
+
+ =head3 is_make_type
+
+ my $is_dmake = $self->is_make_type('dmake');
+
+ Returns true if C<<$self->make>> is the given type; possibilities are:
+
+ gmake GNU make
+ dmake
+ nmake
+ bsdmake BSD pmake-derived
+
+ =cut
+
+ my %maketype2true;
+ # undocumented - so t/cd.t can still do its thing
+ sub _clear_maketype_cache { %maketype2true = () }
+
+ sub is_make_type {
+ my($self, $type) = @_;
+ return $maketype2true{$type} if defined $maketype2true{$type};
+ (undef, undef, my $make_basename) = $self->splitpath($self->make);
+ return $maketype2true{$type} = 1
+ if $make_basename =~ /\b$type\b/i; # executable's filename
+ return $maketype2true{$type} = 0
+ if $make_basename =~ /\b[gdn]make\b/i; # Never fall through for dmake/nmake/gmake
+ # now have to run with "-v" and guess
+ my $redirect = $self->can_redirect_error ? '2>&1' : '';
+ my $make = $self->make || $self->{MAKE};
+ my $minus_v = `"$make" -v $redirect`;
+ return $maketype2true{$type} = 1
+ if $type eq 'gmake' and $minus_v =~ /GNU make/i;
+ return $maketype2true{$type} = 1
+ if $type eq 'bsdmake'
+ and $minus_v =~ /^usage: make \[-BeikNnqrstWwX\]/im;
+ $maketype2true{$type} = 0; # it wasn't whatever you asked
+ }
+
+
+ =head3 can_dep_space
+
+ my $can_dep_space = $self->can_dep_space;
+
+ Returns true if C<make> can handle (probably by quoting)
+ dependencies that contain a space. Currently known true for GNU make,
+ false for BSD pmake derivative.
+
+ =cut
+
+ my $cached_dep_space;
+ sub can_dep_space {
+ my $self = shift;
+ return $cached_dep_space if defined $cached_dep_space;
+ return $cached_dep_space = 1 if $self->is_make_type('gmake');
+ return $cached_dep_space = 0 if $self->is_make_type('dmake'); # only on W32
+ return $cached_dep_space = 0 if $self->is_make_type('bsdmake');
+ return $cached_dep_space = 0; # assume no
+ }
+
+
+ =head3 quote_dep
+
+ $text = $mm->quote_dep($text);
+
+ Method that protects Makefile single-value constants (mainly filenames),
+ so that make will still treat them as single values even if they
+ inconveniently have spaces in. If the make program being used cannot
+ achieve such protection and the given text would need it, throws an
+ exception.
+
+ =cut
+
+ sub quote_dep {
+ my ($self, $arg) = @_;
+ die <<EOF if $arg =~ / / and not $self->can_dep_space;
+ Tried to use make dependency with space for make that can't:
+ '$arg'
+ EOF
+ $arg =~ s/( )/\\$1/g; # how GNU make does it
+ return $arg;
+ }
+
+
+ =head3 split_command
+
+ my @cmds = $MM->split_command($cmd, @args);
+
+ Most OS have a maximum command length they can execute at once. Large
+ modules can easily generate commands well past that limit. Its
+ necessary to split long commands up into a series of shorter commands.
+
+ C<split_command> will return a series of @cmds each processing part of
+ the args. Collectively they will process all the arguments. Each
+ individual line in @cmds will not be longer than the
+ $self->max_exec_len being careful to take into account macro expansion.
+
+ $cmd should include any switches and repeated initial arguments.
+
+ If no @args are given, no @cmds will be returned.
+
+ Pairs of arguments will always be preserved in a single command, this
+ is a heuristic for things like pm_to_blib and pod2man which work on
+ pairs of arguments. This makes things like this safe:
+
+ $self->split_command($cmd, %pod2man);
+
+
+ =cut
+
+ sub split_command {
+ my($self, $cmd, @args) = @_;
+
+ my @cmds = ();
+ return(@cmds) unless @args;
+
+ # If the command was given as a here-doc, there's probably a trailing
+ # newline.
+ chomp $cmd;
+
+ # set aside 30% for macro expansion.
+ my $len_left = int($self->max_exec_len * 0.70);
+ $len_left -= length $self->_expand_macros($cmd);
+
+ do {
+ my $arg_str = '';
+ my @next_args;
+ while( @next_args = splice(@args, 0, 2) ) {
+ # Two at a time to preserve pairs.
+ my $next_arg_str = "\t ". join ' ', @next_args, "\n";
+
+ if( !length $arg_str ) {
+ $arg_str .= $next_arg_str
+ }
+ elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
+ unshift @args, @next_args;
+ last;
+ }
+ else {
+ $arg_str .= $next_arg_str;
+ }
+ }
+ chop $arg_str;
+
+ push @cmds, $self->escape_newlines("$cmd \n$arg_str");
+ } while @args;
+
+ return @cmds;
+ }
+
+
+ sub _expand_macros {
+ my($self, $cmd) = @_;
+
+ $cmd =~ s{\$\((\w+)\)}{
+ defined $self->{$1} ? $self->{$1} : "\$($1)"
+ }e;
+ return $cmd;
+ }
+
+
+ =head3 make_type
+
+ Returns a suitable string describing the type of makefile being written.
+
+ =cut
+
+ # override if this isn't suitable!
+ sub make_type { return 'Unix-style'; }
+
+
+ =head3 stashmeta
+
+ my @recipelines = $MM->stashmeta($text, $file);
+
+ Generates a set of C<@recipelines> which will result in the literal
+ C<$text> ending up in literal C<$file> when the recipe is executed. Call
+ it once, with all the text you want in C<$file>. Make macros will not
+ be expanded, so the locations will be fixed at configure-time, not
+ at build-time.
+
+ =cut
+
+ sub stashmeta {
+ my($self, $text, $file) = @_;
+ require File::Path;
+ -d $STASHDIR or die "$STASHDIR: $!" unless File::Path::mkpath($STASHDIR,0,0777);
+ my $stashfile = File::Spec->catfile($STASHDIR, $file);
+ write_file_via_tmp($stashfile, [ $text ]);
+ my $qlfile = $self->quote_literal($file);
+ my $qlstashfile = $self->quote_literal($stashfile);
+ (
+ sprintf('-$(NOECHO) $(RM_F) %s', $qlfile),
+ sprintf('-$(NOECHO) $(CP) %s %s', $qlstashfile, $qlfile),
+ );
+ }
+
+
+ =head3 echo
+
+ my @commands = $MM->echo($text);
+ my @commands = $MM->echo($text, $file);
+ my @commands = $MM->echo($text, $file, \%opts);
+
+ Generates a set of @commands which print the $text to a $file.
+
+ If $file is not given, output goes to STDOUT.
+
+ If $opts{append} is true the $file will be appended to rather than
+ overwritten. Default is to overwrite.
+
+ If $opts{allow_variables} is true, make variables of the form
+ C<$(...)> will not be escaped. Other C<$> will. Default is to escape
+ all C<$>.
+
+ Example of use:
+
+ my $make = join '', map "\t$_\n", $MM->echo($text, $file);
+
+ =cut
+
+ sub echo {
+ my($self, $text, $file, $opts) = @_;
+
+ # Compatibility with old options
+ if( !ref $opts ) {
+ my $append = $opts;
+ $opts = { append => $append || 0 };
+ }
+ $opts->{allow_variables} = 0 unless defined $opts->{allow_variables};
+
+ my $ql_opts = { allow_variables => $opts->{allow_variables} };
+ my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_, $ql_opts) }
+ split /\n/, $text;
+ if( $file ) {
+ my $redirect = $opts->{append} ? '>>' : '>';
+ $cmds[0] .= " $redirect $file";
+ $_ .= " >> $file" foreach @cmds[1..$#cmds];
+ }
+
+ return @cmds;
+ }
+
+
+ =head3 wraplist
+
+ my $args = $mm->wraplist(@list);
+
+ Takes an array of items and turns them into a well-formatted list of
+ arguments. In most cases this is simply something like:
+
+ FOO \
+ BAR \
+ BAZ
+
+ =cut
+
+ sub wraplist {
+ my $self = shift;
+ return join " \\\n\t", @_;
+ }
+
+
+ =head3 maketext_filter
+
+ my $filter_make_text = $mm->maketext_filter($make_text);
+
+ The text of the Makefile is run through this method before writing to
+ disk. It allows systems a chance to make portability fixes to the
+ Makefile.
+
+ By default it does nothing.
+
+ This method is protected and not intended to be called outside of
+ MakeMaker.
+
+ =cut
+
+ sub maketext_filter { return $_[1] }
+
+
+ =head3 cd I<Abstract>
+
+ my $subdir_cmd = $MM->cd($subdir, @cmds);
+
+ This will generate a make fragment which runs the @cmds in the given
+ $dir. The rough equivalent to this, except cross platform.
+
+ cd $subdir && $cmd
+
+ Currently $dir can only go down one level. "foo" is fine. "foo/bar" is
+ not. "../foo" is right out.
+
+ The resulting $subdir_cmd has no leading tab nor trailing newline. This
+ makes it easier to embed in a make string. For example.
+
+ my $make = sprintf <<'CODE', $subdir_cmd;
+ foo :
+ $(ECHO) what
+ %s
+ $(ECHO) mouche
+ CODE
+
+
+ =head3 oneliner I<Abstract>
+
+ my $oneliner = $MM->oneliner($perl_code);
+ my $oneliner = $MM->oneliner($perl_code, \@switches);
+
+ This will generate a perl one-liner safe for the particular platform
+ you're on based on the given $perl_code and @switches (a -e is
+ assumed) suitable for using in a make target. It will use the proper
+ shell quoting and escapes.
+
+ $(PERLRUN) will be used as perl.
+
+ Any newlines in $perl_code will be escaped. Leading and trailing
+ newlines will be stripped. Makes this idiom much easier:
+
+ my $code = $MM->oneliner(<<'CODE', [...switches...]);
+ some code here
+ another line here
+ CODE
+
+ Usage might be something like:
+
+ # an echo emulation
+ $oneliner = $MM->oneliner('print "Foo\n"');
+ $make = '$oneliner > somefile';
+
+ Dollar signs in the $perl_code will be protected from make using the
+ C<quote_literal> method, unless they are recognised as being a make
+ variable, C<$(varname)>, in which case they will be left for make
+ to expand. Remember to quote make macros else it might be used as a
+ bareword. For example:
+
+ # Assign the value of the $(VERSION_FROM) make macro to $vf.
+ $oneliner = $MM->oneliner('$vf = "$(VERSION_FROM)"');
+
+ Its currently very simple and may be expanded sometime in the figure
+ to include more flexible code and switches.
+
+
+ =head3 quote_literal I<Abstract>
+
+ my $safe_text = $MM->quote_literal($text);
+ my $safe_text = $MM->quote_literal($text, \%options);
+
+ This will quote $text so it is interpreted literally in the shell.
+
+ For example, on Unix this would escape any single-quotes in $text and
+ put single-quotes around the whole thing.
+
+ If $options{allow_variables} is true it will leave C<'$(FOO)'> make
+ variables untouched. If false they will be escaped like any other
+ C<$>. Defaults to true.
+
+ =head3 escape_dollarsigns
+
+ my $escaped_text = $MM->escape_dollarsigns($text);
+
+ Escapes stray C<$> so they are not interpreted as make variables.
+
+ It lets by C<$(...)>.
+
+ =cut
+
+ sub escape_dollarsigns {
+ my($self, $text) = @_;
+
+ # Escape dollar signs which are not starting a variable
+ $text =~ s{\$ (?!\() }{\$\$}gx;
+
+ return $text;
+ }
+
+
+ =head3 escape_all_dollarsigns
+
+ my $escaped_text = $MM->escape_all_dollarsigns($text);
+
+ Escapes all C<$> so they are not interpreted as make variables.
+
+ =cut
+
+ sub escape_all_dollarsigns {
+ my($self, $text) = @_;
+
+ # Escape dollar signs
+ $text =~ s{\$}{\$\$}gx;
+
+ return $text;
+ }
+
+
+ =head3 escape_newlines I<Abstract>
+
+ my $escaped_text = $MM->escape_newlines($text);
+
+ Shell escapes newlines in $text.
+
+
+ =head3 max_exec_len I<Abstract>
+
+ my $max_exec_len = $MM->max_exec_len;
+
+ Calculates the maximum command size the OS can exec. Effectively,
+ this is the max size of a shell command line.
+
+ =for _private
+ $self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
+
+
+ =head3 make
+
+ my $make = $MM->make;
+
+ Returns the make variant we're generating the Makefile for. This attempts
+ to do some normalization on the information from %Config or the user.
+
+ =cut
+
+ sub make {
+ my $self = shift;
+
+ my $make = lc $self->{MAKE};
+
+ # Truncate anything like foomake6 to just foomake.
+ $make =~ s/^(\w+make).*/$1/;
+
+ # Turn gnumake into gmake.
+ $make =~ s/^gnu/g/;
+
+ return $make;
+ }
+
+
+ =head2 Targets
+
+ These are methods which produce make targets.
+
+
+ =head3 all_target
+
+ Generate the default target 'all'.
+
+ =cut
+
+ sub all_target {
+ my $self = shift;
+
+ return <<'MAKE_EXT';
+ all :: pure_all
+ $(NOECHO) $(NOOP)
+ MAKE_EXT
+
+ }
+
+
+ =head3 blibdirs_target
+
+ my $make_frag = $mm->blibdirs_target;
+
+ Creates the blibdirs target which creates all the directories we use
+ in blib/.
+
+ The blibdirs.ts target is deprecated. Depend on blibdirs instead.
+
+
+ =cut
+
+ sub _xs_list_basenames {
+ my ($self) = @_;
+ map { (my $b = $_) =~ s/\.xs$//; $b } sort keys %{ $self->{XS} };
+ }
+
+ sub blibdirs_target {
+ my $self = shift;
+
+ my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
+ autodir archautodir
+ bin script
+ man1dir man3dir
+ );
+ if ($self->{XSMULTI}) {
+ for my $ext ($self->_xs_list_basenames) {
+ my ($v, $d, $f) = File::Spec->splitpath($ext);
+ my @d = File::Spec->splitdir($d);
+ shift @d if $d[0] eq 'lib';
+ push @dirs, $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+ }
+ }
+
+ my @exists = map { $_.'$(DFSEP).exists' } @dirs;
+
+ my $make = sprintf <<'MAKE', join(' ', @exists);
+ blibdirs : %s
+ $(NOECHO) $(NOOP)
+
+ # Backwards compat with 6.18 through 6.25
+ blibdirs.ts : blibdirs
+ $(NOECHO) $(NOOP)
+
+ MAKE
+
+ $make .= $self->dir_target(@dirs);
+
+ return $make;
+ }
+
+
+ =head3 clean (o)
+
+ Defines the clean target.
+
+ =cut
+
+ sub clean {
+ # --- Cleanup and Distribution Sections ---
+
+ my($self, %attribs) = @_;
+ my @m;
+ push(@m, '
+ # Delete temporary files but do not touch installed files. We don\'t delete
+ # the Makefile here so a later make realclean still has a makefile to use.
+
+ clean :: clean_subdirs
+ ');
+
+ my @files = sort values %{$self->{XS}}; # .c files from *.xs files
+ push @files, map {
+ my $file = $_;
+ map { $file.$_ } $self->{OBJ_EXT}, qw(.def _def.old .bs .bso .exp .base);
+ } $self->_xs_list_basenames;
+ my @dirs = qw(blib _eumm);
+
+ # Normally these are all under blib but they might have been
+ # redefined.
+ # XXX normally this would be a good idea, but the Perl core sets
+ # INST_LIB = ../../lib rather than actually installing the files.
+ # So a "make clean" in an ext/ directory would blow away lib.
+ # Until the core is adjusted let's leave this out.
+ # push @dirs, qw($(INST_ARCHLIB) $(INST_LIB)
+ # $(INST_BIN) $(INST_SCRIPT)
+ # $(INST_MAN1DIR) $(INST_MAN3DIR)
+ # $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR)
+ # $(INST_STATIC) $(INST_DYNAMIC)
+ # );
+
+
+ if( $attribs{FILES} ) {
+ # Use @dirs because we don't know what's in here.
+ push @dirs, ref $attribs{FILES} ?
+ @{$attribs{FILES}} :
+ split /\s+/, $attribs{FILES} ;
+ }
+
+ push(@files, qw[$(MAKE_APERL_FILE)
+ MYMETA.json MYMETA.yml perlmain.c tmon.out mon.out so_locations
+ blibdirs.ts pm_to_blib pm_to_blib.ts
+ *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
+ $(BOOTSTRAP) $(BASEEXT).bso
+ $(BASEEXT).def lib$(BASEEXT).def
+ $(BASEEXT).exp $(BASEEXT).x
+ ]);
+
+ push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
+ push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
+
+ # core files
+ if ($^O eq 'vos') {
+ push(@files, qw[perl*.kp]);
+ }
+ else {
+ push(@files, qw[core core.*perl.*.? *perl.core]);
+ }
+
+ push(@files, map { "core." . "[0-9]"x$_ } (1..5));
+
+ # OS specific things to clean up. Use @dirs since we don't know
+ # what might be in here.
+ push @dirs, $self->extra_clean_files;
+
+ # Occasionally files are repeated several times from different sources
+ { my(%f) = map { ($_ => 1) } @files; @files = sort keys %f; }
+ { my(%d) = map { ($_ => 1) } @dirs; @dirs = sort keys %d; }
+
+ push @m, map "\t$_\n", $self->split_command('- $(RM_F)', @files);
+ push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
+
+ # Leave Makefile.old around for realclean
+ push @m, <<'MAKE';
+ $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+ - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+ MAKE
+
+ push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
+
+ join("", @m);
+ }
+
+
+ =head3 clean_subdirs_target
+
+ my $make_frag = $MM->clean_subdirs_target;
+
+ Returns the clean_subdirs target. This is used by the clean target to
+ call clean on any subdirectories which contain Makefiles.
+
+ =cut
+
+ sub clean_subdirs_target {
+ my($self) = shift;
+
+ # No subdirectories, no cleaning.
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+ clean_subdirs :
+ $(NOECHO) $(NOOP)
+ NOOP_FRAG
+
+
+ my $clean = "clean_subdirs :\n";
+
+ for my $dir (@{$self->{DIR}}) {
+ my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
+ exit 0 unless chdir '%s'; system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
+ CODE
+
+ $clean .= "\t$subclean\n";
+ }
+
+ return $clean;
+ }
+
+
+ =head3 dir_target
+
+ my $make_frag = $mm->dir_target(@directories);
+
+ Generates targets to create the specified directories and set its
+ permission to PERM_DIR.
+
+ Because depending on a directory to just ensure it exists doesn't work
+ too well (the modified time changes too often) dir_target() creates a
+ .exists file in the created directory. It is this you should depend on.
+ For portability purposes you should use the $(DIRFILESEP) macro rather
+ than a '/' to separate the directory from the file.
+
+ yourdirectory$(DIRFILESEP).exists
+
+ =cut
+
+ sub dir_target {
+ my($self, @dirs) = @_;
+
+ my $make = '';
+ foreach my $dir (@dirs) {
+ $make .= sprintf <<'MAKE', ($dir) x 4;
+ %s$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) %s
+ $(NOECHO) $(CHMOD) $(PERM_DIR) %s
+ $(NOECHO) $(TOUCH) %s$(DFSEP).exists
+
+ MAKE
+
+ }
+
+ return $make;
+ }
+
+
+ =head3 distdir
+
+ Defines the scratch directory target that will hold the distribution
+ before tar-ing (or shar-ing).
+
+ =cut
+
+ # For backwards compatibility.
+ *dist_dir = *distdir;
+
+ sub distdir {
+ my($self) = shift;
+
+ my $meta_target = $self->{NO_META} ? '' : 'distmeta';
+ my $sign_target = !$self->{SIGN} ? '' : 'distsignature';
+
+ return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
+ create_distdir :
+ $(RM_RF) $(DISTVNAME)
+ $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
+ -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
+
+ distdir : create_distdir %s %s
+ $(NOECHO) $(NOOP)
+
+ MAKE_FRAG
+
+ }
+
+
+ =head3 dist_test
+
+ Defines a target that produces the distribution in the
+ scratch directory, and runs 'perl Makefile.PL; make ;make test' in that
+ subdirectory.
+
+ =cut
+
+ sub dist_test {
+ my($self) = shift;
+
+ my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+ my $test = $self->cd('$(DISTVNAME)',
+ '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
+ '$(MAKE) $(PASTHRU)',
+ '$(MAKE) test $(PASTHRU)'
+ );
+
+ return sprintf <<'MAKE_FRAG', $test;
+ disttest : distdir
+ %s
+
+ MAKE_FRAG
+
+
+ }
+
+
+ =head3 xs_dlsyms_ext
+
+ Returns file-extension for C<xs_make_dlsyms> method's output file,
+ including any "." character.
+
+ =cut
+
+ sub xs_dlsyms_ext {
+ die "Pure virtual method";
+ }
+
+ =head3 xs_dlsyms_extra
+
+ Returns any extra text to be prepended to the C<$extra> argument of
+ C<xs_make_dlsyms>.
+
+ =cut
+
+ sub xs_dlsyms_extra {
+ '';
+ }
+
+ =head3 xs_dlsyms_iterator
+
+ Iterates over necessary shared objects, calling C<xs_make_dlsyms> method
+ for each with appropriate arguments.
+
+ =cut
+
+ sub xs_dlsyms_iterator {
+ my ($self, $attribs) = @_;
+ if ($self->{XSMULTI}) {
+ my @m;
+ for my $ext ($self->_xs_list_basenames) {
+ my @parts = File::Spec->splitdir($ext);
+ shift @parts if $parts[0] eq 'lib';
+ my $name = join '::', @parts;
+ push @m, $self->xs_make_dlsyms(
+ $attribs,
+ $ext . $self->xs_dlsyms_ext,
+ "$ext.xs",
+ $name,
+ $parts[-1],
+ {}, [], {}, [],
+ $self->xs_dlsyms_extra . q!, 'FILE' => ! . neatvalue($ext),
+ );
+ }
+ return join "\n", @m;
+ } else {
+ return $self->xs_make_dlsyms(
+ $attribs,
+ $self->{BASEEXT} . $self->xs_dlsyms_ext,
+ 'Makefile.PL',
+ $self->{NAME},
+ $self->{DLBASE},
+ $attribs->{DL_FUNCS} || $self->{DL_FUNCS} || {},
+ $attribs->{FUNCLIST} || $self->{FUNCLIST} || [],
+ $attribs->{IMPORTS} || $self->{IMPORTS} || {},
+ $attribs->{DL_VARS} || $self->{DL_VARS} || [],
+ $self->xs_dlsyms_extra,
+ );
+ }
+ }
+
+ =head3 xs_make_dlsyms
+
+ $self->xs_make_dlsyms(
+ \%attribs, # hashref from %attribs in caller
+ "$self->{BASEEXT}.def", # output file for Makefile target
+ 'Makefile.PL', # dependency
+ $self->{NAME}, # shared object's "name"
+ $self->{DLBASE}, # last ::-separated part of name
+ $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}, # various params
+ $attribs{FUNCLIST} || $self->{FUNCLIST} || [],
+ $attribs{IMPORTS} || $self->{IMPORTS} || {},
+ $attribs{DL_VARS} || $self->{DL_VARS} || [],
+ # optional extra param that will be added as param to Mksymlists
+ );
+
+ Utility method that returns Makefile snippet to call C<Mksymlists>.
+
+ =cut
+
+ sub xs_make_dlsyms {
+ my ($self, $attribs, $target, $dep, $name, $dlbase, $funcs, $funclist, $imports, $vars, $extra) = @_;
+ my @m = (
+ "\n$target: $dep\n",
+ q! $(PERLRUN) -MExtUtils::Mksymlists \\
+ -e "Mksymlists('NAME'=>\"!, $name,
+ q!\", 'DLBASE' => '!,$dlbase,
+ # The above two lines quoted differently to work around
+ # a bug in the 4DOS/4NT command line interpreter. The visible
+ # result of the bug was files named q('extension_name',) *with the
+ # single quotes and the comma* in the extension build directories.
+ q!', 'DL_FUNCS' => !,neatvalue($funcs),
+ q!, 'FUNCLIST' => !,neatvalue($funclist),
+ q!, 'IMPORTS' => !,neatvalue($imports),
+ q!, 'DL_VARS' => !, neatvalue($vars)
+ );
+ push @m, $extra if defined $extra;
+ push @m, qq!);"\n!;
+ join '', @m;
+ }
+
+ =head3 dynamic (o)
+
+ Defines the dynamic target.
+
+ =cut
+
+ sub dynamic {
+ # --- Dynamic Loading Sections ---
+
+ my($self) = shift;
+ '
+ dynamic :: $(FIRST_MAKEFILE) $(INST_BOOT) $(INST_DYNAMIC)
+ $(NOECHO) $(NOOP)
+ ';
+ }
+
+
+ =head3 makemakerdflt_target
+
+ my $make_frag = $mm->makemakerdflt_target
+
+ Returns a make fragment with the makemakerdeflt_target specified.
+ This target is the first target in the Makefile, is the default target
+ and simply points off to 'all' just in case any make variant gets
+ confused or something gets snuck in before the real 'all' target.
+
+ =cut
+
+ sub makemakerdflt_target {
+ return <<'MAKE_FRAG';
+ makemakerdflt : all
+ $(NOECHO) $(NOOP)
+ MAKE_FRAG
+
+ }
+
+
+ =head3 manifypods_target
+
+ my $manifypods_target = $self->manifypods_target;
+
+ Generates the manifypods target. This target generates man pages from
+ all POD files in MAN1PODS and MAN3PODS.
+
+ =cut
+
+ sub manifypods_target {
+ my($self) = shift;
+
+ my $man1pods = '';
+ my $man3pods = '';
+ my $dependencies = '';
+
+ # populate manXpods & dependencies:
+ foreach my $name (sort keys %{$self->{MAN1PODS}}, sort keys %{$self->{MAN3PODS}}) {
+ $dependencies .= " \\\n\t$name";
+ }
+
+ my $manify = <<END;
+ manifypods : pure_all config $dependencies
+ END
+
+ my @man_cmds;
+ foreach my $section (qw(1 3)) {
+ my $pods = $self->{"MAN${section}PODS"};
+ my $p2m = sprintf <<'CMD', $section, $] > 5.008 ? " -u" : "";
+ $(NOECHO) $(POD2MAN) --section=%s --perm_rw=$(PERM_RW)%s
+ CMD
+ push @man_cmds, $self->split_command($p2m, map {($_,$pods->{$_})} sort keys %$pods);
+ }
+
+ $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
+ $manify .= join '', map { "$_\n" } @man_cmds;
+
+ return $manify;
+ }
+
+ sub _has_cpan_meta {
+ return eval {
+ require CPAN::Meta;
+ CPAN::Meta->VERSION(2.112150);
+ 1;
+ };
+ }
+
+ =head3 metafile_target
+
+ my $target = $mm->metafile_target;
+
+ Generate the metafile target.
+
+ Writes the file META.yml (YAML encoded meta-data) and META.json
+ (JSON encoded meta-data) about the module in the distdir.
+ The format follows Module::Build's as closely as possible.
+
+ =cut
+
+ sub metafile_target {
+ my $self = shift;
+ return <<'MAKE_FRAG' if $self->{NO_META} or ! _has_cpan_meta();
+ metafile :
+ $(NOECHO) $(NOOP)
+ MAKE_FRAG
+
+ my $metadata = $self->metafile_data(
+ $self->{META_ADD} || {},
+ $self->{META_MERGE} || {},
+ );
+
+ my $meta = $self->_fix_metadata_before_conversion( $metadata );
+
+ my @write_metayml = $self->stashmeta(
+ $meta->as_string({version => "1.4"}), 'META_new.yml'
+ );
+ my @write_metajson = $self->stashmeta(
+ $meta->as_string({version => "2.0"}), 'META_new.json'
+ );
+
+ my $metayml = join("\n\t", @write_metayml);
+ my $metajson = join("\n\t", @write_metajson);
+ return sprintf <<'MAKE_FRAG', $metayml, $metajson;
+ metafile : create_distdir
+ $(NOECHO) $(ECHO) Generating META.yml
+ %s
+ -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
+ $(NOECHO) $(ECHO) Generating META.json
+ %s
+ -$(NOECHO) $(MV) META_new.json $(DISTVNAME)/META.json
+ MAKE_FRAG
+
+ }
+
+ =begin private
+
+ =head3 _fix_metadata_before_conversion
+
+ $mm->_fix_metadata_before_conversion( \%metadata );
+
+ Fixes errors in the metadata before it's handed off to CPAN::Meta for
+ conversion. This hopefully results in something that can be used further
+ on, no guarantee is made though.
+
+ =end private
+
+ =cut
+
+ sub _fix_metadata_before_conversion {
+ my ( $self, $metadata ) = @_;
+
+ # we should never be called unless this already passed but
+ # prefer to be defensive in case somebody else calls this
+
+ return unless _has_cpan_meta;
+
+ my $bad_version = $metadata->{version} &&
+ !CPAN::Meta::Validator->new->version( 'version', $metadata->{version} );
+ # just delete all invalid versions
+ if( $bad_version ) {
+ warn "Can't parse version '$metadata->{version}'\n";
+ $metadata->{version} = '';
+ }
+
+ my $validator2 = CPAN::Meta::Validator->new( $metadata );
+ my @errors;
+ push @errors, $validator2->errors if !$validator2->is_valid;
+ my $validator14 = CPAN::Meta::Validator->new(
+ {
+ %$metadata,
+ 'meta-spec' => { version => 1.4 },
+ }
+ );
+ push @errors, $validator14->errors if !$validator14->is_valid;
+ # fix non-camelcase custom resource keys (only other trick we know)
+ for my $error ( @errors ) {
+ my ( $key ) = ( $error =~ /Custom resource '(.*)' must be in CamelCase./ );
+ next if !$key;
+
+ # first try to remove all non-alphabetic chars
+ ( my $new_key = $key ) =~ s/[^_a-zA-Z]//g;
+
+ # if that doesn't work, uppercase first one
+ $new_key = ucfirst $new_key if !$validator14->custom_1( $new_key );
+
+ # copy to new key if that worked
+ $metadata->{resources}{$new_key} = $metadata->{resources}{$key}
+ if $validator14->custom_1( $new_key );
+
+ # and delete old one in any case
+ delete $metadata->{resources}{$key};
+ }
+
+ # paper over validation issues, but still complain, necessary because
+ # there's no guarantee that the above will fix ALL errors
+ my $meta = eval { CPAN::Meta->create( $metadata, { lazy_validation => 1 } ) };
+ warn $@ if $@ and
+ $@ !~ /encountered CODE.*, but JSON can only represent references to arrays or hashes/;
+
+ # use the original metadata straight if the conversion failed
+ # or if it can't be stringified.
+ if( !$meta ||
+ !eval { $meta->as_string( { version => $METASPEC_V } ) } ||
+ !eval { $meta->as_string }
+ ) {
+ $meta = bless $metadata, 'CPAN::Meta';
+ }
+
+ my $now_license = $meta->as_struct({ version => 2 })->{license};
+ if ($self->{LICENSE} and $self->{LICENSE} ne 'unknown' and
+ @{$now_license} == 1 and $now_license->[0] eq 'unknown'
+ ) {
+ warn "Invalid LICENSE value '$self->{LICENSE}' ignored\n";
+ }
+
+ $meta;
+ }
+
+
+ =begin private
+
+ =head3 _sort_pairs
+
+ my @pairs = _sort_pairs($sort_sub, \%hash);
+
+ Sorts the pairs of a hash based on keys ordered according
+ to C<$sort_sub>.
+
+ =end private
+
+ =cut
+
+ sub _sort_pairs {
+ my $sort = shift;
+ my $pairs = shift;
+ return map { $_ => $pairs->{$_} }
+ sort $sort
+ keys %$pairs;
+ }
+
+
+ # Taken from Module::Build::Base
+ sub _hash_merge {
+ my ($self, $h, $k, $v) = @_;
+ if (ref $h->{$k} eq 'ARRAY') {
+ push @{$h->{$k}}, ref $v ? @$v : $v;
+ } elsif (ref $h->{$k} eq 'HASH') {
+ $self->_hash_merge($h->{$k}, $_, $v->{$_}) foreach keys %$v;
+ } else {
+ $h->{$k} = $v;
+ }
+ }
+
+
+ =head3 metafile_data
+
+ my $metadata_hashref = $mm->metafile_data(\%meta_add, \%meta_merge);
+
+ Returns the data which MakeMaker turns into the META.yml file
+ and the META.json file. It is always in version 2.0 of the format.
+
+ Values of %meta_add will overwrite any existing metadata in those
+ keys. %meta_merge will be merged with them.
+
+ =cut
+
+ sub metafile_data {
+ my $self = shift;
+ my($meta_add, $meta_merge) = @_;
+
+ $meta_add ||= {};
+ $meta_merge ||= {};
+
+ my $version = _normalize_version($self->{VERSION});
+ my $release_status = ($version =~ /_/) ? 'unstable' : 'stable';
+ my %meta = (
+ # required
+ abstract => $self->{ABSTRACT} || 'unknown',
+ author => defined($self->{AUTHOR}) ? $self->{AUTHOR} : ['unknown'],
+ dynamic_config => 1,
+ generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
+ license => [ $self->{LICENSE} || 'unknown' ],
+ 'meta-spec' => {
+ url => $METASPEC_URL,
+ version => $METASPEC_V,
+ },
+ name => $self->{DISTNAME},
+ release_status => $release_status,
+ version => $version,
+
+ # optional
+ no_index => { directory => [qw(t inc)] },
+ );
+ $self->_add_requirements_to_meta(\%meta);
+
+ if (!eval { require JSON::PP; require CPAN::Meta::Converter; CPAN::Meta::Converter->VERSION(2.141170) }) {
+ return \%meta;
+ }
+
+ # needs to be based on the original version
+ my $v1_add = _metaspec_version($meta_add) !~ /^2/;
+
+ for my $frag ($meta_add, $meta_merge) {
+ $frag = CPAN::Meta::Converter->new($frag, default_version => "1.4")->upgrade_fragment;
+ }
+
+ # if we upgraded a 1.x _ADD fragment, we gave it a prereqs key that
+ # will override all prereqs, which is more than the user asked for;
+ # instead, we'll go inside the prereqs and override all those
+ while( my($key, $val) = each %$meta_add ) {
+ if ($v1_add and $key eq 'prereqs') {
+ $meta{$key}{$_} = $val->{$_} for keys %$val;
+ } elsif ($key ne 'meta-spec') {
+ $meta{$key} = $val;
+ }
+ }
+
+ while( my($key, $val) = each %$meta_merge ) {
+ next if $key eq 'meta-spec';
+ $self->_hash_merge(\%meta, $key, $val);
+ }
+
+ return \%meta;
+ }
+
+
+ =begin private
+
+ =cut
+
+ sub _add_requirements_to_meta {
+ my ( $self, $meta ) = @_;
+ # Check the original args so we can tell between the user setting it
+ # to an empty hash and it just being initialized.
+ $meta->{prereqs}{configure}{requires} = $self->{ARGS}{CONFIGURE_REQUIRES}
+ ? $self->{CONFIGURE_REQUIRES}
+ : { 'ExtUtils::MakeMaker' => 0, };
+ $meta->{prereqs}{build}{requires} = $self->{ARGS}{BUILD_REQUIRES}
+ ? $self->{BUILD_REQUIRES}
+ : { 'ExtUtils::MakeMaker' => 0, };
+ $meta->{prereqs}{test}{requires} = $self->{TEST_REQUIRES}
+ if $self->{ARGS}{TEST_REQUIRES};
+ $meta->{prereqs}{runtime}{requires} = $self->{PREREQ_PM}
+ if $self->{ARGS}{PREREQ_PM};
+ $meta->{prereqs}{runtime}{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION})
+ if $self->{MIN_PERL_VERSION};
+ }
+
+ # spec version of given fragment - if not given, assume 1.4
+ sub _metaspec_version {
+ my ( $meta ) = @_;
+ return $meta->{'meta-spec'}->{version}
+ if defined $meta->{'meta-spec'}
+ and defined $meta->{'meta-spec'}->{version};
+ return '1.4';
+ }
+
+ sub _add_requirements_to_meta_v1_4 {
+ my ( $self, $meta ) = @_;
+ # Check the original args so we can tell between the user setting it
+ # to an empty hash and it just being initialized.
+ if( $self->{ARGS}{CONFIGURE_REQUIRES} ) {
+ $meta->{configure_requires} = $self->{CONFIGURE_REQUIRES};
+ } else {
+ $meta->{configure_requires} = {
+ 'ExtUtils::MakeMaker' => 0,
+ };
+ }
+ if( $self->{ARGS}{BUILD_REQUIRES} ) {
+ $meta->{build_requires} = $self->{BUILD_REQUIRES};
+ } else {
+ $meta->{build_requires} = {
+ 'ExtUtils::MakeMaker' => 0,
+ };
+ }
+ if( $self->{ARGS}{TEST_REQUIRES} ) {
+ $meta->{build_requires} = {
+ %{ $meta->{build_requires} },
+ %{ $self->{TEST_REQUIRES} },
+ };
+ }
+ $meta->{requires} = $self->{PREREQ_PM}
+ if defined $self->{PREREQ_PM};
+ $meta->{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION})
+ if $self->{MIN_PERL_VERSION};
+ }
+
+ # Adapted from Module::Build::Base
+ sub _normalize_version {
+ my ($version) = @_;
+ $version = 0 unless defined $version;
+
+ if ( ref $version eq 'version' ) { # version objects
+ $version = $version->stringify;
+ }
+ elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
+ # normalize string tuples without "v": "1.2.3" -> "v1.2.3"
+ $version = "v$version";
+ }
+ else {
+ # leave alone
+ }
+ return $version;
+ }
+
+ =head3 _dump_hash
+
+ $yaml = _dump_hash(\%options, %hash);
+
+ Implements a fake YAML dumper for a hash given
+ as a list of pairs. No quoting/escaping is done. Keys
+ are supposed to be strings. Values are undef, strings,
+ hash refs or array refs of strings.
+
+ Supported options are:
+
+ delta => STR - indentation delta
+ use_header => BOOL - whether to include a YAML header
+ indent => STR - a string of spaces
+ default: ''
+
+ max_key_length => INT - maximum key length used to align
+ keys and values of the same hash
+ default: 20
+ key_sort => CODE - a sort sub
+ It may be undef, which means no sorting by keys
+ default: sub { lc $a cmp lc $b }
+
+ customs => HASH - special options for certain keys
+ (whose values are hashes themselves)
+ may contain: max_key_length, key_sort, customs
+
+ =end private
+
+ =cut
+
+ sub _dump_hash {
+ croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH';
+ my $options = shift;
+ my %hash = @_;
+
+ # Use a list to preserve order.
+ my @pairs;
+
+ my $k_sort
+ = exists $options->{key_sort} ? $options->{key_sort}
+ : sub { lc $a cmp lc $b };
+ if ($k_sort) {
+ croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE';
+ @pairs = _sort_pairs($k_sort, \%hash);
+ } else { # list of pairs, no sorting
+ @pairs = @_;
+ }
+
+ my $yaml = $options->{use_header} ? "--- #YAML:1.0\n" : '';
+ my $indent = $options->{indent} || '';
+ my $k_length = min(
+ ($options->{max_key_length} || 20),
+ max(map { length($_) + 1 } grep { !ref $hash{$_} } keys %hash)
+ );
+ my $customs = $options->{customs} || {};
+
+ # printf format for key
+ my $k_format = "%-${k_length}s";
+
+ while( @pairs ) {
+ my($key, $val) = splice @pairs, 0, 2;
+ $val = '~' unless defined $val;
+ if(ref $val eq 'HASH') {
+ if ( keys %$val ) {
+ my %k_options = ( # options for recursive call
+ delta => $options->{delta},
+ use_header => 0,
+ indent => $indent . $options->{delta},
+ );
+ if (exists $customs->{$key}) {
+ my %k_custom = %{$customs->{$key}};
+ foreach my $k (qw(key_sort max_key_length customs)) {
+ $k_options{$k} = $k_custom{$k} if exists $k_custom{$k};
+ }
+ }
+ $yaml .= $indent . "$key:\n"
+ . _dump_hash(\%k_options, %$val);
+ }
+ else {
+ $yaml .= $indent . "$key: {}\n";
+ }
+ }
+ elsif (ref $val eq 'ARRAY') {
+ if( @$val ) {
+ $yaml .= $indent . "$key:\n";
+
+ for (@$val) {
+ croak "only nested arrays of non-refs are supported" if ref $_;
+ $yaml .= $indent . $options->{delta} . "- $_\n";
+ }
+ }
+ else {
+ $yaml .= $indent . "$key: []\n";
+ }
+ }
+ elsif( ref $val and !blessed($val) ) {
+ croak "only nested hashes, arrays and objects are supported";
+ }
+ else { # if it's an object, just stringify it
+ $yaml .= $indent . sprintf "$k_format %s\n", "$key:", $val;
+ }
+ };
+
+ return $yaml;
+
+ }
+
+ sub blessed {
+ return eval { $_[0]->isa("UNIVERSAL"); };
+ }
+
+ sub max {
+ return (sort { $b <=> $a } @_)[0];
+ }
+
+ sub min {
+ return (sort { $a <=> $b } @_)[0];
+ }
+
+ =head3 metafile_file
+
+ my $meta_yml = $mm->metafile_file(@metadata_pairs);
+
+ Turns the @metadata_pairs into YAML.
+
+ This method does not implement a complete YAML dumper, being limited
+ to dump a hash with values which are strings, undef's or nested hashes
+ and arrays of strings. No quoting/escaping is done.
+
+ =cut
+
+ sub metafile_file {
+ my $self = shift;
+
+ my %dump_options = (
+ use_header => 1,
+ delta => ' ' x 4,
+ key_sort => undef,
+ );
+ return _dump_hash(\%dump_options, @_);
+
+ }
+
+
+ =head3 distmeta_target
+
+ my $make_frag = $mm->distmeta_target;
+
+ Generates the distmeta target to add META.yml and META.json to the MANIFEST
+ in the distdir.
+
+ =cut
+
+ sub distmeta_target {
+ my $self = shift;
+
+ my @add_meta = (
+ $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']),
+ exit unless -e q{META.yml};
+ eval { maniadd({q{META.yml} => q{Module YAML meta-data (added by MakeMaker)}}) }
+ or die "Could not add META.yml to MANIFEST: ${'@'}"
+ CODE
+ $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd'])
+ exit unless -f q{META.json};
+ eval { maniadd({q{META.json} => q{Module JSON meta-data (added by MakeMaker)}}) }
+ or die "Could not add META.json to MANIFEST: ${'@'}"
+ CODE
+ );
+
+ my @add_meta_to_distdir = map { $self->cd('$(DISTVNAME)', $_) } @add_meta;
+
+ return sprintf <<'MAKE', @add_meta_to_distdir;
+ distmeta : create_distdir metafile
+ $(NOECHO) %s
+ $(NOECHO) %s
+
+ MAKE
+
+ }
+
+
+ =head3 mymeta
+
+ my $mymeta = $mm->mymeta;
+
+ Generate MYMETA information as a hash either from an existing CPAN Meta file
+ (META.json or META.yml) or from internal data.
+
+ =cut
+
+ sub mymeta {
+ my $self = shift;
+ my $file = shift || ''; # for testing
+
+ my $mymeta = $self->_mymeta_from_meta($file);
+ my $v2 = 1;
+
+ unless ( $mymeta ) {
+ $mymeta = $self->metafile_data(
+ $self->{META_ADD} || {},
+ $self->{META_MERGE} || {},
+ );
+ $v2 = 0;
+ }
+
+ # Overwrite the non-configure dependency hashes
+ $self->_add_requirements_to_meta($mymeta);
+
+ $mymeta->{dynamic_config} = 0;
+
+ return $mymeta;
+ }
+
+
+ sub _mymeta_from_meta {
+ my $self = shift;
+ my $metafile = shift || ''; # for testing
+
+ return unless _has_cpan_meta();
+
+ my $meta;
+ for my $file ( $metafile, "META.json", "META.yml" ) {
+ next unless -e $file;
+ eval {
+ $meta = CPAN::Meta->load_file($file)->as_struct( { version => 2 } );
+ };
+ last if $meta;
+ }
+ return unless $meta;
+
+ # META.yml before 6.25_01 cannot be trusted. META.yml lived in the source directory.
+ # There was a good chance the author accidentally uploaded a stale META.yml if they
+ # rolled their own tarball rather than using "make dist".
+ if ($meta->{generated_by} &&
+ $meta->{generated_by} =~ /ExtUtils::MakeMaker version ([\d\._]+)/) {
+ my $eummv = do { local $^W = 0; $1+0; };
+ if ($eummv < 6.2501) {
+ return;
+ }
+ }
+
+ return $meta;
+ }
+
+ =head3 write_mymeta
+
+ $self->write_mymeta( $mymeta );
+
+ Write MYMETA information to MYMETA.json and MYMETA.yml.
+
+ =cut
+
+ sub write_mymeta {
+ my $self = shift;
+ my $mymeta = shift;
+
+ return unless _has_cpan_meta();
+
+ my $meta_obj = $self->_fix_metadata_before_conversion( $mymeta );
+
+ $meta_obj->save( 'MYMETA.json', { version => "2.0" } );
+ $meta_obj->save( 'MYMETA.yml', { version => "1.4" } );
+ return 1;
+ }
+
+ =head3 realclean (o)
+
+ Defines the realclean target.
+
+ =cut
+
+ sub realclean {
+ my($self, %attribs) = @_;
+
+ my @dirs = qw($(DISTVNAME));
+ my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
+
+ # Special exception for the perl core where INST_* is not in blib.
+ # This cleans up the files built from the ext/ directory (all XS).
+ if( $self->{PERL_CORE} ) {
+ push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
+ push @files, values %{$self->{PM}};
+ }
+
+ if( $self->has_link_code ){
+ push @files, qw($(OBJECT));
+ }
+
+ if( $attribs{FILES} ) {
+ if( ref $attribs{FILES} ) {
+ push @dirs, @{ $attribs{FILES} };
+ }
+ else {
+ push @dirs, split /\s+/, $attribs{FILES};
+ }
+ }
+
+ # Occasionally files are repeated several times from different sources
+ { my(%f) = map { ($_ => 1) } @files; @files = sort keys %f; }
+ { my(%d) = map { ($_ => 1) } @dirs; @dirs = sort keys %d; }
+
+ my $rm_cmd = join "\n\t", map { "$_" }
+ $self->split_command('- $(RM_F)', @files);
+ my $rmf_cmd = join "\n\t", map { "$_" }
+ $self->split_command('- $(RM_RF)', @dirs);
+
+ my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
+ # Delete temporary files (via clean) and also delete dist files
+ realclean purge :: realclean_subdirs
+ %s
+ %s
+ MAKE
+
+ $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
+
+ return $m;
+ }
+
+
+ =head3 realclean_subdirs_target
+
+ my $make_frag = $MM->realclean_subdirs_target;
+
+ Returns the realclean_subdirs target. This is used by the realclean
+ target to call realclean on any subdirectories which contain Makefiles.
+
+ =cut
+
+ sub realclean_subdirs_target {
+ my $self = shift;
+ my @m = <<'EOF';
+ # so clean is forced to complete before realclean_subdirs runs
+ realclean_subdirs : clean
+ EOF
+ return join '', @m, "\t\$(NOECHO) \$(NOOP)\n" unless @{$self->{DIR}};
+ foreach my $dir (@{$self->{DIR}}) {
+ foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
+ my $subrclean .= $self->oneliner(_sprintf562 <<'CODE', $dir, $makefile);
+ chdir '%1$s'; system '$(MAKE) $(USEMAKEFILE) %2$s realclean' if -f '%2$s';
+ CODE
+ push @m, "\t- $subrclean\n";
+ }
+ }
+ return join '', @m;
+ }
+
+
+ =head3 signature_target
+
+ my $target = $mm->signature_target;
+
+ Generate the signature target.
+
+ Writes the file SIGNATURE with "cpansign -s".
+
+ =cut
+
+ sub signature_target {
+ my $self = shift;
+
+ return <<'MAKE_FRAG';
+ signature :
+ cpansign -s
+ MAKE_FRAG
+
+ }
+
+
+ =head3 distsignature_target
+
+ my $make_frag = $mm->distsignature_target;
+
+ Generates the distsignature target to add SIGNATURE to the MANIFEST in the
+ distdir.
+
+ =cut
+
+ sub distsignature_target {
+ my $self = shift;
+
+ my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+ eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) }
+ or die "Could not add SIGNATURE to MANIFEST: ${'@'}"
+ CODE
+
+ my $sign_dist = $self->cd('$(DISTVNAME)' => 'cpansign -s');
+
+ # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
+ # exist
+ my $touch_sig = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
+ my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
+
+ return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
+ distsignature : distmeta
+ $(NOECHO) %s
+ $(NOECHO) %s
+ %s
+
+ MAKE
+
+ }
+
+
+ =head3 special_targets
+
+ my $make_frag = $mm->special_targets
+
+ Returns a make fragment containing any targets which have special
+ meaning to make. For example, .SUFFIXES and .PHONY.
+
+ =cut
+
+ sub special_targets {
+ my $make_frag = <<'MAKE_FRAG';
+ .SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+
+ .PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir pure_all subdirs clean_subdirs makemakerdflt manifypods realclean_subdirs subdirs_dynamic subdirs_pure_nolink subdirs_static subdirs-test_dynamic subdirs-test_static test_dynamic test_static
+
+ MAKE_FRAG
+
+ $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
+ .NO_CONFIG_REC: Makefile
+
+ MAKE_FRAG
+
+ return $make_frag;
+ }
+
+
+
+
+ =head2 Init methods
+
+ Methods which help initialize the MakeMaker object and macros.
+
+
+ =head3 init_ABSTRACT
+
+ $mm->init_ABSTRACT
+
+ =cut
+
+ sub init_ABSTRACT {
+ my $self = shift;
+
+ if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) {
+ warn "Both ABSTRACT_FROM and ABSTRACT are set. ".
+ "Ignoring ABSTRACT_FROM.\n";
+ return;
+ }
+
+ if ($self->{ABSTRACT_FROM}){
+ $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
+ carp "WARNING: Setting ABSTRACT via file ".
+ "'$self->{ABSTRACT_FROM}' failed\n";
+ }
+
+ if ($self->{ABSTRACT} && $self->{ABSTRACT} =~ m![[:cntrl:]]+!) {
+ warn "WARNING: ABSTRACT contains control character(s),".
+ " they will be removed\n";
+ $self->{ABSTRACT} =~ s![[:cntrl:]]+!!g;
+ return;
+ }
+ }
+
+ =head3 init_INST
+
+ $mm->init_INST;
+
+ Called by init_main. Sets up all INST_* variables except those related
+ to XS code. Those are handled in init_xs.
+
+ =cut
+
+ sub init_INST {
+ my($self) = shift;
+
+ $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
+ $self->{INST_BIN} ||= $self->catdir($Curdir,'blib','bin');
+
+ # INST_LIB typically pre-set if building an extension after
+ # perl has been built and installed. Setting INST_LIB allows
+ # you to build directly into, say $Config{privlibexp}.
+ unless ($self->{INST_LIB}){
+ if ($self->{PERL_CORE}) {
+ $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+ } else {
+ $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
+ }
+ }
+
+ my @parentdir = split(/::/, $self->{PARENT_NAME});
+ $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)', @parentdir);
+ $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)', @parentdir);
+ $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)', 'auto',
+ '$(FULLEXT)');
+ $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
+ '$(FULLEXT)');
+
+ $self->{INST_SCRIPT} ||= $self->catdir($Curdir,'blib','script');
+
+ $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
+ $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
+
+ return 1;
+ }
+
+
+ =head3 init_INSTALL
+
+ $mm->init_INSTALL;
+
+ Called by init_main. Sets up all INSTALL_* variables (except
+ INSTALLDIRS) and *PREFIX.
+
+ =cut
+
+ sub init_INSTALL {
+ my($self) = shift;
+
+ if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) {
+ die "Only one of PREFIX or INSTALL_BASE can be given. Not both.\n";
+ }
+
+ if( $self->{ARGS}{INSTALL_BASE} ) {
+ $self->init_INSTALL_from_INSTALL_BASE;
+ }
+ else {
+ $self->init_INSTALL_from_PREFIX;
+ }
+ }
+
+
+ =head3 init_INSTALL_from_PREFIX
+
+ $mm->init_INSTALL_from_PREFIX;
+
+ =cut
+
+ sub init_INSTALL_from_PREFIX {
+ my $self = shift;
+
+ $self->init_lib2arch;
+
+ # There are often no Config.pm defaults for these new man variables so
+ # we fall back to the old behavior which is to use installman*dir
+ foreach my $num (1, 3) {
+ my $k = 'installsiteman'.$num.'dir';
+
+ $self->{uc $k} ||= uc "\$(installman${num}dir)"
+ unless $Config{$k};
+ }
+
+ foreach my $num (1, 3) {
+ my $k = 'installvendorman'.$num.'dir';
+
+ unless( $Config{$k} ) {
+ $self->{uc $k} ||= $Config{usevendorprefix}
+ ? uc "\$(installman${num}dir)"
+ : '';
+ }
+ }
+
+ $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
+ unless $Config{installsitebin};
+ $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)'
+ unless $Config{installsitescript};
+
+ unless( $Config{installvendorbin} ) {
+ $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix}
+ ? $Config{installbin}
+ : '';
+ }
+ unless( $Config{installvendorscript} ) {
+ $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix}
+ ? $Config{installscript}
+ : '';
+ }
+
+
+ my $iprefix = $Config{installprefixexp} || $Config{installprefix} ||
+ $Config{prefixexp} || $Config{prefix} || '';
+ my $vprefix = $Config{usevendorprefix} ? $Config{vendorprefixexp} : '';
+ my $sprefix = $Config{siteprefixexp} || '';
+
+ # 5.005_03 doesn't have a siteprefix.
+ $sprefix = $iprefix unless $sprefix;
+
+
+ $self->{PREFIX} ||= '';
+
+ if( $self->{PREFIX} ) {
+ @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
+ ('$(PREFIX)') x 3;
+ }
+ else {
+ $self->{PERLPREFIX} ||= $iprefix;
+ $self->{SITEPREFIX} ||= $sprefix;
+ $self->{VENDORPREFIX} ||= $vprefix;
+
+ # Lots of MM extension authors like to use $(PREFIX) so we
+ # put something sensible in there no matter what.
+ $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
+ }
+
+ my $arch = $Config{archname};
+ my $version = $Config{version};
+
+ # default style
+ my $libstyle = $Config{installstyle} || 'lib/perl5';
+ my $manstyle = '';
+
+ if( $self->{LIBSTYLE} ) {
+ $libstyle = $self->{LIBSTYLE};
+ $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
+ }
+
+ # Some systems, like VOS, set installman*dir to '' if they can't
+ # read man pages.
+ for my $num (1, 3) {
+ $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
+ unless $Config{'installman'.$num.'dir'};
+ }
+
+ my %bin_layouts =
+ (
+ bin => { s => $iprefix,
+ t => 'perl',
+ d => 'bin' },
+ vendorbin => { s => $vprefix,
+ t => 'vendor',
+ d => 'bin' },
+ sitebin => { s => $sprefix,
+ t => 'site',
+ d => 'bin' },
+ script => { s => $iprefix,
+ t => 'perl',
+ d => 'bin' },
+ vendorscript=> { s => $vprefix,
+ t => 'vendor',
+ d => 'bin' },
+ sitescript => { s => $sprefix,
+ t => 'site',
+ d => 'bin' },
+ );
+
+ my %man_layouts =
+ (
+ man1dir => { s => $iprefix,
+ t => 'perl',
+ d => 'man/man1',
+ style => $manstyle, },
+ siteman1dir => { s => $sprefix,
+ t => 'site',
+ d => 'man/man1',
+ style => $manstyle, },
+ vendorman1dir => { s => $vprefix,
+ t => 'vendor',
+ d => 'man/man1',
+ style => $manstyle, },
+
+ man3dir => { s => $iprefix,
+ t => 'perl',
+ d => 'man/man3',
+ style => $manstyle, },
+ siteman3dir => { s => $sprefix,
+ t => 'site',
+ d => 'man/man3',
+ style => $manstyle, },
+ vendorman3dir => { s => $vprefix,
+ t => 'vendor',
+ d => 'man/man3',
+ style => $manstyle, },
+ );
+
+ my %lib_layouts =
+ (
+ privlib => { s => $iprefix,
+ t => 'perl',
+ d => '',
+ style => $libstyle, },
+ vendorlib => { s => $vprefix,
+ t => 'vendor',
+ d => '',
+ style => $libstyle, },
+ sitelib => { s => $sprefix,
+ t => 'site',
+ d => 'site_perl',
+ style => $libstyle, },
+
+ archlib => { s => $iprefix,
+ t => 'perl',
+ d => "$version/$arch",
+ style => $libstyle },
+ vendorarch => { s => $vprefix,
+ t => 'vendor',
+ d => "$version/$arch",
+ style => $libstyle },
+ sitearch => { s => $sprefix,
+ t => 'site',
+ d => "site_perl/$version/$arch",
+ style => $libstyle },
+ );
+
+
+ # Special case for LIB.
+ if( $self->{LIB} ) {
+ foreach my $var (keys %lib_layouts) {
+ my $Installvar = uc "install$var";
+
+ if( $var =~ /arch/ ) {
+ $self->{$Installvar} ||=
+ $self->catdir($self->{LIB}, $Config{archname});
+ }
+ else {
+ $self->{$Installvar} ||= $self->{LIB};
+ }
+ }
+ }
+
+ my %type2prefix = ( perl => 'PERLPREFIX',
+ site => 'SITEPREFIX',
+ vendor => 'VENDORPREFIX'
+ );
+
+ my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
+ while( my($var, $layout) = each(%layouts) ) {
+ my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
+ my $r = '$('.$type2prefix{$t}.')';
+
+ warn "Prefixing $var\n" if $Verbose >= 2;
+
+ my $installvar = "install$var";
+ my $Installvar = uc $installvar;
+ next if $self->{$Installvar};
+
+ $d = "$style/$d" if $style;
+ $self->prefixify($installvar, $s, $r, $d);
+
+ warn " $Installvar == $self->{$Installvar}\n"
+ if $Verbose >= 2;
+ }
+
+ # Generate these if they weren't figured out.
+ $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
+ $self->{VENDORLIBEXP} ||= $self->{INSTALLVENDORLIB};
+
+ return 1;
+ }
+
+
+ =head3 init_from_INSTALL_BASE
+
+ $mm->init_from_INSTALL_BASE
+
+ =cut
+
+ my %map = (
+ lib => [qw(lib perl5)],
+ arch => [('lib', 'perl5', $Config{archname})],
+ bin => [qw(bin)],
+ man1dir => [qw(man man1)],
+ man3dir => [qw(man man3)]
+ );
+ $map{script} = $map{bin};
+
+ sub init_INSTALL_from_INSTALL_BASE {
+ my $self = shift;
+
+ @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} =
+ '$(INSTALL_BASE)';
+
+ my %install;
+ foreach my $thing (keys %map) {
+ foreach my $dir (('', 'SITE', 'VENDOR')) {
+ my $uc_thing = uc $thing;
+ my $key = "INSTALL".$dir.$uc_thing;
+
+ $install{$key} ||=
+ $self->catdir('$(INSTALL_BASE)', @{$map{$thing}});
+ }
+ }
+
+ # Adjust for variable quirks.
+ $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
+ $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
+
+ foreach my $key (keys %install) {
+ $self->{$key} ||= $install{$key};
+ }
+
+ return 1;
+ }
+
+
+ =head3 init_VERSION I<Abstract>
+
+ $mm->init_VERSION
+
+ Initialize macros representing versions of MakeMaker and other tools
+
+ MAKEMAKER: path to the MakeMaker module.
+
+ MM_VERSION: ExtUtils::MakeMaker Version
+
+ MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
+ compat)
+
+ VERSION: version of your module
+
+ VERSION_MACRO: which macro represents the version (usually 'VERSION')
+
+ VERSION_SYM: like version but safe for use as an RCS revision number
+
+ DEFINE_VERSION: -D line to set the module version when compiling
+
+ XS_VERSION: version in your .xs file. Defaults to $(VERSION)
+
+ XS_VERSION_MACRO: which macro represents the XS version.
+
+ XS_DEFINE_VERSION: -D line to set the xs version when compiling.
+
+ Called by init_main.
+
+ =cut
+
+ sub init_VERSION {
+ my($self) = shift;
+
+ $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename;
+ $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
+ $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
+ $self->{VERSION_FROM} ||= '';
+
+ if ($self->{VERSION_FROM}){
+ $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
+ if( $self->{VERSION} eq 'undef' ) {
+ carp("WARNING: Setting VERSION via file ".
+ "'$self->{VERSION_FROM}' failed\n");
+ }
+ }
+
+ if (defined $self->{VERSION}) {
+ if ( $self->{VERSION} !~ /^\s*v?[\d_\.]+\s*$/ ) {
+ require version;
+ my $normal = eval { version->new( $self->{VERSION} ) };
+ $self->{VERSION} = $normal if defined $normal;
+ }
+ $self->{VERSION} =~ s/^\s+//;
+ $self->{VERSION} =~ s/\s+$//;
+ }
+ else {
+ $self->{VERSION} = '';
+ }
+
+
+ $self->{VERSION_MACRO} = 'VERSION';
+ ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
+ $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
+
+
+ # Graham Barr and Paul Marquess had some ideas how to ensure
+ # version compatibility between the *.pm file and the
+ # corresponding *.xs file. The bottom line was, that we need an
+ # XS_VERSION macro that defaults to VERSION:
+ $self->{XS_VERSION} ||= $self->{VERSION};
+
+ $self->{XS_VERSION_MACRO} = 'XS_VERSION';
+ $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
+
+ }
+
+
+ =head3 init_tools
+
+ $MM->init_tools();
+
+ Initializes the simple macro definitions used by tools_other() and
+ places them in the $MM object. These use conservative cross platform
+ versions and should be overridden with platform specific versions for
+ performance.
+
+ Defines at least these macros.
+
+ Macro Description
+
+ NOOP Do nothing
+ NOECHO Tell make not to display the command itself
+
+ SHELL Program used to run shell commands
+
+ ECHO Print text adding a newline on the end
+ RM_F Remove a file
+ RM_RF Remove a directory
+ TOUCH Update a file's timestamp
+ TEST_F Test for a file's existence
+ TEST_S Test the size of a file
+ CP Copy a file
+ CP_NONEMPTY Copy a file if it is not empty
+ MV Move a file
+ CHMOD Change permissions on a file
+ FALSE Exit with non-zero
+ TRUE Exit with zero
+
+ UMASK_NULL Nullify umask
+ DEV_NULL Suppress all command output
+
+ =cut
+
+ sub init_tools {
+ my $self = shift;
+
+ $self->{ECHO} ||= $self->oneliner('binmode STDOUT, qq{:raw}; print qq{@ARGV}', ['-l']);
+ $self->{ECHO_N} ||= $self->oneliner('print qq{@ARGV}');
+
+ $self->{TOUCH} ||= $self->oneliner('touch', ["-MExtUtils::Command"]);
+ $self->{CHMOD} ||= $self->oneliner('chmod', ["-MExtUtils::Command"]);
+ $self->{RM_F} ||= $self->oneliner('rm_f', ["-MExtUtils::Command"]);
+ $self->{RM_RF} ||= $self->oneliner('rm_rf', ["-MExtUtils::Command"]);
+ $self->{TEST_F} ||= $self->oneliner('test_f', ["-MExtUtils::Command"]);
+ $self->{TEST_S} ||= $self->oneliner('test_s', ["-MExtUtils::Command::MM"]);
+ $self->{CP_NONEMPTY} ||= $self->oneliner('cp_nonempty', ["-MExtUtils::Command::MM"]);
+ $self->{FALSE} ||= $self->oneliner('exit 1');
+ $self->{TRUE} ||= $self->oneliner('exit 0');
+
+ $self->{MKPATH} ||= $self->oneliner('mkpath', ["-MExtUtils::Command"]);
+
+ $self->{CP} ||= $self->oneliner('cp', ["-MExtUtils::Command"]);
+ $self->{MV} ||= $self->oneliner('mv', ["-MExtUtils::Command"]);
+
+ $self->{MOD_INSTALL} ||=
+ $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+ install([ from_to => {@ARGV}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]);
+ CODE
+ $self->{DOC_INSTALL} ||= $self->oneliner('perllocal_install', ["-MExtUtils::Command::MM"]);
+ $self->{UNINSTALL} ||= $self->oneliner('uninstall', ["-MExtUtils::Command::MM"]);
+ $self->{WARN_IF_OLD_PACKLIST} ||=
+ $self->oneliner('warn_if_old_packlist', ["-MExtUtils::Command::MM"]);
+ $self->{FIXIN} ||= $self->oneliner('MY->fixin(shift)', ["-MExtUtils::MY"]);
+ $self->{EQUALIZE_TIMESTAMP} ||= $self->oneliner('eqtime', ["-MExtUtils::Command"]);
+
+ $self->{UNINST} ||= 0;
+ $self->{VERBINST} ||= 0;
+
+ $self->{SHELL} ||= $Config{sh};
+
+ # UMASK_NULL is not used by MakeMaker but some CPAN modules
+ # make use of it.
+ $self->{UMASK_NULL} ||= "umask 0";
+
+ # Not the greatest default, but its something.
+ $self->{DEV_NULL} ||= "> /dev/null 2>&1";
+
+ $self->{NOOP} ||= '$(TRUE)';
+ $self->{NOECHO} = '@' unless defined $self->{NOECHO};
+
+ $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE} || 'Makefile';
+ $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
+ $self->{MAKEFILE_OLD} ||= $self->{MAKEFILE}.'.old';
+ $self->{MAKE_APERL_FILE} ||= $self->{MAKEFILE}.'.aperl';
+
+ # Not everybody uses -f to indicate "use this Makefile instead"
+ $self->{USEMAKEFILE} ||= '-f';
+
+ # Some makes require a wrapper around macros passed in on the command
+ # line.
+ $self->{MACROSTART} ||= '';
+ $self->{MACROEND} ||= '';
+
+ return;
+ }
+
+
+ =head3 init_others
+
+ $MM->init_others();
+
+ Initializes the macro definitions having to do with compiling and
+ linking used by tools_other() and places them in the $MM object.
+
+ If there is no description, its the same as the parameter to
+ WriteMakefile() documented in ExtUtils::MakeMaker.
+
+ =cut
+
+ sub init_others {
+ my $self = shift;
+
+ $self->{LD_RUN_PATH} = "";
+
+ $self->{LIBS} = $self->_fix_libs($self->{LIBS});
+
+ # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
+ foreach my $libs ( @{$self->{LIBS}} ){
+ $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
+ my(@libs) = $self->extliblist($libs);
+ if ($libs[0] or $libs[1] or $libs[2]){
+ # LD_RUN_PATH now computed by ExtUtils::Liblist
+ ($self->{EXTRALIBS}, $self->{BSLOADLIBS},
+ $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
+ last;
+ }
+ }
+
+ if ( $self->{OBJECT} ) {
+ $self->{OBJECT} = join(" ", @{$self->{OBJECT}}) if ref $self->{OBJECT};
+ $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+ } elsif ( ($self->{MAGICXS} || $self->{XSMULTI}) && @{$self->{O_FILES}||[]} ) {
+ $self->{OBJECT} = join(" ", @{$self->{O_FILES}});
+ $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+ } else {
+ # init_dirscan should have found out, if we have C files
+ $self->{OBJECT} = "";
+ $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
+ }
+ $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
+
+ $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
+ $self->{PERLMAINCC} ||= '$(CC)';
+ $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
+
+ # Sanity check: don't define LINKTYPE = dynamic if we're skipping
+ # the 'dynamic' section of MM. We don't have this problem with
+ # 'static', since we either must use it (%Config says we can't
+ # use dynamic loading) or the caller asked for it explicitly.
+ if (!$self->{LINKTYPE}) {
+ $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
+ ? 'static'
+ : ($Config{usedl} ? 'dynamic' : 'static');
+ }
+
+ return;
+ }
+
+
+ # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
+ # undefined. In any case we turn it into an anon array
+ sub _fix_libs {
+ my($self, $libs) = @_;
+
+ return !defined $libs ? [''] :
+ !ref $libs ? [$libs] :
+ !defined $libs->[0] ? [''] :
+ $libs ;
+ }
+
+
+ =head3 tools_other
+
+ my $make_frag = $MM->tools_other;
+
+ Returns a make fragment containing definitions for the macros init_others()
+ initializes.
+
+ =cut
+
+ sub tools_other {
+ my($self) = shift;
+ my @m;
+
+ # We set PM_FILTER as late as possible so it can see all the earlier
+ # on macro-order sensitive makes such as nmake.
+ for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH
+ UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP
+ FALSE TRUE
+ ECHO ECHO_N
+ UNINST VERBINST
+ MOD_INSTALL DOC_INSTALL UNINSTALL
+ WARN_IF_OLD_PACKLIST
+ MACROSTART MACROEND
+ USEMAKEFILE
+ PM_FILTER
+ FIXIN
+ CP_NONEMPTY
+ } )
+ {
+ next unless defined $self->{$tool};
+ push @m, "$tool = $self->{$tool}\n";
+ }
+
+ return join "", @m;
+ }
+
+
+ =head3 init_DIRFILESEP I<Abstract>
+
+ $MM->init_DIRFILESEP;
+ my $dirfilesep = $MM->{DIRFILESEP};
+
+ Initializes the DIRFILESEP macro which is the separator between the
+ directory and filename in a filepath. ie. / on Unix, \ on Win32 and
+ nothing on VMS.
+
+ For example:
+
+ # instead of $(INST_ARCHAUTODIR)/extralibs.ld
+ $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
+
+ Something of a hack but it prevents a lot of code duplication between
+ MM_* variants.
+
+ Do not use this as a separator between directories. Some operating
+ systems use different separators between subdirectories as between
+ directories and filenames (for example: VOLUME:[dir1.dir2]file on VMS).
+
+ =head3 init_linker I<Abstract>
+
+ $mm->init_linker;
+
+ Initialize macros which have to do with linking.
+
+ PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
+ extensions.
+
+ PERL_ARCHIVE_AFTER: path to a library which should be put on the
+ linker command line I<after> the external libraries to be linked to
+ dynamic extensions. This may be needed if the linker is one-pass, and
+ Perl includes some overrides for C RTL functions, such as malloc().
+
+ EXPORT_LIST: name of a file that is passed to linker to define symbols
+ to be exported.
+
+ Some OSes do not need these in which case leave it blank.
+
+
+ =head3 init_platform
+
+ $mm->init_platform
+
+ Initialize any macros which are for platform specific use only.
+
+ A typical one is the version number of your OS specific module.
+ (ie. MM_Unix_VERSION or MM_VMS_VERSION).
+
+ =cut
+
+ sub init_platform {
+ return '';
+ }
+
+
+ =head3 init_MAKE
+
+ $mm->init_MAKE
+
+ Initialize MAKE from either a MAKE environment variable or $Config{make}.
+
+ =cut
+
+ sub init_MAKE {
+ my $self = shift;
+
+ $self->{MAKE} ||= $ENV{MAKE} || $Config{make};
+ }
+
+
+ =head2 Tools
+
+ A grab bag of methods to generate specific macros and commands.
+
+
+
+ =head3 manifypods
+
+ Defines targets and routines to translate the pods into manpages and
+ put them into the INST_* directories.
+
+ =cut
+
+ sub manifypods {
+ my $self = shift;
+
+ my $POD2MAN_macro = $self->POD2MAN_macro();
+ my $manifypods_target = $self->manifypods_target();
+
+ return <<END_OF_TARGET;
+
+ $POD2MAN_macro
+
+ $manifypods_target
+
+ END_OF_TARGET
+
+ }
+
+
+ =head3 POD2MAN_macro
+
+ my $pod2man_macro = $self->POD2MAN_macro
+
+ Returns a definition for the POD2MAN macro. This is a program
+ which emulates the pod2man utility. You can add more switches to the
+ command by simply appending them on the macro.
+
+ Typical usage:
+
+ $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
+
+ =cut
+
+ sub POD2MAN_macro {
+ my $self = shift;
+
+ # Need the trailing '--' so perl stops gobbling arguments and - happens
+ # to be an alternative end of line separator on VMS so we quote it
+ return <<'END_OF_DEF';
+ POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
+ POD2MAN = $(POD2MAN_EXE)
+ END_OF_DEF
+ }
+
+
+ =head3 test_via_harness
+
+ my $command = $mm->test_via_harness($perl, $tests);
+
+ Returns a $command line which runs the given set of $tests with
+ Test::Harness and the given $perl.
+
+ Used on the t/*.t files.
+
+ =cut
+
+ sub test_via_harness {
+ my($self, $perl, $tests) = @_;
+
+ return qq{\t$perl "-MExtUtils::Command::MM" "-MTest::Harness" }.
+ qq{"-e" "undef *Test::Harness::Switches; test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
+ }
+
+ =head3 test_via_script
+
+ my $command = $mm->test_via_script($perl, $script);
+
+ Returns a $command line which just runs a single test without
+ Test::Harness. No checks are done on the results, they're just
+ printed.
+
+ Used for test.pl, since they don't always follow Test::Harness
+ formatting.
+
+ =cut
+
+ sub test_via_script {
+ my($self, $perl, $script) = @_;
+ return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
+ }
+
+
+ =head3 tool_autosplit
+
+ Defines a simple perl call that runs autosplit. May be deprecated by
+ pm_to_blib soon.
+
+ =cut
+
+ sub tool_autosplit {
+ my($self, %attribs) = @_;
+
+ my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
+ : '';
+
+ my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
+ use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
+ PERL_CODE
+
+ return sprintf <<'MAKE_FRAG', $asplit;
+ # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
+ AUTOSPLITFILE = %s
+
+ MAKE_FRAG
+
+ }
+
+
+ =head3 arch_check
+
+ my $arch_ok = $mm->arch_check(
+ $INC{"Config.pm"},
+ File::Spec->catfile($Config{archlibexp}, "Config.pm")
+ );
+
+ A sanity check that what Perl thinks the architecture is and what
+ Config thinks the architecture is are the same. If they're not it
+ will return false and show a diagnostic message.
+
+ When building Perl it will always return true, as nothing is installed
+ yet.
+
+ The interface is a bit odd because this is the result of a
+ quick refactoring. Don't rely on it.
+
+ =cut
+
+ sub arch_check {
+ my $self = shift;
+ my($pconfig, $cconfig) = @_;
+
+ return 1 if $self->{PERL_SRC};
+
+ my($pvol, $pthinks) = $self->splitpath($pconfig);
+ my($cvol, $cthinks) = $self->splitpath($cconfig);
+
+ $pthinks = $self->canonpath($pthinks);
+ $cthinks = $self->canonpath($cthinks);
+
+ my $ret = 1;
+ if ($pthinks ne $cthinks) {
+ print "Have $pthinks\n";
+ print "Want $cthinks\n";
+
+ $ret = 0;
+
+ my $arch = (grep length, $self->splitdir($pthinks))[-1];
+
+ print <<END unless $self->{UNINSTALLED_PERL};
+ Your perl and your Config.pm seem to have different ideas about the
+ architecture they are running on.
+ Perl thinks: [$arch]
+ Config says: [$Config{archname}]
+ This may or may not cause problems. Please check your installation of perl
+ if you have problems building this extension.
+ END
+ }
+
+ return $ret;
+ }
+
+
+
+ =head2 File::Spec wrappers
+
+ ExtUtils::MM_Any is a subclass of File::Spec. The methods noted here
+ override File::Spec.
+
+
+
+ =head3 catfile
+
+ File::Spec <= 0.83 has a bug where the file part of catfile is not
+ canonicalized. This override fixes that bug.
+
+ =cut
+
+ sub catfile {
+ my $self = shift;
+ return $self->canonpath($self->SUPER::catfile(@_));
+ }
+
+
+
+ =head2 Misc
+
+ Methods I can't really figure out where they should go yet.
+
+
+ =head3 find_tests
+
+ my $test = $mm->find_tests;
+
+ Returns a string suitable for feeding to the shell to return all
+ tests in t/*.t.
+
+ =cut
+
+ sub find_tests {
+ my($self) = shift;
+ return -d 't' ? 't/*.t' : '';
+ }
+
+ =head3 find_tests_recursive
+
+ my $tests = $mm->find_tests_recursive;
+
+ Returns a string suitable for feeding to the shell to return all
+ tests in t/ but recursively.
+
+ =cut
+
+ sub find_tests_recursive {
+ my($self) = shift;
+ return '' unless -d 't';
+
+ require File::Find;
+
+ my %testfiles;
+
+ my $wanted = sub {
+ return unless m!\.t$!;
+ my ($volume,$directories,$file) =
+ File::Spec->splitpath( $File::Find::name );
+ my @dirs = File::Spec->splitdir( $directories );
+ for ( @dirs ) {
+ next if $_ eq 't';
+ unless ( $_ ) {
+ $_ = '*.t';
+ next;
+ }
+ $_ = '*';
+ }
+ my $testfile = join '/', @dirs;
+ $testfiles{ $testfile } = 1;
+ };
+
+ File::Find::find( $wanted, 't' );
+
+ return join ' ', sort keys %testfiles;
+ }
+
+ =head3 extra_clean_files
+
+ my @files_to_clean = $MM->extra_clean_files;
+
+ Returns a list of OS specific files to be removed in the clean target in
+ addition to the usual set.
+
+ =cut
+
+ # An empty method here tickled a perl 5.8.1 bug and would return its object.
+ sub extra_clean_files {
+ return;
+ }
+
+
+ =head3 installvars
+
+ my @installvars = $mm->installvars;
+
+ A list of all the INSTALL* variables without the INSTALL prefix. Useful
+ for iteration or building related variable sets.
+
+ =cut
+
+ sub installvars {
+ return qw(PRIVLIB SITELIB VENDORLIB
+ ARCHLIB SITEARCH VENDORARCH
+ BIN SITEBIN VENDORBIN
+ SCRIPT SITESCRIPT VENDORSCRIPT
+ MAN1DIR SITEMAN1DIR VENDORMAN1DIR
+ MAN3DIR SITEMAN3DIR VENDORMAN3DIR
+ );
+ }
+
+
+ =head3 libscan
+
+ my $wanted = $self->libscan($path);
+
+ Takes a path to a file or dir and returns an empty string if we don't
+ want to include this file in the library. Otherwise it returns the
+ the $path unchanged.
+
+ Mainly used to exclude version control administrative directories from
+ installation.
+
+ =cut
+
+ sub libscan {
+ my($self,$path) = @_;
+ my($dirs,$file) = ($self->splitpath($path))[1,2];
+ return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/,
+ $self->splitdir($dirs), $file;
+
+ return $path;
+ }
+
+
+ =head3 platform_constants
+
+ my $make_frag = $mm->platform_constants
+
+ Returns a make fragment defining all the macros initialized in
+ init_platform() rather than put them in constants().
+
+ =cut
+
+ sub platform_constants {
+ return '';
+ }
+
+ =head3 post_constants (o)
+
+ Returns an empty string per default. Dedicated to overrides from
+ within Makefile.PL after all constants have been defined.
+
+ =cut
+
+ sub post_constants {
+ "";
+ }
+
+ =head3 post_initialize (o)
+
+ Returns an empty string per default. Used in Makefile.PLs to add some
+ chunk of text to the Makefile after the object is initialized.
+
+ =cut
+
+ sub post_initialize {
+ "";
+ }
+
+ =head3 postamble (o)
+
+ Returns an empty string. Can be used in Makefile.PLs to write some
+ text to the Makefile at the end.
+
+ =cut
+
+ sub postamble {
+ "";
+ }
+
+ =begin private
+
+ =head3 _PREREQ_PRINT
+
+ $self->_PREREQ_PRINT;
+
+ Implements PREREQ_PRINT.
+
+ Refactored out of MakeMaker->new().
+
+ =end private
+
+ =cut
+
+ sub _PREREQ_PRINT {
+ my $self = shift;
+
+ require Data::Dumper;
+ my @what = ('PREREQ_PM');
+ push @what, 'MIN_PERL_VERSION' if $self->{MIN_PERL_VERSION};
+ push @what, 'BUILD_REQUIRES' if $self->{BUILD_REQUIRES};
+ print Data::Dumper->Dump([@{$self}{@what}], \@what);
+ exit 0;
+ }
+
+
+ =begin private
+
+ =head3 _PRINT_PREREQ
+
+ $mm->_PRINT_PREREQ;
+
+ Implements PRINT_PREREQ, a slightly different version of PREREQ_PRINT
+ added by Redhat to, I think, support generating RPMs from Perl modules.
+
+ Should not include BUILD_REQUIRES as RPMs do not include them.
+
+ Refactored out of MakeMaker->new().
+
+ =end private
+
+ =cut
+
+ sub _PRINT_PREREQ {
+ my $self = shift;
+
+ my $prereqs= $self->{PREREQ_PM};
+ my @prereq = map { [$_, $prereqs->{$_}] } keys %$prereqs;
+
+ if ( $self->{MIN_PERL_VERSION} ) {
+ push @prereq, ['perl' => $self->{MIN_PERL_VERSION}];
+ }
+
+ print join(" ", map { "perl($_->[0])>=$_->[1] " }
+ sort { $a->[0] cmp $b->[0] } @prereq), "\n";
+ exit 0;
+ }
+
+
+ =begin private
+
+ =head3 _perl_header_files
+
+ my $perl_header_files= $self->_perl_header_files;
+
+ returns a sorted list of header files as found in PERL_SRC or $archlibexp/CORE.
+
+ Used by perldepend() in MM_Unix and MM_VMS via _perl_header_files_fragment()
+
+ =end private
+
+ =cut
+
+ sub _perl_header_files {
+ my $self = shift;
+
+ my $header_dir = $self->{PERL_SRC} || $ENV{PERL_SRC} || $self->catdir($Config{archlibexp}, 'CORE');
+ opendir my $dh, $header_dir
+ or die "Failed to opendir '$header_dir' to find header files: $!";
+
+ # we need to use a temporary here as the sort in scalar context would have undefined results.
+ my @perl_headers= sort grep { /\.h\z/ } readdir($dh);
+
+ closedir $dh;
+
+ return @perl_headers;
+ }
+
+ =begin private
+
+ =head3 _perl_header_files_fragment ($o, $separator)
+
+ my $perl_header_files_fragment= $self->_perl_header_files_fragment("/");
+
+ return a Makefile fragment which holds the list of perl header files which
+ XS code depends on $(PERL_INC), and sets up the dependency for the $(OBJECT) file.
+
+ The $separator argument defaults to "". MM_VMS will set it to "" and MM_UNIX to "/"
+ in perldepend(). This reason child subclasses need to control this is that in
+ VMS the $(PERL_INC) directory will already have delimiters in it, but in
+ UNIX $(PERL_INC) will need a slash between it an the filename. Hypothetically
+ win32 could use "\\" (but it doesn't need to).
+
+ =end private
+
+ =cut
+
+ sub _perl_header_files_fragment {
+ my ($self, $separator)= @_;
+ $separator ||= "";
+ return join("\\\n",
+ "PERL_HDRS = ",
+ map {
+ sprintf( " \$(PERL_INCDEP)%s%s ", $separator, $_ )
+ } $self->_perl_header_files()
+ ) . "\n\n"
+ . "\$(OBJECT) : \$(PERL_HDRS)\n";
+ }
+
+
+ =head1 AUTHOR
+
+ Michael G Schwern <schwern@pobox.com> and the denizens of
+ makemaker@perl.org with code from ExtUtils::MM_Unix and
+ ExtUtils::MM_Win32.
+
+
+ =cut
+
+ 1;
+EXTUTILS_MM_ANY
+
+$fatpacked{"ExtUtils/MM_BeOS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_BEOS';
+ package ExtUtils::MM_BeOS;
+
+ use strict;
+
+ =head1 NAME
+
+ ExtUtils::MM_BeOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MM_BeOS; # Done internally by ExtUtils::MakeMaker if needed
+
+ =head1 DESCRIPTION
+
+ See ExtUtils::MM_Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ =over 4
+
+ =cut
+
+ use ExtUtils::MakeMaker::Config;
+ use File::Spec;
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+
+ our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+
+ =item os_flavor
+
+ BeOS is BeOS.
+
+ =cut
+
+ sub os_flavor {
+ return('BeOS');
+ }
+
+ =item init_linker
+
+ libperl.a equivalent to be linked to dynamic extensions.
+
+ =cut
+
+ sub init_linker {
+ my($self) = shift;
+
+ $self->{PERL_ARCHIVE} ||=
+ File::Spec->catdir('$(PERL_INC)',$Config{libperl});
+ $self->{PERL_ARCHIVEDEP} ||= '';
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+ }
+
+ =back
+
+ 1;
+ __END__
+
+EXTUTILS_MM_BEOS
+
+$fatpacked{"ExtUtils/MM_Cygwin.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_CYGWIN';
+ package ExtUtils::MM_Cygwin;
+
+ use strict;
+
+ use ExtUtils::MakeMaker::Config;
+ use File::Spec;
+
+ require ExtUtils::MM_Unix;
+ require ExtUtils::MM_Win32;
+ our @ISA = qw( ExtUtils::MM_Unix );
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+
+ =head1 NAME
+
+ ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
+
+ =head1 DESCRIPTION
+
+ See ExtUtils::MM_Unix for a documentation of the methods provided there.
+
+ =over 4
+
+ =item os_flavor
+
+ We're Unix and Cygwin.
+
+ =cut
+
+ sub os_flavor {
+ return('Unix', 'Cygwin');
+ }
+
+ =item cflags
+
+ if configured for dynamic loading, triggers #define EXT in EXTERN.h
+
+ =cut
+
+ sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ return '' unless $self->needs_linking();
+
+ my $base = $self->SUPER::cflags($libperl);
+ foreach (split /\n/, $base) {
+ /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
+ };
+ $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
+
+ return $self->{CFLAGS} = qq{
+ CCFLAGS = $self->{CCFLAGS}
+ OPTIMIZE = $self->{OPTIMIZE}
+ PERLTYPE = $self->{PERLTYPE}
+ };
+
+ }
+
+
+ =item replace_manpage_separator
+
+ replaces strings '::' with '.' in MAN*POD man page names
+
+ =cut
+
+ sub replace_manpage_separator {
+ my($self, $man) = @_;
+ $man =~ s{/+}{.}g;
+ return $man;
+ }
+
+ =item init_linker
+
+ points to libperl.a
+
+ =cut
+
+ sub init_linker {
+ my $self = shift;
+
+ if ($Config{useshrplib} eq 'true') {
+ my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
+ if( $] >= 5.006002 ) {
+ $libperl =~ s/a$/dll.a/;
+ }
+ $self->{PERL_ARCHIVE} = $libperl;
+ } else {
+ $self->{PERL_ARCHIVE} =
+ '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
+ }
+
+ $self->{PERL_ARCHIVEDEP} ||= '';
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+ }
+
+ =item maybe_command
+
+ Determine whether a file is native to Cygwin by checking whether it
+ resides inside the Cygwin installation (using Windows paths). If so,
+ use C<ExtUtils::MM_Unix> to determine if it may be a command.
+ Otherwise use the tests from C<ExtUtils::MM_Win32>.
+
+ =cut
+
+ sub maybe_command {
+ my ($self, $file) = @_;
+
+ my $cygpath = Cygwin::posix_to_win_path('/', 1);
+ my $filepath = Cygwin::posix_to_win_path($file, 1);
+
+ return (substr($filepath,0,length($cygpath)) eq $cygpath)
+ ? $self->SUPER::maybe_command($file) # Unix
+ : ExtUtils::MM_Win32->maybe_command($file); # Win32
+ }
+
+ =item dynamic_lib
+
+ Use the default to produce the *.dll's.
+ But for new archdir dll's use the same rebase address if the old exists.
+
+ =cut
+
+ sub dynamic_lib {
+ my($self, %attribs) = @_;
+ my $s = ExtUtils::MM_Unix::dynamic_lib($self, %attribs);
+ return '' unless $s;
+ return $s unless %{$self->{XS}};
+
+ # do an ephemeral rebase so the new DLL fits to the current rebase map
+ $s .= "\t/bin/find \$\(INST_ARCHLIB\)/auto -xdev -name \\*.$self->{DLEXT} | /bin/rebase -sOT -" if (( $Config{myarchname} eq 'i686-cygwin' ) and not ( exists $ENV{CYGPORT_PACKAGE_VERSION} ));
+ $s;
+ }
+
+ =item install
+
+ Rebase dll's with the global rebase database after installation.
+
+ =cut
+
+ sub install {
+ my($self, %attribs) = @_;
+ my $s = ExtUtils::MM_Unix::install($self, %attribs);
+ return '' unless $s;
+ return $s unless %{$self->{XS}};
+
+ my $INSTALLDIRS = $self->{INSTALLDIRS};
+ my $INSTALLLIB = $self->{"INSTALL". ($INSTALLDIRS eq 'perl' ? 'ARCHLIB' : uc($INSTALLDIRS)."ARCH")};
+ my $dop = "\$\(DESTDIR\)$INSTALLLIB/auto/";
+ my $dll = "$dop/$self->{FULLEXT}/$self->{BASEEXT}.$self->{DLEXT}";
+ $s =~ s|^(pure_install :: pure_\$\(INSTALLDIRS\)_install\n\t)\$\(NOECHO\) \$\(NOOP\)\n|$1\$(CHMOD) \$(PERM_RWX) $dll\n\t/bin/find $dop -xdev -name \\*.$self->{DLEXT} \| /bin/rebase -sOT -\n|m if (( $Config{myarchname} eq 'i686-cygwin') and not ( exists $ENV{CYGPORT_PACKAGE_VERSION} ));
+ $s;
+ }
+
+ =item all_target
+
+ Build man pages, too
+
+ =cut
+
+ sub all_target {
+ ExtUtils::MM_Unix::all_target(shift);
+ }
+
+ =back
+
+ =cut
+
+ 1;
+EXTUTILS_MM_CYGWIN
+
+$fatpacked{"ExtUtils/MM_DOS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_DOS';
+ package ExtUtils::MM_DOS;
+
+ use strict;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+ our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+
+ =head1 NAME
+
+ ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
+
+ =head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+ =head1 DESCRIPTION
+
+ This is a subclass of ExtUtils::MM_Unix which contains functionality
+ for DOS.
+
+ Unless otherwise stated, it works just like ExtUtils::MM_Unix
+
+ =head2 Overridden methods
+
+ =over 4
+
+ =item os_flavor
+
+ =cut
+
+ sub os_flavor {
+ return('DOS');
+ }
+
+ =item B<replace_manpage_separator>
+
+ Generates Foo__Bar.3 style man page names
+
+ =cut
+
+ sub replace_manpage_separator {
+ my($self, $man) = @_;
+
+ $man =~ s,/+,__,g;
+ return $man;
+ }
+
+ =back
+
+ =head1 AUTHOR
+
+ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MM_Unix>, L<ExtUtils::MakeMaker>
+
+ =cut
+
+ 1;
+EXTUTILS_MM_DOS
+
+$fatpacked{"ExtUtils/MM_Darwin.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_DARWIN';
+ package ExtUtils::MM_Darwin;
+
+ use strict;
+
+ BEGIN {
+ require ExtUtils::MM_Unix;
+ our @ISA = qw( ExtUtils::MM_Unix );
+ }
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+
+ =head1 NAME
+
+ ExtUtils::MM_Darwin - special behaviors for OS X
+
+ =head1 SYNOPSIS
+
+ For internal MakeMaker use only
+
+ =head1 DESCRIPTION
+
+ See L<ExtUtils::MM_Unix> for L<ExtUtils::MM_Any> for documentation on the
+ methods overridden here.
+
+ =head2 Overriden Methods
+
+ =head3 init_dist
+
+ Turn off Apple tar's tendency to copy resource forks as "._foo" files.
+
+ =cut
+
+ sub init_dist {
+ my $self = shift;
+
+ # Thank you, Apple, for breaking tar and then breaking the work around.
+ # 10.4 wants COPY_EXTENDED_ATTRIBUTES_DISABLE while 10.5 wants
+ # COPYFILE_DISABLE. I'm not going to push my luck and instead just
+ # set both.
+ $self->{TAR} ||=
+ 'COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 tar';
+
+ $self->SUPER::init_dist(@_);
+ }
+
+ 1;
+EXTUTILS_MM_DARWIN
+
+$fatpacked{"ExtUtils/MM_MacOS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_MACOS';
+ package ExtUtils::MM_MacOS;
+
+ use strict;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ sub new {
+ die 'MacOS Classic (MacPerl) is no longer supported by MakeMaker';
+ }
+
+ =head1 NAME
+
+ ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
+
+ =head1 SYNOPSIS
+
+ # MM_MacOS no longer contains any code. This is just a stub.
+
+ =head1 DESCRIPTION
+
+ Once upon a time, MakeMaker could produce an approximation of a correct
+ Makefile on MacOS Classic (MacPerl). Due to a lack of maintainers, this
+ fell out of sync with the rest of MakeMaker and hadn't worked in years.
+ Since there's little chance of it being repaired, MacOS Classic is fading
+ away, and the code was icky to begin with, the code has been deleted to
+ make maintenance easier.
+
+ Anyone interested in resurrecting this file should pull the old version
+ from the MakeMaker CVS repository and contact makemaker@perl.org.
+
+ =cut
+
+ 1;
+EXTUTILS_MM_MACOS
+
+$fatpacked{"ExtUtils/MM_NW5.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_NW5';
+ package ExtUtils::MM_NW5;
+
+ =head1 NAME
+
+ ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
+
+ =head1 DESCRIPTION
+
+ See ExtUtils::MM_Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ =over
+
+ =cut
+
+ use strict;
+ use ExtUtils::MakeMaker::Config;
+ use File::Basename;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Win32;
+ our @ISA = qw(ExtUtils::MM_Win32);
+
+ use ExtUtils::MakeMaker qw(&neatvalue &_sprintf562);
+
+ $ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+ my $BORLAND = $Config{'cc'} =~ /\bbcc/i;
+ my $GCC = $Config{'cc'} =~ /\bgcc/i;
+
+
+ =item os_flavor
+
+ We're Netware in addition to being Windows.
+
+ =cut
+
+ sub os_flavor {
+ my $self = shift;
+ return ($self->SUPER::os_flavor, 'Netware');
+ }
+
+ =item init_platform
+
+ Add Netware macros.
+
+ LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH, BOOT_SYMBOL,
+ NLM_SHORT_NAME, INCLUDE, PATH, MM_NW5_REVISION
+
+
+ =item platform_constants
+
+ Add Netware macros initialized above to the Makefile.
+
+ =cut
+
+ sub init_platform {
+ my($self) = shift;
+
+ # To get Win32's setup.
+ $self->SUPER::init_platform;
+
+ # incpath is copied to makefile var INCLUDE in constants sub, here just
+ # make it empty
+ my $libpth = $Config{'libpth'};
+ $libpth =~ s( )(;);
+ $self->{'LIBPTH'} = $libpth;
+
+ $self->{'BASE_IMPORT'} = $Config{'base_import'};
+
+ # Additional import file specified from Makefile.pl
+ if($self->{'base_import'}) {
+ $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
+ }
+
+ $self->{'NLM_VERSION'} = $Config{'nlm_version'};
+ $self->{'MPKTOOL'} = $Config{'mpktool'};
+ $self->{'TOOLPATH'} = $Config{'toolpath'};
+
+ (my $boot = $self->{'NAME'}) =~ s/:/_/g;
+ $self->{'BOOT_SYMBOL'}=$boot;
+
+ # If the final binary name is greater than 8 chars,
+ # truncate it here.
+ if(length($self->{'BASEEXT'}) > 8) {
+ $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
+ }
+
+ # Get the include path and replace the spaces with ;
+ # Copy this to makefile as INCLUDE = d:\...;d:\;
+ ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
+
+ # Set the path to CodeWarrior binaries which might not have been set in
+ # any other place
+ $self->{PATH} = '$(PATH);$(TOOLPATH)';
+
+ $self->{MM_NW5_VERSION} = $VERSION;
+ }
+
+ sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ # Setup Win32's constants.
+ $make_frag .= $self->SUPER::platform_constants;
+
+ foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL
+ TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH
+ MM_NW5_VERSION
+ ))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+ }
+
+ =item static_lib_pure_cmd
+
+ Defines how to run the archive utility
+
+ =cut
+
+ sub static_lib_pure_cmd {
+ my ($self, $src) = @_;
+ $src =~ s/(\$\(\w+)(\))/$1:^"+"$2/g if $BORLAND;
+ sprintf qq{\t\$(AR) %s\n}, ($BORLAND ? '$@ ' . $src
+ : ($GCC ? '-ru $@ ' . $src
+ : '-type library -o $@ ' . $src));
+ }
+
+ =item dynamic_lib
+
+ Override of utility methods for OS-specific work.
+
+ =cut
+
+ sub xs_make_dynamic_lib {
+ my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_;
+ my @m;
+ # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
+ if ($to =~ /^\$/) {
+ if ($self->{NLM_SHORT_NAME}) {
+ # deal with shortnames
+ my $newto = q{$(INST_AUTODIR)\\$(NLM_SHORT_NAME).$(DLEXT)};
+ push @m, "$to: $newto\n\n";
+ $to = $newto;
+ }
+ } else {
+ my ($v, $d, $f) = File::Spec->splitpath($to);
+ # relies on $f having a literal "." in it, unlike for $(OBJ_EXT)
+ if ($f =~ /[^\.]{9}\./) {
+ # 9+ chars before '.', need to shorten
+ $f = substr $f, 0, 8;
+ }
+ my $newto = File::Spec->catpath($v, $d, $f);
+ push @m, "$to: $newto\n\n";
+ $to = $newto;
+ }
+ # bits below should be in dlsyms, not here
+ # 1 2 3 4
+ push @m, _sprintf562 <<'MAKE_FRAG', $to, $from, $todir, $exportlist;
+ # Create xdc data for an MT safe NLM in case of mpk build
+ %1$s: %2$s $(MYEXTLIB) $(BOOTSTRAP) %3$s$(DFSEP).exists
+ $(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > %4$s
+ $(NOECHO) $(ECHO) $(BASE_IMPORT) >> %4$s
+ $(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> %4$s
+ MAKE_FRAG
+ if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
+ (my $xdc = $exportlist) =~ s#def\z#xdc#;
+ $xdc = '$(BASEEXT).xdc';
+ push @m, sprintf <<'MAKE_FRAG', $xdc, $exportlist;
+ $(MPKTOOL) $(XDCFLAGS) %s
+ $(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> %s
+ MAKE_FRAG
+ }
+ # Reconstruct the X.Y.Z version.
+ my $version = join '.', map { sprintf "%d", $_ }
+ $] =~ /(\d)\.(\d{3})(\d{2})/;
+ push @m, sprintf <<'EOF', $from, $version, $to, $exportlist;
+ $(LD) $(LDFLAGS) %s -desc "Perl %s Extension ($(BASEEXT)) XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION) -o %s $(MYEXTLIB) $(PERL_INC)\Main.lib -commandfile %s
+ $(CHMOD) 755 $@
+ EOF
+ join '', @m;
+ }
+
+ 1;
+ __END__
+
+ =back
+
+ =cut
+EXTUTILS_MM_NW5
+
+$fatpacked{"ExtUtils/MM_OS2.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_OS2';
+ package ExtUtils::MM_OS2;
+
+ use strict;
+
+ use ExtUtils::MakeMaker qw(neatvalue);
+ use File::Spec;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+ our @ISA = qw(ExtUtils::MM_Any ExtUtils::MM_Unix);
+
+ =pod
+
+ =head1 NAME
+
+ ExtUtils::MM_OS2 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MM_OS2; # Done internally by ExtUtils::MakeMaker if needed
+
+ =head1 DESCRIPTION
+
+ See ExtUtils::MM_Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ =head1 METHODS
+
+ =over 4
+
+ =item init_dist
+
+ Define TO_UNIX to convert OS2 linefeeds to Unix style.
+
+ =cut
+
+ sub init_dist {
+ my($self) = @_;
+
+ $self->{TO_UNIX} ||= <<'MAKE_TEXT';
+ $(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip
+ MAKE_TEXT
+
+ $self->SUPER::init_dist;
+ }
+
+ sub dlsyms {
+ my($self,%attribs) = @_;
+ if ($self->{IMPORTS} && %{$self->{IMPORTS}}) {
+ # Make import files (needed for static build)
+ -d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp";
+ open my $imp, '>', 'tmpimp.imp' or die "Can't open tmpimp.imp";
+ while (my($name, $exp) = each %{$self->{IMPORTS}}) {
+ my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'";
+ print $imp "$name $lib $id ?\n";
+ }
+ close $imp or die "Can't close tmpimp.imp";
+ # print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n";
+ system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp"
+ and die "Cannot make import library: $!, \$?=$?";
+ # May be running under miniperl, so have no glob...
+ eval { unlink <tmp_imp/*>; 1 } or system "rm tmp_imp/*";
+ system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}"
+ and die "Cannot extract import objects: $!, \$?=$?";
+ }
+ return '' if $self->{SKIPHASH}{'dynamic'};
+ $self->xs_dlsyms_iterator(\%attribs);
+ }
+
+ sub xs_dlsyms_ext {
+ '.def';
+ }
+
+ sub xs_dlsyms_extra {
+ join '', map { qq{, "$_" => "\$($_)"} } qw(VERSION DISTNAME INSTALLDIRS);
+ }
+
+ sub static_lib_pure_cmd {
+ my($self) = @_;
+ my $old = $self->SUPER::static_lib_pure_cmd;
+ return $old unless $self->{IMPORTS} && %{$self->{IMPORTS}};
+ $old . <<'EOC';
+ $(AR) $(AR_STATIC_ARGS) "$@" tmp_imp/*
+ $(RANLIB) "$@"
+ EOC
+ }
+
+ sub replace_manpage_separator {
+ my($self,$man) = @_;
+ $man =~ s,/+,.,g;
+ $man;
+ }
+
+ sub maybe_command {
+ my($self,$file) = @_;
+ $file =~ s,[/\\]+,/,g;
+ return $file if -x $file && ! -d _;
+ return "$file.exe" if -x "$file.exe" && ! -d _;
+ return "$file.cmd" if -x "$file.cmd" && ! -d _;
+ return;
+ }
+
+ =item init_linker
+
+ =cut
+
+ sub init_linker {
+ my $self = shift;
+
+ $self->{PERL_ARCHIVE} = "\$(PERL_INC)/libperl\$(LIB_EXT)";
+
+ $self->{PERL_ARCHIVEDEP} ||= '';
+ $self->{PERL_ARCHIVE_AFTER} = $OS2::is_aout
+ ? ''
+ : '$(PERL_INC)/libperl_override$(LIB_EXT)';
+ $self->{EXPORT_LIST} = '$(BASEEXT).def';
+ }
+
+ =item os_flavor
+
+ OS/2 is OS/2
+
+ =cut
+
+ sub os_flavor {
+ return('OS/2');
+ }
+
+ =back
+
+ =cut
+
+ 1;
+EXTUTILS_MM_OS2
+
+$fatpacked{"ExtUtils/MM_QNX.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_QNX';
+ package ExtUtils::MM_QNX;
+
+ use strict;
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Unix;
+ our @ISA = qw(ExtUtils::MM_Unix);
+
+
+ =head1 NAME
+
+ ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
+
+ =head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+ =head1 DESCRIPTION
+
+ This is a subclass of ExtUtils::MM_Unix which contains functionality for
+ QNX.
+
+ Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+ =head2 Overridden methods
+
+ =head3 extra_clean_files
+
+ Add .err files corresponding to each .c file.
+
+ =cut
+
+ sub extra_clean_files {
+ my $self = shift;
+
+ my @errfiles = @{$self->{C}};
+ for ( @errfiles ) {
+ s/.c$/.err/;
+ }
+
+ return( @errfiles, 'perlmain.err' );
+ }
+
+
+ =head1 AUTHOR
+
+ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MakeMaker>
+
+ =cut
+
+
+ 1;
+EXTUTILS_MM_QNX
+
+$fatpacked{"ExtUtils/MM_UWIN.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_UWIN';
+ package ExtUtils::MM_UWIN;
+
+ use strict;
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Unix;
+ our @ISA = qw(ExtUtils::MM_Unix);
+
+
+ =head1 NAME
+
+ ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
+
+ =head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+ =head1 DESCRIPTION
+
+ This is a subclass of ExtUtils::MM_Unix which contains functionality for
+ the AT&T U/WIN UNIX on Windows environment.
+
+ Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+ =head2 Overridden methods
+
+ =over 4
+
+ =item os_flavor
+
+ In addition to being Unix, we're U/WIN.
+
+ =cut
+
+ sub os_flavor {
+ return('Unix', 'U/WIN');
+ }
+
+
+ =item B<replace_manpage_separator>
+
+ =cut
+
+ sub replace_manpage_separator {
+ my($self, $man) = @_;
+
+ $man =~ s,/+,.,g;
+ return $man;
+ }
+
+ =back
+
+ =head1 AUTHOR
+
+ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MM_Win32>, L<ExtUtils::MakeMaker>
+
+ =cut
+
+ 1;
+EXTUTILS_MM_UWIN
+
+$fatpacked{"ExtUtils/MM_Unix.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_UNIX';
+ package ExtUtils::MM_Unix;
+
+ require 5.006;
+
+ use strict;
+
+ use Carp;
+ use ExtUtils::MakeMaker::Config;
+ use File::Basename qw(basename dirname);
+ use DirHandle;
+
+ our %Config_Override;
+
+ use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562);
+
+ # If we make $VERSION an our variable parse_version() breaks
+ use vars qw($VERSION);
+ $VERSION = '7.06';
+ $VERSION = eval $VERSION; ## no critic [BuiltinFunctions::ProhibitStringyEval]
+
+ require ExtUtils::MM_Any;
+ our @ISA = qw(ExtUtils::MM_Any);
+
+ my %Is;
+ BEGIN {
+ $Is{OS2} = $^O eq 'os2';
+ $Is{Win32} = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare';
+ $Is{Dos} = $^O eq 'dos';
+ $Is{VMS} = $^O eq 'VMS';
+ $Is{OSF} = $^O eq 'dec_osf';
+ $Is{IRIX} = $^O eq 'irix';
+ $Is{NetBSD} = $^O eq 'netbsd';
+ $Is{Interix} = $^O eq 'interix';
+ $Is{SunOS4} = $^O eq 'sunos';
+ $Is{Solaris} = $^O eq 'solaris';
+ $Is{SunOS} = $Is{SunOS4} || $Is{Solaris};
+ $Is{BSD} = ($^O =~ /^(?:free|net|open)bsd$/ or
+ grep( $^O eq $_, qw(bsdos interix dragonfly) )
+ );
+ $Is{Android} = $^O =~ /android/;
+ }
+
+ BEGIN {
+ if( $Is{VMS} ) {
+ # For things like vmsify()
+ require VMS::Filespec;
+ VMS::Filespec->import;
+ }
+ }
+
+
+ =head1 NAME
+
+ ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ C<require ExtUtils::MM_Unix;>
+
+ =head1 DESCRIPTION
+
+ The methods provided by this package are designed to be used in
+ conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
+ Makefile, it creates one or more objects that inherit their methods
+ from a package C<MM>. MM itself doesn't provide any methods, but it
+ ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
+ specific packages take the responsibility for all the methods provided
+ by MM_Unix. We are trying to reduce the number of the necessary
+ overrides by defining rather primitive operations within
+ ExtUtils::MM_Unix.
+
+ If you are going to write a platform specific MM package, please try
+ to limit the necessary overrides to primitive methods, and if it is not
+ possible to do so, let's work out how to achieve that gain.
+
+ If you are overriding any of these methods in your Makefile.PL (in the
+ MY class), please report that to the makemaker mailing list. We are
+ trying to minimize the necessary method overrides and switch to data
+ driven Makefile.PLs wherever possible. In the long run less methods
+ will be overridable via the MY class.
+
+ =head1 METHODS
+
+ The following description of methods is still under
+ development. Please refer to the code for not suitably documented
+ sections and complain loudly to the makemaker@perl.org mailing list.
+ Better yet, provide a patch.
+
+ Not all of the methods below are overridable in a
+ Makefile.PL. Overridable methods are marked as (o). All methods are
+ overridable by a platform specific MM_*.pm file.
+
+ Cross-platform methods are being moved into MM_Any. If you can't find
+ something that used to be in here, look in MM_Any.
+
+ =cut
+
+ # So we don't have to keep calling the methods over and over again,
+ # we have these globals to cache the values. Faster and shrtr.
+ my $Curdir = __PACKAGE__->curdir;
+ my $Rootdir = __PACKAGE__->rootdir;
+ my $Updir = __PACKAGE__->updir;
+
+
+ =head2 Methods
+
+ =over 4
+
+ =item os_flavor
+
+ Simply says that we're Unix.
+
+ =cut
+
+ sub os_flavor {
+ return('Unix');
+ }
+
+
+ =item c_o (o)
+
+ Defines the suffix rules to compile different flavors of C files to
+ object files.
+
+ =cut
+
+ sub c_o {
+ # --- Translation Sections ---
+
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ my(@m);
+
+ my $command = '$(CCCMD)';
+ my $flags = '$(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE)';
+
+ if (my $cpp = $Config{cpprun}) {
+ my $cpp_cmd = $self->const_cccmd;
+ $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
+ push @m, qq{
+ .c.i:
+ $cpp_cmd $flags \$*.c > \$*.i
+ };
+ }
+
+ push @m, sprintf <<'EOF', $command, $flags, $self->xs_obj_opt('$*.s');
+
+ .c.s :
+ %s -S %s $*.c %s
+ EOF
+
+ my @exts = qw(c cpp cxx cc);
+ push @exts, 'C' if !$Is{OS2} and !$Is{Win32} and !$Is{Dos}; #Case-specific
+ my $oo = $self->xs_obj_opt('$*$(OBJ_EXT)');
+ for my $ext (@exts) {
+ push @m, "\n.$ext\$(OBJ_EXT) :\n\t$command $flags \$*.$ext $oo\n";
+ }
+ return join "", @m;
+ }
+
+
+ =item xs_obj_opt
+
+ Takes the object file as an argument, and returns the portion of compile
+ command-line that will output to the specified object file.
+
+ =cut
+
+ sub xs_obj_opt {
+ my ($self, $output_file) = @_;
+ "-o $output_file";
+ }
+
+
+ =item cflags (o)
+
+ Does very much the same as the cflags script in the perl
+ distribution. It doesn't return the whole compiler command line, but
+ initializes all of its parts. The const_cccmd method then actually
+ returns the definition of the CCCMD macro which uses these parts.
+
+ =cut
+
+ #'
+
+ sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ return '' unless $self->needs_linking();
+
+ my($prog, $uc, $perltype, %cflags);
+ $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
+ $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
+
+ @cflags{qw(cc ccflags optimize shellflags)}
+ = @Config{qw(cc ccflags optimize shellflags)};
+
+ # Perl 5.21.4 adds the (gcc) warning (-Wall ...) and std (-std=c89)
+ # flags to the %Config, and the modules in the core should be built
+ # with the warning flags, but NOT the -std=c89 flags (the latter
+ # would break using any system header files that are strict C99).
+ my @ccextraflags = qw(ccwarnflags);
+ if ($ENV{PERL_CORE}) {
+ for my $x (@ccextraflags) {
+ if (exists $Config{$x}) {
+ $cflags{$x} = $Config{$x};
+ }
+ }
+ }
+
+ my($optdebug) = "";
+
+ $cflags{shellflags} ||= '';
+
+ my(%map) = (
+ D => '-DDEBUGGING',
+ E => '-DEMBED',
+ DE => '-DDEBUGGING -DEMBED',
+ M => '-DEMBED -DMULTIPLICITY',
+ DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
+ );
+
+ if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
+ $uc = uc($1);
+ } else {
+ $uc = ""; # avoid warning
+ }
+ $perltype = $map{$uc} ? $map{$uc} : "";
+
+ if ($uc =~ /^D/) {
+ $optdebug = "-g";
+ }
+
+
+ my($name);
+ ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+ if ($prog = $Config{$name}) {
+ # Expand hints for this extension via the shell
+ print "Processing $name hint:\n" if $Verbose;
+ my(@o)=`cc=\"$cflags{cc}\"
+ ccflags=\"$cflags{ccflags}\"
+ optimize=\"$cflags{optimize}\"
+ perltype=\"$cflags{perltype}\"
+ optdebug=\"$cflags{optdebug}\"
+ eval '$prog'
+ echo cc=\$cc
+ echo ccflags=\$ccflags
+ echo optimize=\$optimize
+ echo perltype=\$perltype
+ echo optdebug=\$optdebug
+ `;
+ foreach my $line (@o){
+ chomp $line;
+ if ($line =~ /(.*?)=\s*(.*)\s*$/){
+ $cflags{$1} = $2;
+ print " $1 = $2\n" if $Verbose;
+ } else {
+ print "Unrecognised result from hint: '$line'\n";
+ }
+ }
+ }
+
+ if ($optdebug) {
+ $cflags{optimize} = $optdebug;
+ }
+
+ for (qw(ccflags optimize perltype)) {
+ $cflags{$_} ||= '';
+ $cflags{$_} =~ s/^\s+//;
+ $cflags{$_} =~ s/\s+/ /g;
+ $cflags{$_} =~ s/\s+$//;
+ $self->{uc $_} ||= $cflags{$_};
+ }
+
+ if ($self->{POLLUTE}) {
+ $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
+ }
+
+ for my $x (@ccextraflags) {
+ next unless exists $cflags{$x};
+ $self->{CCFLAGS} .= $cflags{$x} =~ m!^\s! ? $cflags{$x} : ' ' . $cflags{$x};
+ }
+
+ my $pollute = '';
+ if ($Config{usemymalloc} and not $Config{bincompat5005}
+ and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
+ and $self->{PERL_MALLOC_OK}) {
+ $pollute = '$(PERL_MALLOC_DEF)';
+ }
+
+ return $self->{CFLAGS} = qq{
+ CCFLAGS = $self->{CCFLAGS}
+ OPTIMIZE = $self->{OPTIMIZE}
+ PERLTYPE = $self->{PERLTYPE}
+ MPOLLUTE = $pollute
+ };
+
+ }
+
+
+ =item const_cccmd (o)
+
+ Returns the full compiler call for C programs and stores the
+ definition in CONST_CCCMD.
+
+ =cut
+
+ sub const_cccmd {
+ my($self,$libperl)=@_;
+ return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+ return '' unless $self->needs_linking();
+ return $self->{CONST_CCCMD} =
+ q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+ $(CCFLAGS) $(OPTIMIZE) \\
+ $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
+ $(XS_DEFINE_VERSION)};
+ }
+
+ =item const_config (o)
+
+ Sets SHELL if needed, then defines a couple of constants in the Makefile
+ that are imported from %Config.
+
+ =cut
+
+ sub const_config {
+ # --- Constants Sections ---
+
+ my($self) = shift;
+ my @m = $self->specify_shell(); # Usually returns empty string
+ push @m, <<"END";
+
+ # These definitions are from config.sh (via $INC{'Config.pm'}).
+ # They may have been overridden via Makefile.PL or on the command line.
+ END
+
+ my(%once_only);
+ foreach my $key (@{$self->{CONFIG}}){
+ # SITE*EXP macros are defined in &constants; avoid duplicates here
+ next if $once_only{$key};
+ push @m, uc($key) , ' = ' , $self->{uc $key}, "\n";
+ $once_only{$key} = 1;
+ }
+ join('', @m);
+ }
+
+ =item const_loadlibs (o)
+
+ Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
+ L<ExtUtils::Liblist> for details.
+
+ =cut
+
+ sub const_loadlibs {
+ my($self) = shift;
+ return "" unless $self->needs_linking;
+ my @m;
+ push @m, qq{
+ # $self->{NAME} might depend on some other libraries:
+ # See ExtUtils::Liblist for details
+ #
+ };
+ for my $tmp (qw/
+ EXTRALIBS LDLOADLIBS BSLOADLIBS
+ /) {
+ next unless defined $self->{$tmp};
+ push @m, "$tmp = $self->{$tmp}\n";
+ }
+ # don't set LD_RUN_PATH if empty
+ for my $tmp (qw/
+ LD_RUN_PATH
+ /) {
+ next unless $self->{$tmp};
+ push @m, "$tmp = $self->{$tmp}\n";
+ }
+ return join "", @m;
+ }
+
+ =item constants (o)
+
+ my $make_frag = $mm->constants;
+
+ Prints out macros for lots of constants.
+
+ =cut
+
+ sub constants {
+ my($self) = @_;
+ my @m = ();
+
+ $self->{DFSEP} = '$(DIRFILESEP)'; # alias for internal use
+
+ for my $macro (qw(
+
+ AR_STATIC_ARGS DIRFILESEP DFSEP
+ NAME NAME_SYM
+ VERSION VERSION_MACRO VERSION_SYM DEFINE_VERSION
+ XS_VERSION XS_VERSION_MACRO XS_DEFINE_VERSION
+ INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
+ INST_MAN1DIR INST_MAN3DIR
+ MAN1EXT MAN3EXT
+ INSTALLDIRS INSTALL_BASE DESTDIR PREFIX
+ PERLPREFIX SITEPREFIX VENDORPREFIX
+ ),
+ (map { ("INSTALL".$_,
+ "DESTINSTALL".$_)
+ } $self->installvars),
+ qw(
+ PERL_LIB
+ PERL_ARCHLIB PERL_ARCHLIBDEP
+ LIBPERL_A MYEXTLIB
+ FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE
+ PERLMAINCC PERL_SRC PERL_INC PERL_INCDEP
+ PERL FULLPERL ABSPERL
+ PERLRUN FULLPERLRUN ABSPERLRUN
+ PERLRUNINST FULLPERLRUNINST ABSPERLRUNINST
+ PERL_CORE
+ PERM_DIR PERM_RW PERM_RWX
+
+ ) )
+ {
+ next unless defined $self->{$macro};
+
+ # pathnames can have sharp signs in them; escape them so
+ # make doesn't think it is a comment-start character.
+ $self->{$macro} =~ s/#/\\#/g;
+ $self->{$macro} = $self->quote_dep($self->{$macro})
+ if $ExtUtils::MakeMaker::macro_dep{$macro};
+ push @m, "$macro = $self->{$macro}\n";
+ }
+
+ push @m, qq{
+ MAKEMAKER = $self->{MAKEMAKER}
+ MM_VERSION = $self->{MM_VERSION}
+ MM_REVISION = $self->{MM_REVISION}
+ };
+
+ push @m, q{
+ # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
+ # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
+ # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
+ # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
+ };
+
+ for my $macro (qw/
+ MAKE
+ FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
+ LDFROM LINKTYPE BOOTDEP
+ / )
+ {
+ next unless defined $self->{$macro};
+ push @m, "$macro = $self->{$macro}\n";
+ }
+
+ push @m, "
+ # Handy lists of source code files:
+ XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})."
+ C_FILES = ".$self->wraplist(sort @{$self->{C}})."
+ O_FILES = ".$self->wraplist(sort @{$self->{O_FILES}})."
+ H_FILES = ".$self->wraplist(sort @{$self->{H}})."
+ MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
+ MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
+ ";
+
+
+ push @m, q{
+ # Where is the Config information that we are using/depend on
+ CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_INCDEP)$(DFSEP)config.h
+ } if -e File::Spec->catfile( $self->{PERL_INC}, 'config.h' );
+
+
+ push @m, qq{
+ # Where to build things
+ INST_LIBDIR = $self->{INST_LIBDIR}
+ INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
+
+ INST_AUTODIR = $self->{INST_AUTODIR}
+ INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
+
+ INST_STATIC = $self->{INST_STATIC}
+ INST_DYNAMIC = $self->{INST_DYNAMIC}
+ INST_BOOT = $self->{INST_BOOT}
+ };
+
+ push @m, qq{
+ # Extra linker info
+ EXPORT_LIST = $self->{EXPORT_LIST}
+ PERL_ARCHIVE = $self->{PERL_ARCHIVE}
+ PERL_ARCHIVEDEP = $self->{PERL_ARCHIVEDEP}
+ PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER}
+ };
+
+ push @m, "
+
+ TO_INST_PM = ".$self->wraplist(map $self->quote_dep($_), sort keys %{$self->{PM}})."\n";
+
+ join('',@m);
+ }
+
+
+ =item depend (o)
+
+ Same as macro for the depend attribute.
+
+ =cut
+
+ sub depend {
+ my($self,%attribs) = @_;
+ my(@m,$key,$val);
+ for my $key (sort keys %attribs){
+ my $val = $attribs{$key};
+ next unless defined $key and defined $val;
+ push @m, "$key : $val\n";
+ }
+ join "", @m;
+ }
+
+
+ =item init_DEST
+
+ $mm->init_DEST
+
+ Defines the DESTDIR and DEST* variables paralleling the INSTALL*.
+
+ =cut
+
+ sub init_DEST {
+ my $self = shift;
+
+ # Initialize DESTDIR
+ $self->{DESTDIR} ||= '';
+
+ # Make DEST variables.
+ foreach my $var ($self->installvars) {
+ my $destvar = 'DESTINSTALL'.$var;
+ $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')';
+ }
+ }
+
+
+ =item init_dist
+
+ $mm->init_dist;
+
+ Defines a lot of macros for distribution support.
+
+ macro description default
+
+ TAR tar command to use tar
+ TARFLAGS flags to pass to TAR cvf
+
+ ZIP zip command to use zip
+ ZIPFLAGS flags to pass to ZIP -r
+
+ COMPRESS compression command to gzip --best
+ use for tarfiles
+ SUFFIX suffix to put on .gz
+ compressed files
+
+ SHAR shar command to use shar
+
+ PREOP extra commands to run before
+ making the archive
+ POSTOP extra commands to run after
+ making the archive
+
+ TO_UNIX a command to convert linefeeds
+ to Unix style in your archive
+
+ CI command to checkin your ci -u
+ sources to version control
+ RCS_LABEL command to label your sources rcs -Nv$(VERSION_SYM): -q
+ just after CI is run
+
+ DIST_CP $how argument to manicopy() best
+ when the distdir is created
+
+ DIST_DEFAULT default target to use to tardist
+ create a distribution
+
+ DISTVNAME name of the resulting archive $(DISTNAME)-$(VERSION)
+ (minus suffixes)
+
+ =cut
+
+ sub init_dist {
+ my $self = shift;
+
+ $self->{TAR} ||= 'tar';
+ $self->{TARFLAGS} ||= 'cvf';
+ $self->{ZIP} ||= 'zip';
+ $self->{ZIPFLAGS} ||= '-r';
+ $self->{COMPRESS} ||= 'gzip --best';
+ $self->{SUFFIX} ||= '.gz';
+ $self->{SHAR} ||= 'shar';
+ $self->{PREOP} ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST
+ $self->{POSTOP} ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir
+ $self->{TO_UNIX} ||= '$(NOECHO) $(NOOP)';
+
+ $self->{CI} ||= 'ci -u';
+ $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q';
+ $self->{DIST_CP} ||= 'best';
+ $self->{DIST_DEFAULT} ||= 'tardist';
+
+ ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME};
+ $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION};
+ }
+
+ =item dist (o)
+
+ my $dist_macros = $mm->dist(%overrides);
+
+ Generates a make fragment defining all the macros initialized in
+ init_dist.
+
+ %overrides can be used to override any of the above.
+
+ =cut
+
+ sub dist {
+ my($self, %attribs) = @_;
+
+ my $make = '';
+ if ( $attribs{SUFFIX} && $attribs{SUFFIX} !~ m!^\.! ) {
+ $attribs{SUFFIX} = '.' . $attribs{SUFFIX};
+ }
+ foreach my $key (qw(
+ TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR
+ PREOP POSTOP TO_UNIX
+ CI RCS_LABEL DIST_CP DIST_DEFAULT
+ DISTNAME DISTVNAME
+ ))
+ {
+ my $value = $attribs{$key} || $self->{$key};
+ $make .= "$key = $value\n";
+ }
+
+ return $make;
+ }
+
+ =item dist_basics (o)
+
+ Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
+
+ =cut
+
+ sub dist_basics {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ distclean :: realclean distcheck
+ $(NOECHO) $(NOOP)
+
+ distcheck :
+ $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
+
+ skipcheck :
+ $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
+
+ manifest :
+ $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
+
+ veryclean : realclean
+ $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old
+
+ MAKE_FRAG
+
+ }
+
+ =item dist_ci (o)
+
+ Defines a check in target for RCS.
+
+ =cut
+
+ sub dist_ci {
+ my($self) = shift;
+ return sprintf "ci :\n\t%s\n", $self->oneliner(<<'EOF', [qw(-MExtUtils::Manifest=maniread)]);
+ @all = keys %{ maniread() };
+ print(qq{Executing $(CI) @all\n});
+ system(qq{$(CI) @all}) == 0 or die $!;
+ print(qq{Executing $(RCS_LABEL) ...\n});
+ system(qq{$(RCS_LABEL) @all}) == 0 or die $!;
+ EOF
+ }
+
+ =item dist_core (o)
+
+ my $dist_make_fragment = $MM->dist_core;
+
+ Puts the targets necessary for 'make dist' together into one make
+ fragment.
+
+ =cut
+
+ sub dist_core {
+ my($self) = shift;
+
+ my $make_frag = '';
+ foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile
+ shdist))
+ {
+ my $method = $target.'_target';
+ $make_frag .= "\n";
+ $make_frag .= $self->$method();
+ }
+
+ return $make_frag;
+ }
+
+
+ =item B<dist_target>
+
+ my $make_frag = $MM->dist_target;
+
+ Returns the 'dist' target to make an archive for distribution. This
+ target simply checks to make sure the Makefile is up-to-date and
+ depends on $(DIST_DEFAULT).
+
+ =cut
+
+ sub dist_target {
+ my($self) = shift;
+
+ my $date_check = $self->oneliner(<<'CODE', ['-l']);
+ print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
+ if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
+ CODE
+
+ return sprintf <<'MAKE_FRAG', $date_check;
+ dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
+ $(NOECHO) %s
+ MAKE_FRAG
+ }
+
+ =item B<tardist_target>
+
+ my $make_frag = $MM->tardist_target;
+
+ Returns the 'tardist' target which is simply so 'make tardist' works.
+ The real work is done by the dynamically named tardistfile_target()
+ method, tardist should have that as a dependency.
+
+ =cut
+
+ sub tardist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ tardist : $(DISTVNAME).tar$(SUFFIX)
+ $(NOECHO) $(NOOP)
+ MAKE_FRAG
+ }
+
+ =item B<zipdist_target>
+
+ my $make_frag = $MM->zipdist_target;
+
+ Returns the 'zipdist' target which is simply so 'make zipdist' works.
+ The real work is done by the dynamically named zipdistfile_target()
+ method, zipdist should have that as a dependency.
+
+ =cut
+
+ sub zipdist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ zipdist : $(DISTVNAME).zip
+ $(NOECHO) $(NOOP)
+ MAKE_FRAG
+ }
+
+ =item B<tarfile_target>
+
+ my $make_frag = $MM->tarfile_target;
+
+ The name of this target is the name of the tarball generated by
+ tardist. This target does the actual work of turning the distdir into
+ a tarball.
+
+ =cut
+
+ sub tarfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ $(DISTVNAME).tar$(SUFFIX) : distdir
+ $(PREOP)
+ $(TO_UNIX)
+ $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
+ $(RM_RF) $(DISTVNAME)
+ $(COMPRESS) $(DISTVNAME).tar
+ $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)'
+ $(POSTOP)
+ MAKE_FRAG
+ }
+
+ =item zipfile_target
+
+ my $make_frag = $MM->zipfile_target;
+
+ The name of this target is the name of the zip file generated by
+ zipdist. This target does the actual work of turning the distdir into
+ a zip file.
+
+ =cut
+
+ sub zipfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ $(DISTVNAME).zip : distdir
+ $(PREOP)
+ $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
+ $(RM_RF) $(DISTVNAME)
+ $(NOECHO) $(ECHO) 'Created $(DISTVNAME).zip'
+ $(POSTOP)
+ MAKE_FRAG
+ }
+
+ =item uutardist_target
+
+ my $make_frag = $MM->uutardist_target;
+
+ Converts the tarfile into a uuencoded file
+
+ =cut
+
+ sub uutardist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ uutardist : $(DISTVNAME).tar$(SUFFIX)
+ uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
+ $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)_uu'
+ MAKE_FRAG
+ }
+
+
+ =item shdist_target
+
+ my $make_frag = $MM->shdist_target;
+
+ Converts the distdir into a shell archive.
+
+ =cut
+
+ sub shdist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ shdist : distdir
+ $(PREOP)
+ $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
+ $(RM_RF) $(DISTVNAME)
+ $(NOECHO) $(ECHO) 'Created $(DISTVNAME).shar'
+ $(POSTOP)
+ MAKE_FRAG
+ }
+
+
+ =item dlsyms (o)
+
+ Used by some OS' to define DL_FUNCS and DL_VARS and write the *.exp files.
+
+ Normally just returns an empty string.
+
+ =cut
+
+ sub dlsyms {
+ return '';
+ }
+
+
+ =item dynamic_bs (o)
+
+ Defines targets for bootstrap files.
+
+ =cut
+
+ sub dynamic_bs {
+ my($self, %attribs) = @_;
+ return "\nBOOTSTRAP =\n" unless $self->has_link_code();
+ my @exts;
+ if ($self->{XSMULTI}) {
+ @exts = $self->_xs_list_basenames;
+ } else {
+ @exts = '$(BASEEXT)';
+ }
+ return join "\n",
+ "BOOTSTRAP = @{[map { qq{$_.bs} } @exts]}\n",
+ map { $self->_xs_make_bs($_) } @exts;
+ }
+
+ sub _xs_make_bs {
+ my ($self, $basename) = @_;
+ my ($v, $d, $f) = File::Spec->splitpath($basename);
+ my @d = File::Spec->splitdir($d);
+ shift @d if $self->{XSMULTI} and $d[0] eq 'lib';
+ my $instdir = File::Spec->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+ $instdir = '$(INST_ARCHAUTODIR)' if $basename eq '$(BASEEXT)';
+ my $instfile = File::Spec->catfile($instdir, "$f.bs");
+ my $exists = "$instdir\$(DFSEP).exists"; # match blibdirs_target
+ # 1 2 3
+ return _sprintf562 <<'MAKE_FRAG', $basename, $instfile, $exists;
+ # As Mkbootstrap might not write a file (if none is required)
+ # we use touch to prevent make continually trying to remake it.
+ # The DynaLoader only reads a non-empty file.
+ %1$s.bs : $(FIRST_MAKEFILE) $(BOOTDEP)
+ $(NOECHO) $(ECHO) "Running Mkbootstrap for %1$s ($(BSLOADLIBS))"
+ $(NOECHO) $(PERLRUN) \
+ "-MExtUtils::Mkbootstrap" \
+ -e "Mkbootstrap('%1$s','$(BSLOADLIBS)');"
+ $(NOECHO) $(TOUCH) "%1$s.bs"
+ $(CHMOD) $(PERM_RW) "%1$s.bs"
+
+ %2$s : %1$s.bs %3$s
+ $(NOECHO) $(RM_RF) %2$s
+ - $(CP_NONEMPTY) %1$s.bs %2$s $(PERM_RW)
+ MAKE_FRAG
+ }
+
+ =item dynamic_lib (o)
+
+ Defines how to produce the *.so (or equivalent) files.
+
+ =cut
+
+ sub dynamic_lib {
+ my($self, %attribs) = @_;
+ return '' unless $self->needs_linking(); #might be because of a subdir
+ return '' unless $self->has_link_code;
+ my @m = $self->xs_dynamic_lib_macros(\%attribs);
+ my @libs;
+ if ($self->{XSMULTI}) {
+ my @exts = $self->_xs_list_basenames;
+ for my $ext (@exts) {
+ my ($v, $d, $f) = File::Spec->splitpath($ext);
+ my @d = File::Spec->splitdir($d);
+ shift @d if $d[0] eq 'lib';
+ my $instdir = File::Spec->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+ my $instfile = File::Spec->catfile($instdir, "$f.\$(DLEXT)");
+ my $objfile = $self->_xsbuild_value('xs', $ext, 'OBJECT');
+ $objfile = "$ext\$(OBJ_EXT)" unless defined $objfile;
+ my $ldfrom = $self->_xsbuild_value('xs', $ext, 'LDFROM');
+ $ldfrom = $objfile unless defined $ldfrom;
+ my $exportlist = "$ext.def";
+ push @libs, [ $objfile, $instfile, $instdir, $ldfrom, $exportlist ];
+ }
+ } else {
+ @libs = ([ qw($(OBJECT) $(INST_DYNAMIC) $(INST_ARCHAUTODIR) $(LDFROM) $(EXPORT_LIST)) ]);
+ }
+ push @m, map { $self->xs_make_dynamic_lib(\%attribs, @$_); } @libs;
+
+ return join("\n",@m);
+ }
+
+ =item xs_dynamic_lib_macros
+
+ Defines the macros for the C<dynamic_lib> section.
+
+ =cut
+
+ sub xs_dynamic_lib_macros {
+ my ($self, $attribs) = @_;
+ my $otherldflags = $attribs->{OTHERLDFLAGS} || "";
+ my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || "";
+ my $armaybe = $self->_xs_armaybe($attribs);
+ my $ld_opt = $Is{OS2} ? '$(OPTIMIZE) ' : ''; # Useful on other systems too?
+ my $ld_fix = $Is{OS2} ? '|| ( $(RM_F) $@ && sh -c false )' : '';
+ sprintf <<'EOF', $armaybe, $ld_opt.$otherldflags, $inst_dynamic_dep, $ld_fix;
+ # This section creates the dynamically loadable objects from relevant
+ # objects and possibly $(MYEXTLIB).
+ ARMAYBE = %s
+ OTHERLDFLAGS = %s
+ INST_DYNAMIC_DEP = %s
+ INST_DYNAMIC_FIX = %s
+ EOF
+ }
+
+ sub _xs_armaybe {
+ my ($self, $attribs) = @_;
+ my $armaybe = $attribs->{ARMAYBE} || $self->{ARMAYBE} || ":";
+ $armaybe = 'ar' if ($Is{OSF} and $armaybe eq ':');
+ $armaybe;
+ }
+
+ =item xs_make_dynamic_lib
+
+ Defines the recipes for the C<dynamic_lib> section.
+
+ =cut
+
+ sub xs_make_dynamic_lib {
+ my ($self, $attribs, $object, $to, $todir, $ldfrom, $exportlist) = @_;
+ $exportlist = '' if $exportlist ne '$(EXPORT_LIST)';
+ my $armaybe = $self->_xs_armaybe($attribs);
+ my @m = sprintf '%s : %s $(MYEXTLIB) %s$(DFSEP).exists %s $(PERL_ARCHIVEDEP) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)'."\n", $to, $object, $todir, $exportlist;
+ if ($armaybe ne ':'){
+ $ldfrom = 'tmp$(LIB_EXT)';
+ push(@m," \$(ARMAYBE) cr $ldfrom $object\n");
+ push(@m," \$(RANLIB) $ldfrom\n");
+ }
+ $ldfrom = "-all $ldfrom -none" if $Is{OSF};
+
+ # The IRIX linker doesn't use LD_RUN_PATH
+ my $ldrun = $Is{IRIX} && $self->{LD_RUN_PATH} ?
+ qq{-rpath "$self->{LD_RUN_PATH}"} : '';
+
+ # For example in AIX the shared objects/libraries from previous builds
+ # linger quite a while in the shared dynalinker cache even when nobody
+ # is using them. This is painful if one for instance tries to restart
+ # a failed build because the link command will fail unnecessarily 'cos
+ # the shared object/library is 'busy'.
+ push(@m," \$(RM_F) \$\@\n");
+
+ my $libs = '$(LDLOADLIBS)';
+ if (($Is{NetBSD} || $Is{Interix} || $Is{Android}) && $Config{'useshrplib'} eq 'true') {
+ # Use nothing on static perl platforms, and to the flags needed
+ # to link against the shared libperl library on shared perl
+ # platforms. We peek at lddlflags to see if we need -Wl,-R
+ # or -R to add paths to the run-time library search path.
+ if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+ $libs .= ' "-L$(PERL_INC)" "-Wl,-R$(INSTALLARCHLIB)/CORE" "-Wl,-R$(PERL_ARCHLIB)/CORE" -lperl';
+ } elsif ($Config{'lddlflags'} =~ /-R/) {
+ $libs .= ' "-L$(PERL_INC)" "-R$(INSTALLARCHLIB)/CORE" "-R$(PERL_ARCHLIB)/CORE" -lperl';
+ } elsif ( $Is{Android} ) {
+ # The Android linker will not recognize symbols from
+ # libperl unless the module explicitly depends on it.
+ $libs .= ' "-L$(PERL_INC)" -lperl';
+ }
+ }
+
+ my $ld_run_path_shell = "";
+ if ($self->{LD_RUN_PATH} ne "") {
+ $ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" ';
+ }
+
+ push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $self->xs_obj_opt('$@'), $ldfrom, $libs, $exportlist;
+ %s$(LD) %s $(LDDLFLAGS) %s $(OTHERLDFLAGS) %s $(MYEXTLIB) \
+ $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) %s \
+ $(INST_DYNAMIC_FIX)
+ $(CHMOD) $(PERM_RWX) $@
+ MAKE
+ join '', @m;
+ }
+
+ =item exescan
+
+ Deprecated method. Use libscan instead.
+
+ =cut
+
+ sub exescan {
+ my($self,$path) = @_;
+ $path;
+ }
+
+ =item extliblist
+
+ Called by init_others, and calls ext ExtUtils::Liblist. See
+ L<ExtUtils::Liblist> for details.
+
+ =cut
+
+ sub extliblist {
+ my($self,$libs) = @_;
+ require ExtUtils::Liblist;
+ $self->ext($libs, $Verbose);
+ }
+
+ =item find_perl
+
+ Finds the executables PERL and FULLPERL
+
+ =cut
+
+ sub find_perl {
+ my($self, $ver, $names, $dirs, $trace) = @_;
+
+ if ($trace >= 2){
+ print "Looking for perl $ver by these names:
+ @$names
+ in these dirs:
+ @$dirs
+ ";
+ }
+
+ my $stderr_duped = 0;
+ local *STDERR_COPY;
+
+ unless ($Is{BSD}) {
+ # >& and lexical filehandles together give 5.6.2 indigestion
+ if( open(STDERR_COPY, '>&STDERR') ) { ## no critic
+ $stderr_duped = 1;
+ }
+ else {
+ warn <<WARNING;
+ find_perl() can't dup STDERR: $!
+ You might see some garbage while we search for Perl
+ WARNING
+ }
+ }
+
+ foreach my $name (@$names){
+ foreach my $dir (@$dirs){
+ next unless defined $dir; # $self->{PERL_SRC} may be undefined
+ my ($abs, $val);
+ if ($self->file_name_is_absolute($name)) { # /foo/bar
+ $abs = $name;
+ } elsif ($self->canonpath($name) eq
+ $self->canonpath(basename($name))) { # foo
+ $abs = File::Spec->catfile($dir, $name);
+ } else { # foo/bar
+ $abs = File::Spec->catfile($Curdir, $name);
+ }
+ print "Checking $abs\n" if ($trace >= 2);
+ next unless $self->maybe_command($abs);
+ print "Executing $abs\n" if ($trace >= 2);
+
+ my $version_check = qq{"$abs" -le "require $ver; print qq{VER_OK}"};
+
+ # To avoid using the unportable 2>&1 to suppress STDERR,
+ # we close it before running the command.
+ # However, thanks to a thread library bug in many BSDs
+ # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 )
+ # we cannot use the fancier more portable way in here
+ # but instead need to use the traditional 2>&1 construct.
+ if ($Is{BSD}) {
+ $val = `$version_check 2>&1`;
+ } else {
+ close STDERR if $stderr_duped;
+ $val = `$version_check`;
+
+ # 5.6.2's 3-arg open doesn't work with >&
+ open STDERR, ">&STDERR_COPY" ## no critic
+ if $stderr_duped;
+ }
+
+ if ($val =~ /^VER_OK/m) {
+ print "Using PERL=$abs\n" if $trace;
+ return $abs;
+ } elsif ($trace >= 2) {
+ print "Result: '$val' ".($? >> 8)."\n";
+ }
+ }
+ }
+ print "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+ 0; # false and not empty
+ }
+
+
+ =item fixin
+
+ $mm->fixin(@files);
+
+ Inserts the sharpbang or equivalent magic number to a set of @files.
+
+ =cut
+
+ sub fixin { # stolen from the pink Camel book, more or less
+ my ( $self, @files ) = @_;
+
+ for my $file (@files) {
+ my $file_new = "$file.new";
+ my $file_bak = "$file.bak";
+
+ open( my $fixin, '<', $file ) or croak "Can't process '$file': $!";
+ local $/ = "\n";
+ chomp( my $line = <$fixin> );
+ next unless $line =~ s/^\s*\#!\s*//; # Not a shebang file.
+
+ my $shb = $self->_fixin_replace_shebang( $file, $line );
+ next unless defined $shb;
+
+ open( my $fixout, ">", "$file_new" ) or do {
+ warn "Can't create new $file: $!\n";
+ next;
+ };
+
+ # Print out the new #! line (or equivalent).
+ local $\;
+ local $/;
+ print $fixout $shb, <$fixin>;
+ close $fixin;
+ close $fixout;
+
+ chmod 0666, $file_bak;
+ unlink $file_bak;
+ unless ( _rename( $file, $file_bak ) ) {
+ warn "Can't rename $file to $file_bak: $!";
+ next;
+ }
+ unless ( _rename( $file_new, $file ) ) {
+ warn "Can't rename $file_new to $file: $!";
+ unless ( _rename( $file_bak, $file ) ) {
+ warn "Can't rename $file_bak back to $file either: $!";
+ warn "Leaving $file renamed as $file_bak\n";
+ }
+ next;
+ }
+ unlink $file_bak;
+ }
+ continue {
+ system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+ }
+ }
+
+
+ sub _rename {
+ my($old, $new) = @_;
+
+ foreach my $file ($old, $new) {
+ if( $Is{VMS} and basename($file) !~ /\./ ) {
+ # rename() in 5.8.0 on VMS will not rename a file if it
+ # does not contain a dot yet it returns success.
+ $file = "$file.";
+ }
+ }
+
+ return rename($old, $new);
+ }
+
+ sub _fixin_replace_shebang {
+ my ( $self, $file, $line ) = @_;
+
+ # Now figure out the interpreter name.
+ my ( $cmd, $arg ) = split ' ', $line, 2;
+ $cmd =~ s!^.*/!!;
+
+ # Now look (in reverse) for interpreter in absolute PATH (unless perl).
+ my $interpreter;
+ if ( $cmd =~ m{^perl(?:\z|[^a-z])} ) {
+ if ( $Config{startperl} =~ m,^\#!.*/perl, ) {
+ $interpreter = $Config{startperl};
+ $interpreter =~ s,^\#!,,;
+ }
+ else {
+ $interpreter = $Config{perlpath};
+ }
+ }
+ else {
+ my (@absdirs)
+ = reverse grep { $self->file_name_is_absolute($_) } $self->path;
+ $interpreter = '';
+
+ foreach my $dir (@absdirs) {
+ my $maybefile = File::Spec->catfile($dir,$cmd);
+ if ( $self->maybe_command($maybefile) ) {
+ warn "Ignoring $interpreter in $file\n"
+ if $Verbose && $interpreter;
+ $interpreter = $maybefile;
+ }
+ }
+ }
+
+ # Figure out how to invoke interpreter on this machine.
+
+ my ($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
+ my ($shb) = "";
+ if ($interpreter) {
+ print "Changing sharpbang in $file to $interpreter"
+ if $Verbose;
+ # this is probably value-free on DOSISH platforms
+ if ($does_shbang) {
+ $shb .= "$Config{'sharpbang'}$interpreter";
+ $shb .= ' ' . $arg if defined $arg;
+ $shb .= "\n";
+ }
+ }
+ else {
+ warn "Can't find $cmd in PATH, $file unchanged"
+ if $Verbose;
+ return;
+ }
+ return $shb
+ }
+
+ =item force (o)
+
+ Writes an empty FORCE: target.
+
+ =cut
+
+ sub force {
+ my($self) = shift;
+ '# Phony target to force checking subdirectories.
+ FORCE :
+ $(NOECHO) $(NOOP)
+ ';
+ }
+
+ =item guess_name
+
+ Guess the name of this package by examining the working directory's
+ name. MakeMaker calls this only if the developer has not supplied a
+ NAME attribute.
+
+ =cut
+
+ # ';
+
+ sub guess_name {
+ my($self) = @_;
+ use Cwd 'cwd';
+ my $name = basename(cwd());
+ $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we
+ # strip minus or underline
+ # followed by a float or some such
+ print "Warning: Guessing NAME [$name] from current directory name.\n";
+ $name;
+ }
+
+ =item has_link_code
+
+ Returns true if C, XS, MYEXTLIB or similar objects exist within this
+ object that need a compiler. Does not descend into subdirectories as
+ needs_linking() does.
+
+ =cut
+
+ sub has_link_code {
+ my($self) = shift;
+ return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
+ if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
+ $self->{HAS_LINK_CODE} = 1;
+ return 1;
+ }
+ return $self->{HAS_LINK_CODE} = 0;
+ }
+
+
+ =item init_dirscan
+
+ Scans the directory structure and initializes DIR, XS, XS_FILES,
+ C, C_FILES, O_FILES, H, H_FILES, PL_FILES, EXE_FILES.
+
+ Called by init_main.
+
+ =cut
+
+ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
+ my($self) = @_;
+ my(%dir, %xs, %c, %o, %h, %pl_files, %pm);
+
+ my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t);
+
+ # ignore the distdir
+ $Is{VMS} ? $ignore{"$self->{DISTVNAME}.dir"} = 1
+ : $ignore{$self->{DISTVNAME}} = 1;
+
+ my $distprefix = $Is{VMS} ? qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+\.dir$/i
+ : qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+$/;
+
+ @ignore{map lc, keys %ignore} = values %ignore if $Is{VMS};
+
+ if ( defined $self->{XS} and !defined $self->{C} ) {
+ my @c_files = grep { m/\.c(pp|xx)?\z/i } values %{$self->{XS}};
+ my @o_files = grep { m/(?:.(?:o(?:bj)?)|\$\(OBJ_EXT\))\z/i } values %{$self->{XS}};
+ %c = map { $_ => 1 } @c_files;
+ %o = map { $_ => 1 } @o_files;
+ }
+
+ foreach my $name ($self->lsdir($Curdir)){
+ next if $name =~ /\#/;
+ next if $name =~ $distprefix && -d $name;
+ $name = lc($name) if $Is{VMS};
+ next if $name eq $Curdir or $name eq $Updir or $ignore{$name};
+ next unless $self->libscan($name);
+ if (-d $name){
+ next if -l $name; # We do not support symlinks at all
+ next if $self->{NORECURS};
+ $dir{$name} = $name if (-f File::Spec->catfile($name,"Makefile.PL"));
+ } elsif ($name =~ /\.xs\z/){
+ my($c); ($c = $name) =~ s/\.xs\z/.c/;
+ $xs{$name} = $c;
+ $c{$c} = 1;
+ } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc
+ $c{$name} = 1
+ unless $name =~ m/perlmain\.c/; # See MAP_TARGET
+ } elsif ($name =~ /\.h\z/i){
+ $h{$name} = 1;
+ } elsif ($name =~ /\.PL\z/) {
+ ($pl_files{$name} = $name) =~ s/\.PL\z// ;
+ } elsif (($Is{VMS} || $Is{Dos}) && $name =~ /[._]pl$/i) {
+ # case-insensitive filesystem, one dot per name, so foo.h.PL
+ # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
+ local($/); open(my $pl, '<', $name); my $txt = <$pl>; close $pl;
+ if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
+ ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
+ }
+ else {
+ $pm{$name} = File::Spec->catfile($self->{INST_LIBDIR},$name);
+ }
+ } elsif ($name =~ /\.(p[ml]|pod)\z/){
+ $pm{$name} = File::Spec->catfile($self->{INST_LIBDIR},$name);
+ }
+ }
+
+ $self->{PL_FILES} ||= \%pl_files;
+ $self->{DIR} ||= [sort keys %dir];
+ $self->{XS} ||= \%xs;
+ $self->{C} ||= [sort keys %c];
+ $self->{H} ||= [sort keys %h];
+ $self->{PM} ||= \%pm;
+
+ my @o_files = @{$self->{C}};
+ %o = (%o, map { $_ => 1 } grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files);
+ $self->{O_FILES} = [sort keys %o];
+ }
+
+
+ =item init_MANPODS
+
+ Determines if man pages should be generated and initializes MAN1PODS
+ and MAN3PODS as appropriate.
+
+ =cut
+
+ sub init_MANPODS {
+ my $self = shift;
+
+ # Set up names of manual pages to generate from pods
+ foreach my $man (qw(MAN1 MAN3)) {
+ if ( $self->{"${man}PODS"}
+ or $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/
+ ) {
+ $self->{"${man}PODS"} ||= {};
+ }
+ else {
+ my $init_method = "init_${man}PODS";
+ $self->$init_method();
+ }
+ }
+ }
+
+
+ sub _has_pod {
+ my($self, $file) = @_;
+
+ my($ispod)=0;
+ if (open( my $fh, '<', $file )) {
+ while (<$fh>) {
+ if (/^=(?:head\d+|item|pod)\b/) {
+ $ispod=1;
+ last;
+ }
+ }
+ close $fh;
+ } else {
+ # If it doesn't exist yet, we assume, it has pods in it
+ $ispod = 1;
+ }
+
+ return $ispod;
+ }
+
+
+ =item init_MAN1PODS
+
+ Initializes MAN1PODS from the list of EXE_FILES.
+
+ =cut
+
+ sub init_MAN1PODS {
+ my($self) = @_;
+
+ if ( exists $self->{EXE_FILES} ) {
+ foreach my $name (@{$self->{EXE_FILES}}) {
+ next unless $self->_has_pod($name);
+
+ $self->{MAN1PODS}->{$name} =
+ File::Spec->catfile("\$(INST_MAN1DIR)",
+ basename($name).".\$(MAN1EXT)");
+ }
+ }
+ }
+
+
+ =item init_MAN3PODS
+
+ Initializes MAN3PODS from the list of PM files.
+
+ =cut
+
+ sub init_MAN3PODS {
+ my $self = shift;
+
+ my %manifypods = (); # we collect the keys first, i.e. the files
+ # we have to convert to pod
+
+ foreach my $name (keys %{$self->{PM}}) {
+ if ($name =~ /\.pod\z/ ) {
+ $manifypods{$name} = $self->{PM}{$name};
+ } elsif ($name =~ /\.p[ml]\z/ ) {
+ if( $self->_has_pod($name) ) {
+ $manifypods{$name} = $self->{PM}{$name};
+ }
+ }
+ }
+
+ my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}};
+
+ # Remove "Configure.pm" and similar, if it's not the only pod listed
+ # To force inclusion, just name it "Configure.pod", or override
+ # MAN3PODS
+ foreach my $name (keys %manifypods) {
+ if (
+ ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) or
+ ( $name eq 'README.pod') # don't manify top-level README.pod
+ ) {
+ delete $manifypods{$name};
+ next;
+ }
+ my($manpagename) = $name;
+ $manpagename =~ s/\.p(od|m|l)\z//;
+ # everything below lib is ok
+ unless($manpagename =~ s!^\W*($parentlibs_re)\W+!!s) {
+ $manpagename = File::Spec->catfile(
+ split(/::/,$self->{PARENT_NAME}),$manpagename
+ );
+ }
+ $manpagename = $self->replace_manpage_separator($manpagename);
+ $self->{MAN3PODS}->{$name} =
+ File::Spec->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+ }
+ }
+
+
+ =item init_PM
+
+ Initializes PMLIBDIRS and PM from PMLIBDIRS.
+
+ =cut
+
+ sub init_PM {
+ my $self = shift;
+
+ # Some larger extensions often wish to install a number of *.pm/pl
+ # files into the library in various locations.
+
+ # The attribute PMLIBDIRS holds an array reference which lists
+ # subdirectories which we should search for library files to
+ # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
+ # recursively search through the named directories (skipping any
+ # which don't exist or contain Makefile.PL files).
+
+ # For each *.pm or *.pl file found $self->libscan() is called with
+ # the default installation path in $_[1]. The return value of
+ # libscan defines the actual installation location. The default
+ # libscan function simply returns the path. The file is skipped
+ # if libscan returns false.
+
+ # The default installation location passed to libscan in $_[1] is:
+ #
+ # ./*.pm => $(INST_LIBDIR)/*.pm
+ # ./xyz/... => $(INST_LIBDIR)/xyz/...
+ # ./lib/... => $(INST_LIB)/...
+ #
+ # In this way the 'lib' directory is seen as the root of the actual
+ # perl library whereas the others are relative to INST_LIBDIR
+ # (which includes PARENT_NAME). This is a subtle distinction but one
+ # that's important for nested modules.
+
+ unless( $self->{PMLIBDIRS} ) {
+ if( $Is{VMS} ) {
+ # Avoid logical name vs directory collisions
+ $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"];
+ }
+ else {
+ $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}];
+ }
+ }
+
+ #only existing directories that aren't in $dir are allowed
+
+ # Avoid $_ wherever possible:
+ # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
+ my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
+ @{$self->{PMLIBDIRS}} = ();
+ my %dir = map { ($_ => $_) } @{$self->{DIR}};
+ foreach my $pmlibdir (@pmlibdirs) {
+ -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
+ }
+
+ unless( $self->{PMLIBPARENTDIRS} ) {
+ @{$self->{PMLIBPARENTDIRS}} = ('lib');
+ }
+
+ return if $self->{PM} and $self->{ARGS}{PM};
+
+ if (@{$self->{PMLIBDIRS}}){
+ print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
+ if ($Verbose >= 2);
+ require File::Find;
+ File::Find::find(sub {
+ if (-d $_){
+ unless ($self->libscan($_)){
+ $File::Find::prune = 1;
+ }
+ return;
+ }
+ return if /\#/;
+ return if /~$/; # emacs temp files
+ return if /,v$/; # RCS files
+ return if m{\.swp$}; # vim swap files
+
+ my $path = $File::Find::name;
+ my $prefix = $self->{INST_LIBDIR};
+ my $striplibpath;
+
+ my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}};
+ $prefix = $self->{INST_LIB}
+ if ($striplibpath = $path) =~ s{^(\W*)($parentlibs_re)\W}
+ {$1}i;
+
+ my($inst) = File::Spec->catfile($prefix,$striplibpath);
+ local($_) = $inst; # for backwards compatibility
+ $inst = $self->libscan($inst);
+ print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
+ return unless $inst;
+ if ($self->{XSMULTI} and $inst =~ /\.xs\z/) {
+ my($base); ($base = $path) =~ s/\.xs\z//;
+ $self->{XS}{$path} = "$base.c";
+ push @{$self->{C}}, "$base.c";
+ push @{$self->{O_FILES}}, "$base$self->{OBJ_EXT}";
+ } else {
+ $self->{PM}{$path} = $inst;
+ }
+ }, @{$self->{PMLIBDIRS}});
+ }
+ }
+
+
+ =item init_DIRFILESEP
+
+ Using / for Unix. Called by init_main.
+
+ =cut
+
+ sub init_DIRFILESEP {
+ my($self) = shift;
+
+ $self->{DIRFILESEP} = '/';
+ }
+
+
+ =item init_main
+
+ Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE,
+ EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*,
+ INSTALL*, INSTALLDIRS, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME,
+ OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB,
+ PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION,
+ VERSION_SYM, XS_VERSION.
+
+ =cut
+
+ sub init_main {
+ my($self) = @_;
+
+ # --- Initialize Module Name and Paths
+
+ # NAME = Foo::Bar::Oracle
+ # FULLEXT = Foo/Bar/Oracle
+ # BASEEXT = Oracle
+ # PARENT_NAME = Foo::Bar
+ ### Only UNIX:
+ ### ($self->{FULLEXT} =
+ ### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
+ $self->{FULLEXT} = File::Spec->catdir(split /::/, $self->{NAME});
+
+
+ # Copied from DynaLoader:
+
+ my(@modparts) = split(/::/,$self->{NAME});
+ my($modfname) = $modparts[-1];
+
+ # Some systems have restrictions on files names for DLL's etc.
+ # mod2fname returns appropriate file base name (typically truncated)
+ # It may also edit @modparts if required.
+ # We require DynaLoader to make sure that mod2fname is loaded
+ eval { require DynaLoader };
+ if (defined &DynaLoader::mod2fname) {
+ $modfname = &DynaLoader::mod2fname(\@modparts);
+ }
+
+ ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
+ $self->{PARENT_NAME} ||= '';
+
+ if (defined &DynaLoader::mod2fname) {
+ # As of 5.001m, dl_os2 appends '_'
+ $self->{DLBASE} = $modfname;
+ } else {
+ $self->{DLBASE} = '$(BASEEXT)';
+ }
+
+
+ # --- Initialize PERL_LIB, PERL_SRC
+
+ # *Real* information: where did we get these two from? ...
+ my $inc_config_dir = dirname($INC{'Config.pm'});
+ my $inc_carp_dir = dirname($INC{'Carp.pm'});
+
+ unless ($self->{PERL_SRC}){
+ foreach my $dir_count (1..8) { # 8 is the VMS limit for nesting
+ my $dir = File::Spec->catdir(($Updir) x $dir_count);
+
+ if (-f File::Spec->catfile($dir,"config_h.SH") &&
+ -f File::Spec->catfile($dir,"perl.h") &&
+ -f File::Spec->catfile($dir,"lib","strict.pm")
+ ) {
+ $self->{PERL_SRC}=$dir ;
+ last;
+ }
+ }
+ }
+
+ warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if
+ $self->{PERL_CORE} and !$self->{PERL_SRC};
+
+ if ($self->{PERL_SRC}){
+ $self->{PERL_LIB} ||= File::Spec->catdir("$self->{PERL_SRC}","lib");
+
+ $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+ $self->{PERL_INC} = ($Is{Win32}) ?
+ File::Spec->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+
+ # catch a situation that has occurred a few times in the past:
+ unless (
+ -s File::Spec->catfile($self->{PERL_SRC},'cflags')
+ or
+ $Is{VMS}
+ &&
+ -s File::Spec->catfile($self->{PERL_SRC},'vmsish.h')
+ or
+ $Is{Win32}
+ ){
+ warn qq{
+ You cannot build extensions below the perl source tree after executing
+ a 'make clean' in the perl source tree.
+
+ To rebuild extensions distributed with the perl source you should
+ simply Configure (to include those extensions) and then build perl as
+ normal. After installing perl the source tree can be deleted. It is
+ not needed for building extensions by running 'perl Makefile.PL'
+ usually without extra arguments.
+
+ It is recommended that you unpack and build additional extensions away
+ from the perl source tree.
+ };
+ }
+ } else {
+ # we should also consider $ENV{PERL5LIB} here
+ my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
+ $self->{PERL_LIB} ||= $Config{privlibexp};
+ $self->{PERL_ARCHLIB} ||= $Config{archlibexp};
+ $self->{PERL_INC} = File::Spec->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
+ my $perl_h;
+
+ if (not -f ($perl_h = File::Spec->catfile($self->{PERL_INC},"perl.h"))
+ and not $old){
+ # Maybe somebody tries to build an extension with an
+ # uninstalled Perl outside of Perl build tree
+ my $lib;
+ for my $dir (@INC) {
+ $lib = $dir, last if -e File::Spec->catfile($dir, "Config.pm");
+ }
+ if ($lib) {
+ # Win32 puts its header files in /perl/src/lib/CORE.
+ # Unix leaves them in /perl/src.
+ my $inc = $Is{Win32} ? File::Spec->catdir($lib, "CORE" )
+ : dirname $lib;
+ if (-e File::Spec->catfile($inc, "perl.h")) {
+ $self->{PERL_LIB} = $lib;
+ $self->{PERL_ARCHLIB} = $lib;
+ $self->{PERL_INC} = $inc;
+ $self->{UNINSTALLED_PERL} = 1;
+ print <<EOP;
+ ... Detected uninstalled Perl. Trying to continue.
+ EOP
+ }
+ }
+ }
+ }
+
+ if ($Is{Android}) {
+ # Android fun times!
+ # ../../perl -I../../lib -MFile::Glob -e1 works
+ # ../../../perl -I../../../lib -MFile::Glob -e1 fails to find
+ # the .so for File::Glob.
+ # This always affects core perl, but may also affect an installed
+ # perl built with -Duserelocatableinc.
+ $self->{PERL_LIB} = File::Spec->rel2abs($self->{PERL_LIB});
+ $self->{PERL_ARCHLIB} = File::Spec->rel2abs($self->{PERL_ARCHLIB});
+ }
+ $self->{PERL_INCDEP} = $self->{PERL_INC};
+ $self->{PERL_ARCHLIBDEP} = $self->{PERL_ARCHLIB};
+
+ # We get SITELIBEXP and SITEARCHEXP directly via
+ # Get_from_Config. When we are running standard modules, these
+ # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
+ # set it to "site". I prefer that INSTALLDIRS be set from outside
+ # MakeMaker.
+ $self->{INSTALLDIRS} ||= "site";
+
+ $self->{MAN1EXT} ||= $Config{man1ext};
+ $self->{MAN3EXT} ||= $Config{man3ext};
+
+ # Get some stuff out of %Config if we haven't yet done so
+ print "CONFIG must be an array ref\n"
+ if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
+ $self->{CONFIG} = [] unless (ref $self->{CONFIG});
+ push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
+ push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags};
+ my(%once_only);
+ foreach my $m (@{$self->{CONFIG}}){
+ next if $once_only{$m};
+ print "CONFIG key '$m' does not exist in Config.pm\n"
+ unless exists $Config{$m};
+ $self->{uc $m} ||= $Config{$m};
+ $once_only{$m} = 1;
+ }
+
+ # This is too dangerous:
+ # if ($^O eq "next") {
+ # $self->{AR} = "libtool";
+ # $self->{AR_STATIC_ARGS} = "-o";
+ # }
+ # But I leave it as a placeholder
+
+ $self->{AR_STATIC_ARGS} ||= "cr";
+
+ # These should never be needed
+ $self->{OBJ_EXT} ||= '.o';
+ $self->{LIB_EXT} ||= '.a';
+
+ $self->{MAP_TARGET} ||= "perl";
+
+ $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
+
+ # make a simple check if we find strict
+ warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
+ (strict.pm not found)"
+ unless -f File::Spec->catfile("$self->{PERL_LIB}","strict.pm") ||
+ $self->{NAME} eq "ExtUtils::MakeMaker";
+ }
+
+ =item init_tools
+
+ Initializes tools to use their common (and faster) Unix commands.
+
+ =cut
+
+ sub init_tools {
+ my $self = shift;
+
+ $self->{ECHO} ||= 'echo';
+ $self->{ECHO_N} ||= 'echo -n';
+ $self->{RM_F} ||= "rm -f";
+ $self->{RM_RF} ||= "rm -rf";
+ $self->{TOUCH} ||= "touch";
+ $self->{TEST_F} ||= "test -f";
+ $self->{TEST_S} ||= "test -s";
+ $self->{CP} ||= "cp";
+ $self->{MV} ||= "mv";
+ $self->{CHMOD} ||= "chmod";
+ $self->{FALSE} ||= 'false';
+ $self->{TRUE} ||= 'true';
+
+ $self->{LD} ||= 'ld';
+
+ return $self->SUPER::init_tools(@_);
+
+ # After SUPER::init_tools so $Config{shell} has a
+ # chance to get set.
+ $self->{SHELL} ||= '/bin/sh';
+
+ return;
+ }
+
+
+ =item init_linker
+
+ Unix has no need of special linker flags.
+
+ =cut
+
+ sub init_linker {
+ my($self) = shift;
+ $self->{PERL_ARCHIVE} ||= '';
+ $self->{PERL_ARCHIVEDEP} ||= '';
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+ }
+
+
+ =begin _protected
+
+ =item init_lib2arch
+
+ $mm->init_lib2arch
+
+ =end _protected
+
+ =cut
+
+ sub init_lib2arch {
+ my($self) = shift;
+
+ # The user who requests an installation directory explicitly
+ # should not have to tell us an architecture installation directory
+ # as well. We look if a directory exists that is named after the
+ # architecture. If not we take it as a sign that it should be the
+ # same as the requested installation directory. Otherwise we take
+ # the found one.
+ for my $libpair ({l=>"privlib", a=>"archlib"},
+ {l=>"sitelib", a=>"sitearch"},
+ {l=>"vendorlib", a=>"vendorarch"},
+ )
+ {
+ my $lib = "install$libpair->{l}";
+ my $Lib = uc $lib;
+ my $Arch = uc "install$libpair->{a}";
+ if( $self->{$Lib} && ! $self->{$Arch} ){
+ my($ilib) = $Config{$lib};
+
+ $self->prefixify($Arch,$ilib,$self->{$Lib});
+
+ unless (-d $self->{$Arch}) {
+ print "Directory $self->{$Arch} not found\n"
+ if $Verbose;
+ $self->{$Arch} = $self->{$Lib};
+ }
+ print "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
+ }
+ }
+ }
+
+
+ =item init_PERL
+
+ $mm->init_PERL;
+
+ Called by init_main. Sets up ABSPERL, PERL, FULLPERL and all the
+ *PERLRUN* permutations.
+
+ PERL is allowed to be miniperl
+ FULLPERL must be a complete perl
+
+ ABSPERL is PERL converted to an absolute path
+
+ *PERLRUN contains everything necessary to run perl, find it's
+ libraries, etc...
+
+ *PERLRUNINST is *PERLRUN + everything necessary to find the
+ modules being built.
+
+ =cut
+
+ sub init_PERL {
+ my($self) = shift;
+
+ my @defpath = ();
+ foreach my $component ($self->{PERL_SRC}, $self->path(),
+ $Config{binexp})
+ {
+ push @defpath, $component if defined $component;
+ }
+
+ # Build up a set of file names (not command names).
+ my $thisperl = $self->canonpath($^X);
+ $thisperl .= $Config{exe_ext} unless
+ # VMS might have a file version # at the end
+ $Is{VMS} ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i
+ : $thisperl =~ m/$Config{exe_ext}$/i;
+
+ # We need a relative path to perl when in the core.
+ $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE};
+
+ my @perls = ($thisperl);
+ push @perls, map { "$_$Config{exe_ext}" }
+ ("perl$Config{version}", 'perl5', 'perl');
+
+ # miniperl has priority over all but the canonical perl when in the
+ # core. Otherwise its a last resort.
+ my $miniperl = "miniperl$Config{exe_ext}";
+ if( $self->{PERL_CORE} ) {
+ splice @perls, 1, 0, $miniperl;
+ }
+ else {
+ push @perls, $miniperl;
+ }
+
+ $self->{PERL} ||=
+ $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
+
+ my $perl = $self->{PERL};
+ $perl =~ s/^"//;
+ my $has_mcr = $perl =~ s/^MCR\s*//;
+ my $perlflags = '';
+ my $stripped_perl;
+ while ($perl) {
+ ($stripped_perl = $perl) =~ s/"$//;
+ last if -x $stripped_perl;
+ last unless $perl =~ s/(\s+\S+)$//;
+ $perlflags = $1.$perlflags;
+ }
+ $self->{PERL} = $stripped_perl;
+ $self->{PERL} = 'MCR '.$self->{PERL} if $has_mcr || $Is{VMS};
+
+ # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe.
+ my $perl_name = 'perl';
+ $perl_name = 'ndbgperl' if $Is{VMS} &&
+ defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define';
+
+ # XXX This logic is flawed. If "miniperl" is anywhere in the path
+ # it will get confused. It should be fixed to work only on the filename.
+ # Define 'FULLPERL' to be a non-miniperl (used in test: target)
+ unless ($self->{FULLPERL}) {
+ ($self->{FULLPERL} = $self->{PERL}) =~ s/\Q$miniperl\E$/$perl_name$Config{exe_ext}/i;
+ $self->{FULLPERL} = qq{"$self->{FULLPERL}"}.$perlflags;
+ }
+ # Can't have an image name with quotes, and findperl will have
+ # already escaped spaces.
+ $self->{FULLPERL} =~ tr/"//d if $Is{VMS};
+
+ # Little hack to get around VMS's find_perl putting "MCR" in front
+ # sometimes.
+ $self->{ABSPERL} = $self->{PERL};
+ $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//;
+ if( $self->file_name_is_absolute($self->{ABSPERL}) ) {
+ $self->{ABSPERL} = '$(PERL)';
+ }
+ else {
+ $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL});
+
+ # Quote the perl command if it contains whitespace
+ $self->{ABSPERL} = $self->quote_literal($self->{ABSPERL})
+ if $self->{ABSPERL} =~ /\s/;
+
+ $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr;
+ }
+ $self->{PERL} = qq{"$self->{PERL}"}.$perlflags;
+
+ # Can't have an image name with quotes, and findperl will have
+ # already escaped spaces.
+ $self->{PERL} =~ tr/"//d if $Is{VMS};
+
+ # Are we building the core?
+ $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE};
+ $self->{PERL_CORE} = 0 unless defined $self->{PERL_CORE};
+
+ # Make sure perl can find itself before it's installed.
+ my $lib_paths = $self->{UNINSTALLED_PERL} || $self->{PERL_CORE}
+ ? $self->{PERL_ARCHLIB} ne $self->{PERL_LIB} ?
+ q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"} : q{ "-I$(PERL_LIB)"}
+ : undef;
+ my $inst_lib_paths = $self->{INST_ARCHLIB} ne $self->{INST_LIB}
+ ? 'RUN)'.$perlflags.' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"'
+ : 'RUN)'.$perlflags.' "-I$(INST_LIB)"';
+ # How do we run perl?
+ foreach my $perl (qw(PERL FULLPERL ABSPERL)) {
+ my $run = $perl.'RUN';
+
+ $self->{$run} = qq{\$($perl)};
+ $self->{$run} .= $lib_paths if $lib_paths;
+
+ $self->{$perl.'RUNINST'} = '$('.$perl.$inst_lib_paths;
+ }
+
+ return 1;
+ }
+
+
+ =item init_platform
+
+ =item platform_constants
+
+ Add MM_Unix_VERSION.
+
+ =cut
+
+ sub init_platform {
+ my($self) = shift;
+
+ $self->{MM_Unix_VERSION} = $VERSION;
+ $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '.
+ '-Dfree=Perl_mfree -Drealloc=Perl_realloc '.
+ '-Dcalloc=Perl_calloc';
+
+ }
+
+ sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+ }
+
+
+ =item init_PERM
+
+ $mm->init_PERM
+
+ Called by init_main. Initializes PERL_*
+
+ =cut
+
+ sub init_PERM {
+ my($self) = shift;
+
+ $self->{PERM_DIR} = 755 unless defined $self->{PERM_DIR};
+ $self->{PERM_RW} = 644 unless defined $self->{PERM_RW};
+ $self->{PERM_RWX} = 755 unless defined $self->{PERM_RWX};
+
+ return 1;
+ }
+
+
+ =item init_xs
+
+ $mm->init_xs
+
+ Sets up macros having to do with XS code. Currently just INST_STATIC,
+ INST_DYNAMIC and INST_BOOT.
+
+ =cut
+
+ sub init_xs {
+ my $self = shift;
+
+ if ($self->has_link_code()) {
+ $self->{INST_STATIC} =
+ File::Spec->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)');
+ $self->{INST_DYNAMIC} =
+ File::Spec->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)');
+ $self->{INST_BOOT} =
+ File::Spec->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs');
+ if ($self->{XSMULTI}) {
+ my @exts = $self->_xs_list_basenames;
+ my (@statics, @dynamics, @boots);
+ for my $ext (@exts) {
+ my ($v, $d, $f) = File::Spec->splitpath($ext);
+ my @d = File::Spec->splitdir($d);
+ shift @d if defined $d[0] and $d[0] eq 'lib';
+ my $instdir = File::Spec->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+ my $instfile = File::Spec->catfile($instdir, $f);
+ push @statics, "$instfile\$(LIB_EXT)";
+ push @dynamics, "$instfile.\$(DLEXT)";
+ push @boots, "$instfile.bs";
+ }
+ $self->{INST_STATIC} = join ' ', @statics;
+ $self->{INST_DYNAMIC} = join ' ', @dynamics;
+ $self->{INST_BOOT} = join ' ', @boots;
+ }
+ } else {
+ $self->{INST_STATIC} = '';
+ $self->{INST_DYNAMIC} = '';
+ $self->{INST_BOOT} = '';
+ }
+ }
+
+ =item install (o)
+
+ Defines the install target.
+
+ =cut
+
+ sub install {
+ my($self, %attribs) = @_;
+ my(@m);
+
+ push @m, q{
+ install :: pure_install doc_install
+ $(NOECHO) $(NOOP)
+
+ install_perl :: pure_perl_install doc_perl_install
+ $(NOECHO) $(NOOP)
+
+ install_site :: pure_site_install doc_site_install
+ $(NOECHO) $(NOOP)
+
+ install_vendor :: pure_vendor_install doc_vendor_install
+ $(NOECHO) $(NOOP)
+
+ pure_install :: pure_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+ doc_install :: doc_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+ pure__install : pure_site_install
+ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+ doc__install : doc_site_install
+ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+ pure_perl_install :: all
+ $(NOECHO) $(MOD_INSTALL) \
+ };
+
+ push @m,
+ q{ read "}.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \
+ write "}.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \
+ } unless $self->{NO_PACKLIST};
+
+ push @m,
+ q{ "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \
+ "$(INST_ARCHLIB)" "$(DESTINSTALLARCHLIB)" \
+ "$(INST_BIN)" "$(DESTINSTALLBIN)" \
+ "$(INST_SCRIPT)" "$(DESTINSTALLSCRIPT)" \
+ "$(INST_MAN1DIR)" "$(DESTINSTALLMAN1DIR)" \
+ "$(INST_MAN3DIR)" "$(DESTINSTALLMAN3DIR)"
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+ "}.File::Spec->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{"
+
+
+ pure_site_install :: all
+ $(NOECHO) $(MOD_INSTALL) \
+ };
+ push @m,
+ q{ read "}.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \
+ write "}.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{" \
+ } unless $self->{NO_PACKLIST};
+
+ push @m,
+ q{ "$(INST_LIB)" "$(DESTINSTALLSITELIB)" \
+ "$(INST_ARCHLIB)" "$(DESTINSTALLSITEARCH)" \
+ "$(INST_BIN)" "$(DESTINSTALLSITEBIN)" \
+ "$(INST_SCRIPT)" "$(DESTINSTALLSITESCRIPT)" \
+ "$(INST_MAN1DIR)" "$(DESTINSTALLSITEMAN1DIR)" \
+ "$(INST_MAN3DIR)" "$(DESTINSTALLSITEMAN3DIR)"
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+ "}.File::Spec->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{"
+
+ pure_vendor_install :: all
+ $(NOECHO) $(MOD_INSTALL) \
+ };
+ push @m,
+ q{ read "}.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \
+ write "}.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{" \
+ } unless $self->{NO_PACKLIST};
+
+ push @m,
+ q{ "$(INST_LIB)" "$(DESTINSTALLVENDORLIB)" \
+ "$(INST_ARCHLIB)" "$(DESTINSTALLVENDORARCH)" \
+ "$(INST_BIN)" "$(DESTINSTALLVENDORBIN)" \
+ "$(INST_SCRIPT)" "$(DESTINSTALLVENDORSCRIPT)" \
+ "$(INST_MAN1DIR)" "$(DESTINSTALLVENDORMAN1DIR)" \
+ "$(INST_MAN3DIR)" "$(DESTINSTALLVENDORMAN3DIR)"
+
+ };
+
+ push @m, q{
+ doc_perl_install :: all
+ $(NOECHO) $(NOOP)
+
+ doc_site_install :: all
+ $(NOECHO) $(NOOP)
+
+ doc_vendor_install :: all
+ $(NOECHO) $(NOOP)
+
+ } if $self->{NO_PERLLOCAL};
+
+ push @m, q{
+ doc_perl_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+ -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLPRIVLIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> "}.File::Spec->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+ doc_site_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+ -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLSITELIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> "}.File::Spec->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+ doc_vendor_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+ -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLVENDORLIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> "}.File::Spec->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+ } unless $self->{NO_PERLLOCAL};
+
+ push @m, q{
+ uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+ $(NOECHO) $(NOOP)
+
+ uninstall_from_perldirs ::
+ $(NOECHO) $(UNINSTALL) "}.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{"
+
+ uninstall_from_sitedirs ::
+ $(NOECHO) $(UNINSTALL) "}.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{"
+
+ uninstall_from_vendordirs ::
+ $(NOECHO) $(UNINSTALL) "}.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{"
+ };
+
+ join("",@m);
+ }
+
+ =item installbin (o)
+
+ Defines targets to make and to install EXE_FILES.
+
+ =cut
+
+ sub installbin {
+ my($self) = shift;
+
+ return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
+ my @exefiles = sort @{$self->{EXE_FILES}};
+ return "" unless @exefiles;
+
+ @exefiles = map vmsify($_), @exefiles if $Is{VMS};
+
+ my %fromto;
+ for my $from (@exefiles) {
+ my($path)= File::Spec->catfile('$(INST_SCRIPT)', basename($from));
+
+ local($_) = $path; # for backwards compatibility
+ my $to = $self->libscan($path);
+ print "libscan($from) => '$to'\n" if ($Verbose >=2);
+
+ $to = vmsify($to) if $Is{VMS};
+ $fromto{$from} = $to;
+ }
+ my @to = sort values %fromto;
+
+ my @m;
+ push(@m, qq{
+ EXE_FILES = @exefiles
+
+ pure_all :: @to
+ \$(NOECHO) \$(NOOP)
+
+ realclean ::
+ });
+
+ # realclean can get rather large.
+ push @m, map "\t$_\n", $self->split_command('$(RM_F)', @to);
+ push @m, "\n";
+
+ # A target for each exe file.
+ my @froms = sort keys %fromto;
+ for my $from (@froms) {
+ # 1 2
+ push @m, _sprintf562 <<'MAKE', $from, $fromto{$from};
+ %2$s : %1$s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists
+ $(NOECHO) $(RM_F) %2$s
+ $(CP) %1$s %2$s
+ $(FIXIN) %2$s
+ -$(NOECHO) $(CHMOD) $(PERM_RWX) %2$s
+
+ MAKE
+
+ }
+
+ join "", @m;
+ }
+
+ =item linkext (o)
+
+ Defines the linkext target which in turn defines the LINKTYPE.
+
+ =cut
+
+ # LINKTYPE => static or dynamic or ''
+ sub linkext {
+ my($self, %attribs) = @_;
+ my $linktype = $attribs{LINKTYPE};
+ $linktype = $self->{LINKTYPE} unless defined $linktype;
+ if (defined $linktype and $linktype eq '') {
+ warn "Warning: LINKTYPE set to '', no longer necessary\n";
+ }
+ $linktype = '$(LINKTYPE)' unless defined $linktype;
+ "
+ linkext :: $linktype
+ \$(NOECHO) \$(NOOP)
+ ";
+ }
+
+ =item lsdir
+
+ Takes as arguments a directory name and a regular expression. Returns
+ all entries in the directory that match the regular expression.
+
+ =cut
+
+ sub lsdir {
+ my($self) = shift;
+ my($dir, $regex) = @_;
+ my(@ls);
+ my $dh = new DirHandle;
+ $dh->open($dir || ".") or return ();
+ @ls = $dh->read;
+ $dh->close;
+ @ls = grep(/$regex/, @ls) if $regex;
+ @ls;
+ }
+
+ =item macro (o)
+
+ Simple subroutine to insert the macros defined by the macro attribute
+ into the Makefile.
+
+ =cut
+
+ sub macro {
+ my($self,%attribs) = @_;
+ my(@m,$key,$val);
+ while (($key,$val) = each %attribs){
+ last unless defined $key;
+ push @m, "$key = $val\n";
+ }
+ join "", @m;
+ }
+
+ =item makeaperl (o)
+
+ Called by staticmake. Defines how to write the Makefile to produce a
+ static new perl.
+
+ By default the Makefile produced includes all the static extensions in
+ the perl library. (Purified versions of library files, e.g.,
+ DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
+
+ =cut
+
+ sub makeaperl {
+ my($self, %attribs) = @_;
+ my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
+ @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
+ s/^(.*)/"-I$1"/ for @{$perlinc || []};
+ my(@m);
+ push @m, "
+ # --- MakeMaker makeaperl section ---
+ MAP_TARGET = $target
+ FULLPERL = $self->{FULLPERL}
+ MAP_PERLINC = @{$perlinc || []}
+ ";
+ return join '', @m if $self->{PARENT};
+
+ my($dir) = join ":", @{$self->{DIR}};
+
+ unless ($self->{MAKEAPERL}) {
+ push @m, q{
+ $(MAP_TARGET) :: $(MAKE_APERL_FILE)
+ $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
+
+ $(MAKE_APERL_FILE) : static $(FIRST_MAKEFILE) pm_to_blib
+ $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
+ $(NOECHO) $(PERLRUNINST) \
+ Makefile.PL DIR="}, $dir, q{" \
+ MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
+
+ foreach (@ARGV){
+ if( /\s/ ){
+ s/=(.*)/='$1'/;
+ }
+ push @m, " \\\n\t\t$_";
+ }
+ # push @m, map( " \\\n\t\t$_", @ARGV );
+ push @m, "\n";
+
+ return join '', @m;
+ }
+
+ my $cccmd = $self->const_cccmd($libperl);
+ $cccmd =~ s/^CCCMD\s*=\s*//;
+ $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /;
+ $cccmd .= " $Config{cccdlflags}"
+ if ($Config{useshrplib} eq 'true');
+ $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
+
+ # The front matter of the linkcommand...
+ my $linkcmd = join ' ', "\$(CC)",
+ grep($_, @Config{qw(ldflags ccdlflags)});
+ $linkcmd =~ s/\s+/ /g;
+ $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
+
+ # Which *.a files could we make use of...
+ my %static;
+ require File::Find;
+ # don't use File::Spec here because on Win32 F::F still uses "/"
+ my $installed_version = join('/',
+ 'auto', $self->{FULLEXT}, "$self->{BASEEXT}$self->{LIB_EXT}"
+ );
+ File::Find::find(sub {
+ return unless m/\Q$self->{LIB_EXT}\E$/;
+
+ # Skip perl's libraries.
+ return if m/^libperl/ or m/^perl\Q$self->{LIB_EXT}\E$/;
+
+ # Skip purified versions of libraries
+ # (e.g., DynaLoader_pure_p1_c0_032.a)
+ return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
+
+ if( exists $self->{INCLUDE_EXT} ){
+ my $found = 0;
+
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,s;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything not explicitly marked for inclusion.
+ # DynaLoader is implied.
+ foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+ if( $xx eq $incl ){
+ $found++;
+ last;
+ }
+ }
+ return unless $found;
+ }
+ elsif( exists $self->{EXCLUDE_EXT} ){
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,s;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything explicitly marked for exclusion
+ foreach my $excl (@{$self->{EXCLUDE_EXT}}){
+ return if( $xx eq $excl );
+ }
+ }
+
+ # don't include the installed version of this extension. I
+ # leave this line here, although it is not necessary anymore:
+ # I patched minimod.PL instead, so that Miniperl.pm won't
+ # include duplicates
+
+ # Once the patch to minimod.PL is in the distribution, I can
+ # drop it
+ return if $File::Find::name =~ m:\Q$installed_version\E\z:;
+ use Cwd 'cwd';
+ $static{cwd() . "/" . $_}++;
+ }, grep( -d $_, @{$searchdirs || []}) );
+
+ # We trust that what has been handed in as argument, will be buildable
+ $static = [] unless $static;
+ @static{@{$static}} = (1) x @{$static};
+
+ $extra = [] unless $extra && ref $extra eq 'ARRAY';
+ for (sort keys %static) {
+ next unless /\Q$self->{LIB_EXT}\E\z/;
+ $_ = dirname($_) . "/extralibs.ld";
+ push @$extra, $_;
+ }
+
+ s/^(.*)/"-I$1"/ for @{$perlinc || []};
+
+ $target ||= "perl";
+ $tmp ||= ".";
+
+ # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
+ # regenerate the Makefiles, MAP_STATIC and the dependencies for
+ # extralibs.all are computed correctly
+ my @map_static = reverse sort keys %static;
+ push @m, "
+ MAP_LINKCMD = $linkcmd
+ MAP_STATIC = ", join(" \\\n\t", map { qq{"$_"} } @map_static), "
+ MAP_STATICDEP = ", join(' ', map { $self->quote_dep($_) } @map_static), "
+
+ MAP_PRELIBS = $Config{perllibs} $Config{cryptlib}
+ ";
+
+ my $lperl;
+ if (defined $libperl) {
+ ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
+ }
+ unless ($libperl && -f $lperl) { # Ilya's code...
+ my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
+ $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
+ $libperl ||= "libperl$self->{LIB_EXT}";
+ $libperl = "$dir/$libperl";
+ $lperl ||= "libperl$self->{LIB_EXT}";
+ $lperl = "$dir/$lperl";
+
+ if (! -f $libperl and ! -f $lperl) {
+ # We did not find a static libperl. Maybe there is a shared one?
+ if ($Is{SunOS}) {
+ $lperl = $libperl = "$dir/$Config{libperl}";
+ # SUNOS ld does not take the full path to a shared library
+ $libperl = '' if $Is{SunOS4};
+ }
+ }
+
+ print <<EOF unless -f $lperl || defined($self->{PERL_SRC});
+ Warning: $libperl not found
+ If you're going to build a static perl binary, make sure perl is installed
+ otherwise ignore this warning
+ EOF
+ }
+
+ # SUNOS ld does not take the full path to a shared library
+ my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl';
+ my $libperl_dep = $self->quote_dep($libperl);
+
+ push @m, "
+ MAP_LIBPERL = $libperl
+ MAP_LIBPERLDEP = $libperl_dep
+ LLIBPERL = $llibperl
+ ";
+
+ push @m, '
+ $(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).exists '.join(" \\\n\t", @$extra).'
+ $(NOECHO) $(RM_F) $@
+ $(NOECHO) $(TOUCH) $@
+ ';
+
+ foreach my $catfile (@$extra){
+ push @m, "\tcat $catfile >> \$\@\n";
+ }
+
+ my $ldfrom = $self->{XSMULTI} ? '' : '$(LDFROM)';
+ # 1 2 3 4
+ push @m, _sprintf562 <<'EOF', $tmp, $self->xs_obj_opt('$@'), $ldfrom, $makefilename;
+ $(MAP_TARGET) :: %1$s/perlmain$(OBJ_EXT) $(MAP_LIBPERLDEP) $(MAP_STATICDEP) $(INST_ARCHAUTODIR)/extralibs.all
+ $(MAP_LINKCMD) %2$s $(OPTIMIZE) %1$s/perlmain$(OBJ_EXT) %3$s $(MAP_STATIC) "$(LLIBPERL)" `cat $(INST_ARCHAUTODIR)/extralibs.all` $(MAP_PRELIBS)
+ $(NOECHO) $(ECHO) "To install the new '$(MAP_TARGET)' binary, call"
+ $(NOECHO) $(ECHO) " $(MAKE) $(USEMAKEFILE) %4$s inst_perl MAP_TARGET=$(MAP_TARGET)"
+ $(NOECHO) $(ECHO) " $(MAKE) $(USEMAKEFILE) %4$s map_clean"
+
+ %1$s/perlmain\$(OBJ_EXT): %1$s/perlmain.c
+ EOF
+ push @m, "\t".$self->cd($tmp, qq[$cccmd "-I\$(PERL_INC)" perlmain.c])."\n";
+
+ my $maybe_DynaLoader = $Config{usedl} ? 'q(DynaLoader)' : '';
+ push @m, _sprintf562 <<'EOF', $tmp, $makefilename, $maybe_DynaLoader;
+
+ %1$s/perlmain.c: %2$s
+ $(NOECHO) $(ECHO) Writing $@
+ $(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \
+ -e "writemain(grep(s#.*/auto/##s, @ARGV), %3$s)" $(MAP_STATIC) > $@t
+ $(MV) $@t $@
+
+ EOF
+ push @m, "\t", q{$(NOECHO) $(PERL) "$(INSTALLSCRIPT)/fixpmain"
+ } if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
+
+
+ push @m, q{
+ doc_inst_perl :
+ $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+ -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+ -$(NOECHO) $(DOC_INSTALL) \
+ "Perl binary" "$(MAP_TARGET)" \
+ MAP_STATIC "$(MAP_STATIC)" \
+ MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
+ MAP_LIBPERL "$(MAP_LIBPERL)" \
+ >> "}.File::Spec->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+ };
+
+ push @m, q{
+ inst_perl : pure_inst_perl doc_inst_perl
+
+ pure_inst_perl : $(MAP_TARGET)
+ }.$self->{CP}.q{ $(MAP_TARGET) "}.File::Spec->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{"
+
+ clean :: map_clean
+
+ map_clean :
+ }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
+ };
+
+ join '', @m;
+ }
+
+ =item makefile (o)
+
+ Defines how to rewrite the Makefile.
+
+ =cut
+
+ sub makefile {
+ my($self) = shift;
+ my $m;
+ # We do not know what target was originally specified so we
+ # must force a manual rerun to be sure. But as it should only
+ # happen very rarely it is not a significant problem.
+ $m = '
+ $(OBJECT) : $(FIRST_MAKEFILE)
+
+ ' if $self->{OBJECT};
+
+ my $newer_than_target = $Is{VMS} ? '$(MMS$SOURCE_LIST)' : '$?';
+ my $mpl_args = join " ", map qq["$_"], @ARGV;
+ my $cross = '';
+ if (defined $::Cross::platform) {
+ # Inherited from win32/buildext.pl
+ $cross = "-MCross=$::Cross::platform ";
+ }
+ $m .= sprintf <<'MAKE_FRAG', $newer_than_target, $cross, $mpl_args;
+ # We take a very conservative approach here, but it's worth it.
+ # We move Makefile to Makefile.old here to avoid gnu make looping.
+ $(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
+ $(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s"
+ $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
+ -$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+ -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
+ - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
+ $(PERLRUN) %sMakefile.PL %s
+ $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
+ $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
+ $(FALSE)
+
+ MAKE_FRAG
+
+ return $m;
+ }
+
+
+ =item maybe_command
+
+ Returns true, if the argument is likely to be a command.
+
+ =cut
+
+ sub maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d $file;
+ return;
+ }
+
+
+ =item needs_linking (o)
+
+ Does this module need linking? Looks into subdirectory objects (see
+ also has_link_code())
+
+ =cut
+
+ sub needs_linking {
+ my($self) = shift;
+
+ my $caller = (caller(0))[3];
+ confess("needs_linking called too early") if
+ $caller =~ /^ExtUtils::MakeMaker::/;
+ return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
+ if ($self->has_link_code or $self->{MAKEAPERL}){
+ $self->{NEEDS_LINKING} = 1;
+ return 1;
+ }
+ foreach my $child (keys %{$self->{CHILDREN}}) {
+ if ($self->{CHILDREN}->{$child}->needs_linking) {
+ $self->{NEEDS_LINKING} = 1;
+ return 1;
+ }
+ }
+ return $self->{NEEDS_LINKING} = 0;
+ }
+
+
+ =item parse_abstract
+
+ parse a file and return what you think is the ABSTRACT
+
+ =cut
+
+ sub parse_abstract {
+ my($self,$parsefile) = @_;
+ my $result;
+
+ local $/ = "\n";
+ open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!";
+ binmode $fh;
+ my $inpod = 0;
+ my $pod_encoding;
+ my $package = $self->{DISTNAME};
+ $package =~ s/-/::/g;
+ while (<$fh>) {
+ $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+ next if !$inpod;
+ s#\r*\n\z##; # handle CRLF input
+
+ if ( /^=encoding\s*(.*)$/i ) {
+ $pod_encoding = $1;
+ }
+
+ if ( /^($package(?:\.pm)? \s+ -+ \s+)(.*)/x ) {
+ $result = $2;
+ next;
+ }
+ next unless $result;
+
+ if ( $result && ( /^\s*$/ || /^\=/ ) ) {
+ last;
+ }
+ $result = join ' ', $result, $_;
+ }
+ close $fh;
+
+ if ( $pod_encoding and !( $] < 5.008 or !$Config{useperlio} ) ) {
+ # Have to wrap in an eval{} for when running under PERL_CORE
+ # Encode isn't available during build phase and parsing
+ # ABSTRACT isn't important there
+ eval {
+ require Encode;
+ $result = Encode::decode($pod_encoding, $result);
+ }
+ }
+
+ return $result;
+ }
+
+ =item parse_version
+
+ my $version = MM->parse_version($file);
+
+ Parse a $file and return what $VERSION is set to by the first assignment.
+ It will return the string "undef" if it can't figure out what $VERSION
+ is. $VERSION should be for all to see, so C<our $VERSION> or plain $VERSION
+ are okay, but C<my $VERSION> is not.
+
+ C<<package Foo VERSION>> is also checked for. The first version
+ declaration found is used, but this may change as it differs from how
+ Perl does it.
+
+ parse_version() will try to C<use version> before checking for
+ C<$VERSION> so the following will work.
+
+ $VERSION = qv(1.2.3);
+
+ =cut
+
+ sub parse_version {
+ my($self,$parsefile) = @_;
+ my $result;
+
+ local $/ = "\n";
+ local $_;
+ open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!";
+ my $inpod = 0;
+ while (<$fh>) {
+ $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+ next if $inpod || /^\s*#/;
+ chop;
+ next if /^\s*(if|unless|elsif)/;
+ if ( m{^ \s* package \s+ \w[\w\:\']* \s+ (v?[0-9._]+) \s* ; }x ) {
+ local $^W = 0;
+ $result = $1;
+ }
+ elsif ( m{(?<!\\) ([\$*]) (([\w\:\']*) \bVERSION)\b .* (?<![<>=!])\=[^=]}x ) {
+ $result = $self->get_version($parsefile, $1, $2);
+ }
+ else {
+ next;
+ }
+ last if defined $result;
+ }
+ close $fh;
+
+ if ( defined $result && $result !~ /^v?[\d_\.]+$/ ) {
+ require version;
+ my $normal = eval { version->new( $result ) };
+ $result = $normal if defined $normal;
+ }
+ $result = "undef" unless defined $result;
+ return $result;
+ }
+
+ sub get_version {
+ my ($self, $parsefile, $sigil, $name) = @_;
+ my $line = $_; # from the while() loop in parse_version
+ {
+ package ExtUtils::MakeMaker::_version;
+ undef *version; # in case of unexpected version() sub
+ eval {
+ require version;
+ version::->import;
+ };
+ no strict;
+ local *{$name};
+ local $^W = 0;
+ $line = $1 if $line =~ m{^(.+)}s;
+ eval($line); ## no critic
+ return ${$name};
+ }
+ }
+
+ =item pasthru (o)
+
+ Defines the string that is passed to recursive make calls in
+ subdirectories. The variables like C<PASTHRU_DEFINE> are used in each
+ level, and passed downwards on the command-line with e.g. the value of
+ that level's DEFINE. Example:
+
+ # Level 0 has DEFINE = -Dfunky
+ # This code will define level 0's PASTHRU=PASTHRU_DEFINE="$(DEFINE)
+ # $(PASTHRU_DEFINE)"
+ # Level 0's $(CCCMD) will include macros $(DEFINE) and $(PASTHRU_DEFINE)
+ # So will level 1's, so when level 1 compiles, it will get right values
+ # And so ad infinitum
+
+ =cut
+
+ sub pasthru {
+ my($self) = shift;
+ my(@m);
+
+ my(@pasthru);
+ my($sep) = $Is{VMS} ? ',' : '';
+ $sep .= "\\\n\t";
+
+ foreach my $key (qw(LIB LIBPERL_A LINKTYPE OPTIMIZE
+ PREFIX INSTALL_BASE)
+ )
+ {
+ next unless defined $self->{$key};
+ push @pasthru, "$key=\"\$($key)\"";
+ }
+
+ foreach my $key (qw(DEFINE INC)) {
+ # default to the make var
+ my $val = qq{\$($key)};
+ # expand within perl if given since need to use quote_literal
+ # since INC might include space-protecting ""!
+ $val = $self->{$key} if defined $self->{$key};
+ $val .= " \$(PASTHRU_$key)";
+ my $quoted = $self->quote_literal($val);
+ push @pasthru, qq{PASTHRU_$key=$quoted};
+ }
+
+ push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
+ join "", @m;
+ }
+
+ =item perl_script
+
+ Takes one argument, a file name, and returns the file name, if the
+ argument is likely to be a perl script. On MM_Unix this is true for
+ any ordinary, readable file.
+
+ =cut
+
+ sub perl_script {
+ my($self,$file) = @_;
+ return $file if -r $file && -f _;
+ return;
+ }
+
+ =item perldepend (o)
+
+ Defines the dependency from all *.h files that come with the perl
+ distribution.
+
+ =cut
+
+ sub perldepend {
+ my($self) = shift;
+ my(@m);
+
+ my $make_config = $self->cd('$(PERL_SRC)', '$(MAKE) lib/Config.pm');
+
+ push @m, sprintf <<'MAKE_FRAG', $make_config if $self->{PERL_SRC};
+ # Check for unpropogated config.sh changes. Should never happen.
+ # We do NOT just update config.h because that is not sufficient.
+ # An out of date config.h is not fatal but complains loudly!
+ $(PERL_INCDEP)/config.h: $(PERL_SRC)/config.sh
+ -$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; $(FALSE)
+
+ $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
+ $(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
+ %s
+ MAKE_FRAG
+
+ return join "", @m unless $self->needs_linking;
+
+ if ($self->{OBJECT}) {
+ # Need to add an object file dependency on the perl headers.
+ # this is very important for XS modules in perl.git development.
+ push @m, $self->_perl_header_files_fragment("/"); # Directory separator between $(PERL_INC)/header.h
+ }
+
+ push @m, join(" ", sort values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
+
+ return join "\n", @m;
+ }
+
+
+ =item pm_to_blib
+
+ Defines target that copies all files in the hash PM to their
+ destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
+
+ =cut
+
+ sub pm_to_blib {
+ my $self = shift;
+ my($autodir) = File::Spec->catdir('$(INST_LIB)','auto');
+ my $r = q{
+ pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
+ };
+
+ # VMS will swallow '' and PM_FILTER is often empty. So use q[]
+ my $pm_to_blib = $self->oneliner(<<CODE, ['-MExtUtils::Install']);
+ pm_to_blib({\@ARGV}, '$autodir', q[\$(PM_FILTER)], '\$(PERM_DIR)')
+ CODE
+
+ my @cmds = $self->split_command($pm_to_blib,
+ map { ($self->quote_literal($_) => $self->quote_literal($self->{PM}->{$_})) } sort keys %{$self->{PM}});
+
+ $r .= join '', map { "\t\$(NOECHO) $_\n" } @cmds;
+ $r .= qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n};
+
+ return $r;
+ }
+
+ # transform dot-separated version string into comma-separated quadruple
+ # examples: '1.2.3.4.5' => '1,2,3,4'
+ # '1.2.3' => '1,2,3,0'
+ sub _ppd_version {
+ my ($self, $string) = @_;
+ return join ',', ((split /\./, $string), (0) x 4)[0..3];
+ }
+
+ =item ppd
+
+ Defines target that creates a PPD (Perl Package Description) file
+ for a binary distribution.
+
+ =cut
+
+ sub ppd {
+ my($self) = @_;
+
+ my $abstract = $self->{ABSTRACT} || '';
+ $abstract =~ s/\n/\\n/sg;
+ $abstract =~ s/</&lt;/g;
+ $abstract =~ s/>/&gt;/g;
+
+ my $author = join(', ',@{ ref $self->{AUTHOR} eq 'ARRAY' ? $self->{AUTHOR} : [ $self->{AUTHOR} || '']});
+ $author =~ s/</&lt;/g;
+ $author =~ s/>/&gt;/g;
+
+ my $ppd_file = "$self->{DISTNAME}.ppd";
+
+ my @ppd_chunks = qq(<SOFTPKG NAME="$self->{DISTNAME}" VERSION="$self->{VERSION}">\n);
+
+ push @ppd_chunks, sprintf <<'PPD_HTML', $abstract, $author;
+ <ABSTRACT>%s</ABSTRACT>
+ <AUTHOR>%s</AUTHOR>
+ PPD_HTML
+
+ push @ppd_chunks, " <IMPLEMENTATION>\n";
+ if ( $self->{MIN_PERL_VERSION} ) {
+ my $min_perl_version = $self->_ppd_version($self->{MIN_PERL_VERSION});
+ push @ppd_chunks, sprintf <<'PPD_PERLVERS', $min_perl_version;
+ <PERLCORE VERSION="%s" />
+ PPD_PERLVERS
+
+ }
+
+ # Don't add "perl" to requires. perl dependencies are
+ # handles by ARCHITECTURE.
+ my %prereqs = %{$self->{PREREQ_PM}};
+ delete $prereqs{perl};
+
+ # Build up REQUIRE
+ foreach my $prereq (sort keys %prereqs) {
+ my $name = $prereq;
+ $name .= '::' unless $name =~ /::/;
+ my $version = $prereqs{$prereq};
+
+ my %attrs = ( NAME => $name );
+ $attrs{VERSION} = $version if $version;
+ my $attrs = join " ", map { qq[$_="$attrs{$_}"] } sort keys %attrs;
+ push @ppd_chunks, qq( <REQUIRE $attrs />\n);
+ }
+
+ my $archname = $Config{archname};
+ if ($] >= 5.008) {
+ # archname did not change from 5.6 to 5.8, but those versions may
+ # not be not binary compatible so now we append the part of the
+ # version that changes when binary compatibility may change
+ $archname .= "-$Config{PERL_REVISION}.$Config{PERL_VERSION}";
+ }
+ push @ppd_chunks, sprintf <<'PPD_OUT', $archname;
+ <ARCHITECTURE NAME="%s" />
+ PPD_OUT
+
+ if ($self->{PPM_INSTALL_SCRIPT}) {
+ if ($self->{PPM_INSTALL_EXEC}) {
+ push @ppd_chunks, sprintf qq{ <INSTALL EXEC="%s">%s</INSTALL>\n},
+ $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT};
+ }
+ else {
+ push @ppd_chunks, sprintf qq{ <INSTALL>%s</INSTALL>\n},
+ $self->{PPM_INSTALL_SCRIPT};
+ }
+ }
+
+ if ($self->{PPM_UNINSTALL_SCRIPT}) {
+ if ($self->{PPM_UNINSTALL_EXEC}) {
+ push @ppd_chunks, sprintf qq{ <UNINSTALL EXEC="%s">%s</UNINSTALL>\n},
+ $self->{PPM_UNINSTALL_EXEC}, $self->{PPM_UNINSTALL_SCRIPT};
+ }
+ else {
+ push @ppd_chunks, sprintf qq{ <UNINSTALL>%s</UNINSTALL>\n},
+ $self->{PPM_UNINSTALL_SCRIPT};
+ }
+ }
+
+ my ($bin_location) = $self->{BINARY_LOCATION} || '';
+ $bin_location =~ s/\\/\\\\/g;
+
+ push @ppd_chunks, sprintf <<'PPD_XML', $bin_location;
+ <CODEBASE HREF="%s" />
+ </IMPLEMENTATION>
+ </SOFTPKG>
+ PPD_XML
+
+ my @ppd_cmds = $self->stashmeta(join('', @ppd_chunks), $ppd_file);
+
+ return sprintf <<'PPD_OUT', join "\n\t", @ppd_cmds;
+ # Creates a PPD (Perl Package Description) for a binary distribution.
+ ppd :
+ %s
+ PPD_OUT
+
+ }
+
+ =item prefixify
+
+ $MM->prefixify($var, $prefix, $new_prefix, $default);
+
+ Using either $MM->{uc $var} || $Config{lc $var}, it will attempt to
+ replace it's $prefix with a $new_prefix.
+
+ Should the $prefix fail to match I<AND> a PREFIX was given as an
+ argument to WriteMakefile() it will set it to the $new_prefix +
+ $default. This is for systems whose file layouts don't neatly fit into
+ our ideas of prefixes.
+
+ This is for heuristics which attempt to create directory structures
+ that mirror those of the installed perl.
+
+ For example:
+
+ $MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1');
+
+ this will attempt to remove '/usr' from the front of the
+ $MM->{INSTALLMAN1DIR} path (initializing it to $Config{installman1dir}
+ if necessary) and replace it with '/home/foo'. If this fails it will
+ simply use '/home/foo/man/man1'.
+
+ =cut
+
+ sub prefixify {
+ my($self,$var,$sprefix,$rprefix,$default) = @_;
+
+ my $path = $self->{uc $var} ||
+ $Config_Override{lc $var} || $Config{lc $var} || '';
+
+ $rprefix .= '/' if $sprefix =~ m|/$|;
+
+ warn " prefixify $var => $path\n" if $Verbose >= 2;
+ warn " from $sprefix to $rprefix\n" if $Verbose >= 2;
+
+ if( $self->{ARGS}{PREFIX} &&
+ $path !~ s{^\Q$sprefix\E\b}{$rprefix}s )
+ {
+
+ warn " cannot prefix, using default.\n" if $Verbose >= 2;
+ warn " no default!\n" if !$default && $Verbose >= 2;
+
+ $path = File::Spec->catdir($rprefix, $default) if $default;
+ }
+
+ print " now $path\n" if $Verbose >= 2;
+ return $self->{uc $var} = $path;
+ }
+
+
+ =item processPL (o)
+
+ Defines targets to run *.PL files.
+
+ =cut
+
+ sub processPL {
+ my $self = shift;
+ my $pl_files = $self->{PL_FILES};
+
+ return "" unless $pl_files;
+
+ my $m = '';
+ foreach my $plfile (sort keys %$pl_files) {
+ my $list = ref($pl_files->{$plfile})
+ ? $pl_files->{$plfile}
+ : [$pl_files->{$plfile}];
+
+ foreach my $target (@$list) {
+ if( $Is{VMS} ) {
+ $plfile = vmsify($self->eliminate_macros($plfile));
+ $target = vmsify($self->eliminate_macros($target));
+ }
+
+ # Normally a .PL file runs AFTER pm_to_blib so it can have
+ # blib in its @INC and load the just built modules. BUT if
+ # the generated module is something in $(TO_INST_PM) which
+ # pm_to_blib depends on then it can't depend on pm_to_blib
+ # else we have a dependency loop.
+ my $pm_dep;
+ my $perlrun;
+ if( defined $self->{PM}{$target} ) {
+ $pm_dep = '';
+ $perlrun = 'PERLRUN';
+ }
+ else {
+ $pm_dep = 'pm_to_blib';
+ $perlrun = 'PERLRUNINST';
+ }
+
+ $m .= <<MAKE_FRAG;
+
+ all :: $target
+ \$(NOECHO) \$(NOOP)
+
+ $target :: $plfile $pm_dep
+ \$($perlrun) $plfile $target
+ MAKE_FRAG
+
+ }
+ }
+
+ return $m;
+ }
+
+ =item specify_shell
+
+ Specify SHELL if needed - not done on Unix.
+
+ =cut
+
+ sub specify_shell {
+ return '';
+ }
+
+ =item quote_paren
+
+ Backslashes parentheses C<()> in command line arguments.
+ Doesn't handle recursive Makefile C<$(...)> constructs,
+ but handles simple ones.
+
+ =cut
+
+ sub quote_paren {
+ my $arg = shift;
+ $arg =~ s{\$\((.+?)\)}{\$\\\\($1\\\\)}g; # protect $(...)
+ $arg =~ s{(?<!\\)([()])}{\\$1}g; # quote unprotected
+ $arg =~ s{\$\\\\\((.+?)\\\\\)}{\$($1)}g; # unprotect $(...)
+ return $arg;
+ }
+
+ =item replace_manpage_separator
+
+ my $man_name = $MM->replace_manpage_separator($file_path);
+
+ Takes the name of a package, which may be a nested package, in the
+ form 'Foo/Bar.pm' and replaces the slash with C<::> or something else
+ safe for a man page file name. Returns the replacement.
+
+ =cut
+
+ sub replace_manpage_separator {
+ my($self,$man) = @_;
+
+ $man =~ s,/+,::,g;
+ return $man;
+ }
+
+
+ =item cd
+
+ =cut
+
+ sub cd {
+ my($self, $dir, @cmds) = @_;
+
+ # No leading tab and no trailing newline makes for easier embedding
+ my $make_frag = join "\n\t", map { "cd $dir && $_" } @cmds;
+
+ return $make_frag;
+ }
+
+ =item oneliner
+
+ =cut
+
+ sub oneliner {
+ my($self, $cmd, $switches) = @_;
+ $switches = [] unless defined $switches;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ my @cmds = split /\n/, $cmd;
+ $cmd = join " \n\t -e ", map $self->quote_literal($_), @cmds;
+ $cmd = $self->escape_newlines($cmd);
+
+ $switches = join ' ', @$switches;
+
+ return qq{\$(ABSPERLRUN) $switches -e $cmd --};
+ }
+
+
+ =item quote_literal
+
+ Quotes macro literal value suitable for being used on a command line so
+ that when expanded by make, will be received by command as given to
+ this method:
+
+ my $quoted = $mm->quote_literal(q{it isn't});
+ # returns:
+ # 'it isn'\''t'
+ print MAKEFILE "target:\n\techo $quoted\n";
+ # when run "make target", will output:
+ # it isn't
+
+ =cut
+
+ sub quote_literal {
+ my($self, $text, $opts) = @_;
+ $opts->{allow_variables} = 1 unless defined $opts->{allow_variables};
+
+ # Quote single quotes
+ $text =~ s{'}{'\\''}g;
+
+ $text = $opts->{allow_variables}
+ ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text);
+
+ return "'$text'";
+ }
+
+
+ =item escape_newlines
+
+ =cut
+
+ sub escape_newlines {
+ my($self, $text) = @_;
+
+ $text =~ s{\n}{\\\n}g;
+
+ return $text;
+ }
+
+
+ =item max_exec_len
+
+ Using POSIX::ARG_MAX. Otherwise falling back to 4096.
+
+ =cut
+
+ sub max_exec_len {
+ my $self = shift;
+
+ if (!defined $self->{_MAX_EXEC_LEN}) {
+ if (my $arg_max = eval { require POSIX; &POSIX::ARG_MAX }) {
+ $self->{_MAX_EXEC_LEN} = $arg_max;
+ }
+ else { # POSIX minimum exec size
+ $self->{_MAX_EXEC_LEN} = 4096;
+ }
+ }
+
+ return $self->{_MAX_EXEC_LEN};
+ }
+
+
+ =item static (o)
+
+ Defines the static target.
+
+ =cut
+
+ sub static {
+ # --- Static Loading Sections ---
+
+ my($self) = shift;
+ '
+ ## $(INST_PM) has been moved to the all: target.
+ ## It remains here for awhile to allow for old usage: "make static"
+ static :: $(FIRST_MAKEFILE) $(INST_STATIC)
+ $(NOECHO) $(NOOP)
+ ';
+ }
+
+ sub static_lib {
+ my($self) = @_;
+ return '' unless $self->has_link_code;
+ my(@m);
+ my @libs;
+ if ($self->{XSMULTI}) {
+ for my $ext ($self->_xs_list_basenames) {
+ my ($v, $d, $f) = File::Spec->splitpath($ext);
+ my @d = File::Spec->splitdir($d);
+ shift @d if $d[0] eq 'lib';
+ my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+ my $instfile = $self->catfile($instdir, "$f\$(LIB_EXT)");
+ my $objfile = "$ext\$(OBJ_EXT)";
+ push @libs, [ $objfile, $instfile, $instdir ];
+ }
+ } else {
+ @libs = ([ qw($(OBJECT) $(INST_STATIC) $(INST_ARCHAUTODIR)) ]);
+ }
+ push @m, map { $self->xs_make_static_lib(@$_); } @libs;
+ join "\n", @m;
+ }
+
+ =item xs_make_static_lib
+
+ Defines the recipes for the C<static_lib> section.
+
+ =cut
+
+ sub xs_make_static_lib {
+ my ($self, $from, $to, $todir) = @_;
+ my @m = sprintf '%s: %s $(MYEXTLIB) %s$(DFSEP).exists'."\n", $to, $from, $todir;
+ push @m, "\t\$(RM_F) \"\$\@\"\n";
+ push @m, $self->static_lib_fixtures;
+ push @m, $self->static_lib_pure_cmd($from);
+ push @m, "\t\$(CHMOD) \$(PERM_RWX) \$\@\n";
+ push @m, $self->static_lib_closures($todir);
+ join '', @m;
+ }
+
+ =item static_lib_closures
+
+ Records C<$(EXTRALIBS)> in F<extralibs.ld> and F<$(PERL_SRC)/ext.libs>.
+
+ =cut
+
+ sub static_lib_closures {
+ my ($self, $todir) = @_;
+ my @m = sprintf <<'MAKE_FRAG', $todir;
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" > %s$(DFSEP)extralibs.ld
+ MAKE_FRAG
+ # Old mechanism - still available:
+ push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)$(DFSEP)ext.libs
+ MAKE_FRAG
+ @m;
+ }
+
+ =item static_lib_fixtures
+
+ Handles copying C<$(MYEXTLIB)> as starter for final static library that
+ then gets added to.
+
+ =cut
+
+ sub static_lib_fixtures {
+ my ($self) = @_;
+ # If this extension has its own library (eg SDBM_File)
+ # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+ return unless $self->{MYEXTLIB};
+ "\t\$(CP) \$(MYEXTLIB) \"\$\@\"\n";
+ }
+
+ =item static_lib_pure_cmd
+
+ Defines how to run the archive utility.
+
+ =cut
+
+ sub static_lib_pure_cmd {
+ my ($self, $from) = @_;
+ my $ar;
+ if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
+ # Prefer the absolute pathed ar if available so that PATH
+ # doesn't confuse us. Perl itself is built with the full_ar.
+ $ar = 'FULL_AR';
+ } else {
+ $ar = 'AR';
+ }
+ sprintf <<'MAKE_FRAG', $ar, $from;
+ $(%s) $(AR_STATIC_ARGS) "$@" %s
+ $(RANLIB) "$@"
+ MAKE_FRAG
+ }
+
+ =item staticmake (o)
+
+ Calls makeaperl.
+
+ =cut
+
+ sub staticmake {
+ my($self, %attribs) = @_;
+ my(@static);
+
+ my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
+
+ # And as it's not yet built, we add the current extension
+ # but only if it has some C code (or XS code, which implies C code)
+ if (@{$self->{C}}) {
+ @static = File::Spec->catfile($self->{INST_ARCHLIB},
+ "auto",
+ $self->{FULLEXT},
+ "$self->{BASEEXT}$self->{LIB_EXT}"
+ );
+ }
+
+ # Either we determine now, which libraries we will produce in the
+ # subdirectories or we do it at runtime of the make.
+
+ # We could ask all subdir objects, but I cannot imagine, why it
+ # would be necessary.
+
+ # Instead we determine all libraries for the new perl at
+ # runtime.
+ my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
+
+ $self->makeaperl(MAKE => $self->{MAKEFILE},
+ DIRS => \@searchdirs,
+ STAT => \@static,
+ INCL => \@perlinc,
+ TARGET => $self->{MAP_TARGET},
+ TMP => "",
+ LIBPERL => $self->{LIBPERL_A}
+ );
+ }
+
+ =item subdir_x (o)
+
+ Helper subroutine for subdirs
+
+ =cut
+
+ sub subdir_x {
+ my($self, $subdir) = @_;
+
+ my $subdir_cmd = $self->cd($subdir,
+ '$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)'
+ );
+ return sprintf <<'EOT', $subdir_cmd;
+
+ subdirs ::
+ $(NOECHO) %s
+ EOT
+
+ }
+
+ =item subdirs (o)
+
+ Defines targets to process subdirectories.
+
+ =cut
+
+ sub subdirs {
+ # --- Sub-directory Sections ---
+ my($self) = shift;
+ my(@m);
+ # This method provides a mechanism to automatically deal with
+ # subdirectories containing further Makefile.PL scripts.
+ # It calls the subdir_x() method for each subdirectory.
+ foreach my $dir (@{$self->{DIR}}){
+ push @m, $self->subdir_x($dir);
+ #### print "Including $dir subdirectory\n";
+ }
+ if (@m){
+ unshift @m, <<'EOF';
+
+ # The default clean, realclean and test targets in this Makefile
+ # have automatically been given entries for each subdir.
+
+ EOF
+ } else {
+ push(@m, "\n# none")
+ }
+ join('',@m);
+ }
+
+ =item test (o)
+
+ Defines the test targets.
+
+ =cut
+
+ sub test {
+ my($self, %attribs) = @_;
+ my $tests = $attribs{TESTS} || '';
+ if (!$tests && -d 't' && defined $attribs{RECURSIVE_TEST_FILES}) {
+ $tests = $self->find_tests_recursive;
+ }
+ elsif (!$tests && -d 't') {
+ $tests = $self->find_tests;
+ }
+ # have to do this because nmake is broken
+ $tests =~ s!/!\\!g if $self->is_make_type('nmake');
+ # note: 'test.pl' name is also hardcoded in init_dirscan()
+ my @m;
+ my $default_testtype = $Config{usedl} ? 'dynamic' : 'static';
+ push @m, <<EOF;
+ TEST_VERBOSE=0
+ TEST_TYPE=test_\$(LINKTYPE)
+ TEST_FILE = test.pl
+ TEST_FILES = $tests
+ TESTDB_SW = -d
+
+ testdb :: testdb_\$(LINKTYPE)
+ \$(NOECHO) \$(NOOP)
+
+ test :: \$(TEST_TYPE)
+ \$(NOECHO) \$(NOOP)
+
+ # Occasionally we may face this degenerate target:
+ test_ : test_$default_testtype
+ \$(NOECHO) \$(NOOP)
+
+ EOF
+
+ for my $linktype (qw(dynamic static)) {
+ push @m, "subdirs-test_$linktype :: $linktype pure_all\n";
+ foreach my $dir (@{ $self->{DIR} }) {
+ my $test = $self->cd($dir, "\$(MAKE) test_$linktype \$(PASTHRU)");
+ push @m, "\t\$(NOECHO) $test\n";
+ }
+ push @m, "\n";
+ if ($tests or -f "test.pl") {
+ for my $testspec ([ '', '' ], [ 'db', ' $(TESTDB_SW)' ]) {
+ my ($db, $switch) = @$testspec;
+ my ($command, $deps);
+ $deps = "subdirs-test_$linktype";
+ if ($linktype eq 'static' and $self->needs_linking) {
+ my $target = File::Spec->rel2abs('$(MAP_TARGET)');
+ $command = qq{"$target" \$(MAP_PERLINC)};
+ $deps .= ' $(MAP_TARGET)';
+ } else {
+ $command = '$(FULLPERLRUN)' . $switch;
+ }
+ push @m, "test${db}_$linktype :: $deps\n";
+ push @m, $self->test_via_harness($command, '$(TEST_FILES)')
+ if $tests;
+ push @m, $self->test_via_script($command, '$(TEST_FILE)')
+ if -f "test.pl";
+ push @m, "\n";
+ }
+ } else {
+ push @m, _sprintf562 <<'EOF', $linktype;
+ testdb_%1$s test_%1$s :: subdirs-test_%1$s
+ $(NOECHO) $(ECHO) 'No tests defined for $(NAME) extension.'
+
+ EOF
+ }
+ }
+
+ join "", @m;
+ }
+
+ =item test_via_harness (override)
+
+ For some reason which I forget, Unix machines like to have
+ PERL_DL_NONLAZY set for tests.
+
+ =cut
+
+ sub test_via_harness {
+ my($self, $perl, $tests) = @_;
+ return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests);
+ }
+
+ =item test_via_script (override)
+
+ Again, the PERL_DL_NONLAZY thing.
+
+ =cut
+
+ sub test_via_script {
+ my($self, $perl, $script) = @_;
+ return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script);
+ }
+
+
+ =item tool_xsubpp (o)
+
+ Determines typemaps, xsubpp version, prototype behaviour.
+
+ =cut
+
+ sub tool_xsubpp {
+ my($self) = shift;
+ return "" unless $self->needs_linking;
+
+ my $xsdir;
+ my @xsubpp_dirs = @INC;
+
+ # Make sure we pick up the new xsubpp if we're building perl.
+ unshift @xsubpp_dirs, $self->{PERL_LIB} if $self->{PERL_CORE};
+
+ my $foundxsubpp = 0;
+ foreach my $dir (@xsubpp_dirs) {
+ $xsdir = File::Spec->catdir($dir, 'ExtUtils');
+ if( -r File::Spec->catfile($xsdir, "xsubpp") ) {
+ $foundxsubpp = 1;
+ last;
+ }
+ }
+ die "ExtUtils::MM_Unix::tool_xsubpp : Can't find xsubpp" if !$foundxsubpp;
+
+ my $tmdir = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+ my(@tmdeps) = File::Spec->catfile($tmdir,'typemap');
+ if( $self->{TYPEMAPS} ){
+ foreach my $typemap (@{$self->{TYPEMAPS}}){
+ if( ! -f $typemap ) {
+ warn "Typemap $typemap not found.\n";
+ }
+ else {
+ push(@tmdeps, $typemap);
+ }
+ }
+ }
+ push(@tmdeps, "typemap") if -f "typemap";
+ # absolutised because with deep-located typemaps, eg "lib/XS/typemap",
+ # if xsubpp is called from top level with
+ # $(XSUBPP) ... -typemap "lib/XS/typemap" "lib/XS/Test.xs"
+ # it says:
+ # Can't find lib/XS/type map in (fulldir)/lib/XS
+ # because ExtUtils::ParseXS::process_file chdir's to .xs file's
+ # location. This is the only way to get all specified typemaps used,
+ # wherever located.
+ my @tmargs = map { '-typemap '.$self->quote_literal(File::Spec->rel2abs($_)) } @tmdeps;
+ $_ = $self->quote_dep($_) for @tmdeps;
+ if( exists $self->{XSOPT} ){
+ unshift( @tmargs, $self->{XSOPT} );
+ }
+
+ if ($Is{VMS} &&
+ $Config{'ldflags'} &&
+ $Config{'ldflags'} =~ m!/Debug!i &&
+ (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)
+ )
+ {
+ unshift(@tmargs,'-nolinenumbers');
+ }
+
+
+ $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
+ my $xsdirdep = $self->quote_dep($xsdir);
+ # -dep for use when dependency not command
+
+ return qq{
+ XSUBPPDIR = $xsdir
+ XSUBPP = "\$(XSUBPPDIR)\$(DFSEP)xsubpp"
+ XSUBPPRUN = \$(PERLRUN) \$(XSUBPP)
+ XSPROTOARG = $self->{XSPROTOARG}
+ XSUBPPDEPS = @tmdeps $xsdirdep\$(DFSEP)xsubpp
+ XSUBPPARGS = @tmargs
+ XSUBPP_EXTRA_ARGS =
+ };
+ }
+
+
+ =item all_target
+
+ Build man pages, too
+
+ =cut
+
+ sub all_target {
+ my $self = shift;
+
+ return <<'MAKE_EXT';
+ all :: pure_all manifypods
+ $(NOECHO) $(NOOP)
+ MAKE_EXT
+ }
+
+ =item top_targets (o)
+
+ Defines the targets all, subdirs, config, and O_FILES
+
+ =cut
+
+ sub top_targets {
+ # --- Target Sections ---
+
+ my($self) = shift;
+ my(@m);
+
+ push @m, $self->all_target, "\n" unless $self->{SKIPHASH}{'all'};
+
+ push @m, sprintf <<'EOF';
+ pure_all :: config pm_to_blib subdirs linkext
+ $(NOECHO) $(NOOP)
+
+ $(NOECHO) $(NOOP)
+
+ subdirs :: $(MYEXTLIB)
+ $(NOECHO) $(NOOP)
+
+ config :: $(FIRST_MAKEFILE) blibdirs
+ $(NOECHO) $(NOOP)
+ EOF
+
+ push @m, '
+ $(O_FILES) : $(H_FILES)
+ ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
+
+ push @m, q{
+ help :
+ perldoc ExtUtils::MakeMaker
+ };
+
+ join('',@m);
+ }
+
+ =item writedoc
+
+ Obsolete, deprecated method. Not used since Version 5.21.
+
+ =cut
+
+ sub writedoc {
+ # --- perllocal.pod section ---
+ my($self,$what,$name,@attribs)=@_;
+ my $time = localtime;
+ print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
+ print join "\n\n=item *\n\n", map("C<$_>",@attribs);
+ print "\n\n=back\n\n";
+ }
+
+ =item xs_c (o)
+
+ Defines the suffix rules to compile XS files to C.
+
+ =cut
+
+ sub xs_c {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+ .xs.c:
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc
+ $(MV) $*.xsc $*.c
+ ';
+ }
+
+ =item xs_cpp (o)
+
+ Defines the suffix rules to compile XS files to C++.
+
+ =cut
+
+ sub xs_cpp {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+ .xs.cpp:
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc
+ $(MV) $*.xsc $*.cpp
+ ';
+ }
+
+ =item xs_o (o)
+
+ Defines suffix rules to go from XS to object files directly. This was
+ originally only intended for broken make implementations, but is now
+ necessary for per-XS file under C<XSMULTI>, since each XS file might
+ have an individual C<$(VERSION)>.
+
+ =cut
+
+ sub xs_o {
+ my ($self) = @_;
+ return '' unless $self->needs_linking();
+ my $minus_o = $self->xs_obj_opt('$*$(OBJ_EXT)');
+ my $frag = '';
+ # dmake makes noise about ambiguous rule
+ $frag .= sprintf <<'EOF', $minus_o unless $self->is_make_type('dmake');
+ .xs$(OBJ_EXT) :
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc
+ $(MV) $*.xsc $*.c
+ $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c %s
+ EOF
+ if ($self->{XSMULTI}) {
+ for my $ext ($self->_xs_list_basenames) {
+ my $pmfile = "$ext.pm";
+ croak "$ext.xs has no matching $pmfile: $!" unless -f $pmfile;
+ my $version = $self->parse_version($pmfile);
+ my $cccmd = $self->{CONST_CCCMD};
+ $cccmd =~ s/^\s*CCCMD\s*=\s*//;
+ $cccmd =~ s/\$\(DEFINE_VERSION\)/-DVERSION=\\"$version\\"/;
+ $cccmd =~ s/\$\(XS_DEFINE_VERSION\)/-DXS_VERSION=\\"$version\\"/;
+ $self->_xsbuild_replace_macro($cccmd, 'xs', $ext, 'INC');
+ my $define = '$(DEFINE)';
+ $self->_xsbuild_replace_macro($define, 'xs', $ext, 'DEFINE');
+ # 1 2 3 4
+ $frag .= _sprintf562 <<'EOF', $ext, $cccmd, $minus_o, $define;
+
+ %1$s$(OBJ_EXT): %1$s.xs
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc
+ $(MV) $*.xsc $*.c
+ %2$s $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) %4$s $*.c %3$s
+ EOF
+ }
+ }
+ $frag;
+ }
+
+ # param gets modified
+ sub _xsbuild_replace_macro {
+ my ($self, undef, $xstype, $ext, $varname) = @_;
+ my $value = $self->_xsbuild_value($xstype, $ext, $varname);
+ return unless defined $value;
+ $_[1] =~ s/\$\($varname\)/$value/;
+ }
+
+ sub _xsbuild_value {
+ my ($self, $xstype, $ext, $varname) = @_;
+ return $self->{XSBUILD}{$xstype}{$ext}{$varname}
+ if $self->{XSBUILD}{$xstype}{$ext}{$varname};
+ return $self->{XSBUILD}{$xstype}{all}{$varname}
+ if $self->{XSBUILD}{$xstype}{all}{$varname};
+ ();
+ }
+
+ 1;
+
+ =back
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MakeMaker>
+
+ =cut
+
+ __END__
+EXTUTILS_MM_UNIX
+
+$fatpacked{"ExtUtils/MM_VMS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_VMS';
+ package ExtUtils::MM_VMS;
+
+ use strict;
+
+ use ExtUtils::MakeMaker::Config;
+ require Exporter;
+
+ BEGIN {
+ # so we can compile the thing on non-VMS platforms.
+ if( $^O eq 'VMS' ) {
+ require VMS::Filespec;
+ VMS::Filespec->import;
+ }
+ }
+
+ use File::Basename;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+ our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+ use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562);
+ our $Revision = $ExtUtils::MakeMaker::Revision;
+
+
+ =head1 NAME
+
+ ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ Do not use this directly.
+ Instead, use ExtUtils::MM and it will figure out which MM_*
+ class to use for you.
+
+ =head1 DESCRIPTION
+
+ See ExtUtils::MM_Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ =head2 Methods always loaded
+
+ =over 4
+
+ =item wraplist
+
+ Converts a list into a string wrapped at approximately 80 columns.
+
+ =cut
+
+ sub wraplist {
+ my($self) = shift;
+ my($line,$hlen) = ('',0);
+
+ foreach my $word (@_) {
+ # Perl bug -- seems to occasionally insert extra elements when
+ # traversing array (scalar(@array) doesn't show them, but
+ # foreach(@array) does) (5.00307)
+ next unless $word =~ /\w/;
+ $line .= ' ' if length($line);
+ if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
+ $line .= $word;
+ $hlen += length($word) + 2;
+ }
+ $line;
+ }
+
+
+ # This isn't really an override. It's just here because ExtUtils::MM_VMS
+ # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
+ # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
+ # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
+ # XXX This hackery will die soon. --Schwern
+ sub ext {
+ require ExtUtils::Liblist::Kid;
+ goto &ExtUtils::Liblist::Kid::ext;
+ }
+
+ =back
+
+ =head2 Methods
+
+ Those methods which override default MM_Unix methods are marked
+ "(override)", while methods unique to MM_VMS are marked "(specific)".
+ For overridden methods, documentation is limited to an explanation
+ of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
+ documentation for more details.
+
+ =over 4
+
+ =item guess_name (override)
+
+ Try to determine name of extension being built. We begin with the name
+ of the current directory. Since VMS filenames are case-insensitive,
+ however, we look for a F<.pm> file whose name matches that of the current
+ directory (presumably the 'main' F<.pm> file for this extension), and try
+ to find a C<package> statement from which to obtain the Mixed::Case
+ package name.
+
+ =cut
+
+ sub guess_name {
+ my($self) = @_;
+ my($defname,$defpm,@pm,%xs);
+ local *PM;
+
+ $defname = basename(fileify($ENV{'DEFAULT'}));
+ $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
+ $defpm = $defname;
+ # Fallback in case for some reason a user has copied the files for an
+ # extension into a working directory whose name doesn't reflect the
+ # extension's name. We'll use the name of a unique .pm file, or the
+ # first .pm file with a matching .xs file.
+ if (not -e "${defpm}.pm") {
+ @pm = glob('*.pm');
+ s/.pm$// for @pm;
+ if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
+ elsif (@pm) {
+ %xs = map { s/.xs$//; ($_,1) } glob('*.xs'); ## no critic
+ if (keys %xs) {
+ foreach my $pm (@pm) {
+ $defpm = $pm, last if exists $xs{$pm};
+ }
+ }
+ }
+ }
+ if (open(my $pm, '<', "${defpm}.pm")){
+ while (<$pm>) {
+ if (/^\s*package\s+([^;]+)/i) {
+ $defname = $1;
+ last;
+ }
+ }
+ print "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
+ "defaulting package name to $defname\n"
+ if eof($pm);
+ close $pm;
+ }
+ else {
+ print "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
+ "defaulting package name to $defname\n";
+ }
+ $defname =~ s#[\d.\-_]+$##;
+ $defname;
+ }
+
+ =item find_perl (override)
+
+ Use VMS file specification syntax and CLI commands to find and
+ invoke Perl images.
+
+ =cut
+
+ sub find_perl {
+ my($self, $ver, $names, $dirs, $trace) = @_;
+ my($vmsfile,@sdirs,@snames,@cand);
+ my($rslt);
+ my($inabs) = 0;
+ local *TCF;
+
+ if( $self->{PERL_CORE} ) {
+ # Check in relative directories first, so we pick up the current
+ # version of Perl if we're running MakeMaker as part of the main build.
+ @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
+ my($absb) = $self->file_name_is_absolute($b);
+ if ($absa && $absb) { return $a cmp $b }
+ else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
+ } @$dirs;
+ # Check miniperl before perl, and check names likely to contain
+ # version numbers before "generic" names, so we pick up an
+ # executable that's less likely to be from an old installation.
+ @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
+ my($bb) = $b =~ m!([^:>\]/]+)$!;
+ my($ahasdir) = (length($a) - length($ba) > 0);
+ my($bhasdir) = (length($b) - length($bb) > 0);
+ if ($ahasdir and not $bhasdir) { return 1; }
+ elsif ($bhasdir and not $ahasdir) { return -1; }
+ else { $bb =~ /\d/ <=> $ba =~ /\d/
+ or substr($ba,0,1) cmp substr($bb,0,1)
+ or length($bb) <=> length($ba) } } @$names;
+ }
+ else {
+ @sdirs = @$dirs;
+ @snames = @$names;
+ }
+
+ # Image names containing Perl version use '_' instead of '.' under VMS
+ s/\.(\d+)$/_$1/ for @snames;
+ if ($trace >= 2){
+ print "Looking for perl $ver by these names:\n";
+ print "\t@snames,\n";
+ print "in these dirs:\n";
+ print "\t@sdirs\n";
+ }
+ foreach my $dir (@sdirs){
+ next unless defined $dir; # $self->{PERL_SRC} may be undefined
+ $inabs++ if $self->file_name_is_absolute($dir);
+ if ($inabs == 1) {
+ # We've covered relative dirs; everything else is an absolute
+ # dir (probably an installed location). First, we'll try
+ # potential command names, to see whether we can avoid a long
+ # MCR expression.
+ foreach my $name (@snames) {
+ push(@cand,$name) if $name =~ /^[\w\-\$]+$/;
+ }
+ $inabs++; # Should happen above in next $dir, but just in case...
+ }
+ foreach my $name (@snames){
+ push @cand, ($name !~ m![/:>\]]!) ? $self->catfile($dir,$name)
+ : $self->fixpath($name,0);
+ }
+ }
+ foreach my $name (@cand) {
+ print "Checking $name\n" if $trace >= 2;
+ # If it looks like a potential command, try it without the MCR
+ if ($name =~ /^[\w\-\$]+$/) {
+ open(my $tcf, ">", "temp_mmvms.com")
+ or die('unable to open temp file');
+ print $tcf "\$ set message/nofacil/nosever/noident/notext\n";
+ print $tcf "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
+ close $tcf;
+ $rslt = `\@temp_mmvms.com` ;
+ unlink('temp_mmvms.com');
+ if ($rslt =~ /VER_OK/) {
+ print "Using PERL=$name\n" if $trace;
+ return $name;
+ }
+ }
+ next unless $vmsfile = $self->maybe_command($name);
+ $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
+ print "Executing $vmsfile\n" if ($trace >= 2);
+ open(my $tcf, '>', "temp_mmvms.com")
+ or die('unable to open temp file');
+ print $tcf "\$ set message/nofacil/nosever/noident/notext\n";
+ print $tcf "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
+ close $tcf;
+ $rslt = `\@temp_mmvms.com`;
+ unlink('temp_mmvms.com');
+ if ($rslt =~ /VER_OK/) {
+ print "Using PERL=MCR $vmsfile\n" if $trace;
+ return "MCR $vmsfile";
+ }
+ }
+ print "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+ 0; # false and not empty
+ }
+
+ =item _fixin_replace_shebang (override)
+
+ Helper routine for MM->fixin(), overridden because there's no such thing as an
+ actual shebang line that will be interpreted by the shell, so we just prepend
+ $Config{startperl} and preserve the shebang line argument for any switches it
+ may contain.
+
+ =cut
+
+ sub _fixin_replace_shebang {
+ my ( $self, $file, $line ) = @_;
+
+ my ( undef, $arg ) = split ' ', $line, 2;
+
+ return $Config{startperl} . "\n" . $Config{sharpbang} . "perl $arg\n";
+ }
+
+ =item maybe_command (override)
+
+ Follows VMS naming conventions for executable files.
+ If the name passed in doesn't exactly match an executable file,
+ appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
+ to check for DCL procedure. If this fails, checks directories in DCL$PATH
+ and finally F<Sys$System:> for an executable file having the name specified,
+ with or without the F<.Exe>-equivalent suffix.
+
+ =cut
+
+ sub maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d _;
+ my(@dirs) = ('');
+ my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
+
+ if ($file !~ m![/:>\]]!) {
+ for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
+ my $dir = $ENV{"DCL\$PATH;$i"};
+ $dir .= ':' unless $dir =~ m%[\]:]$%;
+ push(@dirs,$dir);
+ }
+ push(@dirs,'Sys$System:');
+ foreach my $dir (@dirs) {
+ my $sysfile = "$dir$file";
+ foreach my $ext (@exts) {
+ return $file if -x "$sysfile$ext" && ! -d _;
+ }
+ }
+ }
+ return 0;
+ }
+
+
+ =item pasthru (override)
+
+ VMS has $(MMSQUALIFIERS) which is a listing of all the original command line
+ options. This is used in every invocation of make in the VMS Makefile so
+ PASTHRU should not be necessary. Using PASTHRU tends to blow commands past
+ the 256 character limit.
+
+ =cut
+
+ sub pasthru {
+ return "PASTHRU=\n";
+ }
+
+
+ =item pm_to_blib (override)
+
+ VMS wants a dot in every file so we can't have one called 'pm_to_blib',
+ it becomes 'pm_to_blib.' and MMS/K isn't smart enough to know that when
+ you have a target called 'pm_to_blib' it should look for 'pm_to_blib.'.
+
+ So in VMS its pm_to_blib.ts.
+
+ =cut
+
+ sub pm_to_blib {
+ my $self = shift;
+
+ my $make = $self->SUPER::pm_to_blib;
+
+ $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m;
+ $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts};
+
+ $make = <<'MAKE' . $make;
+ # Dummy target to match Unix target name; we use pm_to_blib.ts as
+ # timestamp file to avoid repeated invocations under VMS
+ pm_to_blib : pm_to_blib.ts
+ $(NOECHO) $(NOOP)
+
+ MAKE
+
+ return $make;
+ }
+
+
+ =item perl_script (override)
+
+ If name passed in doesn't specify a readable file, appends F<.com> or
+ F<.pl> and tries again, since it's customary to have file types on all files
+ under VMS.
+
+ =cut
+
+ sub perl_script {
+ my($self,$file) = @_;
+ return $file if -r $file && ! -d _;
+ return "$file.com" if -r "$file.com";
+ return "$file.pl" if -r "$file.pl";
+ return '';
+ }
+
+
+ =item replace_manpage_separator
+
+ Use as separator a character which is legal in a VMS-syntax file name.
+
+ =cut
+
+ sub replace_manpage_separator {
+ my($self,$man) = @_;
+ $man = unixify($man);
+ $man =~ s#/+#__#g;
+ $man;
+ }
+
+ =item init_DEST
+
+ (override) Because of the difficulty concatenating VMS filepaths we
+ must pre-expand the DEST* variables.
+
+ =cut
+
+ sub init_DEST {
+ my $self = shift;
+
+ $self->SUPER::init_DEST;
+
+ # Expand DEST variables.
+ foreach my $var ($self->installvars) {
+ my $destvar = 'DESTINSTALL'.$var;
+ $self->{$destvar} = $self->eliminate_macros($self->{$destvar});
+ }
+ }
+
+
+ =item init_DIRFILESEP
+
+ No separator between a directory path and a filename on VMS.
+
+ =cut
+
+ sub init_DIRFILESEP {
+ my($self) = shift;
+
+ $self->{DIRFILESEP} = '';
+ return 1;
+ }
+
+
+ =item init_main (override)
+
+
+ =cut
+
+ sub init_main {
+ my($self) = shift;
+
+ $self->SUPER::init_main;
+
+ $self->{DEFINE} ||= '';
+ if ($self->{DEFINE} ne '') {
+ my(@terms) = split(/\s+/,$self->{DEFINE});
+ my(@defs,@udefs);
+ foreach my $def (@terms) {
+ next unless $def;
+ my $targ = \@defs;
+ if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
+ $targ = \@udefs if $1 eq 'U';
+ $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
+ $def =~ s/^'(.*)'$/$1/; # from entire term or argument
+ }
+ if ($def =~ /=/) {
+ $def =~ s/"/""/g; # Protect existing " from DCL
+ $def = qq["$def"]; # and quote to prevent parsing of =
+ }
+ push @$targ, $def;
+ }
+
+ $self->{DEFINE} = '';
+ if (@defs) {
+ $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
+ }
+ if (@udefs) {
+ $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
+ }
+ }
+ }
+
+ =item init_tools (override)
+
+ Provide VMS-specific forms of various utility commands.
+
+ Sets DEV_NULL to nothing because I don't know how to do it on VMS.
+
+ Changes EQUALIZE_TIMESTAMP to set revision date of target file to
+ one second later than source file, since MMK interprets precisely
+ equal revision dates for a source and target file as a sign that the
+ target needs to be updated.
+
+ =cut
+
+ sub init_tools {
+ my($self) = @_;
+
+ $self->{NOOP} = 'Continue';
+ $self->{NOECHO} ||= '@ ';
+
+ $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE} || 'Descrip.MMS';
+ $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE};
+ $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
+ $self->{MAKEFILE_OLD} ||= $self->eliminate_macros('$(FIRST_MAKEFILE)_old');
+ #
+ # If an extension is not specified, then MMS/MMK assumes an
+ # an extension of .MMS. If there really is no extension,
+ # then a trailing "." needs to be appended to specify a
+ # a null extension.
+ #
+ $self->{MAKEFILE} .= '.' unless $self->{MAKEFILE} =~ m/\./;
+ $self->{FIRST_MAKEFILE} .= '.' unless $self->{FIRST_MAKEFILE} =~ m/\./;
+ $self->{MAKE_APERL_FILE} .= '.' unless $self->{MAKE_APERL_FILE} =~ m/\./;
+ $self->{MAKEFILE_OLD} .= '.' unless $self->{MAKEFILE_OLD} =~ m/\./;
+
+ $self->{MACROSTART} ||= '/Macro=(';
+ $self->{MACROEND} ||= ')';
+ $self->{USEMAKEFILE} ||= '/Descrip=';
+
+ $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
+
+ $self->{MOD_INSTALL} ||=
+ $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+ install([ from_to => {split('\|', <STDIN>)}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]);
+ CODE
+
+ $self->{UMASK_NULL} = '! ';
+
+ $self->SUPER::init_tools;
+
+ # Use the default shell
+ $self->{SHELL} ||= 'Posix';
+
+ # Redirection on VMS goes before the command, not after as on Unix.
+ # $(DEV_NULL) is used once and its not worth going nuts over making
+ # it work. However, Unix's DEV_NULL is quite wrong for VMS.
+ $self->{DEV_NULL} = '';
+
+ return;
+ }
+
+ =item init_platform (override)
+
+ Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
+
+ MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
+ $VERSION.
+
+ =cut
+
+ sub init_platform {
+ my($self) = shift;
+
+ $self->{MM_VMS_REVISION} = $Revision;
+ $self->{MM_VMS_VERSION} = $VERSION;
+ $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
+ if $self->{PERL_SRC};
+ }
+
+
+ =item platform_constants
+
+ =cut
+
+ sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+ }
+
+
+ =item init_VERSION (override)
+
+ Override the *DEFINE_VERSION macros with VMS semantics. Translate the
+ MAKEMAKER filepath to VMS style.
+
+ =cut
+
+ sub init_VERSION {
+ my $self = shift;
+
+ $self->SUPER::init_VERSION;
+
+ $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""';
+ $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
+ $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
+ }
+
+
+ =item constants (override)
+
+ Fixes up numerous file and directory macros to insure VMS syntax
+ regardless of input syntax. Also makes lists of files
+ comma-separated.
+
+ =cut
+
+ sub constants {
+ my($self) = @_;
+
+ # Be kind about case for pollution
+ for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
+
+ # Cleanup paths for directories in MMS macros.
+ foreach my $macro ( qw [
+ INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
+ PERL_LIB PERL_ARCHLIB
+ PERL_INC PERL_SRC ],
+ (map { 'INSTALL'.$_ } $self->installvars)
+ )
+ {
+ next unless defined $self->{$macro};
+ next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
+ $self->{$macro} = $self->fixpath($self->{$macro},1);
+ }
+
+ # Cleanup paths for files in MMS macros.
+ foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD
+ MAKE_APERL_FILE MYEXTLIB] )
+ {
+ next unless defined $self->{$macro};
+ $self->{$macro} = $self->fixpath($self->{$macro},0);
+ }
+
+ # Fixup files for MMS macros
+ # XXX is this list complete?
+ for my $macro (qw/
+ FULLEXT VERSION_FROM
+ / ) {
+ next unless defined $self->{$macro};
+ $self->{$macro} = $self->fixpath($self->{$macro},0);
+ }
+
+
+ for my $macro (qw/
+ OBJECT LDFROM
+ / ) {
+ next unless defined $self->{$macro};
+
+ # Must expand macros before splitting on unescaped whitespace.
+ $self->{$macro} = $self->eliminate_macros($self->{$macro});
+ if ($self->{$macro} =~ /(?<!\^)\s/) {
+ $self->{$macro} =~ s/(\\)?\n+\s+/ /g;
+ $self->{$macro} = $self->wraplist(
+ map $self->fixpath($_,0), split /,?(?<!\^)\s+/, $self->{$macro}
+ );
+ }
+ else {
+ $self->{$macro} = $self->fixpath($self->{$macro},0);
+ }
+ }
+
+ for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
+ # Where is the space coming from? --jhi
+ next unless $self ne " " && defined $self->{$macro};
+ my %tmp = ();
+ for my $key (keys %{$self->{$macro}}) {
+ $tmp{$self->fixpath($key,0)} =
+ $self->fixpath($self->{$macro}{$key},0);
+ }
+ $self->{$macro} = \%tmp;
+ }
+
+ for my $macro (qw/ C O_FILES H /) {
+ next unless defined $self->{$macro};
+ my @tmp = ();
+ for my $val (@{$self->{$macro}}) {
+ push(@tmp,$self->fixpath($val,0));
+ }
+ $self->{$macro} = \@tmp;
+ }
+
+ # mms/k does not define a $(MAKE) macro.
+ $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)';
+
+ return $self->SUPER::constants;
+ }
+
+
+ =item special_targets
+
+ Clear the default .SUFFIXES and put in our own list.
+
+ =cut
+
+ sub special_targets {
+ my $self = shift;
+
+ my $make_frag .= <<'MAKE_FRAG';
+ .SUFFIXES :
+ .SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
+
+ MAKE_FRAG
+
+ return $make_frag;
+ }
+
+ =item cflags (override)
+
+ Bypass shell script and produce qualifiers for CC directly (but warn
+ user if a shell script for this extension exists). Fold multiple
+ /Defines into one, since some C compilers pay attention to only one
+ instance of this qualifier on the command line.
+
+ =cut
+
+ sub cflags {
+ my($self,$libperl) = @_;
+ my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
+ my($definestr,$undefstr,$flagoptstr) = ('','','');
+ my($incstr) = '/Include=($(PERL_INC)';
+ my($name,$sys,@m);
+
+ ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+ print "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
+ " required to modify CC command for $self->{'BASEEXT'}\n"
+ if ($Config{$name});
+
+ if ($quals =~ / -[DIUOg]/) {
+ while ($quals =~ / -([Og])(\d*)\b/) {
+ my($type,$lvl) = ($1,$2);
+ $quals =~ s/ -$type$lvl\b\s*//;
+ if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
+ else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
+ }
+ while ($quals =~ / -([DIU])(\S+)/) {
+ my($type,$def) = ($1,$2);
+ $quals =~ s/ -$type$def\s*//;
+ $def =~ s/"/""/g;
+ if ($type eq 'D') { $definestr .= qq["$def",]; }
+ elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
+ else { $undefstr .= qq["$def",]; }
+ }
+ }
+ if (length $quals and $quals !~ m!/!) {
+ warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
+ $quals = '';
+ }
+ $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
+ if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
+ if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
+ # Deal with $self->{DEFINE} here since some C compilers pay attention
+ # to only one /Define clause on command line, so we have to
+ # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
+ # ($self->{DEFINE} has already been VMSified in constants() above)
+ if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
+ for my $type (qw(Def Undef)) {
+ my(@terms);
+ while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
+ my $term = $1;
+ $term =~ s:^\((.+)\)$:$1:;
+ push @terms, $term;
+ }
+ if ($type eq 'Def') {
+ push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
+ }
+ if (@terms) {
+ $quals =~ s:/${type}i?n?e?=[^/]+::ig;
+ $quals .= "/${type}ine=(" . join(',',@terms) . ')';
+ }
+ }
+
+ $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
+
+ # Likewise with $self->{INC} and /Include
+ if ($self->{'INC'}) {
+ my(@includes) = split(/\s+/,$self->{INC});
+ foreach (@includes) {
+ s/^-I//;
+ $incstr .= ','.$self->fixpath($_,1);
+ }
+ }
+ $quals .= "$incstr)";
+ # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
+ $self->{CCFLAGS} = $quals;
+
+ $self->{PERLTYPE} ||= '';
+
+ $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
+ if ($self->{OPTIMIZE} !~ m!/!) {
+ if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
+ elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
+ $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
+ }
+ else {
+ warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
+ $self->{OPTIMIZE} = '/Optimize';
+ }
+ }
+
+ return $self->{CFLAGS} = qq{
+ CCFLAGS = $self->{CCFLAGS}
+ OPTIMIZE = $self->{OPTIMIZE}
+ PERLTYPE = $self->{PERLTYPE}
+ };
+ }
+
+ =item const_cccmd (override)
+
+ Adds directives to point C preprocessor to the right place when
+ handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
+ command line a bit differently than MM_Unix method.
+
+ =cut
+
+ sub const_cccmd {
+ my($self,$libperl) = @_;
+ my(@m);
+
+ return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+ return '' unless $self->needs_linking();
+ if ($Config{'vms_cc_type'} eq 'gcc') {
+ push @m,'
+ .FIRST
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
+ }
+ elsif ($Config{'vms_cc_type'} eq 'vaxc') {
+ push @m,'
+ .FIRST
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
+ }
+ else {
+ push @m,'
+ .FIRST
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
+ ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
+ ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
+ }
+
+ push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
+
+ $self->{CONST_CCCMD} = join('',@m);
+ }
+
+
+ =item tools_other (override)
+
+ Throw in some dubious extra macros for Makefile args.
+
+ Also keep around the old $(SAY) macro in case somebody's using it.
+
+ =cut
+
+ sub tools_other {
+ my($self) = @_;
+
+ # XXX Are these necessary? Does anyone override them? They're longer
+ # than just typing the literal string.
+ my $extra_tools = <<'EXTRA_TOOLS';
+
+ # Just in case anyone is using the old macro.
+ USEMACROS = $(MACROSTART)
+ SAY = $(ECHO)
+
+ EXTRA_TOOLS
+
+ return $self->SUPER::tools_other . $extra_tools;
+ }
+
+ =item init_dist (override)
+
+ VMSish defaults for some values.
+
+ macro description default
+
+ ZIPFLAGS flags to pass to ZIP -Vu
+
+ COMPRESS compression command to gzip
+ use for tarfiles
+ SUFFIX suffix to put on -gz
+ compressed files
+
+ SHAR shar command to use vms_share
+
+ DIST_DEFAULT default target to use to tardist
+ create a distribution
+
+ DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
+ VERSION for the name
+
+ =cut
+
+ sub init_dist {
+ my($self) = @_;
+ $self->{ZIPFLAGS} ||= '-Vu';
+ $self->{COMPRESS} ||= 'gzip';
+ $self->{SUFFIX} ||= '-gz';
+ $self->{SHAR} ||= 'vms_share';
+ $self->{DIST_DEFAULT} ||= 'zipdist';
+
+ $self->SUPER::init_dist;
+
+ $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}"
+ unless $self->{ARGS}{DISTVNAME};
+
+ return;
+ }
+
+ =item c_o (override)
+
+ Use VMS syntax on command line. In particular, $(DEFINE) and
+ $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
+
+ =cut
+
+ sub c_o {
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+ '
+ .c$(OBJ_EXT) :
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT)
+
+ .cpp$(OBJ_EXT) :
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT)
+
+ .cxx$(OBJ_EXT) :
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT)
+
+ ';
+ }
+
+ =item xs_c (override)
+
+ Use MM[SK] macros.
+
+ =cut
+
+ sub xs_c {
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+ '
+ .xs.c :
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).xsc
+ $(MV) $(MMS$TARGET_NAME).xsc $(MMS$TARGET_NAME).c
+ ';
+ }
+
+ =item xs_o (override)
+
+ Use MM[SK] macros, and VMS command line for C compiler.
+
+ =cut
+
+ sub xs_o {
+ my ($self) = @_;
+ return '' unless $self->needs_linking();
+ my $frag = '
+ .xs$(OBJ_EXT) :
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).xsc
+ $(MV) $(MMS$TARGET_NAME).xsc $(MMS$TARGET_NAME).c
+ $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT)
+ ';
+ if ($self->{XSMULTI}) {
+ for my $ext ($self->_xs_list_basenames) {
+ my $version = $self->parse_version("$ext.pm");
+ my $cccmd = $self->{CONST_CCCMD};
+ $cccmd =~ m/^\s*CCCMD\s*=\s*(.*)\n/m;
+ $cccmd = $1;
+ $cccmd =~ s/\b(VERSION=)[^,\)]*/$1\\"$version\\"/;
+ $cccmd =~ s/\b(XS_VERSION=)[^,\)]*/$1\\"$version\\"/;
+ # 1 2
+ $frag .= _sprintf562 <<'EOF', $ext, $cccmd;
+
+ %1$s$(OBJ_EXT) : %1$s.xs
+ $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs > $(MMS$TARGET_NAME).xsc
+ $(MV) $(MMS$TARGET_NAME).xsc $(MMS$TARGET_NAME).c
+ %2$s $(CCCDLFLAGS) $(MMS$TARGET_NAME).c /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT)
+ EOF
+ }
+ }
+ $frag;
+ }
+
+
+ sub xs_dlsyms_ext {
+ '.opt';
+ }
+
+ =item dlsyms (override)
+
+ Create VMS linker options files specifying universal symbols for this
+ extension's shareable image, and listing other shareable images or
+ libraries to which it should be linked.
+
+ =cut
+
+ sub dlsyms {
+ my ($self, %attribs) = @_;
+ return '' unless $self->needs_linking;
+ $self->xs_dlsyms_iterator;
+ }
+
+ sub xs_make_dlsyms {
+ my ($self, $attribs, $target, $dep, $name, $dlbase, $funcs, $funclist, $imports, $vars, $extra) = @_;
+ my @m;
+ if ($self->{XSMULTI}) {
+ my ($v, $d, $f) = File::Spec->splitpath($target);
+ my @d = File::Spec->splitdir($d);
+ shift @d if $d[0] eq 'lib';
+ my $instloc = $self->catfile('$(INST_ARCHLIB)', 'auto', @d, $f);
+ push @m,"\ndynamic :: $instloc\n\t\$(NOECHO) \$(NOOP)\n"
+ unless $self->{SKIPHASH}{'dynamic'};
+ push @m,"\nstatic :: $instloc\n\t\$(NOECHO) \$(NOOP)\n"
+ unless $self->{SKIPHASH}{'static'};
+ push @m, sprintf <<'EOF', $instloc, $target;
+ %s : %s
+ $(CP) $(MMS$SOURCE) $(MMS$TARGET)
+ EOF
+ } else {
+ push @m,"\ndynamic :: \$(INST_ARCHAUTODIR)$self->{BASEEXT}.opt\n\t\$(NOECHO) \$(NOOP)\n"
+ unless $self->{SKIPHASH}{'dynamic'};
+ push @m,"\nstatic :: \$(INST_ARCHAUTODIR)$self->{BASEEXT}.opt\n\t\$(NOECHO) \$(NOOP)\n"
+ unless $self->{SKIPHASH}{'static'};
+ push @m, sprintf <<'EOF', $target;
+ $(INST_ARCHAUTODIR)$(BASEEXT).opt : %s
+ $(CP) $(MMS$SOURCE) $(MMS$TARGET)
+ EOF
+ }
+ push @m,
+ "\n$target : $dep\n\t",
+ q!$(PERLRUN) -MExtUtils::Mksymlists -e "Mksymlists('NAME'=>'!, $name,
+ q!', 'DLBASE' => '!,$dlbase,
+ q!', 'DL_FUNCS' => !,neatvalue($funcs),
+ q!, 'FUNCLIST' => !,neatvalue($funclist),
+ q!, 'IMPORTS' => !,neatvalue($imports),
+ q!, 'DL_VARS' => !, neatvalue($vars);
+ push @m, $extra if defined $extra;
+ push @m, qq!);"\n\t!;
+ push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
+ if ($self->{XSMULTI}) {
+ push @m, uc($dlbase); # the "DLBASE" - is this right?
+ } elsif ($self->{OBJECT} =~ /\bBASEEXT\b/ or
+ $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
+ push @m, ($Config{d_vms_case_sensitive_symbols}
+ ? uc($self->{BASEEXT}) :'$(BASEEXT)');
+ } else { # We don't have a "main" object file, so pull 'em all in
+ # Upcase module names if linker is being case-sensitive
+ my($upcase) = $Config{d_vms_case_sensitive_symbols};
+ my(@omods) = split ' ', $self->eliminate_macros($self->{OBJECT});
+ for (@omods) {
+ s/\.[^.]*$//; # Trim off file type
+ s[\$\(\w+_EXT\)][]; # even as a macro
+ s/.*[:>\/\]]//; # Trim off dir spec
+ $_ = uc if $upcase;
+ };
+ my(@lines);
+ my $tmp = shift @omods;
+ foreach my $elt (@omods) {
+ $tmp .= ",$elt";
+ if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
+ }
+ push @lines, $tmp;
+ push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
+ }
+ push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
+ if (length $self->{LDLOADLIBS}) {
+ my($line) = '';
+ foreach my $lib (split ' ', $self->{LDLOADLIBS}) {
+ $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
+ if (length($line) + length($lib) > 160) {
+ push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
+ $line = $lib . '\n';
+ }
+ else { $line .= $lib . '\n'; }
+ }
+ push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
+ }
+ join '', @m;
+ }
+
+
+ =item xs_obj_opt
+
+ Override to fixup -o flags.
+
+ =cut
+
+ sub xs_obj_opt {
+ my ($self, $output_file) = @_;
+ "/OBJECT=$output_file";
+ }
+
+ =item dynamic_lib (override)
+
+ Use VMS Link command.
+
+ =cut
+
+ sub xs_dynamic_lib_macros {
+ my ($self, $attribs) = @_;
+ my $otherldflags = $attribs->{OTHERLDFLAGS} || "";
+ my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || "";
+ sprintf <<'EOF', $otherldflags, $inst_dynamic_dep;
+ # This section creates the dynamically loadable objects from relevant
+ # objects and possibly $(MYEXTLIB).
+ OTHERLDFLAGS = %s
+ INST_DYNAMIC_DEP = %s
+ EOF
+ }
+
+ sub xs_make_dynamic_lib {
+ my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_;
+ my $shr = $Config{'dbgprefix'} . 'PerlShr';
+ $exportlist =~ s/.def$/.opt/; # it's a linker options file
+ # 1 2 3 4 5
+ _sprintf562 <<'EOF', $to, $todir, $exportlist, $shr, "$shr Sys\$Share:$shr.$Config{'dlext'}";
+ %1$s : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt %2$s$(DFSEP).exists %3$s $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+ If F$TrnLNm("%4$s").eqs."" Then Define/NoLog/User %5$s
+ Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) %3$s/Option,$(PERL_INC)perlshr_attr.opt/Option
+ EOF
+ }
+
+
+ =item static_lib (override)
+
+ Use VMS commands to manipulate object library.
+
+ =cut
+
+ sub static_lib {
+ my($self) = @_;
+ return '' unless $self->needs_linking();
+
+ return '
+ $(INST_STATIC) :
+ $(NOECHO) $(NOOP)
+ ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
+
+ my(@m);
+ push @m,'
+ # Rely on suffix rule for update action
+ $(OBJECT) : $(INST_ARCHAUTODIR)$(DFSEP).exists
+
+ $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
+ ';
+ # If this extension has its own library (eg SDBM_File)
+ # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+ push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
+
+ push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
+
+ # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
+ # 'cause it's a library and you can't stick them in other libraries.
+ # In that case, we use $OBJECT instead and hope for the best
+ if ($self->{MYEXTLIB}) {
+ push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
+ } else {
+ push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
+ }
+
+ push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
+ foreach my $lib (split ' ', $self->{EXTRALIBS}) {
+ push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
+ }
+ join('',@m);
+ }
+
+
+ =item extra_clean_files
+
+ Clean up some OS specific files. Plus the temp file used to shorten
+ a lot of commands. And the name mangler database.
+
+ =cut
+
+ sub extra_clean_files {
+ return qw(
+ *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso
+ .MM_Tmp cxx_repository
+ );
+ }
+
+
+ =item zipfile_target
+
+ =item tarfile_target
+
+ =item shdist_target
+
+ Syntax for invoking shar, tar and zip differs from that for Unix.
+
+ =cut
+
+ sub zipfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ $(DISTVNAME).zip : distdir
+ $(PREOP)
+ $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+ MAKE_FRAG
+ }
+
+ sub tarfile_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ $(DISTVNAME).tar$(SUFFIX) : distdir
+ $(PREOP)
+ $(TO_UNIX)
+ $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
+ $(RM_RF) $(DISTVNAME)
+ $(COMPRESS) $(DISTVNAME).tar
+ $(POSTOP)
+ MAKE_FRAG
+ }
+
+ sub shdist_target {
+ my($self) = shift;
+
+ return <<'MAKE_FRAG';
+ shdist : distdir
+ $(PREOP)
+ $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+ MAKE_FRAG
+ }
+
+
+ # --- Test and Installation Sections ---
+
+ =item install (override)
+
+ Work around DCL's 255 character limit several times,and use
+ VMS-style command line quoting in a few cases.
+
+ =cut
+
+ sub install {
+ my($self, %attribs) = @_;
+ my(@m);
+
+ push @m, q[
+ install :: all pure_install doc_install
+ $(NOECHO) $(NOOP)
+
+ install_perl :: all pure_perl_install doc_perl_install
+ $(NOECHO) $(NOOP)
+
+ install_site :: all pure_site_install doc_site_install
+ $(NOECHO) $(NOOP)
+
+ install_vendor :: all pure_vendor_install doc_vendor_install
+ $(NOECHO) $(NOOP)
+
+ pure_install :: pure_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+ doc_install :: doc_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
+
+ pure__install : pure_site_install
+ $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
+
+ doc__install : doc_site_install
+ $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
+
+ # This hack brought to you by DCL's 255-character command line limit
+ pure_perl_install ::
+ ];
+ push @m,
+ q[ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read|'.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').'|'" >.MM_tmp
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write|'.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').'|'" >>.MM_tmp
+ ] unless $self->{NO_PACKLIST};
+
+ push @m,
+ q[ $(NOECHO) $(ECHO_N) "$(INST_LIB)|$(DESTINSTALLPRIVLIB)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB)|$(DESTINSTALLARCHLIB)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_BIN)|$(DESTINSTALLBIN)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_SCRIPT)|$(DESTINSTALLSCRIPT)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR)|$(DESTINSTALLMAN3DIR)" >>.MM_tmp
+ $(NOECHO) $(MOD_INSTALL) <.MM_tmp
+ $(NOECHO) $(RM_F) .MM_tmp
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) "].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q["
+
+ # Likewise
+ pure_site_install ::
+ ];
+ push @m,
+ q[ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read|'.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').'|'" >.MM_tmp
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write|'.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').'|'" >>.MM_tmp
+ ] unless $self->{NO_PACKLIST};
+
+ push @m,
+ q[ $(NOECHO) $(ECHO_N) "$(INST_LIB)|$(DESTINSTALLSITELIB)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB)|$(DESTINSTALLSITEARCH)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_BIN)|$(DESTINSTALLSITEBIN)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_SCRIPT)|$(DESTINSTALLSCRIPT)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR)|$(DESTINSTALLSITEMAN1DIR)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR)|$(DESTINSTALLSITEMAN3DIR)" >>.MM_tmp
+ $(NOECHO) $(MOD_INSTALL) <.MM_tmp
+ $(NOECHO) $(RM_F) .MM_tmp
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) "].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q["
+
+ pure_vendor_install ::
+ ];
+ push @m,
+ q[ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read|'.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').'|'" >.MM_tmp
+ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write|'.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').'|'" >>.MM_tmp
+ ] unless $self->{NO_PACKLIST};
+
+ push @m,
+ q[ $(NOECHO) $(ECHO_N) "$(INST_LIB)|$(DESTINSTALLVENDORLIB)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB)|$(DESTINSTALLVENDORARCH)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_BIN)|$(DESTINSTALLVENDORBIN)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_SCRIPT)|$(DESTINSTALLSCRIPT)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR)|$(DESTINSTALLVENDORMAN1DIR)|" >>.MM_tmp
+ $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR)|$(DESTINSTALLVENDORMAN3DIR)" >>.MM_tmp
+ $(NOECHO) $(MOD_INSTALL) <.MM_tmp
+ $(NOECHO) $(RM_F) .MM_tmp
+
+ ];
+
+ push @m, q[
+ # Ditto
+ doc_perl_install ::
+ $(NOECHO) $(NOOP)
+
+ # And again
+ doc_site_install ::
+ $(NOECHO) $(NOOP)
+
+ doc_vendor_install ::
+ $(NOECHO) $(NOOP)
+
+ ] if $self->{NO_PERLLOCAL};
+
+ push @m, q[
+ # Ditto
+ doc_perl_install ::
+ $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
+ $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+
+ # And again
+ doc_site_install ::
+ $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
+ $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+
+ doc_vendor_install ::
+ $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
+ $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+
+ ] unless $self->{NO_PERLLOCAL};
+
+ push @m, q[
+ uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+ $(NOECHO) $(NOOP)
+
+ uninstall_from_perldirs ::
+ $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
+
+ uninstall_from_sitedirs ::
+ $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
+
+ uninstall_from_vendordirs ::
+ $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{VENDORARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
+ ];
+
+ join('',@m);
+ }
+
+ =item perldepend (override)
+
+ Use VMS-style syntax for files; it's cheaper to just do it directly here
+ than to have the MM_Unix method call C<catfile> repeatedly. Also, if
+ we have to rebuild Config.pm, use MM[SK] to do it.
+
+ =cut
+
+ sub perldepend {
+ my($self) = @_;
+ my(@m);
+
+ if ($self->{OBJECT}) {
+ # Need to add an object file dependency on the perl headers.
+ # this is very important for XS modules in perl.git development.
+
+ push @m, $self->_perl_header_files_fragment(""); # empty separator on VMS as its in the $(PERL_INC)
+ }
+
+ if ($self->{PERL_SRC}) {
+ my(@macros);
+ my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
+ push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
+ push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
+ push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
+ push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
+ push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
+ $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
+ push(@m,q[
+ # Check for unpropagated config.sh changes. Should never happen.
+ # We do NOT just update config.h because that is not sufficient.
+ # An out of date config.h is not fatal but complains loudly!
+ $(PERL_INC)config.h : $(PERL_SRC)config.sh
+ $(NOOP)
+
+ $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
+ $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
+ olddef = F$Environment("Default")
+ Set Default $(PERL_SRC)
+ $(MMS)],$mmsquals,);
+ if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
+ my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
+ $target =~ s/\Q$prefix/[/;
+ push(@m," $target");
+ }
+ else { push(@m,' $(MMS$TARGET)'); }
+ push(@m,q[
+ Set Default 'olddef'
+ ]);
+ }
+
+ push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
+ if %{$self->{XS}};
+
+ join('',@m);
+ }
+
+
+ =item makeaperl (override)
+
+ Undertake to build a new set of Perl images using VMS commands. Since
+ VMS does dynamic loading, it's not necessary to statically link each
+ extension into the Perl image, so this isn't the normal build path.
+ Consequently, it hasn't really been tested, and may well be incomplete.
+
+ =cut
+
+ our %olbs; # needs to be localized
+
+ sub makeaperl {
+ my($self, %attribs) = @_;
+ my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) =
+ @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
+ my(@m);
+ push @m, "
+ # --- MakeMaker makeaperl section ---
+ MAP_TARGET = $target
+ ";
+ return join '', @m if $self->{PARENT};
+
+ my($dir) = join ":", @{$self->{DIR}};
+
+ unless ($self->{MAKEAPERL}) {
+ push @m, q{
+ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
+ $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
+ $(NOECHO) $(PERLRUNINST) \
+ Makefile.PL DIR=}, $dir, q{ \
+ FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+ MAKEAPERL=1 NORECURS=1 };
+
+ push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
+
+ $(MAP_TARGET) :: $(MAKE_APERL_FILE)
+ $(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
+ };
+ push @m, "\n";
+
+ return join '', @m;
+ }
+
+
+ my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
+ local($_);
+
+ # The front matter of the linkcommand...
+ $linkcmd = join ' ', $Config{'ld'},
+ grep($_, @Config{qw(large split ldflags ccdlflags)});
+ $linkcmd =~ s/\s+/ /g;
+
+ # Which *.olb files could we make use of...
+ local(%olbs); # XXX can this be lexical?
+ $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
+ require File::Find;
+ File::Find::find(sub {
+ return unless m/\Q$self->{LIB_EXT}\E$/;
+ return if m/^libperl/;
+
+ if( exists $self->{INCLUDE_EXT} ){
+ my $found = 0;
+
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything not explicitly marked for inclusion.
+ # DynaLoader is implied.
+ foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+ if( $xx eq $incl ){
+ $found++;
+ last;
+ }
+ }
+ return unless $found;
+ }
+ elsif( exists $self->{EXCLUDE_EXT} ){
+ (my $xx = $File::Find::name) =~ s,.*?/auto/,,;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything explicitly marked for exclusion
+ foreach my $excl (@{$self->{EXCLUDE_EXT}}){
+ return if( $xx eq $excl );
+ }
+ }
+
+ $olbs{$ENV{DEFAULT}} = $_;
+ }, grep( -d $_, @{$searchdirs || []}));
+
+ # We trust that what has been handed in as argument will be buildable
+ $static = [] unless $static;
+ @olbs{@{$static}} = (1) x @{$static};
+
+ $extra = [] unless $extra && ref $extra eq 'ARRAY';
+ # Sort the object libraries in inverse order of
+ # filespec length to try to insure that dependent extensions
+ # will appear before their parents, so the linker will
+ # search the parent library to resolve references.
+ # (e.g. Intuit::DWIM will precede Intuit, so unresolved
+ # references from [.intuit.dwim]dwim.obj can be found
+ # in [.intuit]intuit.olb).
+ for (sort { length($a) <=> length($b) } keys %olbs) {
+ next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
+ my($dir) = $self->fixpath($_,1);
+ my($extralibs) = $dir . "extralibs.ld";
+ my($extopt) = $dir . $olbs{$_};
+ $extopt =~ s/$self->{LIB_EXT}$/.opt/;
+ push @optlibs, "$dir$olbs{$_}";
+ # Get external libraries this extension will need
+ if (-f $extralibs ) {
+ my %seenthis;
+ open my $list, "<", $extralibs or warn $!,next;
+ while (<$list>) {
+ chomp;
+ # Include a library in the link only once, unless it's mentioned
+ # multiple times within a single extension's options file, in which
+ # case we assume the builder needed to search it again later in the
+ # link.
+ my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
+ $libseen{$_}++; $seenthis{$_}++;
+ next if $skip;
+ push @$extra,$_;
+ }
+ }
+ # Get full name of extension for ExtUtils::Miniperl
+ if (-f $extopt) {
+ open my $opt, '<', $extopt or die $!;
+ while (<$opt>) {
+ next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
+ my $pkg = $1;
+ $pkg =~ s#__*#::#g;
+ push @staticpkgs,$pkg;
+ }
+ }
+ }
+ # Place all of the external libraries after all of the Perl extension
+ # libraries in the final link, in order to maximize the opportunity
+ # for XS code from multiple extensions to resolve symbols against the
+ # same external library while only including that library once.
+ push @optlibs, @$extra;
+
+ $target = "Perl$Config{'exe_ext'}" unless $target;
+ my $shrtarget;
+ ($shrtarget,$targdir) = fileparse($target);
+ $shrtarget =~ s/^([^.]*)/$1Shr/;
+ $shrtarget = $targdir . $shrtarget;
+ $target = "Perlshr.$Config{'dlext'}" unless $target;
+ $tmpdir = "[]" unless $tmpdir;
+ $tmpdir = $self->fixpath($tmpdir,1);
+ if (@optlibs) { $extralist = join(' ',@optlibs); }
+ else { $extralist = ''; }
+ # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
+ # that's what we're building here).
+ push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
+ if ($libperl) {
+ unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
+ print "Warning: $libperl not found\n";
+ undef $libperl;
+ }
+ }
+ unless ($libperl) {
+ if (defined $self->{PERL_SRC}) {
+ $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
+ } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
+ } else {
+ print "Warning: $libperl not found
+ If you're going to build a static perl binary, make sure perl is installed
+ otherwise ignore this warning\n";
+ }
+ }
+ $libperldir = $self->fixpath((fileparse($libperl))[1],1);
+
+ push @m, '
+ # Fill in the target you want to produce if it\'s not perl
+ MAP_TARGET = ',$self->fixpath($target,0),'
+ MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
+ MAP_LINKCMD = $linkcmd
+ MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
+ MAP_EXTRA = $extralist
+ MAP_LIBPERL = ",$self->fixpath($libperl,0),'
+ ';
+
+
+ push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
+ foreach (@optlibs) {
+ push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
+ }
+ push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
+ push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
+
+ push @m,'
+ $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
+ $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
+ $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
+ $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
+ $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
+ $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
+ $(NOECHO) $(ECHO) "To remove the intermediate files, say
+ $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
+ ';
+ push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
+ push @m, "# More from the 255-char line length limit\n";
+ foreach (@staticpkgs) {
+ push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
+ }
+
+ push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
+ $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
+ $(NOECHO) $(RM_F) %sWritemain.tmp
+ MAKE_FRAG
+
+ push @m, q[
+ # Still more from the 255-char line length limit
+ doc_inst_perl :
+ $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+ $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
+ $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
+ $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
+ $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
+ $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[
+ $(NOECHO) $(RM_F) .MM_tmp
+ ];
+
+ push @m, "
+ inst_perl : pure_inst_perl doc_inst_perl
+ \$(NOECHO) \$(NOOP)
+
+ pure_inst_perl : \$(MAP_TARGET)
+ $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
+ $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
+
+ clean :: map_clean
+ \$(NOECHO) \$(NOOP)
+
+ map_clean :
+ \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
+ \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
+ ";
+
+ join '', @m;
+ }
+
+
+ # --- Output postprocessing section ---
+
+ =item maketext_filter (override)
+
+ Ensure that colons marking targets are preceded by space, in order
+ to distinguish the target delimiter from a colon appearing as
+ part of a filespec.
+
+ =cut
+
+ sub maketext_filter {
+ my($self, $text) = @_;
+
+ $text =~ s/^([^\s:=]+)(:+\s)/$1 $2/mg;
+ return $text;
+ }
+
+ =item prefixify (override)
+
+ prefixifying on VMS is simple. Each should simply be:
+
+ perl_root:[some.dir]
+
+ which can just be converted to:
+
+ volume:[your.prefix.some.dir]
+
+ otherwise you get the default layout.
+
+ In effect, your search prefix is ignored and $Config{vms_prefix} is
+ used instead.
+
+ =cut
+
+ sub prefixify {
+ my($self, $var, $sprefix, $rprefix, $default) = @_;
+
+ # Translate $(PERLPREFIX) to a real path.
+ $rprefix = $self->eliminate_macros($rprefix);
+ $rprefix = vmspath($rprefix) if $rprefix;
+ $sprefix = vmspath($sprefix) if $sprefix;
+
+ $default = vmsify($default)
+ unless $default =~ /\[.*\]/;
+
+ (my $var_no_install = $var) =~ s/^install//;
+ my $path = $self->{uc $var} ||
+ $ExtUtils::MM_Unix::Config_Override{lc $var} ||
+ $Config{lc $var} || $Config{lc $var_no_install};
+
+ if( !$path ) {
+ warn " no Config found for $var.\n" if $Verbose >= 2;
+ $path = $self->_prefixify_default($rprefix, $default);
+ }
+ elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) {
+ # do nothing if there's no prefix or if its relative
+ }
+ elsif( $sprefix eq $rprefix ) {
+ warn " no new prefix.\n" if $Verbose >= 2;
+ }
+ else {
+
+ warn " prefixify $var => $path\n" if $Verbose >= 2;
+ warn " from $sprefix to $rprefix\n" if $Verbose >= 2;
+
+ my($path_vol, $path_dirs) = $self->splitpath( $path );
+ if( $path_vol eq $Config{vms_prefix}.':' ) {
+ warn " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
+
+ $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
+ $path = $self->_catprefix($rprefix, $path_dirs);
+ }
+ else {
+ $path = $self->_prefixify_default($rprefix, $default);
+ }
+ }
+
+ print " now $path\n" if $Verbose >= 2;
+ return $self->{uc $var} = $path;
+ }
+
+
+ sub _prefixify_default {
+ my($self, $rprefix, $default) = @_;
+
+ warn " cannot prefix, using default.\n" if $Verbose >= 2;
+
+ if( !$default ) {
+ warn "No default!\n" if $Verbose >= 1;
+ return;
+ }
+ if( !$rprefix ) {
+ warn "No replacement prefix!\n" if $Verbose >= 1;
+ return '';
+ }
+
+ return $self->_catprefix($rprefix, $default);
+ }
+
+ sub _catprefix {
+ my($self, $rprefix, $default) = @_;
+
+ my($rvol, $rdirs) = $self->splitpath($rprefix);
+ if( $rvol ) {
+ return $self->catpath($rvol,
+ $self->catdir($rdirs, $default),
+ ''
+ )
+ }
+ else {
+ return $self->catdir($rdirs, $default);
+ }
+ }
+
+
+ =item cd
+
+ =cut
+
+ sub cd {
+ my($self, $dir, @cmds) = @_;
+
+ $dir = vmspath($dir);
+
+ my $cmd = join "\n\t", map "$_", @cmds;
+
+ # No leading tab makes it look right when embedded
+ my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
+ startdir = F$Environment("Default")
+ Set Default %s
+ %s
+ Set Default 'startdir'
+ MAKE_FRAG
+
+ # No trailing newline makes this easier to embed
+ chomp $make_frag;
+
+ return $make_frag;
+ }
+
+
+ =item oneliner
+
+ =cut
+
+ sub oneliner {
+ my($self, $cmd, $switches) = @_;
+ $switches = [] unless defined $switches;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ $cmd = $self->quote_literal($cmd);
+ $cmd = $self->escape_newlines($cmd);
+
+ # Switches must be quoted else they will be lowercased.
+ $switches = join ' ', map { qq{"$_"} } @$switches;
+
+ return qq{\$(ABSPERLRUN) $switches -e $cmd "--"};
+ }
+
+
+ =item B<echo>
+
+ perl trips up on "<foo>" thinking it's an input redirect. So we use the
+ native Write command instead. Besides, it's faster.
+
+ =cut
+
+ sub echo {
+ my($self, $text, $file, $opts) = @_;
+
+ # Compatibility with old options
+ if( !ref $opts ) {
+ my $append = $opts;
+ $opts = { append => $append || 0 };
+ }
+ my $opencmd = $opts->{append} ? 'Open/Append' : 'Open/Write';
+
+ $opts->{allow_variables} = 0 unless defined $opts->{allow_variables};
+
+ my $ql_opts = { allow_variables => $opts->{allow_variables} };
+
+ my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
+ push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_, $ql_opts) }
+ split /\n/, $text;
+ push @cmds, '$(NOECHO) Close MMECHOFILE';
+ return @cmds;
+ }
+
+
+ =item quote_literal
+
+ =cut
+
+ sub quote_literal {
+ my($self, $text, $opts) = @_;
+ $opts->{allow_variables} = 1 unless defined $opts->{allow_variables};
+
+ # I believe this is all we should need.
+ $text =~ s{"}{""}g;
+
+ $text = $opts->{allow_variables}
+ ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text);
+
+ return qq{"$text"};
+ }
+
+ =item escape_dollarsigns
+
+ Quote, don't escape.
+
+ =cut
+
+ sub escape_dollarsigns {
+ my($self, $text) = @_;
+
+ # Quote dollar signs which are not starting a variable
+ $text =~ s{\$ (?!\() }{"\$"}gx;
+
+ return $text;
+ }
+
+
+ =item escape_all_dollarsigns
+
+ Quote, don't escape.
+
+ =cut
+
+ sub escape_all_dollarsigns {
+ my($self, $text) = @_;
+
+ # Quote dollar signs
+ $text =~ s{\$}{"\$\"}gx;
+
+ return $text;
+ }
+
+ =item escape_newlines
+
+ =cut
+
+ sub escape_newlines {
+ my($self, $text) = @_;
+
+ $text =~ s{\n}{-\n}g;
+
+ return $text;
+ }
+
+ =item max_exec_len
+
+ 256 characters.
+
+ =cut
+
+ sub max_exec_len {
+ my $self = shift;
+
+ return $self->{_MAX_EXEC_LEN} ||= 256;
+ }
+
+ =item init_linker
+
+ =cut
+
+ sub init_linker {
+ my $self = shift;
+ $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
+
+ my $shr = $Config{dbgprefix} . 'PERLSHR';
+ if ($self->{PERL_SRC}) {
+ $self->{PERL_ARCHIVE} ||=
+ $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
+ }
+ else {
+ $self->{PERL_ARCHIVE} ||=
+ $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
+ }
+
+ $self->{PERL_ARCHIVEDEP} ||= '';
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ }
+
+
+ =item catdir (override)
+
+ =item catfile (override)
+
+ Eliminate the macros in the output to the MMS/MMK file.
+
+ (File::Spec::VMS used to do this for us, but it's being removed)
+
+ =cut
+
+ sub catdir {
+ my $self = shift;
+
+ # Process the macros on VMS MMS/MMK
+ my @args = map { m{\$\(} ? $self->eliminate_macros($_) : $_ } @_;
+
+ my $dir = $self->SUPER::catdir(@args);
+
+ # Fix up the directory and force it to VMS format.
+ $dir = $self->fixpath($dir, 1);
+
+ return $dir;
+ }
+
+ sub catfile {
+ my $self = shift;
+
+ # Process the macros on VMS MMS/MMK
+ my @args = map { m{\$\(} ? $self->eliminate_macros($_) : $_ } @_;
+
+ my $file = $self->SUPER::catfile(@args);
+
+ $file = vmsify($file);
+
+ return $file
+ }
+
+
+ =item eliminate_macros
+
+ Expands MM[KS]/Make macros in a text string, using the contents of
+ identically named elements of C<%$self>, and returns the result
+ as a file specification in Unix syntax.
+
+ NOTE: This is the canonical version of the method. The version in
+ File::Spec::VMS is deprecated.
+
+ =cut
+
+ sub eliminate_macros {
+ my($self,$path) = @_;
+ return '' unless $path;
+ $self = {} unless ref $self;
+
+ my($npath) = unixify($path);
+ # sometimes unixify will return a string with an off-by-one trailing null
+ $npath =~ s{\0$}{};
+
+ my($complex) = 0;
+ my($head,$macro,$tail);
+
+ # perform m##g in scalar context so it acts as an iterator
+ while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
+ if (defined $self->{$2}) {
+ ($head,$macro,$tail) = ($1,$2,$3);
+ if (ref $self->{$macro}) {
+ if (ref $self->{$macro} eq 'ARRAY') {
+ $macro = join ' ', @{$self->{$macro}};
+ }
+ else {
+ print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+ "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+ $macro = "\cB$macro\cB";
+ $complex = 1;
+ }
+ }
+ else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
+ $npath = "$head$macro$tail";
+ }
+ }
+ if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+ $npath;
+ }
+
+ =item fixpath
+
+ my $path = $mm->fixpath($path);
+ my $path = $mm->fixpath($path, $is_dir);
+
+ Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
+ in any directory specification, in order to avoid juxtaposing two
+ VMS-syntax directories when MM[SK] is run. Also expands expressions which
+ are all macro, so that we can tell how long the expansion is, and avoid
+ overrunning DCL's command buffer when MM[KS] is running.
+
+ fixpath() checks to see whether the result matches the name of a
+ directory in the current default directory and returns a directory or
+ file specification accordingly. C<$is_dir> can be set to true to
+ force fixpath() to consider the path to be a directory or false to force
+ it to be a file.
+
+ NOTE: This is the canonical version of the method. The version in
+ File::Spec::VMS is deprecated.
+
+ =cut
+
+ sub fixpath {
+ my($self,$path,$force_path) = @_;
+ return '' unless $path;
+ $self = bless {}, $self unless ref $self;
+ my($fixedpath,$prefix,$name);
+
+ if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
+ if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
+ $fixedpath = vmspath($self->eliminate_macros($path));
+ }
+ else {
+ $fixedpath = vmsify($self->eliminate_macros($path));
+ }
+ }
+ elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+ my($vmspre) = $self->eliminate_macros("\$($prefix)");
+ # is it a dir or just a name?
+ $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
+ $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ else {
+ $fixedpath = $path;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ # No hints, so we try to guess
+ if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+ $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+ }
+
+ # Trim off root dirname if it's had other dirs inserted in front of it.
+ $fixedpath =~ s/\.000000([\]>])/$1/;
+ # Special case for VMS absolute directory specs: these will have had device
+ # prepended during trip through Unix syntax in eliminate_macros(), since
+ # Unix syntax has no way to express "absolute from the top of this device's
+ # directory tree".
+ if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+
+ return $fixedpath;
+ }
+
+
+ =item os_flavor
+
+ VMS is VMS.
+
+ =cut
+
+ sub os_flavor {
+ return('VMS');
+ }
+
+
+ =item is_make_type (override)
+
+ None of the make types being checked for is viable on VMS,
+ plus our $self->{MAKE} is an unexpanded (and unexpandable)
+ macro whose value is known only to the make utility itself.
+
+ =cut
+
+ sub is_make_type {
+ my($self, $type) = @_;
+ return 0;
+ }
+
+
+ =item make_type (override)
+
+ Returns a suitable string describing the type of makefile being written.
+
+ =cut
+
+ sub make_type { "$Config{make}-style"; }
+
+
+ =back
+
+
+ =head1 AUTHOR
+
+ Original author Charles Bailey F<bailey@newman.upenn.edu>
+
+ Maintained by Michael G Schwern F<schwern@pobox.com>
+
+ See L<ExtUtils::MakeMaker> for patching and contact information.
+
+
+ =cut
+
+ 1;
+
+EXTUTILS_MM_VMS
+
+$fatpacked{"ExtUtils/MM_VOS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_VOS';
+ package ExtUtils::MM_VOS;
+
+ use strict;
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Unix;
+ our @ISA = qw(ExtUtils::MM_Unix);
+
+
+ =head1 NAME
+
+ ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
+
+ =head1 SYNOPSIS
+
+ Don't use this module directly.
+ Use ExtUtils::MM and let it choose.
+
+ =head1 DESCRIPTION
+
+ This is a subclass of ExtUtils::MM_Unix which contains functionality for
+ VOS.
+
+ Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+ =head2 Overridden methods
+
+ =head3 extra_clean_files
+
+ Cleanup VOS core files
+
+ =cut
+
+ sub extra_clean_files {
+ return qw(*.kp);
+ }
+
+
+ =head1 AUTHOR
+
+ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MakeMaker>
+
+ =cut
+
+
+ 1;
+EXTUTILS_MM_VOS
+
+$fatpacked{"ExtUtils/MM_Win32.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_WIN32';
+ package ExtUtils::MM_Win32;
+
+ use strict;
+
+
+ =head1 NAME
+
+ ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
+
+ =head1 DESCRIPTION
+
+ See ExtUtils::MM_Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ =cut
+
+ use ExtUtils::MakeMaker::Config;
+ use File::Basename;
+ use File::Spec;
+ use ExtUtils::MakeMaker qw(neatvalue _sprintf562);
+
+ require ExtUtils::MM_Any;
+ require ExtUtils::MM_Unix;
+ our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ $ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+ my ( $BORLAND, $GCC, $MSVC, $DLLTOOL ) = _identify_compiler_environment( \%Config );
+
+ sub _identify_compiler_environment {
+ my ( $config ) = @_;
+
+ my $BORLAND = $config->{cc} =~ /\bbcc/i ? 1 : 0;
+ my $GCC = $config->{cc} =~ /\bgcc\b/i ? 1 : 0;
+ my $MSVC = $config->{cc} =~ /\b(?:cl|icl)/i ? 1 : 0; # MSVC can come as clarm.exe, icl=Intel C
+ my $DLLTOOL = $config->{dlltool} || 'dlltool';
+
+ return ( $BORLAND, $GCC, $MSVC, $DLLTOOL );
+ }
+
+
+ =head2 Overridden methods
+
+ =over 4
+
+ =item B<dlsyms>
+
+ =cut
+
+ sub dlsyms {
+ my($self,%attribs) = @_;
+ return '' if $self->{SKIPHASH}{'dynamic'};
+ $self->xs_dlsyms_iterator(\%attribs);
+ }
+
+ =item xs_dlsyms_ext
+
+ On Win32, is C<.def>.
+
+ =cut
+
+ sub xs_dlsyms_ext {
+ '.def';
+ }
+
+ =item replace_manpage_separator
+
+ Changes the path separator with .
+
+ =cut
+
+ sub replace_manpage_separator {
+ my($self,$man) = @_;
+ $man =~ s,/+,.,g;
+ $man;
+ }
+
+
+ =item B<maybe_command>
+
+ Since Windows has nothing as simple as an executable bit, we check the
+ file extension.
+
+ The PATHEXT env variable will be used to get a list of extensions that
+ might indicate a command, otherwise .com, .exe, .bat and .cmd will be
+ used by default.
+
+ =cut
+
+ sub maybe_command {
+ my($self,$file) = @_;
+ my @e = exists($ENV{'PATHEXT'})
+ ? split(/;/, $ENV{PATHEXT})
+ : qw(.com .exe .bat .cmd);
+ my $e = '';
+ for (@e) { $e .= "\Q$_\E|" }
+ chop $e;
+ # see if file ends in one of the known extensions
+ if ($file =~ /($e)$/i) {
+ return $file if -e $file;
+ }
+ else {
+ for (@e) {
+ return "$file$_" if -e "$file$_";
+ }
+ }
+ return;
+ }
+
+
+ =item B<init_DIRFILESEP>
+
+ Using \ for Windows, except for "gmake" where it is /.
+
+ =cut
+
+ sub init_DIRFILESEP {
+ my($self) = shift;
+
+ # The ^ makes sure its not interpreted as an escape in nmake
+ $self->{DIRFILESEP} = $self->is_make_type('nmake') ? '^\\' :
+ $self->is_make_type('dmake') ? '\\\\' :
+ $self->is_make_type('gmake') ? '/'
+ : '\\';
+ }
+
+ =item init_tools
+
+ Override some of the slower, portable commands with Windows specific ones.
+
+ =cut
+
+ sub init_tools {
+ my ($self) = @_;
+
+ $self->{NOOP} ||= 'rem';
+ $self->{DEV_NULL} ||= '> NUL';
+
+ $self->{FIXIN} ||= $self->{PERL_CORE} ?
+ "\$(PERLRUN) $self->{PERL_SRC}\\win32\\bin\\pl2bat.pl" :
+ 'pl2bat.bat';
+
+ $self->SUPER::init_tools;
+
+ # Setting SHELL from $Config{sh} can break dmake. Its ok without it.
+ delete $self->{SHELL};
+
+ return;
+ }
+
+
+ =item init_others
+
+ Override the default link and compile tools.
+
+ LDLOADLIBS's default is changed to $Config{libs}.
+
+ Adjustments are made for Borland's quirks needing -L to come first.
+
+ =cut
+
+ sub init_others {
+ my $self = shift;
+
+ $self->{LD} ||= 'link';
+ $self->{AR} ||= 'lib';
+
+ $self->SUPER::init_others;
+
+ $self->{LDLOADLIBS} ||= $Config{libs};
+ # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
+ if ($BORLAND) {
+ my $libs = $self->{LDLOADLIBS};
+ my $libpath = '';
+ while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
+ $libpath .= ' ' if length $libpath;
+ $libpath .= $1;
+ }
+ $self->{LDLOADLIBS} = $libs;
+ $self->{LDDLFLAGS} ||= $Config{lddlflags};
+ $self->{LDDLFLAGS} .= " $libpath";
+ }
+
+ return;
+ }
+
+
+ =item init_platform
+
+ Add MM_Win32_VERSION.
+
+ =item platform_constants
+
+ =cut
+
+ sub init_platform {
+ my($self) = shift;
+
+ $self->{MM_Win32_VERSION} = $VERSION;
+
+ return;
+ }
+
+ sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
+
+ foreach my $macro (qw(MM_Win32_VERSION))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
+ }
+
+ =item specify_shell
+
+ Set SHELL to $ENV{COMSPEC} only if make is type 'gmake'.
+
+ =cut
+
+ sub specify_shell {
+ my $self = shift;
+ return '' unless $self->is_make_type('gmake');
+ "\nSHELL = $ENV{COMSPEC}\n";
+ }
+
+ =item constants
+
+ Add MAXLINELENGTH for dmake before all the constants are output.
+
+ =cut
+
+ sub constants {
+ my $self = shift;
+
+ my $make_text = $self->SUPER::constants;
+ return $make_text unless $self->is_make_type('dmake');
+
+ # dmake won't read any single "line" (even those with escaped newlines)
+ # larger than a certain size which can be as small as 8k. PM_TO_BLIB
+ # on large modules like DateTime::TimeZone can create lines over 32k.
+ # So we'll crank it up to a <ironic>WHOPPING</ironic> 64k.
+ #
+ # This has to come here before all the constants and not in
+ # platform_constants which is after constants.
+ my $size = $self->{MAXLINELENGTH} || 800000;
+ my $prefix = qq{
+ # Get dmake to read long commands like PM_TO_BLIB
+ MAXLINELENGTH = $size
+
+ };
+
+ return $prefix . $make_text;
+ }
+
+
+ =item special_targets
+
+ Add .USESHELL target for dmake.
+
+ =cut
+
+ sub special_targets {
+ my($self) = @_;
+
+ my $make_frag = $self->SUPER::special_targets;
+
+ $make_frag .= <<'MAKE_FRAG' if $self->is_make_type('dmake');
+ .USESHELL :
+ MAKE_FRAG
+
+ return $make_frag;
+ }
+
+ =item static_lib_pure_cmd
+
+ Defines how to run the archive utility
+
+ =cut
+
+ sub static_lib_pure_cmd {
+ my ($self, $from) = @_;
+ $from =~ s/(\$\(\w+)(\))/$1:^"+"$2/g if $BORLAND;
+ sprintf qq{\t\$(AR) %s\n}, ($BORLAND ? '$@ ' . $from
+ : ($GCC ? '-ru $@ ' . $from
+ : '-out:$@ ' . $from));
+ }
+
+ =item dynamic_lib
+
+ Methods are overridden here: not dynamic_lib itself, but the utility
+ ones that do the OS-specific work.
+
+ =cut
+
+ sub xs_make_dynamic_lib {
+ my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_;
+ my @m = sprintf '%s : %s $(MYEXTLIB) %s$(DFSEP).exists %s $(PERL_ARCHIVEDEP) $(INST_DYNAMIC_DEP)'."\n", $to, $from, $todir, $exportlist;
+ if ($GCC) {
+ # per https://rt.cpan.org/Ticket/Display.html?id=78395 no longer
+ # uses dlltool - relies on post 2002 MinGW
+ # 1 2
+ push @m, _sprintf562 <<'EOF', $exportlist, $ldfrom;
+ $(LD) %1$s -o $@ $(LDDLFLAGS) %2$s $(OTHERLDFLAGS) $(MYEXTLIB) "$(PERL_ARCHIVE)" $(LDLOADLIBS) -Wl,--enable-auto-image-base
+ EOF
+ } elsif ($BORLAND) {
+ my $ldargs = $self->is_make_type('dmake')
+ ? q{"$(PERL_ARCHIVE:s,/,\,)" $(LDLOADLIBS:s,/,\,) $(MYEXTLIB:s,/,\,),}
+ : q{"$(subst /,\,$(PERL_ARCHIVE))" $(subst /,\,$(LDLOADLIBS)) $(subst /,\,$(MYEXTLIB)),};
+ my $subbed;
+ if ($exportlist eq '$(EXPORT_LIST)') {
+ $subbed = $self->is_make_type('dmake')
+ ? q{$(EXPORT_LIST:s,/,\,)}
+ : q{$(subst /,\,$(EXPORT_LIST))};
+ } else {
+ # in XSMULTI, exportlist is per-XS, so have to sub in perl not make
+ ($subbed = $exportlist) =~ s#/#\\#g;
+ }
+ push @m, sprintf <<'EOF', $ldfrom, $ldargs . $subbed;
+ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) %s,$@,,%s,$(RESFILES)
+ EOF
+ } else { # VC
+ push @m, sprintf <<'EOF', $ldfrom, $exportlist;
+ $(LD) -out:$@ $(LDDLFLAGS) %s $(OTHERLDFLAGS) $(MYEXTLIB) "$(PERL_ARCHIVE)" $(LDLOADLIBS) -def:%s
+ EOF
+ # Embed the manifest file if it exists
+ push(@m, q{ if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2
+ if exist $@.manifest del $@.manifest});
+ }
+ push @m, "\n\t\$(CHMOD) \$(PERM_RWX) \$\@\n";
+
+ join '', @m;
+ }
+
+ sub xs_dynamic_lib_macros {
+ my ($self, $attribs) = @_;
+ my $otherldflags = $attribs->{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
+ my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || "";
+ sprintf <<'EOF', $otherldflags, $inst_dynamic_dep;
+ # This section creates the dynamically loadable objects from relevant
+ # objects and possibly $(MYEXTLIB).
+ OTHERLDFLAGS = %s
+ INST_DYNAMIC_DEP = %s
+ EOF
+ }
+
+ =item extra_clean_files
+
+ Clean out some extra dll.{base,exp} files which might be generated by
+ gcc. Otherwise, take out all *.pdb files.
+
+ =cut
+
+ sub extra_clean_files {
+ my $self = shift;
+
+ return $GCC ? (qw(dll.base dll.exp)) : ('*.pdb');
+ }
+
+ =item init_linker
+
+ =cut
+
+ sub init_linker {
+ my $self = shift;
+
+ $self->{PERL_ARCHIVE} = "\$(PERL_INC)\\$Config{libperl}";
+ $self->{PERL_ARCHIVEDEP} = "\$(PERL_INCDEP)\\$Config{libperl}";
+ $self->{PERL_ARCHIVE_AFTER} = '';
+ $self->{EXPORT_LIST} = '$(BASEEXT).def';
+ }
+
+
+ =item perl_script
+
+ Checks for the perl program under several common perl extensions.
+
+ =cut
+
+ sub perl_script {
+ my($self,$file) = @_;
+ return $file if -r $file && -f _;
+ return "$file.pl" if -r "$file.pl" && -f _;
+ return "$file.plx" if -r "$file.plx" && -f _;
+ return "$file.bat" if -r "$file.bat" && -f _;
+ return;
+ }
+
+ sub can_dep_space {
+ my $self = shift;
+ 1; # with Win32::GetShortPathName
+ }
+
+ =item quote_dep
+
+ =cut
+
+ sub quote_dep {
+ my ($self, $arg) = @_;
+ if ($arg =~ / / and not $self->is_make_type('gmake')) {
+ require Win32;
+ $arg = Win32::GetShortPathName($arg);
+ die <<EOF if not defined $arg or $arg =~ / /;
+ Tried to use make dependency with space for non-GNU make:
+ '$arg'
+ Fallback to short pathname failed.
+ EOF
+ return $arg;
+ }
+ return $self->SUPER::quote_dep($arg);
+ }
+
+
+ =item xs_obj_opt
+
+ Override to fixup -o flags for MSVC.
+
+ =cut
+
+ sub xs_obj_opt {
+ my ($self, $output_file) = @_;
+ ($MSVC ? "/Fo" : "-o ") . $output_file;
+ }
+
+
+ =item pasthru
+
+ All we send is -nologo to nmake to prevent it from printing its damned
+ banner.
+
+ =cut
+
+ sub pasthru {
+ my($self) = shift;
+ my $old = $self->SUPER::pasthru;
+ return $old unless $self->is_make_type('nmake');
+ $old =~ s/(PASTHRU\s*=\s*)/$1 -nologo /;
+ $old;
+ }
+
+
+ =item arch_check (override)
+
+ Normalize all arguments for consistency of comparison.
+
+ =cut
+
+ sub arch_check {
+ my $self = shift;
+
+ # Win32 is an XS module, minperl won't have it.
+ # arch_check() is not critical, so just fake it.
+ return 1 unless $self->can_load_xs;
+ return $self->SUPER::arch_check( map { $self->_normalize_path_name($_) } @_);
+ }
+
+ sub _normalize_path_name {
+ my $self = shift;
+ my $file = shift;
+
+ require Win32;
+ my $short = Win32::GetShortPathName($file);
+ return defined $short ? lc $short : lc $file;
+ }
+
+
+ =item oneliner
+
+ These are based on what command.com does on Win98. They may be wrong
+ for other Windows shells, I don't know.
+
+ =cut
+
+ sub oneliner {
+ my($self, $cmd, $switches) = @_;
+ $switches = [] unless defined $switches;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ $cmd = $self->quote_literal($cmd);
+ $cmd = $self->escape_newlines($cmd);
+
+ $switches = join ' ', @$switches;
+
+ return qq{\$(ABSPERLRUN) $switches -e $cmd --};
+ }
+
+
+ sub quote_literal {
+ my($self, $text, $opts) = @_;
+ $opts->{allow_variables} = 1 unless defined $opts->{allow_variables};
+
+ # See: http://www.autohotkey.net/~deleyd/parameters/parameters.htm#CPP
+
+ # Apply the Microsoft C/C++ parsing rules
+ $text =~ s{\\\\"}{\\\\\\\\\\"}g; # \\" -> \\\\\"
+ $text =~ s{(?<!\\)\\"}{\\\\\\"}g; # \" -> \\\"
+ $text =~ s{(?<!\\)"}{\\"}g; # " -> \"
+ $text = qq{"$text"} if $text =~ /[ \t]/;
+
+ # Apply the Command Prompt parsing rules (cmd.exe)
+ my @text = split /("[^"]*")/, $text;
+ # We should also escape parentheses, but it breaks one-liners containing
+ # $(MACRO)s in makefiles.
+ s{([<>|&^@!])}{^$1}g foreach grep { !/^"[^"]*"$/ } @text;
+ $text = join('', @text);
+
+ # dmake expands {{ to { and }} to }.
+ if( $self->is_make_type('dmake') ) {
+ $text =~ s/{/{{/g;
+ $text =~ s/}/}}/g;
+ }
+
+ $text = $opts->{allow_variables}
+ ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text);
+
+ return $text;
+ }
+
+
+ sub escape_newlines {
+ my($self, $text) = @_;
+
+ # Escape newlines
+ $text =~ s{\n}{\\\n}g;
+
+ return $text;
+ }
+
+
+ =item cd
+
+ dmake can handle Unix style cd'ing but nmake (at least 1.5) cannot. It
+ wants:
+
+ cd dir1\dir2
+ command
+ another_command
+ cd ..\..
+
+ =cut
+
+ sub cd {
+ my($self, $dir, @cmds) = @_;
+
+ return $self->SUPER::cd($dir, @cmds) unless $self->is_make_type('nmake');
+
+ my $cmd = join "\n\t", map "$_", @cmds;
+
+ my $updirs = $self->catdir(map { $self->updir } $self->splitdir($dir));
+
+ # No leading tab and no trailing newline makes for easier embedding.
+ my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd, $updirs;
+ cd %s
+ %s
+ cd %s
+ MAKE_FRAG
+
+ chomp $make_frag;
+
+ return $make_frag;
+ }
+
+
+ =item max_exec_len
+
+ nmake 1.50 limits command length to 2048 characters.
+
+ =cut
+
+ sub max_exec_len {
+ my $self = shift;
+
+ return $self->{_MAX_EXEC_LEN} ||= 2 * 1024;
+ }
+
+
+ =item os_flavor
+
+ Windows is Win32.
+
+ =cut
+
+ sub os_flavor {
+ return('Win32');
+ }
+
+
+ =item cflags
+
+ Defines the PERLDLL symbol if we are configured for static building since all
+ code destined for the perl5xx.dll must be compiled with the PERLDLL symbol
+ defined.
+
+ =cut
+
+ sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ return '' unless $self->needs_linking();
+
+ my $base = $self->SUPER::cflags($libperl);
+ foreach (split /\n/, $base) {
+ /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
+ };
+ $self->{CCFLAGS} .= " -DPERLDLL" if ($self->{LINKTYPE} eq 'static');
+
+ return $self->{CFLAGS} = qq{
+ CCFLAGS = $self->{CCFLAGS}
+ OPTIMIZE = $self->{OPTIMIZE}
+ PERLTYPE = $self->{PERLTYPE}
+ };
+
+ }
+
+ =item make_type
+
+ Returns a suitable string describing the type of makefile being written.
+
+ =cut
+
+ sub make_type {
+ my ($self) = @_;
+ my $make = $self->make;
+ $make = +( File::Spec->splitpath( $make ) )[-1];
+ $make =~ s!\.exe$!!i;
+ if ( $make =~ m![^A-Z0-9]!i ) {
+ ($make) = grep { m!make!i } split m![^A-Z0-9]!i, $make;
+ }
+ return "$make-style";
+ }
+
+ 1;
+ __END__
+
+ =back
+EXTUTILS_MM_WIN32
+
+$fatpacked{"ExtUtils/MM_Win95.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MM_WIN95';
+ package ExtUtils::MM_Win95;
+
+ use strict;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require ExtUtils::MM_Win32;
+ our @ISA = qw(ExtUtils::MM_Win32);
+
+ use ExtUtils::MakeMaker::Config;
+
+
+ =head1 NAME
+
+ ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
+
+ =head1 SYNOPSIS
+
+ You should not be using this module directly.
+
+ =head1 DESCRIPTION
+
+ This is a subclass of ExtUtils::MM_Win32 containing changes necessary
+ to get MakeMaker playing nice with command.com and other Win9Xisms.
+
+ =head2 Overridden methods
+
+ Most of these make up for limitations in the Win9x/nmake command shell.
+
+ =over 4
+
+
+ =item max_exec_len
+
+ Win98 chokes on things like Encode if we set the max length to nmake's max
+ of 2K. So we go for a more conservative value of 1K.
+
+ =cut
+
+ sub max_exec_len {
+ my $self = shift;
+
+ return $self->{_MAX_EXEC_LEN} ||= 1024;
+ }
+
+
+ =item os_flavor
+
+ Win95 and Win98 and WinME are collectively Win9x and Win32
+
+ =cut
+
+ sub os_flavor {
+ my $self = shift;
+ return ($self->SUPER::os_flavor, 'Win9x');
+ }
+
+
+ =back
+
+
+ =head1 AUTHOR
+
+ Code originally inside MM_Win32. Original author unknown.
+
+ Currently maintained by Michael G Schwern C<schwern@pobox.com>.
+
+ Send patches and ideas to C<makemaker@perl.org>.
+
+ See https://metacpan.org/release/ExtUtils-MakeMaker.
+
+ =cut
+
+
+ 1;
+EXTUTILS_MM_WIN95
+
+$fatpacked{"ExtUtils/MY.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MY';
+ package ExtUtils::MY;
+
+ use strict;
+ require ExtUtils::MM;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+ our @ISA = qw(ExtUtils::MM);
+
+ {
+ package MY;
+ our @ISA = qw(ExtUtils::MY);
+ }
+
+ sub DESTROY {}
+
+
+ =head1 NAME
+
+ ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
+
+ =head1 SYNOPSIS
+
+ # in your Makefile.PL
+ sub MY::whatever {
+ ...
+ }
+
+ =head1 DESCRIPTION
+
+ B<FOR INTERNAL USE ONLY>
+
+ ExtUtils::MY is a subclass of ExtUtils::MM. Its provided in your
+ Makefile.PL for you to add and override MakeMaker functionality.
+
+ It also provides a convenient alias via the MY class.
+
+ ExtUtils::MY might turn out to be a temporary solution, but MY won't
+ go away.
+
+ =cut
+EXTUTILS_MY
+
+$fatpacked{"ExtUtils/MakeMaker.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MAKEMAKER';
+ # $Id$
+ package ExtUtils::MakeMaker;
+
+ use strict;
+
+ BEGIN {require 5.006;}
+
+ require Exporter;
+ use ExtUtils::MakeMaker::Config;
+ use ExtUtils::MakeMaker::version; # ensure we always have our fake version.pm
+ use Carp;
+ use File::Path;
+ my $CAN_DECODE = eval { require ExtUtils::MakeMaker::Locale; }; # 2 birds, 1 stone
+ eval { ExtUtils::MakeMaker::Locale::reinit('UTF-8') }
+ if $CAN_DECODE and $ExtUtils::MakeMaker::Locale::ENCODING_LOCALE eq 'US-ASCII';
+
+ our $Verbose = 0; # exported
+ our @Parent; # needs to be localized
+ our @Get_from_Config; # referenced by MM_Unix
+ our @MM_Sections;
+ our @Overridable;
+ my @Prepend_parent;
+ my %Recognized_Att_Keys;
+ our %macro_fsentity; # whether a macro is a filesystem name
+ our %macro_dep; # whether a macro is a dependency
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION; ## no critic [BuiltinFunctions::ProhibitStringyEval]
+
+ # Emulate something resembling CVS $Revision$
+ (our $Revision = $VERSION) =~ s{_}{};
+ $Revision = int $Revision * 10000;
+
+ our $Filename = __FILE__; # referenced outside MakeMaker
+
+ our @ISA = qw(Exporter);
+ our @EXPORT = qw(&WriteMakefile $Verbose &prompt);
+ our @EXPORT_OK = qw($VERSION &neatvalue &mkbootstrap &mksymlists
+ &WriteEmptyMakefile &open_for_writing &write_file_via_tmp
+ &_sprintf562);
+
+ # These will go away once the last of the Win32 & VMS specific code is
+ # purged.
+ my $Is_VMS = $^O eq 'VMS';
+ my $Is_Win32 = $^O eq 'MSWin32';
+ my $UNDER_CORE = $ENV{PERL_CORE};
+
+ full_setup();
+
+ require ExtUtils::MM; # Things like CPAN assume loading ExtUtils::MakeMaker
+ # will give them MM.
+
+ require ExtUtils::MY; # XXX pre-5.8 versions of ExtUtils::Embed expect
+ # loading ExtUtils::MakeMaker will give them MY.
+ # This will go when Embed is its own CPAN module.
+
+
+ # 5.6.2 can't do sprintf "%1$s" - this can only do %s
+ sub _sprintf562 {
+ my ($format, @args) = @_;
+ for (my $i = 1; $i <= @args; $i++) {
+ $format =~ s#%$i\$s#$args[$i-1]#g;
+ }
+ $format;
+ }
+
+ sub WriteMakefile {
+ croak "WriteMakefile: Need even number of args" if @_ % 2;
+
+ require ExtUtils::MY;
+ my %att = @_;
+
+ _convert_compat_attrs(\%att);
+
+ _verify_att(\%att);
+
+ my $mm = MM->new(\%att);
+ $mm->flush;
+
+ return $mm;
+ }
+
+
+ # Basic signatures of the attributes WriteMakefile takes. Each is the
+ # reference type. Empty value indicate it takes a non-reference
+ # scalar.
+ my %Att_Sigs;
+ my %Special_Sigs = (
+ AUTHOR => 'ARRAY',
+ C => 'ARRAY',
+ CONFIG => 'ARRAY',
+ CONFIGURE => 'CODE',
+ DIR => 'ARRAY',
+ DL_FUNCS => 'HASH',
+ DL_VARS => 'ARRAY',
+ EXCLUDE_EXT => 'ARRAY',
+ EXE_FILES => 'ARRAY',
+ FUNCLIST => 'ARRAY',
+ H => 'ARRAY',
+ IMPORTS => 'HASH',
+ INCLUDE_EXT => 'ARRAY',
+ LIBS => ['ARRAY',''],
+ MAN1PODS => 'HASH',
+ MAN3PODS => 'HASH',
+ META_ADD => 'HASH',
+ META_MERGE => 'HASH',
+ OBJECT => ['ARRAY', ''],
+ PL_FILES => 'HASH',
+ PM => 'HASH',
+ PMLIBDIRS => 'ARRAY',
+ PMLIBPARENTDIRS => 'ARRAY',
+ PREREQ_PM => 'HASH',
+ BUILD_REQUIRES => 'HASH',
+ CONFIGURE_REQUIRES => 'HASH',
+ TEST_REQUIRES => 'HASH',
+ SKIP => 'ARRAY',
+ TYPEMAPS => 'ARRAY',
+ XS => 'HASH',
+ XSBUILD => 'HASH',
+ VERSION => ['version',''],
+ _KEEP_AFTER_FLUSH => '',
+
+ clean => 'HASH',
+ depend => 'HASH',
+ dist => 'HASH',
+ dynamic_lib=> 'HASH',
+ linkext => 'HASH',
+ macro => 'HASH',
+ postamble => 'HASH',
+ realclean => 'HASH',
+ test => 'HASH',
+ tool_autosplit => 'HASH',
+ );
+
+ @Att_Sigs{keys %Recognized_Att_Keys} = ('') x keys %Recognized_Att_Keys;
+ @Att_Sigs{keys %Special_Sigs} = values %Special_Sigs;
+
+ sub _convert_compat_attrs { #result of running several times should be same
+ my($att) = @_;
+ if (exists $att->{AUTHOR}) {
+ if ($att->{AUTHOR}) {
+ if (!ref($att->{AUTHOR})) {
+ my $t = $att->{AUTHOR};
+ $att->{AUTHOR} = [$t];
+ }
+ } else {
+ $att->{AUTHOR} = [];
+ }
+ }
+ }
+
+ sub _verify_att {
+ my($att) = @_;
+
+ while( my($key, $val) = each %$att ) {
+ my $sig = $Att_Sigs{$key};
+ unless( defined $sig ) {
+ warn "WARNING: $key is not a known parameter.\n";
+ next;
+ }
+
+ my @sigs = ref $sig ? @$sig : $sig;
+ my $given = ref $val;
+ unless( grep { _is_of_type($val, $_) } @sigs ) {
+ my $takes = join " or ", map { _format_att($_) } @sigs;
+
+ my $has = _format_att($given);
+ warn "WARNING: $key takes a $takes not a $has.\n".
+ " Please inform the author.\n";
+ }
+ }
+ }
+
+
+ # Check if a given thing is a reference or instance of $type
+ sub _is_of_type {
+ my($thing, $type) = @_;
+
+ return 1 if ref $thing eq $type;
+
+ local $SIG{__DIE__};
+ return 1 if eval{ $thing->isa($type) };
+
+ return 0;
+ }
+
+
+ sub _format_att {
+ my $given = shift;
+
+ return $given eq '' ? "string/number"
+ : uc $given eq $given ? "$given reference"
+ : "$given object"
+ ;
+ }
+
+
+ sub prompt ($;$) { ## no critic
+ my($mess, $def) = @_;
+ confess("prompt function called without an argument")
+ unless defined $mess;
+
+ my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;
+
+ my $dispdef = defined $def ? "[$def] " : " ";
+ $def = defined $def ? $def : "";
+
+ local $|=1;
+ local $\;
+ print "$mess $dispdef";
+
+ my $ans;
+ if ($ENV{PERL_MM_USE_DEFAULT} || (!$isa_tty && eof STDIN)) {
+ print "$def\n";
+ }
+ else {
+ $ans = <STDIN>;
+ if( defined $ans ) {
+ $ans =~ s{\015?\012$}{};
+ }
+ else { # user hit ctrl-D
+ print "\n";
+ }
+ }
+
+ return (!defined $ans || $ans eq '') ? $def : $ans;
+ }
+
+ sub eval_in_subdirs {
+ my($self) = @_;
+ use Cwd qw(cwd abs_path);
+ my $pwd = cwd() || die "Can't figure out your cwd!";
+
+ local @INC = map eval {abs_path($_) if -e} || $_, @INC;
+ push @INC, '.'; # '.' has to always be at the end of @INC
+
+ foreach my $dir (@{$self->{DIR}}){
+ my($abs) = $self->catdir($pwd,$dir);
+ eval { $self->eval_in_x($abs); };
+ last if $@;
+ }
+ chdir $pwd;
+ die $@ if $@;
+ }
+
+ sub eval_in_x {
+ my($self,$dir) = @_;
+ chdir $dir or carp("Couldn't change to directory $dir: $!");
+
+ {
+ package main;
+ do './Makefile.PL';
+ };
+ if ($@) {
+ # if ($@ =~ /prerequisites/) {
+ # die "MakeMaker WARNING: $@";
+ # } else {
+ # warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+ # }
+ die "ERROR from evaluation of $dir/Makefile.PL: $@";
+ }
+ }
+
+
+ # package name for the classes into which the first object will be blessed
+ my $PACKNAME = 'PACK000';
+
+ sub full_setup {
+ $Verbose ||= 0;
+
+ my @dep_macros = qw/
+ PERL_INCDEP PERL_ARCHLIBDEP PERL_ARCHIVEDEP
+ /;
+
+ my @fs_macros = qw/
+ FULLPERL XSUBPPDIR
+
+ INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB INST_MAN1DIR INST_MAN3DIR
+ INSTALLDIRS
+ DESTDIR PREFIX INSTALL_BASE
+ PERLPREFIX SITEPREFIX VENDORPREFIX
+ INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
+ INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
+ INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN
+ INSTALLMAN1DIR INSTALLMAN3DIR
+ INSTALLSITEMAN1DIR INSTALLSITEMAN3DIR
+ INSTALLVENDORMAN1DIR INSTALLVENDORMAN3DIR
+ INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT
+ PERL_LIB PERL_ARCHLIB
+ SITELIBEXP SITEARCHEXP
+
+ MAKE LIBPERL_A LIB PERL_SRC PERL_INC
+ PPM_INSTALL_EXEC PPM_UNINSTALL_EXEC
+ PPM_INSTALL_SCRIPT PPM_UNINSTALL_SCRIPT
+ /;
+
+ my @attrib_help = qw/
+
+ AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION
+ C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DISTVNAME
+ DL_FUNCS DL_VARS
+ EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE
+ FULLPERLRUN FULLPERLRUNINST
+ FUNCLIST H IMPORTS
+
+ INC INCLUDE_EXT LDFROM LIBS LICENSE
+ LINKTYPE MAKEAPERL MAKEFILE MAKEFILE_OLD MAN1PODS MAN3PODS MAP_TARGET
+ META_ADD META_MERGE MIN_PERL_VERSION BUILD_REQUIRES CONFIGURE_REQUIRES
+ MYEXTLIB NAME NEEDS_LINKING NOECHO NO_META NO_MYMETA NO_PACKLIST NO_PERLLOCAL
+ NORECURS NO_VC OBJECT OPTIMIZE PERL_MALLOC_OK PERL PERLMAINCC PERLRUN
+ PERLRUNINST PERL_CORE
+ PERM_DIR PERM_RW PERM_RWX MAGICXS
+ PL_FILES PM PM_FILTER PMLIBDIRS PMLIBPARENTDIRS POLLUTE
+ PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ
+ SIGN SKIP TEST_REQUIRES TYPEMAPS UNINST VERSION VERSION_FROM XS
+ XSBUILD XSMULTI XSOPT XSPROTOARG XS_VERSION
+ clean depend dist dynamic_lib linkext macro realclean tool_autosplit
+
+ MAN1EXT MAN3EXT
+
+ MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
+ MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
+ /;
+ push @attrib_help, @fs_macros;
+ @macro_fsentity{@fs_macros, @dep_macros} = (1) x (@fs_macros+@dep_macros);
+ @macro_dep{@dep_macros} = (1) x @dep_macros;
+
+ # IMPORTS is used under OS/2 and Win32
+
+ # @Overridable is close to @MM_Sections but not identical. The
+ # order is important. Many subroutines declare macros. These
+ # depend on each other. Let's try to collect the macros up front,
+ # then pasthru, then the rules.
+
+ # MM_Sections are the sections we have to call explicitly
+ # in Overridable we have subroutines that are used indirectly
+
+
+ @MM_Sections =
+ qw(
+
+ post_initialize const_config constants platform_constants
+ tool_autosplit tool_xsubpp tools_other
+
+ makemakerdflt
+
+ dist macro depend cflags const_loadlibs const_cccmd
+ post_constants
+
+ pasthru
+
+ special_targets
+ c_o xs_c xs_o
+ top_targets blibdirs linkext dlsyms dynamic_bs dynamic
+ dynamic_lib static static_lib manifypods processPL
+ installbin subdirs
+ clean_subdirs clean realclean_subdirs realclean
+ metafile signature
+ dist_basics dist_core distdir dist_test dist_ci distmeta distsignature
+ install force perldepend makefile staticmake test ppd
+
+ ); # loses section ordering
+
+ @Overridable = @MM_Sections;
+ push @Overridable, qw[
+
+ libscan makeaperl needs_linking
+ subdir_x test_via_harness test_via_script
+
+ init_VERSION init_dist init_INST init_INSTALL init_DEST init_dirscan
+ init_PM init_MANPODS init_xs init_PERL init_DIRFILESEP init_linker
+ ];
+
+ push @MM_Sections, qw[
+
+ pm_to_blib selfdocument
+
+ ];
+
+ # Postamble needs to be the last that was always the case
+ push @MM_Sections, "postamble";
+ push @Overridable, "postamble";
+
+ # All sections are valid keys.
+ @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
+
+ # we will use all these variables in the Makefile
+ @Get_from_Config =
+ qw(
+ ar cc cccdlflags ccdlflags dlext dlsrc exe_ext full_ar ld
+ lddlflags ldflags libc lib_ext obj_ext osname osvers ranlib
+ sitelibexp sitearchexp so
+ );
+
+ # 5.5.3 doesn't have any concept of vendor libs
+ push @Get_from_Config, qw( vendorarchexp vendorlibexp ) if $] >= 5.006;
+
+ foreach my $item (@attrib_help){
+ $Recognized_Att_Keys{$item} = 1;
+ }
+ foreach my $item (@Get_from_Config) {
+ $Recognized_Att_Keys{uc $item} = $Config{$item};
+ print "Attribute '\U$item\E' => '$Config{$item}'\n"
+ if ($Verbose >= 2);
+ }
+
+ #
+ # When we eval a Makefile.PL in a subdirectory, that one will ask
+ # us (the parent) for the values and will prepend "..", so that
+ # all files to be installed end up below OUR ./blib
+ #
+ @Prepend_parent = qw(
+ INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
+ MAP_TARGET INST_MAN1DIR INST_MAN3DIR PERL_SRC
+ PERL FULLPERL
+ );
+ }
+
+ sub _has_cpan_meta_requirements {
+ return eval {
+ require CPAN::Meta::Requirements;
+ CPAN::Meta::Requirements->VERSION(2.130);
+ require B; # CMR requires this, for core we have to too.
+ };
+ }
+
+ sub new {
+ my($class,$self) = @_;
+ my($key);
+
+ _convert_compat_attrs($self) if defined $self && $self;
+
+ # Store the original args passed to WriteMakefile()
+ foreach my $k (keys %$self) {
+ $self->{ARGS}{$k} = $self->{$k};
+ }
+
+ $self = {} unless defined $self;
+
+ # Temporarily bless it into MM so it can be used as an
+ # object. It will be blessed into a temp package later.
+ bless $self, "MM";
+
+ # Cleanup all the module requirement bits
+ my %key2cmr;
+ for my $key (qw(PREREQ_PM BUILD_REQUIRES CONFIGURE_REQUIRES TEST_REQUIRES)) {
+ $self->{$key} ||= {};
+ if (_has_cpan_meta_requirements) {
+ my $cmr = CPAN::Meta::Requirements->from_string_hash(
+ $self->{$key},
+ {
+ bad_version_hook => sub {
+ carp "Unparsable version '$_[0]' for prerequisite $_[1] treated as 0";
+ version->new(0);
+ },
+ },
+ );
+ $self->{$key} = $cmr->as_string_hash;
+ $key2cmr{$key} = $cmr;
+ } else {
+ for my $module (sort keys %{ $self->{$key} }) {
+ my $version = $self->{$key}->{$module};
+ if (!defined($version) or !length($version)) {
+ carp "Undefined requirement for $module treated as '0' (CPAN::Meta::Requirements not available)";
+ } else {
+ next if $version =~ /^\d+(?:\.\d+(?:_\d+)*)?$/;
+ carp "Unparsable version '$version' for prerequisite $module treated as 0 (CPAN::Meta::Requirements not available)";
+ }
+ $self->{$key}->{$module} = 0;
+ }
+ }
+ }
+
+ if ("@ARGV" =~ /\bPREREQ_PRINT\b/) {
+ $self->_PREREQ_PRINT;
+ }
+
+ # PRINT_PREREQ is RedHatism.
+ if ("@ARGV" =~ /\bPRINT_PREREQ\b/) {
+ $self->_PRINT_PREREQ;
+ }
+
+ print "MakeMaker (v$VERSION)\n" if $Verbose;
+ if (-f "MANIFEST" && ! -f "Makefile" && ! $ENV{PERL_CORE}){
+ check_manifest();
+ }
+
+ check_hints($self);
+
+ if ( defined $self->{MIN_PERL_VERSION}
+ && $self->{MIN_PERL_VERSION} !~ /^v?[\d_\.]+$/ ) {
+ require version;
+ my $normal = eval {
+ local $SIG{__WARN__} = sub {
+ # simulate "use warnings FATAL => 'all'" for vintage perls
+ die @_;
+ };
+ version->new( $self->{MIN_PERL_VERSION} )
+ };
+ $self->{MIN_PERL_VERSION} = $normal if defined $normal && !$@;
+ }
+
+ # Translate X.Y.Z to X.00Y00Z
+ if( defined $self->{MIN_PERL_VERSION} ) {
+ $self->{MIN_PERL_VERSION} =~ s{ ^v? (\d+) \. (\d+) \. (\d+) $ }
+ {sprintf "%d.%03d%03d", $1, $2, $3}ex;
+ }
+
+ my $perl_version_ok = eval {
+ local $SIG{__WARN__} = sub {
+ # simulate "use warnings FATAL => 'all'" for vintage perls
+ die @_;
+ };
+ !$self->{MIN_PERL_VERSION} or $self->{MIN_PERL_VERSION} <= $]
+ };
+ if (!$perl_version_ok) {
+ if (!defined $perl_version_ok) {
+ die <<'END';
+ Warning: MIN_PERL_VERSION is not in a recognized format.
+ Recommended is a quoted numerical value like '5.005' or '5.008001'.
+ END
+ }
+ elsif ($self->{PREREQ_FATAL}) {
+ die sprintf <<"END", $self->{MIN_PERL_VERSION}, $];
+ MakeMaker FATAL: perl version too low for this distribution.
+ Required is %s. We run %s.
+ END
+ }
+ else {
+ warn sprintf
+ "Warning: Perl version %s or higher required. We run %s.\n",
+ $self->{MIN_PERL_VERSION}, $];
+ }
+ }
+
+ my %configure_att; # record &{$self->{CONFIGURE}} attributes
+ my(%initial_att) = %$self; # record initial attributes
+
+ my(%unsatisfied) = ();
+ my %prereq2version;
+ my $cmr;
+ if (_has_cpan_meta_requirements) {
+ $cmr = CPAN::Meta::Requirements->new;
+ for my $key (qw(PREREQ_PM BUILD_REQUIRES CONFIGURE_REQUIRES TEST_REQUIRES)) {
+ $cmr->add_requirements($key2cmr{$key}) if $key2cmr{$key};
+ }
+ foreach my $prereq ($cmr->required_modules) {
+ $prereq2version{$prereq} = $cmr->requirements_for_module($prereq);
+ }
+ } else {
+ for my $key (qw(PREREQ_PM BUILD_REQUIRES CONFIGURE_REQUIRES TEST_REQUIRES)) {
+ next unless my $module2version = $self->{$key};
+ $prereq2version{$_} = $module2version->{$_} for keys %$module2version;
+ }
+ }
+ foreach my $prereq (sort keys %prereq2version) {
+ my $required_version = $prereq2version{$prereq};
+
+ my $pr_version = 0;
+ my $installed_file;
+
+ if ( $prereq eq 'perl' ) {
+ if ( defined $required_version && $required_version =~ /^v?[\d_\.]+$/
+ || $required_version !~ /^v?[\d_\.]+$/ ) {
+ require version;
+ my $normal = eval { version->new( $required_version ) };
+ $required_version = $normal if defined $normal;
+ }
+ $installed_file = $prereq;
+ $pr_version = $];
+ }
+ else {
+ $installed_file = MM->_installed_file_for_module($prereq);
+ $pr_version = MM->parse_version($installed_file) if $installed_file;
+ $pr_version = 0 if $pr_version eq 'undef';
+ }
+
+ # convert X.Y_Z alpha version #s to X.YZ for easier comparisons
+ $pr_version =~ s/(\d+)\.(\d+)_(\d+)/$1.$2$3/;
+
+ if (!$installed_file) {
+ warn sprintf "Warning: prerequisite %s %s not found.\n",
+ $prereq, $required_version
+ unless $self->{PREREQ_FATAL}
+ or $ENV{PERL_CORE};
+
+ $unsatisfied{$prereq} = 'not installed';
+ }
+ elsif (
+ $cmr
+ ? !$cmr->accepts_module($prereq, $pr_version)
+ : $required_version > $pr_version
+ ) {
+ warn sprintf "Warning: prerequisite %s %s not found. We have %s.\n",
+ $prereq, $required_version, ($pr_version || 'unknown version')
+ unless $self->{PREREQ_FATAL}
+ or $ENV{PERL_CORE};
+
+ $unsatisfied{$prereq} = $required_version || 'unknown version' ;
+ }
+ }
+
+ if (%unsatisfied && $self->{PREREQ_FATAL}){
+ my $failedprereqs = join "\n", map {" $_ $unsatisfied{$_}"}
+ sort { $a cmp $b } keys %unsatisfied;
+ die <<"END";
+ MakeMaker FATAL: prerequisites not found.
+ $failedprereqs
+
+ Please install these modules first and rerun 'perl Makefile.PL'.
+ END
+ }
+
+ if (defined $self->{CONFIGURE}) {
+ if (ref $self->{CONFIGURE} eq 'CODE') {
+ %configure_att = %{&{$self->{CONFIGURE}}};
+ _convert_compat_attrs(\%configure_att);
+ $self = { %$self, %configure_att };
+ } else {
+ croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
+ }
+ }
+
+ # This is for old Makefiles written pre 5.00, will go away
+ if ( Carp::longmess("") =~ /runsubdirpl/s ){
+ carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n");
+ }
+
+ my $newclass = ++$PACKNAME;
+ local @Parent = @Parent; # Protect against non-local exits
+ {
+ print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
+ mv_all_methods("MY",$newclass);
+ bless $self, $newclass;
+ push @Parent, $self;
+ require ExtUtils::MY;
+
+ no strict 'refs'; ## no critic;
+ @{"$newclass\:\:ISA"} = 'MM';
+ }
+
+ if (defined $Parent[-2]){
+ $self->{PARENT} = $Parent[-2];
+ for my $key (@Prepend_parent) {
+ next unless defined $self->{PARENT}{$key};
+
+ # Don't stomp on WriteMakefile() args.
+ next if defined $self->{ARGS}{$key} and
+ $self->{ARGS}{$key} eq $self->{$key};
+
+ $self->{$key} = $self->{PARENT}{$key};
+
+ if ($Is_VMS && $key =~ /PERL$/) {
+ # PERL or FULLPERL will be a command verb or even a
+ # command with an argument instead of a full file
+ # specification under VMS. So, don't turn the command
+ # into a filespec, but do add a level to the path of
+ # the argument if not already absolute.
+ my @cmd = split /\s+/, $self->{$key};
+ $cmd[1] = $self->catfile('[-]',$cmd[1])
+ unless (@cmd < 2) || $self->file_name_is_absolute($cmd[1]);
+ $self->{$key} = join(' ', @cmd);
+ } else {
+ my $value = $self->{$key};
+ # not going to test in FS so only stripping start
+ $value =~ s/^"// if $key =~ /PERL$/;
+ $value = $self->catdir("..", $value)
+ unless $self->file_name_is_absolute($value);
+ $value = qq{"$value} if $key =~ /PERL$/;
+ $self->{$key} = $value;
+ }
+ }
+ if ($self->{PARENT}) {
+ $self->{PARENT}->{CHILDREN}->{$newclass} = $self;
+ foreach my $opt (qw(POLLUTE PERL_CORE LINKTYPE LD OPTIMIZE)) {
+ if (exists $self->{PARENT}->{$opt}
+ and not exists $self->{$opt})
+ {
+ # inherit, but only if already unspecified
+ $self->{$opt} = $self->{PARENT}->{$opt};
+ }
+ }
+ }
+ my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
+ parse_args($self,@fm) if @fm;
+ }
+ else {
+ parse_args($self, _shellwords($ENV{PERL_MM_OPT} || ''),@ARGV);
+ }
+
+ # RT#91540 PREREQ_FATAL not recognized on command line
+ if (%unsatisfied && $self->{PREREQ_FATAL}){
+ my $failedprereqs = join "\n", map {" $_ $unsatisfied{$_}"}
+ sort { $a cmp $b } keys %unsatisfied;
+ die <<"END";
+ MakeMaker FATAL: prerequisites not found.
+ $failedprereqs
+
+ Please install these modules first and rerun 'perl Makefile.PL'.
+ END
+ }
+
+ $self->{NAME} ||= $self->guess_name;
+
+ warn "Warning: NAME must be a package name\n"
+ unless $self->{NAME} =~ m!^[A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*$!;
+
+ ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g;
+
+ $self->init_MAKE;
+ $self->init_main;
+ $self->init_VERSION;
+ $self->init_dist;
+ $self->init_INST;
+ $self->init_INSTALL;
+ $self->init_DEST;
+ $self->init_dirscan;
+ $self->init_PM;
+ $self->init_MANPODS;
+ $self->init_xs;
+ $self->init_PERL;
+ $self->init_DIRFILESEP;
+ $self->init_linker;
+ $self->init_ABSTRACT;
+
+ $self->arch_check(
+ $INC{'Config.pm'},
+ $self->catfile($Config{'archlibexp'}, "Config.pm")
+ );
+
+ $self->init_tools();
+ $self->init_others();
+ $self->init_platform();
+ $self->init_PERM();
+ my @args = @ARGV;
+ @args = map { Encode::decode(locale => $_) } @args if $CAN_DECODE;
+ my($argv) = neatvalue(\@args);
+ $argv =~ s/^\[/(/;
+ $argv =~ s/\]$/)/;
+
+ push @{$self->{RESULT}}, <<END;
+ # This Makefile is for the $self->{NAME} extension to perl.
+ #
+ # It was generated automatically by MakeMaker version
+ # $VERSION (Revision: $Revision) from the contents of
+ # Makefile.PL. Don't edit this file, edit Makefile.PL instead.
+ #
+ # ANY CHANGES MADE HERE WILL BE LOST!
+ #
+ # MakeMaker ARGV: $argv
+ #
+ END
+
+ push @{$self->{RESULT}}, $self->_MakeMaker_Parameters_section(\%initial_att);
+
+ if (defined $self->{CONFIGURE}) {
+ push @{$self->{RESULT}}, <<END;
+
+ # MakeMaker 'CONFIGURE' Parameters:
+ END
+ if (scalar(keys %configure_att) > 0) {
+ foreach my $key (sort keys %configure_att){
+ next if $key eq 'ARGS';
+ my($v) = neatvalue($configure_att{$key});
+ $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+ $v =~ tr/\n/ /s;
+ push @{$self->{RESULT}}, "# $key => $v";
+ }
+ }
+ else
+ {
+ push @{$self->{RESULT}}, "# no values returned";
+ }
+ undef %configure_att; # free memory
+ }
+
+ # turn the SKIP array into a SKIPHASH hash
+ for my $skip (@{$self->{SKIP} || []}) {
+ $self->{SKIPHASH}{$skip} = 1;
+ }
+ delete $self->{SKIP}; # free memory
+
+ if ($self->{PARENT}) {
+ for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
+ $self->{SKIPHASH}{$_} = 1;
+ }
+ }
+
+ # We run all the subdirectories now. They don't have much to query
+ # from the parent, but the parent has to query them: if they need linking!
+ unless ($self->{NORECURS}) {
+ $self->eval_in_subdirs if @{$self->{DIR}};
+ }
+
+ foreach my $section ( @MM_Sections ){
+ # Support for new foo_target() methods.
+ my $method = $section;
+ $method .= '_target' unless $self->can($method);
+
+ print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
+ my($skipit) = $self->skipcheck($section);
+ if ($skipit){
+ push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit.";
+ } else {
+ my(%a) = %{$self->{$section} || {}};
+ push @{$self->{RESULT}}, "\n# --- MakeMaker $section section:";
+ push @{$self->{RESULT}}, "# " . join ", ", %a if $Verbose && %a;
+ push @{$self->{RESULT}}, $self->maketext_filter(
+ $self->$method( %a )
+ );
+ }
+ }
+
+ push @{$self->{RESULT}}, "\n# End.";
+
+ $self;
+ }
+
+ sub WriteEmptyMakefile {
+ croak "WriteEmptyMakefile: Need an even number of args" if @_ % 2;
+
+ my %att = @_;
+ $att{NAME} = 'Dummy' unless $att{NAME}; # eliminate pointless warnings
+ $att{DIR} = [] unless $att{DIR}; # don't recurse by default
+ my $self = MM->new(\%att);
+ require File::Path;
+ require File::Spec;
+ File::Path::rmtree( File::Spec->catdir(qw[blib _eumm]) ); # because MM->new does too much stuff
+
+ my $new = $self->{MAKEFILE};
+ my $old = $self->{MAKEFILE_OLD};
+ if (-f $old) {
+ _unlink($old) or warn "unlink $old: $!";
+ }
+ if ( -f $new ) {
+ _rename($new, $old) or warn "rename $new => $old: $!"
+ }
+ open my $mfh, '>', $new or die "open $new for write: $!";
+ printf $mfh <<'EOP', $self->{RM_F}, $self->{MAKEFILE};
+ all :
+
+ manifypods :
+
+ subdirs :
+
+ dynamic :
+
+ static :
+
+ realclean : clean
+
+ clean :
+ %s %s
+
+ install :
+
+ makemakerdflt :
+
+ test :
+
+ test_dynamic :
+
+ test_static :
+
+ EOP
+ close $mfh or die "close $new for write: $!";
+ }
+
+
+ =begin private
+
+ =head3 _installed_file_for_module
+
+ my $file = MM->_installed_file_for_module($module);
+
+ Return the first installed .pm $file associated with the $module. The
+ one which will show up when you C<use $module>.
+
+ $module is something like "strict" or "Test::More".
+
+ =end private
+
+ =cut
+
+ sub _installed_file_for_module {
+ my $class = shift;
+ my $prereq = shift;
+
+ my $file = "$prereq.pm";
+ $file =~ s{::}{/}g;
+
+ my $path;
+ for my $dir (@INC) {
+ my $tmp = File::Spec->catfile($dir, $file);
+ if ( -r $tmp ) {
+ $path = $tmp;
+ last;
+ }
+ }
+
+ return $path;
+ }
+
+
+ # Extracted from MakeMaker->new so we can test it
+ sub _MakeMaker_Parameters_section {
+ my $self = shift;
+ my $att = shift;
+
+ my @result = <<'END';
+ # MakeMaker Parameters:
+ END
+
+ foreach my $key (sort keys %$att){
+ next if $key eq 'ARGS';
+ my $v;
+ if ($key eq 'PREREQ_PM') {
+ # CPAN.pm takes prereqs from this field in 'Makefile'
+ # and does not know about BUILD_REQUIRES
+ $v = neatvalue({
+ %{ $att->{PREREQ_PM} || {} },
+ %{ $att->{BUILD_REQUIRES} || {} },
+ %{ $att->{TEST_REQUIRES} || {} },
+ });
+ } else {
+ $v = neatvalue($att->{$key});
+ }
+
+ $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+ $v =~ tr/\n/ /s;
+ push @result, "# $key => $v";
+ }
+
+ return @result;
+ }
+
+ # _shellwords and _parseline borrowed from Text::ParseWords
+ sub _shellwords {
+ my (@lines) = @_;
+ my @allwords;
+
+ foreach my $line (@lines) {
+ $line =~ s/^\s+//;
+ my @words = _parse_line('\s+', 0, $line);
+ pop @words if (@words and !defined $words[-1]);
+ return() unless (@words || !length($line));
+ push(@allwords, @words);
+ }
+ return(@allwords);
+ }
+
+ sub _parse_line {
+ my($delimiter, $keep, $line) = @_;
+ my($word, @pieces);
+
+ no warnings 'uninitialized'; # we will be testing undef strings
+
+ while (length($line)) {
+ # This pattern is optimised to be stack conservative on older perls.
+ # Do not refactor without being careful and testing it on very long strings.
+ # See Perl bug #42980 for an example of a stack busting input.
+ $line =~ s/^
+ (?:
+ # double quoted string
+ (") # $quote
+ ((?>[^\\"]*(?:\\.[^\\"]*)*))" # $quoted
+ | # --OR--
+ # singe quoted string
+ (') # $quote
+ ((?>[^\\']*(?:\\.[^\\']*)*))' # $quoted
+ | # --OR--
+ # unquoted string
+ ( # $unquoted
+ (?:\\.|[^\\"'])*?
+ )
+ # followed by
+ ( # $delim
+ \Z(?!\n) # EOL
+ | # --OR--
+ (?-x:$delimiter) # delimiter
+ | # --OR--
+ (?!^)(?=["']) # a quote
+ )
+ )//xs or return; # extended layout
+ my ($quote, $quoted, $unquoted, $delim) = (($1 ? ($1,$2) : ($3,$4)), $5, $6);
+
+
+ return() unless( defined($quote) || length($unquoted) || length($delim));
+
+ if ($keep) {
+ $quoted = "$quote$quoted$quote";
+ }
+ else {
+ $unquoted =~ s/\\(.)/$1/sg;
+ if (defined $quote) {
+ $quoted =~ s/\\(.)/$1/sg if ($quote eq '"');
+ #$quoted =~ s/\\([\\'])/$1/g if ( $PERL_SINGLE_QUOTE && $quote eq "'");
+ }
+ }
+ $word .= substr($line, 0, 0); # leave results tainted
+ $word .= defined $quote ? $quoted : $unquoted;
+
+ if (length($delim)) {
+ push(@pieces, $word);
+ push(@pieces, $delim) if ($keep eq 'delimiters');
+ undef $word;
+ }
+ if (!length($line)) {
+ push(@pieces, $word);
+ }
+ }
+ return(@pieces);
+ }
+
+ sub check_manifest {
+ print "Checking if your kit is complete...\n";
+ require ExtUtils::Manifest;
+ # avoid warning
+ $ExtUtils::Manifest::Quiet = $ExtUtils::Manifest::Quiet = 1;
+ my(@missed) = ExtUtils::Manifest::manicheck();
+ if (@missed) {
+ print "Warning: the following files are missing in your kit:\n";
+ print "\t", join "\n\t", @missed;
+ print "\n";
+ print "Please inform the author.\n";
+ } else {
+ print "Looks good\n";
+ }
+ }
+
+ sub parse_args{
+ my($self, @args) = @_;
+ @args = map { Encode::decode(locale => $_) } @args if $CAN_DECODE;
+ foreach (@args) {
+ unless (m/(.*?)=(.*)/) {
+ ++$Verbose if m/^verb/;
+ next;
+ }
+ my($name, $value) = ($1, $2);
+ if ($value =~ m/^~(\w+)?/) { # tilde with optional username
+ $value =~ s [^~(\w*)]
+ [$1 ?
+ ((getpwnam($1))[7] || "~$1") :
+ (getpwuid($>))[7]
+ ]ex;
+ }
+
+ # Remember the original args passed it. It will be useful later.
+ $self->{ARGS}{uc $name} = $self->{uc $name} = $value;
+ }
+
+ # catch old-style 'potential_libs' and inform user how to 'upgrade'
+ if (defined $self->{potential_libs}){
+ my($msg)="'potential_libs' => '$self->{potential_libs}' should be";
+ if ($self->{potential_libs}){
+ print "$msg changed to:\n\t'LIBS' => ['$self->{potential_libs}']\n";
+ } else {
+ print "$msg deleted.\n";
+ }
+ $self->{LIBS} = [$self->{potential_libs}];
+ delete $self->{potential_libs};
+ }
+ # catch old-style 'ARMAYBE' and inform user how to 'upgrade'
+ if (defined $self->{ARMAYBE}){
+ my($armaybe) = $self->{ARMAYBE};
+ print "ARMAYBE => '$armaybe' should be changed to:\n",
+ "\t'dynamic_lib' => {ARMAYBE => '$armaybe'}\n";
+ my(%dl) = %{$self->{dynamic_lib} || {}};
+ $self->{dynamic_lib} = { %dl, ARMAYBE => $armaybe};
+ delete $self->{ARMAYBE};
+ }
+ if (defined $self->{LDTARGET}){
+ print "LDTARGET should be changed to LDFROM\n";
+ $self->{LDFROM} = $self->{LDTARGET};
+ delete $self->{LDTARGET};
+ }
+ # Turn a DIR argument on the command line into an array
+ if (defined $self->{DIR} && ref \$self->{DIR} eq 'SCALAR') {
+ # So they can choose from the command line, which extensions they want
+ # the grep enables them to have some colons too much in case they
+ # have to build a list with the shell
+ $self->{DIR} = [grep $_, split ":", $self->{DIR}];
+ }
+ # Turn a INCLUDE_EXT argument on the command line into an array
+ if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') {
+ $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}];
+ }
+ # Turn a EXCLUDE_EXT argument on the command line into an array
+ if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') {
+ $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}];
+ }
+
+ foreach my $mmkey (sort keys %$self){
+ next if $mmkey eq 'ARGS';
+ print " $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose;
+ print "'$mmkey' is not a known MakeMaker parameter name.\n"
+ unless exists $Recognized_Att_Keys{$mmkey};
+ }
+ $| = 1 if $Verbose;
+ }
+
+ sub check_hints {
+ my($self) = @_;
+ # We allow extension-specific hints files.
+
+ require File::Spec;
+ my $curdir = File::Spec->curdir;
+
+ my $hint_dir = File::Spec->catdir($curdir, "hints");
+ return unless -d $hint_dir;
+
+ # First we look for the best hintsfile we have
+ my($hint)="${^O}_$Config{osvers}";
+ $hint =~ s/\./_/g;
+ $hint =~ s/_$//;
+ return unless $hint;
+
+ # Also try without trailing minor version numbers.
+ while (1) {
+ last if -f File::Spec->catfile($hint_dir, "$hint.pl"); # found
+ } continue {
+ last unless $hint =~ s/_[^_]*$//; # nothing to cut off
+ }
+ my $hint_file = File::Spec->catfile($hint_dir, "$hint.pl");
+
+ return unless -f $hint_file; # really there
+
+ _run_hintfile($self, $hint_file);
+ }
+
+ sub _run_hintfile {
+ our $self;
+ local($self) = shift; # make $self available to the hint file.
+ my($hint_file) = shift;
+
+ local($@, $!);
+ print "Processing hints file $hint_file\n" if $Verbose;
+
+ # Just in case the ./ isn't on the hint file, which File::Spec can
+ # often strip off, we bung the curdir into @INC
+ local @INC = (File::Spec->curdir, @INC);
+ my $ret = do $hint_file;
+ if( !defined $ret ) {
+ my $error = $@ || $!;
+ warn $error;
+ }
+ }
+
+ sub mv_all_methods {
+ my($from,$to) = @_;
+ local $SIG{__WARN__} = sub {
+ # can't use 'no warnings redefined', 5.6 only
+ warn @_ unless $_[0] =~ /^Subroutine .* redefined/
+ };
+ foreach my $method (@Overridable) {
+ next unless defined &{"${from}::$method"};
+ no strict 'refs'; ## no critic
+ *{"${to}::$method"} = \&{"${from}::$method"};
+
+ # If we delete a method, then it will be undefined and cannot
+ # be called. But as long as we have Makefile.PLs that rely on
+ # %MY:: being intact, we have to fill the hole with an
+ # inheriting method:
+
+ {
+ package MY;
+ my $super = "SUPER::".$method;
+ *{$method} = sub {
+ shift->$super(@_);
+ };
+ }
+ }
+ }
+
+ sub skipcheck {
+ my($self) = shift;
+ my($section) = @_;
+ if ($section eq 'dynamic') {
+ print "Warning (non-fatal): Target 'dynamic' depends on targets ",
+ "in skipped section 'dynamic_bs'\n"
+ if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
+ print "Warning (non-fatal): Target 'dynamic' depends on targets ",
+ "in skipped section 'dynamic_lib'\n"
+ if $self->{SKIPHASH}{dynamic_lib} && $Verbose;
+ }
+ if ($section eq 'dynamic_lib') {
+ print "Warning (non-fatal): Target '\$(INST_DYNAMIC)' depends on ",
+ "targets in skipped section 'dynamic_bs'\n"
+ if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
+ }
+ if ($section eq 'static') {
+ print "Warning (non-fatal): Target 'static' depends on targets ",
+ "in skipped section 'static_lib'\n"
+ if $self->{SKIPHASH}{static_lib} && $Verbose;
+ }
+ return 'skipped' if $self->{SKIPHASH}{$section};
+ return '';
+ }
+
+ # returns filehandle, dies on fail. :raw so no :crlf
+ sub open_for_writing {
+ my ($file) = @_;
+ open my $fh ,">", $file or die "Unable to open $file: $!";
+ my @layers = ':raw';
+ push @layers, join ' ', ':encoding(locale)' if $CAN_DECODE;
+ binmode $fh, join ' ', @layers;
+ $fh;
+ }
+
+ sub flush {
+ my $self = shift;
+
+ my $finalname = $self->{MAKEFILE};
+ printf "Generating a %s %s\n", $self->make_type, $finalname;
+ print "Writing $finalname for $self->{NAME}\n";
+
+ unlink($finalname, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : ());
+
+ write_file_via_tmp($finalname, $self->{RESULT});
+
+ # Write MYMETA.yml to communicate metadata up to the CPAN clients
+ print "Writing MYMETA.yml and MYMETA.json\n"
+ if !$self->{NO_MYMETA} and $self->write_mymeta( $self->mymeta );
+
+ # save memory
+ if ($self->{PARENT} && !$self->{_KEEP_AFTER_FLUSH}) {
+ my %keep = map { ($_ => 1) } qw(NEEDS_LINKING HAS_LINK_CODE);
+ delete $self->{$_} for grep !$keep{$_}, keys %$self;
+ }
+
+ system("$Config::Config{eunicefix} $finalname")
+ if $Config::Config{eunicefix} ne ":";
+
+ return;
+ }
+
+ sub write_file_via_tmp {
+ my ($finalname, $contents) = @_;
+ my $fh = open_for_writing("MakeMaker.tmp");
+ die "write_file_via_tmp: 2nd arg must be ref" unless ref $contents;
+ for my $chunk (@$contents) {
+ my $to_write = $chunk;
+ utf8::encode $to_write if !$CAN_DECODE && $] > 5.008;
+ print $fh "$to_write\n" or die "Can't write to MakeMaker.tmp: $!";
+ }
+ close $fh or die "Can't write to MakeMaker.tmp: $!";
+ _rename("MakeMaker.tmp", $finalname) or
+ warn "rename MakeMaker.tmp => $finalname: $!";
+ chmod 0644, $finalname if !$Is_VMS;
+ return;
+ }
+
+ # This is a rename for OS's where the target must be unlinked first.
+ sub _rename {
+ my($src, $dest) = @_;
+ _unlink($dest);
+ return rename $src, $dest;
+ }
+
+ # This is an unlink for OS's where the target must be writable first.
+ sub _unlink {
+ my @files = @_;
+ chmod 0666, @files;
+ return unlink @files;
+ }
+
+
+ # The following mkbootstrap() is only for installations that are calling
+ # the pre-4.1 mkbootstrap() from their old Makefiles. This MakeMaker
+ # writes Makefiles, that use ExtUtils::Mkbootstrap directly.
+ sub mkbootstrap {
+ die <<END;
+ !!! Your Makefile has been built such a long time ago, !!!
+ !!! that is unlikely to work with current MakeMaker. !!!
+ !!! Please rebuild your Makefile !!!
+ END
+ }
+
+ # Ditto for mksymlists() as of MakeMaker 5.17
+ sub mksymlists {
+ die <<END;
+ !!! Your Makefile has been built such a long time ago, !!!
+ !!! that is unlikely to work with current MakeMaker. !!!
+ !!! Please rebuild your Makefile !!!
+ END
+ }
+
+ sub neatvalue {
+ my($v) = @_;
+ return "undef" unless defined $v;
+ my($t) = ref $v;
+ return "q[$v]" unless $t;
+ if ($t eq 'ARRAY') {
+ my(@m, @neat);
+ push @m, "[";
+ foreach my $elem (@$v) {
+ push @neat, "q[$elem]";
+ }
+ push @m, join ", ", @neat;
+ push @m, "]";
+ return join "", @m;
+ }
+ return $v unless $t eq 'HASH';
+ my(@m, $key, $val);
+ for my $key (sort keys %$v) {
+ last unless defined $key; # cautious programming in case (undef,undef) is true
+ push @m,"$key=>".neatvalue($v->{$key});
+ }
+ return "{ ".join(', ',@m)." }";
+ }
+
+ sub _find_magic_vstring {
+ my $value = shift;
+ return $value if $UNDER_CORE;
+ my $tvalue = '';
+ require B;
+ my $sv = B::svref_2object(\$value);
+ my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
+ while ( $magic ) {
+ if ( $magic->TYPE eq 'V' ) {
+ $tvalue = $magic->PTR;
+ $tvalue =~ s/^v?(.+)$/v$1/;
+ last;
+ }
+ else {
+ $magic = $magic->MOREMAGIC;
+ }
+ }
+ return $tvalue;
+ }
+
+ sub selfdocument {
+ my($self) = @_;
+ my(@m);
+ if ($Verbose){
+ push @m, "\n# Full list of MakeMaker attribute values:";
+ foreach my $key (sort keys %$self){
+ next if $key eq 'RESULT' || $key =~ /^[A-Z][a-z]/;
+ my($v) = neatvalue($self->{$key});
+ $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+ $v =~ tr/\n/ /s;
+ push @m, "# $key => $v";
+ }
+ }
+ # added here as selfdocument is not overridable
+ push @m, <<'EOF';
+
+ # here so even if top_targets is overridden, these will still be defined
+ # gmake will silently still work if any are .PHONY-ed but nmake won't
+ static ::
+ $(NOECHO) $(NOOP)
+
+ dynamic ::
+ $(NOECHO) $(NOOP)
+ EOF
+ push @m, join "\n", map "$_ ::\n\t\$(NOECHO) \$(NOOP)\n",
+ # config is so manifypods won't puke if no subdirs
+ qw(static dynamic config);
+ join "\n", @m;
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ ExtUtils::MakeMaker - Create a module Makefile
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => "Foo::Bar",
+ VERSION_FROM => "lib/Foo/Bar.pm",
+ );
+
+ =head1 DESCRIPTION
+
+ This utility is designed to write a Makefile for an extension module
+ from a Makefile.PL. It is based on the Makefile.SH model provided by
+ Andy Dougherty and the perl5-porters.
+
+ It splits the task of generating the Makefile into several subroutines
+ that can be individually overridden. Each subroutine returns the text
+ it wishes to have written to the Makefile.
+
+ As there are various Make programs with incompatible syntax, which
+ use operating system shells, again with incompatible syntax, it is
+ important for users of this module to know which flavour of Make
+ a Makefile has been written for so they'll use the correct one and
+ won't have to face the possibly bewildering errors resulting from
+ using the wrong one.
+
+ On POSIX systems, that program will likely be GNU Make; on Microsoft
+ Windows, it will be either Microsoft NMake, DMake or GNU Make.
+ See the section on the L</"MAKE"> parameter for details.
+
+ ExtUtils::MakeMaker (EUMM) is object oriented. Each directory below the current
+ directory that contains a Makefile.PL is treated as a separate
+ object. This makes it possible to write an unlimited number of
+ Makefiles with a single invocation of WriteMakefile().
+
+ All inputs to WriteMakefile are Unicode characters, not just octets. EUMM
+ seeks to handle all of these correctly. It is currently still not possible
+ to portably use Unicode characters in module names, because this requires
+ Perl to handle Unicode filenames, which is not yet the case on Windows.
+
+ =head2 How To Write A Makefile.PL
+
+ See L<ExtUtils::MakeMaker::Tutorial>.
+
+ The long answer is the rest of the manpage :-)
+
+ =head2 Default Makefile Behaviour
+
+ The generated Makefile enables the user of the extension to invoke
+
+ perl Makefile.PL # optionally "perl Makefile.PL verbose"
+ make
+ make test # optionally set TEST_VERBOSE=1
+ make install # See below
+
+ The Makefile to be produced may be altered by adding arguments of the
+ form C<KEY=VALUE>. E.g.
+
+ perl Makefile.PL INSTALL_BASE=~
+
+ Other interesting targets in the generated Makefile are
+
+ make config # to check if the Makefile is up-to-date
+ make clean # delete local temp files (Makefile gets renamed)
+ make realclean # delete derived files (including ./blib)
+ make ci # check in all the files in the MANIFEST file
+ make dist # see below the Distribution Support section
+
+ =head2 make test
+
+ MakeMaker checks for the existence of a file named F<test.pl> in the
+ current directory, and if it exists it executes the script with the
+ proper set of perl C<-I> options.
+
+ MakeMaker also checks for any files matching glob("t/*.t"). It will
+ execute all matching files in alphabetical order via the
+ L<Test::Harness> module with the C<-I> switches set correctly.
+
+ If you'd like to see the raw output of your tests, set the
+ C<TEST_VERBOSE> variable to true.
+
+ make test TEST_VERBOSE=1
+
+ If you want to run particular test files, set the C<TEST_FILES> variable.
+ It is possible to use globbing with this mechanism.
+
+ make test TEST_FILES='t/foobar.t t/dagobah*.t'
+
+ Windows users who are using C<nmake> should note that due to a bug in C<nmake>,
+ when specifying C<TEST_FILES> you must use back-slashes instead of forward-slashes.
+
+ nmake test TEST_FILES='t\foobar.t t\dagobah*.t'
+
+ =head2 make testdb
+
+ A useful variation of the above is the target C<testdb>. It runs the
+ test under the Perl debugger (see L<perldebug>). If the file
+ F<test.pl> exists in the current directory, it is used for the test.
+
+ If you want to debug some other testfile, set the C<TEST_FILE> variable
+ thusly:
+
+ make testdb TEST_FILE=t/mytest.t
+
+ By default the debugger is called using C<-d> option to perl. If you
+ want to specify some other option, set the C<TESTDB_SW> variable:
+
+ make testdb TESTDB_SW=-Dx
+
+ =head2 make install
+
+ make alone puts all relevant files into directories that are named by
+ the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR and
+ INST_MAN3DIR. All these default to something below ./blib if you are
+ I<not> building below the perl source directory. If you I<are>
+ building below the perl source, INST_LIB and INST_ARCHLIB default to
+ ../../lib, and INST_SCRIPT is not defined.
+
+ The I<install> target of the generated Makefile copies the files found
+ below each of the INST_* directories to their INSTALL*
+ counterparts. Which counterparts are chosen depends on the setting of
+ INSTALLDIRS according to the following table:
+
+ INSTALLDIRS set to
+ perl site vendor
+
+ PERLPREFIX SITEPREFIX VENDORPREFIX
+ INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
+ INST_LIB INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
+ INST_BIN INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN
+ INST_SCRIPT INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT
+ INST_MAN1DIR INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
+ INST_MAN3DIR INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
+
+ The INSTALL... macros in turn default to their %Config
+ ($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts.
+
+ You can check the values of these variables on your system with
+
+ perl '-V:install.*'
+
+ And to check the sequence in which the library directories are
+ searched by perl, run
+
+ perl -le 'print join $/, @INC'
+
+ Sometimes older versions of the module you're installing live in other
+ directories in @INC. Because Perl loads the first version of a module it
+ finds, not the newest, you might accidentally get one of these older
+ versions even after installing a brand new version. To delete I<all other
+ versions of the module you're installing> (not simply older ones) set the
+ C<UNINST> variable.
+
+ make install UNINST=1
+
+
+ =head2 INSTALL_BASE
+
+ INSTALL_BASE can be passed into Makefile.PL to change where your
+ module will be installed. INSTALL_BASE is more like what everyone
+ else calls "prefix" than PREFIX is.
+
+ To have everything installed in your home directory, do the following.
+
+ # Unix users, INSTALL_BASE=~ works fine
+ perl Makefile.PL INSTALL_BASE=/path/to/your/home/dir
+
+ Like PREFIX, it sets several INSTALL* attributes at once. Unlike
+ PREFIX it is easy to predict where the module will end up. The
+ installation pattern looks like this:
+
+ INSTALLARCHLIB INSTALL_BASE/lib/perl5/$Config{archname}
+ INSTALLPRIVLIB INSTALL_BASE/lib/perl5
+ INSTALLBIN INSTALL_BASE/bin
+ INSTALLSCRIPT INSTALL_BASE/bin
+ INSTALLMAN1DIR INSTALL_BASE/man/man1
+ INSTALLMAN3DIR INSTALL_BASE/man/man3
+
+ INSTALL_BASE in MakeMaker and C<--install_base> in Module::Build (as
+ of 0.28) install to the same location. If you want MakeMaker and
+ Module::Build to install to the same location simply set INSTALL_BASE
+ and C<--install_base> to the same location.
+
+ INSTALL_BASE was added in 6.31.
+
+
+ =head2 PREFIX and LIB attribute
+
+ PREFIX and LIB can be used to set several INSTALL* attributes in one
+ go. Here's an example for installing into your home directory.
+
+ # Unix users, PREFIX=~ works fine
+ perl Makefile.PL PREFIX=/path/to/your/home/dir
+
+ This will install all files in the module under your home directory,
+ with man pages and libraries going into an appropriate place (usually
+ ~/man and ~/lib). How the exact location is determined is complicated
+ and depends on how your Perl was configured. INSTALL_BASE works more
+ like what other build systems call "prefix" than PREFIX and we
+ recommend you use that instead.
+
+ Another way to specify many INSTALL directories with a single
+ parameter is LIB.
+
+ perl Makefile.PL LIB=~/lib
+
+ This will install the module's architecture-independent files into
+ ~/lib, the architecture-dependent files into ~/lib/$archname.
+
+ Note, that in both cases the tilde expansion is done by MakeMaker, not
+ by perl by default, nor by make.
+
+ Conflicts between parameters LIB, PREFIX and the various INSTALL*
+ arguments are resolved so that:
+
+ =over 4
+
+ =item *
+
+ setting LIB overrides any setting of INSTALLPRIVLIB, INSTALLARCHLIB,
+ INSTALLSITELIB, INSTALLSITEARCH (and they are not affected by PREFIX);
+
+ =item *
+
+ without LIB, setting PREFIX replaces the initial C<$Config{prefix}>
+ part of those INSTALL* arguments, even if the latter are explicitly
+ set (but are set to still start with C<$Config{prefix}>).
+
+ =back
+
+ If the user has superuser privileges, and is not working on AFS or
+ relatives, then the defaults for INSTALLPRIVLIB, INSTALLARCHLIB,
+ INSTALLSCRIPT, etc. will be appropriate, and this incantation will be
+ the best:
+
+ perl Makefile.PL;
+ make;
+ make test
+ make install
+
+ make install by default writes some documentation of what has been
+ done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This feature
+ can be bypassed by calling make pure_install.
+
+ =head2 AFS users
+
+ will have to specify the installation directories as these most
+ probably have changed since perl itself has been installed. They will
+ have to do this by calling
+
+ perl Makefile.PL INSTALLSITELIB=/afs/here/today \
+ INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
+ make
+
+ Be careful to repeat this procedure every time you recompile an
+ extension, unless you are sure the AFS installation directories are
+ still valid.
+
+ =head2 Static Linking of a new Perl Binary
+
+ An extension that is built with the above steps is ready to use on
+ systems supporting dynamic loading. On systems that do not support
+ dynamic loading, any newly created extension has to be linked together
+ with the available resources. MakeMaker supports the linking process
+ by creating appropriate targets in the Makefile whenever an extension
+ is built. You can invoke the corresponding section of the makefile with
+
+ make perl
+
+ That produces a new perl binary in the current directory with all
+ extensions linked in that can be found in INST_ARCHLIB, SITELIBEXP,
+ and PERL_ARCHLIB. To do that, MakeMaker writes a new Makefile, on
+ UNIX, this is called F<Makefile.aperl> (may be system dependent). If you
+ want to force the creation of a new perl, it is recommended that you
+ delete this F<Makefile.aperl>, so the directories are searched through
+ for linkable libraries again.
+
+ The binary can be installed into the directory where perl normally
+ resides on your machine with
+
+ make inst_perl
+
+ To produce a perl binary with a different name than C<perl>, either say
+
+ perl Makefile.PL MAP_TARGET=myperl
+ make myperl
+ make inst_perl
+
+ or say
+
+ perl Makefile.PL
+ make myperl MAP_TARGET=myperl
+ make inst_perl MAP_TARGET=myperl
+
+ In any case you will be prompted with the correct invocation of the
+ C<inst_perl> target that installs the new binary into INSTALLBIN.
+
+ make inst_perl by default writes some documentation of what has been
+ done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This
+ can be bypassed by calling make pure_inst_perl.
+
+ Warning: the inst_perl: target will most probably overwrite your
+ existing perl binary. Use with care!
+
+ Sometimes you might want to build a statically linked perl although
+ your system supports dynamic loading. In this case you may explicitly
+ set the linktype with the invocation of the Makefile.PL or make:
+
+ perl Makefile.PL LINKTYPE=static # recommended
+
+ or
+
+ make LINKTYPE=static # works on most systems
+
+ =head2 Determination of Perl Library and Installation Locations
+
+ MakeMaker needs to know, or to guess, where certain things are
+ located. Especially INST_LIB and INST_ARCHLIB (where to put the files
+ during the make(1) run), PERL_LIB and PERL_ARCHLIB (where to read
+ existing modules from), and PERL_INC (header files and C<libperl*.*>).
+
+ Extensions may be built either using the contents of the perl source
+ directory tree or from the installed perl library. The recommended way
+ is to build extensions after you have run 'make install' on perl
+ itself. You can do that in any directory on your hard disk that is not
+ below the perl source tree. The support for extensions below the ext
+ directory of the perl distribution is only good for the standard
+ extensions that come with perl.
+
+ If an extension is being built below the C<ext/> directory of the perl
+ source then MakeMaker will set PERL_SRC automatically (e.g.,
+ C<../..>). If PERL_SRC is defined and the extension is recognized as
+ a standard extension, then other variables default to the following:
+
+ PERL_INC = PERL_SRC
+ PERL_LIB = PERL_SRC/lib
+ PERL_ARCHLIB = PERL_SRC/lib
+ INST_LIB = PERL_LIB
+ INST_ARCHLIB = PERL_ARCHLIB
+
+ If an extension is being built away from the perl source then MakeMaker
+ will leave PERL_SRC undefined and default to using the installed copy
+ of the perl library. The other variables default to the following:
+
+ PERL_INC = $archlibexp/CORE
+ PERL_LIB = $privlibexp
+ PERL_ARCHLIB = $archlibexp
+ INST_LIB = ./blib/lib
+ INST_ARCHLIB = ./blib/arch
+
+ If perl has not yet been installed then PERL_SRC can be defined on the
+ command line as shown in the previous section.
+
+
+ =head2 Which architecture dependent directory?
+
+ If you don't want to keep the defaults for the INSTALL* macros,
+ MakeMaker helps you to minimize the typing needed: the usual
+ relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined
+ by Configure at perl compilation time. MakeMaker supports the user who
+ sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not,
+ then MakeMaker defaults the latter to be the same subdirectory of
+ INSTALLPRIVLIB as Configure decided for the counterparts in %Config,
+ otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
+ for INSTALLSITELIB and INSTALLSITEARCH.
+
+ MakeMaker gives you much more freedom than needed to configure
+ internal variables and get different results. It is worth mentioning
+ that make(1) also lets you configure most of the variables that are
+ used in the Makefile. But in the majority of situations this will not
+ be necessary, and should only be done if the author of a package
+ recommends it (or you know what you're doing).
+
+ =head2 Using Attributes and Parameters
+
+ The following attributes may be specified as arguments to WriteMakefile()
+ or as NAME=VALUE pairs on the command line. Attributes that became
+ available with later versions of MakeMaker are indicated.
+
+ In order to maintain portability of attributes with older versions of
+ MakeMaker you may want to use L<App::EUMM::Upgrade> with your C<Makefile.PL>.
+
+ =over 2
+
+ =item ABSTRACT
+
+ One line description of the module. Will be included in PPD file.
+
+ =item ABSTRACT_FROM
+
+ Name of the file that contains the package description. MakeMaker looks
+ for a line in the POD matching /^($package\s-\s)(.*)/. This is typically
+ the first line in the "=head1 NAME" section. $2 becomes the abstract.
+
+ =item AUTHOR
+
+ Array of strings containing name (and email address) of package author(s).
+ Is used in CPAN Meta files (META.yml or META.json) and PPD
+ (Perl Package Description) files for PPM (Perl Package Manager).
+
+ =item BINARY_LOCATION
+
+ Used when creating PPD files for binary packages. It can be set to a
+ full or relative path or URL to the binary archive for a particular
+ architecture. For example:
+
+ perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz
+
+ builds a PPD package that references a binary of the C<Agent> package,
+ located in the C<x86> directory relative to the PPD itself.
+
+ =item BUILD_REQUIRES
+
+ Available in version 6.5503 and above.
+
+ A hash of modules that are needed to build your module but not run it.
+
+ This will go into the C<build_requires> field of your F<META.yml> and the C<build> of the C<prereqs> field of your F<META.json>.
+
+ Defaults to C<<< { "ExtUtils::MakeMaker" => 0 } >>> if this attribute is not specified.
+
+ The format is the same as PREREQ_PM.
+
+ =item C
+
+ Ref to array of *.c file names. Initialised from a directory scan
+ and the values portion of the XS attribute hash. This is not
+ currently used by MakeMaker but may be handy in Makefile.PLs.
+
+ =item CCFLAGS
+
+ String that will be included in the compiler call command line between
+ the arguments INC and OPTIMIZE.
+
+ =item CONFIG
+
+ Arrayref. E.g. [qw(archname manext)] defines ARCHNAME & MANEXT from
+ config.sh. MakeMaker will add to CONFIG the following values anyway:
+ ar
+ cc
+ cccdlflags
+ ccdlflags
+ dlext
+ dlsrc
+ ld
+ lddlflags
+ ldflags
+ libc
+ lib_ext
+ obj_ext
+ ranlib
+ sitelibexp
+ sitearchexp
+ so
+
+ =item CONFIGURE
+
+ CODE reference. The subroutine should return a hash reference. The
+ hash may contain further attributes, e.g. {LIBS =E<gt> ...}, that have to
+ be determined by some evaluation method.
+
+ =item CONFIGURE_REQUIRES
+
+ Available in version 6.52 and above.
+
+ A hash of modules that are required to run Makefile.PL itself, but not
+ to run your distribution.
+
+ This will go into the C<configure_requires> field of your F<META.yml> and the C<configure> of the C<prereqs> field of your F<META.json>.
+
+ Defaults to C<<< { "ExtUtils::MakeMaker" => 0 } >>> if this attribute is not specified.
+
+ The format is the same as PREREQ_PM.
+
+ =item DEFINE
+
+ Something like C<"-DHAVE_UNISTD_H">
+
+ =item DESTDIR
+
+ This is the root directory into which the code will be installed. It
+ I<prepends itself to the normal prefix>. For example, if your code
+ would normally go into F</usr/local/lib/perl> you could set DESTDIR=~/tmp/
+ and installation would go into F<~/tmp/usr/local/lib/perl>.
+
+ This is primarily of use for people who repackage Perl modules.
+
+ NOTE: Due to the nature of make, it is important that you put the trailing
+ slash on your DESTDIR. F<~/tmp/> not F<~/tmp>.
+
+ =item DIR
+
+ Ref to array of subdirectories containing Makefile.PLs e.g. ['sdbm']
+ in ext/SDBM_File
+
+ =item DISTNAME
+
+ A safe filename for the package.
+
+ Defaults to NAME below but with :: replaced with -.
+
+ For example, Foo::Bar becomes Foo-Bar.
+
+ =item DISTVNAME
+
+ Your name for distributing the package with the version number
+ included. This is used by 'make dist' to name the resulting archive
+ file.
+
+ Defaults to DISTNAME-VERSION.
+
+ For example, version 1.04 of Foo::Bar becomes Foo-Bar-1.04.
+
+ On some OS's where . has special meaning VERSION_SYM may be used in
+ place of VERSION.
+
+ =item DLEXT
+
+ Specifies the extension of the module's loadable object. For example:
+
+ DLEXT => 'unusual_ext', # Default value is $Config{so}
+
+ NOTE: When using this option to alter the extension of a module's
+ loadable object, it is also necessary that the module's pm file
+ specifies the same change:
+
+ local $DynaLoader::dl_dlext = 'unusual_ext';
+
+ =item DL_FUNCS
+
+ Hashref of symbol names for routines to be made available as universal
+ symbols. Each key/value pair consists of the package name and an
+ array of routine names in that package. Used only under AIX, OS/2,
+ VMS and Win32 at present. The routine names supplied will be expanded
+ in the same way as XSUB names are expanded by the XS() macro.
+ Defaults to
+
+ {"$(NAME)" => ["boot_$(NAME)" ] }
+
+ e.g.
+
+ {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )],
+ "NetconfigPtr" => [ 'DESTROY'] }
+
+ Please see the L<ExtUtils::Mksymlists> documentation for more information
+ about the DL_FUNCS, DL_VARS and FUNCLIST attributes.
+
+ =item DL_VARS
+
+ Array of symbol names for variables to be made available as universal symbols.
+ Used only under AIX, OS/2, VMS and Win32 at present. Defaults to [].
+ (e.g. [ qw(Foo_version Foo_numstreams Foo_tree ) ])
+
+ =item EXCLUDE_EXT
+
+ Array of extension names to exclude when doing a static build. This
+ is ignored if INCLUDE_EXT is present. Consult INCLUDE_EXT for more
+ details. (e.g. [ qw( Socket POSIX ) ] )
+
+ This attribute may be most useful when specified as a string on the
+ command line: perl Makefile.PL EXCLUDE_EXT='Socket Safe'
+
+ =item EXE_FILES
+
+ Ref to array of executable files. The files will be copied to the
+ INST_SCRIPT directory. Make realclean will delete them from there
+ again.
+
+ If your executables start with something like #!perl or
+ #!/usr/bin/perl MakeMaker will change this to the path of the perl
+ 'Makefile.PL' was invoked with so the programs will be sure to run
+ properly even if perl is not in /usr/bin/perl.
+
+ =item FIRST_MAKEFILE
+
+ The name of the Makefile to be produced. This is used for the second
+ Makefile that will be produced for the MAP_TARGET.
+
+ Defaults to 'Makefile' or 'Descrip.MMS' on VMS.
+
+ (Note: we couldn't use MAKEFILE because dmake uses this for something
+ else).
+
+ =item FULLPERL
+
+ Perl binary able to run this extension, load XS modules, etc...
+
+ =item FULLPERLRUN
+
+ Like PERLRUN, except it uses FULLPERL.
+
+ =item FULLPERLRUNINST
+
+ Like PERLRUNINST, except it uses FULLPERL.
+
+ =item FUNCLIST
+
+ This provides an alternate means to specify function names to be
+ exported from the extension. Its value is a reference to an
+ array of function names to be exported by the extension. These
+ names are passed through unaltered to the linker options file.
+
+ =item H
+
+ Ref to array of *.h file names. Similar to C.
+
+ =item IMPORTS
+
+ This attribute is used to specify names to be imported into the
+ extension. Takes a hash ref.
+
+ It is only used on OS/2 and Win32.
+
+ =item INC
+
+ Include file dirs eg: C<"-I/usr/5include -I/path/to/inc">
+
+ =item INCLUDE_EXT
+
+ Array of extension names to be included when doing a static build.
+ MakeMaker will normally build with all of the installed extensions when
+ doing a static build, and that is usually the desired behavior. If
+ INCLUDE_EXT is present then MakeMaker will build only with those extensions
+ which are explicitly mentioned. (e.g. [ qw( Socket POSIX ) ])
+
+ It is not necessary to mention DynaLoader or the current extension when
+ filling in INCLUDE_EXT. If the INCLUDE_EXT is mentioned but is empty then
+ only DynaLoader and the current extension will be included in the build.
+
+ This attribute may be most useful when specified as a string on the
+ command line: perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'
+
+ =item INSTALLARCHLIB
+
+ Used by 'make install', which copies files from INST_ARCHLIB to this
+ directory if INSTALLDIRS is set to perl.
+
+ =item INSTALLBIN
+
+ Directory to install binary files (e.g. tkperl) into if
+ INSTALLDIRS=perl.
+
+ =item INSTALLDIRS
+
+ Determines which of the sets of installation directories to choose:
+ perl, site or vendor. Defaults to site.
+
+ =item INSTALLMAN1DIR
+
+ =item INSTALLMAN3DIR
+
+ These directories get the man pages at 'make install' time if
+ INSTALLDIRS=perl. Defaults to $Config{installman*dir}.
+
+ If set to 'none', no man pages will be installed.
+
+ =item INSTALLPRIVLIB
+
+ Used by 'make install', which copies files from INST_LIB to this
+ directory if INSTALLDIRS is set to perl.
+
+ Defaults to $Config{installprivlib}.
+
+ =item INSTALLSCRIPT
+
+ Used by 'make install' which copies files from INST_SCRIPT to this
+ directory if INSTALLDIRS=perl.
+
+ =item INSTALLSITEARCH
+
+ Used by 'make install', which copies files from INST_ARCHLIB to this
+ directory if INSTALLDIRS is set to site (default).
+
+ =item INSTALLSITEBIN
+
+ Used by 'make install', which copies files from INST_BIN to this
+ directory if INSTALLDIRS is set to site (default).
+
+ =item INSTALLSITELIB
+
+ Used by 'make install', which copies files from INST_LIB to this
+ directory if INSTALLDIRS is set to site (default).
+
+ =item INSTALLSITEMAN1DIR
+
+ =item INSTALLSITEMAN3DIR
+
+ These directories get the man pages at 'make install' time if
+ INSTALLDIRS=site (default). Defaults to
+ $(SITEPREFIX)/man/man$(MAN*EXT).
+
+ If set to 'none', no man pages will be installed.
+
+ =item INSTALLSITESCRIPT
+
+ Used by 'make install' which copies files from INST_SCRIPT to this
+ directory if INSTALLDIRS is set to site (default).
+
+ =item INSTALLVENDORARCH
+
+ Used by 'make install', which copies files from INST_ARCHLIB to this
+ directory if INSTALLDIRS is set to vendor.
+
+ =item INSTALLVENDORBIN
+
+ Used by 'make install', which copies files from INST_BIN to this
+ directory if INSTALLDIRS is set to vendor.
+
+ =item INSTALLVENDORLIB
+
+ Used by 'make install', which copies files from INST_LIB to this
+ directory if INSTALLDIRS is set to vendor.
+
+ =item INSTALLVENDORMAN1DIR
+
+ =item INSTALLVENDORMAN3DIR
+
+ These directories get the man pages at 'make install' time if
+ INSTALLDIRS=vendor. Defaults to $(VENDORPREFIX)/man/man$(MAN*EXT).
+
+ If set to 'none', no man pages will be installed.
+
+ =item INSTALLVENDORSCRIPT
+
+ Used by 'make install' which copies files from INST_SCRIPT to this
+ directory if INSTALLDIRS is set to vendor.
+
+ =item INST_ARCHLIB
+
+ Same as INST_LIB for architecture dependent files.
+
+ =item INST_BIN
+
+ Directory to put real binary files during 'make'. These will be copied
+ to INSTALLBIN during 'make install'
+
+ =item INST_LIB
+
+ Directory where we put library files of this extension while building
+ it.
+
+ =item INST_MAN1DIR
+
+ Directory to hold the man pages at 'make' time
+
+ =item INST_MAN3DIR
+
+ Directory to hold the man pages at 'make' time
+
+ =item INST_SCRIPT
+
+ Directory where executable files should be installed during
+ 'make'. Defaults to "./blib/script", just to have a dummy location during
+ testing. make install will copy the files in INST_SCRIPT to
+ INSTALLSCRIPT.
+
+ =item LD
+
+ Program to be used to link libraries for dynamic loading.
+
+ Defaults to $Config{ld}.
+
+ =item LDDLFLAGS
+
+ Any special flags that might need to be passed to ld to create a
+ shared library suitable for dynamic loading. It is up to the makefile
+ to use it. (See L<Config/lddlflags>)
+
+ Defaults to $Config{lddlflags}.
+
+ =item LDFROM
+
+ Defaults to "$(OBJECT)" and is used in the ld command to specify
+ what files to link/load from (also see dynamic_lib below for how to
+ specify ld flags)
+
+ =item LIB
+
+ LIB should only be set at C<perl Makefile.PL> time but is allowed as a
+ MakeMaker argument. It has the effect of setting both INSTALLPRIVLIB
+ and INSTALLSITELIB to that value regardless any explicit setting of
+ those arguments (or of PREFIX). INSTALLARCHLIB and INSTALLSITEARCH
+ are set to the corresponding architecture subdirectory.
+
+ =item LIBPERL_A
+
+ The filename of the perllibrary that will be used together with this
+ extension. Defaults to libperl.a.
+
+ =item LIBS
+
+ An anonymous array of alternative library
+ specifications to be searched for (in order) until
+ at least one library is found. E.g.
+
+ 'LIBS' => ["-lgdbm", "-ldbm -lfoo", "-L/path -ldbm.nfs"]
+
+ Mind, that any element of the array
+ contains a complete set of arguments for the ld
+ command. So do not specify
+
+ 'LIBS' => ["-ltcl", "-ltk", "-lX11"]
+
+ See ODBM_File/Makefile.PL for an example, where an array is needed. If
+ you specify a scalar as in
+
+ 'LIBS' => "-ltcl -ltk -lX11"
+
+ MakeMaker will turn it into an array with one element.
+
+ =item LICENSE
+
+ Available in version 6.31 and above.
+
+ The licensing terms of your distribution. Generally it's "perl_5" for the
+ same license as Perl itself.
+
+ See L<CPAN::Meta::Spec> for the list of options.
+
+ Defaults to "unknown".
+
+ =item LINKTYPE
+
+ 'static' or 'dynamic' (default unless usedl=undef in
+ config.sh). Should only be used to force static linking (also see
+ linkext below).
+
+ =item MAGICXS
+
+ When this is set to C<1>, C<OBJECT> will be automagically derived from
+ C<O_FILES>.
+
+ =item MAKE
+
+ Variant of make you intend to run the generated Makefile with. This
+ parameter lets Makefile.PL know what make quirks to account for when
+ generating the Makefile.
+
+ MakeMaker also honors the MAKE environment variable. This parameter
+ takes precedence.
+
+ Currently the only significant values are 'dmake' and 'nmake' for Windows
+ users, instructing MakeMaker to generate a Makefile in the flavour of
+ DMake ("Dennis Vadura's Make") or Microsoft NMake respectively.
+
+ Defaults to $Config{make}, which may go looking for a Make program
+ in your environment.
+
+ How are you supposed to know what flavour of Make a Makefile has
+ been generated for if you didn't specify a value explicitly? Search
+ the generated Makefile for the definition of the MAKE variable,
+ which is used to recursively invoke the Make utility. That will tell
+ you what Make you're supposed to invoke the Makefile with.
+
+ =item MAKEAPERL
+
+ Boolean which tells MakeMaker that it should include the rules to
+ make a perl. This is handled automatically as a switch by
+ MakeMaker. The user normally does not need it.
+
+ =item MAKEFILE_OLD
+
+ When 'make clean' or similar is run, the $(FIRST_MAKEFILE) will be
+ backed up at this location.
+
+ Defaults to $(FIRST_MAKEFILE).old or $(FIRST_MAKEFILE)_old on VMS.
+
+ =item MAN1PODS
+
+ Hashref of pod-containing files. MakeMaker will default this to all
+ EXE_FILES files that include POD directives. The files listed
+ here will be converted to man pages and installed as was requested
+ at Configure time.
+
+ This hash should map POD files (or scripts containing POD) to the
+ man file names under the C<blib/man1/> directory, as in the following
+ example:
+
+ MAN1PODS => {
+ 'doc/command.pod' => 'blib/man1/command.1',
+ 'scripts/script.pl' => 'blib/man1/script.1',
+ }
+
+ =item MAN3PODS
+
+ Hashref that assigns to *.pm and *.pod files the files into which the
+ manpages are to be written. MakeMaker parses all *.pod and *.pm files
+ for POD directives. Files that contain POD will be the default keys of
+ the MAN3PODS hashref. These will then be converted to man pages during
+ C<make> and will be installed during C<make install>.
+
+ Example similar to MAN1PODS.
+
+ =item MAP_TARGET
+
+ If it is intended that a new perl binary be produced, this variable
+ may hold a name for that binary. Defaults to perl
+
+ =item META_ADD
+
+ =item META_MERGE
+
+ Available in version 6.46 and above.
+
+ A hashref of items to add to the CPAN Meta file (F<META.yml> or
+ F<META.json>).
+
+ They differ in how they behave if they have the same key as the
+ default metadata. META_ADD will override the default value with its
+ own. META_MERGE will merge its value with the default.
+
+ Unless you want to override the defaults, prefer META_MERGE so as to
+ get the advantage of any future defaults.
+
+ Where prereqs are concerned, if META_MERGE is used, prerequisites are merged
+ with their counterpart C<WriteMakefile()> argument
+ (PREREQ_PM is merged into {prereqs}{runtime}{requires},
+ BUILD_REQUIRES into C<{prereqs}{build}{requires}>,
+ CONFIGURE_REQUIRES into C<{prereqs}{configure}{requires}>,
+ and TEST_REQUIRES into C<{prereqs}{test}{requires})>.
+ When prereqs are specified with META_ADD, the only prerequisites added to the
+ file come from the metadata, not C<WriteMakefile()> arguments.
+
+ Note that these configuration options are only used for generating F<META.yml>
+ and F<META.json> -- they are NOT used for F<MYMETA.yml> and F<MYMETA.json>.
+ Therefore data in these fields should NOT be used for dynamic (user-side)
+ configuration.
+
+ By default CPAN Meta specification C<1.4> is used. In order to use
+ CPAN Meta specification C<2.0>, indicate with C<meta-spec> the version
+ you want to use.
+
+ META_MERGE => {
+
+ "meta-spec" => { version => 2 },
+
+ resources => {
+
+ repository => {
+ type => 'git',
+ url => 'git://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker.git',
+ web => 'https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker',
+ },
+
+ },
+
+ },
+
+ =item MIN_PERL_VERSION
+
+ Available in version 6.48 and above.
+
+ The minimum required version of Perl for this distribution.
+
+ Either the 5.006001 or the 5.6.1 format is acceptable.
+
+ =item MYEXTLIB
+
+ If the extension links to a library that it builds, set this to the
+ name of the library (see SDBM_File)
+
+ =item NAME
+
+ The package representing the distribution. For example, C<Test::More>
+ or C<ExtUtils::MakeMaker>. It will be used to derive information about
+ the distribution such as the L</DISTNAME>, installation locations
+ within the Perl library and where XS files will be looked for by
+ default (see L</XS>).
+
+ C<NAME> I<must> be a valid Perl package name and it I<must> have an
+ associated C<.pm> file. For example, C<Foo::Bar> is a valid C<NAME>
+ and there must exist F<Foo/Bar.pm>. Any XS code should be in
+ F<Bar.xs> unless stated otherwise.
+
+ Your distribution B<must> have a C<NAME>.
+
+ =item NEEDS_LINKING
+
+ MakeMaker will figure out if an extension contains linkable code
+ anywhere down the directory tree, and will set this variable
+ accordingly, but you can speed it up a very little bit if you define
+ this boolean variable yourself.
+
+ =item NOECHO
+
+ Command so make does not print the literal commands it's running.
+
+ By setting it to an empty string you can generate a Makefile that
+ prints all commands. Mainly used in debugging MakeMaker itself.
+
+ Defaults to C<@>.
+
+ =item NORECURS
+
+ Boolean. Attribute to inhibit descending into subdirectories.
+
+ =item NO_META
+
+ When true, suppresses the generation and addition to the MANIFEST of
+ the META.yml and META.json module meta-data files during 'make distdir'.
+
+ Defaults to false.
+
+ =item NO_MYMETA
+
+ When true, suppresses the generation of MYMETA.yml and MYMETA.json module
+ meta-data files during 'perl Makefile.PL'.
+
+ Defaults to false.
+
+ =item NO_PACKLIST
+
+ When true, suppresses the writing of C<packlist> files for installs.
+
+ Defaults to false.
+
+ =item NO_PERLLOCAL
+
+ When true, suppresses the appending of installations to C<perllocal>.
+
+ Defaults to false.
+
+ =item NO_VC
+
+ In general, any generated Makefile checks for the current version of
+ MakeMaker and the version the Makefile was built under. If NO_VC is
+ set, the version check is neglected. Do not write this into your
+ Makefile.PL, use it interactively instead.
+
+ =item OBJECT
+
+ List of object files, defaults to '$(BASEEXT)$(OBJ_EXT)', but can be a long
+ string or an array containing all object files, e.g. "tkpBind.o
+ tkpButton.o tkpCanvas.o" or ["tkpBind.o", "tkpButton.o", "tkpCanvas.o"]
+
+ (Where BASEEXT is the last component of NAME, and OBJ_EXT is $Config{obj_ext}.)
+
+ =item OPTIMIZE
+
+ Defaults to C<-O>. Set it to C<-g> to turn debugging on. The flag is
+ passed to subdirectory makes.
+
+ =item PERL
+
+ Perl binary for tasks that can be done by miniperl. If it contains
+ spaces or other shell metacharacters, it needs to be quoted in a way
+ that protects them, since this value is intended to be inserted in a
+ shell command line in the Makefile. E.g.:
+
+ # Perl executable lives in "C:/Program Files/Perl/bin"
+ # Normally you don't need to set this yourself!
+ $ perl Makefile.PL PERL='"C:/Program Files/Perl/bin/perl.exe" -w'
+
+ =item PERL_CORE
+
+ Set only when MakeMaker is building the extensions of the Perl core
+ distribution.
+
+ =item PERLMAINCC
+
+ The call to the program that is able to compile perlmain.c. Defaults
+ to $(CC).
+
+ =item PERL_ARCHLIB
+
+ Same as for PERL_LIB, but for architecture dependent files.
+
+ Used only when MakeMaker is building the extensions of the Perl core
+ distribution (because normally $(PERL_ARCHLIB) is automatically in @INC,
+ and adding it would get in the way of PERL5LIB).
+
+ =item PERL_LIB
+
+ Directory containing the Perl library to use.
+
+ Used only when MakeMaker is building the extensions of the Perl core
+ distribution (because normally $(PERL_LIB) is automatically in @INC,
+ and adding it would get in the way of PERL5LIB).
+
+ =item PERL_MALLOC_OK
+
+ defaults to 0. Should be set to TRUE if the extension can work with
+ the memory allocation routines substituted by the Perl malloc() subsystem.
+ This should be applicable to most extensions with exceptions of those
+
+ =over 4
+
+ =item *
+
+ with bugs in memory allocations which are caught by Perl's malloc();
+
+ =item *
+
+ which interact with the memory allocator in other ways than via
+ malloc(), realloc(), free(), calloc(), sbrk() and brk();
+
+ =item *
+
+ which rely on special alignment which is not provided by Perl's malloc().
+
+ =back
+
+ B<NOTE.> Neglecting to set this flag in I<any one> of the loaded extension
+ nullifies many advantages of Perl's malloc(), such as better usage of
+ system resources, error detection, memory usage reporting, catchable failure
+ of memory allocations, etc.
+
+ =item PERLPREFIX
+
+ Directory under which core modules are to be installed.
+
+ Defaults to $Config{installprefixexp}, falling back to
+ $Config{installprefix}, $Config{prefixexp} or $Config{prefix} should
+ $Config{installprefixexp} not exist.
+
+ Overridden by PREFIX.
+
+ =item PERLRUN
+
+ Use this instead of $(PERL) when you wish to run perl. It will set up
+ extra necessary flags for you.
+
+ =item PERLRUNINST
+
+ Use this instead of $(PERL) when you wish to run perl to work with
+ modules. It will add things like -I$(INST_ARCH) and other necessary
+ flags so perl can see the modules you're about to install.
+
+ =item PERL_SRC
+
+ Directory containing the Perl source code (use of this should be
+ avoided, it may be undefined)
+
+ =item PERM_DIR
+
+ Desired permission for directories. Defaults to C<755>.
+
+ =item PERM_RW
+
+ Desired permission for read/writable files. Defaults to C<644>.
+
+ =item PERM_RWX
+
+ Desired permission for executable files. Defaults to C<755>.
+
+ =item PL_FILES
+
+ MakeMaker can run programs to generate files for you at build time.
+ By default any file named *.PL (except Makefile.PL and Build.PL) in
+ the top level directory will be assumed to be a Perl program and run
+ passing its own basename in as an argument. This basename is actually a build
+ target, and there is an intention, but not a requirement, that the *.PL file
+ make the file passed to to as an argument. For example...
+
+ perl foo.PL foo
+
+ This behavior can be overridden by supplying your own set of files to
+ search. PL_FILES accepts a hash ref, the key being the file to run
+ and the value is passed in as the first argument when the PL file is run.
+
+ PL_FILES => {'bin/foobar.PL' => 'bin/foobar'}
+
+ PL_FILES => {'foo.PL' => 'foo.c'}
+
+ Would run bin/foobar.PL like this:
+
+ perl bin/foobar.PL bin/foobar
+
+ If multiple files from one program are desired an array ref can be used.
+
+ PL_FILES => {'bin/foobar.PL' => [qw(bin/foobar1 bin/foobar2)]}
+
+ In this case the program will be run multiple times using each target file.
+
+ perl bin/foobar.PL bin/foobar1
+ perl bin/foobar.PL bin/foobar2
+
+ PL files are normally run B<after> pm_to_blib and include INST_LIB and
+ INST_ARCH in their C<@INC>, so the just built modules can be
+ accessed... unless the PL file is making a module (or anything else in
+ PM) in which case it is run B<before> pm_to_blib and does not include
+ INST_LIB and INST_ARCH in its C<@INC>. This apparently odd behavior
+ is there for backwards compatibility (and it's somewhat DWIM). The argument
+ passed to the .PL is set up as a target to build in the Makefile. In other
+ sections such as C<postamble> you can specify a dependency on the
+ filename/argument that the .PL is supposed (or will have, now that that is
+ is a dependency) to generate. Note the file to be generated will still be
+ generated and the .PL will still run even without an explicit dependency created
+ by you, since the C<all> target still depends on running all eligible to run.PL
+ files.
+
+ =item PM
+
+ Hashref of .pm files and *.pl files to be installed. e.g.
+
+ {'name_of_file.pm' => '$(INST_LIB)/install_as.pm'}
+
+ By default this will include *.pm and *.pl and the files found in
+ the PMLIBDIRS directories. Defining PM in the
+ Makefile.PL will override PMLIBDIRS.
+
+ =item PMLIBDIRS
+
+ Ref to array of subdirectories containing library files. Defaults to
+ [ 'lib', $(BASEEXT) ]. The directories will be scanned and I<any> files
+ they contain will be installed in the corresponding location in the
+ library. A libscan() method can be used to alter the behaviour.
+ Defining PM in the Makefile.PL will override PMLIBDIRS.
+
+ (Where BASEEXT is the last component of NAME.)
+
+ =item PM_FILTER
+
+ A filter program, in the traditional Unix sense (input from stdin, output
+ to stdout) that is passed on each .pm file during the build (in the
+ pm_to_blib() phase). It is empty by default, meaning no filtering is done.
+ You could use:
+
+ PM_FILTER => 'perl -ne "print unless /^\\#/"',
+
+ to remove all the leading comments on the fly during the build. In order
+ to be as portable as possible, please consider using a Perl one-liner
+ rather than Unix (or other) utilities, as above. The # is escaped for
+ the Makefile, since what is going to be generated will then be:
+
+ PM_FILTER = perl -ne "print unless /^\#/"
+
+ Without the \ before the #, we'd have the start of a Makefile comment,
+ and the macro would be incorrectly defined.
+
+ You will almost certainly be better off using the C<PL_FILES> system,
+ instead. See above, or the L<ExtUtils::MakeMaker::FAQ> entry.
+
+ =item POLLUTE
+
+ Release 5.005 grandfathered old global symbol names by providing preprocessor
+ macros for extension source compatibility. As of release 5.6, these
+ preprocessor definitions are not available by default. The POLLUTE flag
+ specifies that the old names should still be defined:
+
+ perl Makefile.PL POLLUTE=1
+
+ Please inform the module author if this is necessary to successfully install
+ a module under 5.6 or later.
+
+ =item PPM_INSTALL_EXEC
+
+ Name of the executable used to run C<PPM_INSTALL_SCRIPT> below. (e.g. perl)
+
+ =item PPM_INSTALL_SCRIPT
+
+ Name of the script that gets executed by the Perl Package Manager after
+ the installation of a package.
+
+ =item PPM_UNINSTALL_EXEC
+
+ Name of the executable used to run C<PPM_UNINSTALL_SCRIPT> below. (e.g. perl)
+
+ =item PPM_UNINSTALL_SCRIPT
+
+ Name of the script that gets executed by the Perl Package Manager before
+ the removal of a package.
+
+ =item PREFIX
+
+ This overrides all the default install locations. Man pages,
+ libraries, scripts, etc... MakeMaker will try to make an educated
+ guess about where to place things under the new PREFIX based on your
+ Config defaults. Failing that, it will fall back to a structure
+ which should be sensible for your platform.
+
+ If you specify LIB or any INSTALL* variables they will not be affected
+ by the PREFIX.
+
+ =item PREREQ_FATAL
+
+ Bool. If this parameter is true, failing to have the required modules
+ (or the right versions thereof) will be fatal. C<perl Makefile.PL>
+ will C<die> instead of simply informing the user of the missing dependencies.
+
+ It is I<extremely> rare to have to use C<PREREQ_FATAL>. Its use by module
+ authors is I<strongly discouraged> and should never be used lightly.
+
+ For dependencies that are required in order to run C<Makefile.PL>,
+ see C<CONFIGURE_REQUIRES>.
+
+ Module installation tools have ways of resolving unmet dependencies but
+ to do that they need a F<Makefile>. Using C<PREREQ_FATAL> breaks this.
+ That's bad.
+
+ Assuming you have good test coverage, your tests should fail with
+ missing dependencies informing the user more strongly that something
+ is wrong. You can write a F<t/00compile.t> test which will simply
+ check that your code compiles and stop "make test" prematurely if it
+ doesn't. See L<Test::More/BAIL_OUT> for more details.
+
+
+ =item PREREQ_PM
+
+ A hash of modules that are needed to run your module. The keys are
+ the module names ie. Test::More, and the minimum version is the
+ value. If the required version number is 0 any version will do.
+ The versions given may be a Perl v-string (see L<version>) or a range
+ (see L<CPAN::Meta::Requirements>).
+
+ This will go into the C<requires> field of your F<META.yml> and the
+ C<runtime> of the C<prereqs> field of your F<META.json>.
+
+ PREREQ_PM => {
+ # Require Test::More at least 0.47
+ "Test::More" => "0.47",
+
+ # Require any version of Acme::Buffy
+ "Acme::Buffy" => 0,
+ }
+
+ =item PREREQ_PRINT
+
+ Bool. If this parameter is true, the prerequisites will be printed to
+ stdout and MakeMaker will exit. The output format is an evalable hash
+ ref.
+
+ $PREREQ_PM = {
+ 'A::B' => Vers1,
+ 'C::D' => Vers2,
+ ...
+ };
+
+ If a distribution defines a minimal required perl version, this is
+ added to the output as an additional line of the form:
+
+ $MIN_PERL_VERSION = '5.008001';
+
+ If BUILD_REQUIRES is not empty, it will be dumped as $BUILD_REQUIRES hashref.
+
+ =item PRINT_PREREQ
+
+ RedHatism for C<PREREQ_PRINT>. The output format is different, though:
+
+ perl(A::B)>=Vers1 perl(C::D)>=Vers2 ...
+
+ A minimal required perl version, if present, will look like this:
+
+ perl(perl)>=5.008001
+
+ =item SITEPREFIX
+
+ Like PERLPREFIX, but only for the site install locations.
+
+ Defaults to $Config{siteprefixexp}. Perls prior to 5.6.0 didn't have
+ an explicit siteprefix in the Config. In those cases
+ $Config{installprefix} will be used.
+
+ Overridable by PREFIX
+
+ =item SIGN
+
+ When true, perform the generation and addition to the MANIFEST of the
+ SIGNATURE file in the distdir during 'make distdir', via 'cpansign
+ -s'.
+
+ Note that you need to install the Module::Signature module to
+ perform this operation.
+
+ Defaults to false.
+
+ =item SKIP
+
+ Arrayref. E.g. [qw(name1 name2)] skip (do not write) sections of the
+ Makefile. Caution! Do not use the SKIP attribute for the negligible
+ speedup. It may seriously damage the resulting Makefile. Only use it
+ if you really need it.
+
+ =item TEST_REQUIRES
+
+ Available in version 6.64 and above.
+
+ A hash of modules that are needed to test your module but not run or
+ build it.
+
+ This will go into the C<build_requires> field of your F<META.yml> and the C<test> of the C<prereqs> field of your F<META.json>.
+
+ The format is the same as PREREQ_PM.
+
+ =item TYPEMAPS
+
+ Ref to array of typemap file names. Use this when the typemaps are
+ in some directory other than the current directory or when they are
+ not named B<typemap>. The last typemap in the list takes
+ precedence. A typemap in the current directory has highest
+ precedence, even if it isn't listed in TYPEMAPS. The default system
+ typemap has lowest precedence.
+
+ =item VENDORPREFIX
+
+ Like PERLPREFIX, but only for the vendor install locations.
+
+ Defaults to $Config{vendorprefixexp}.
+
+ Overridable by PREFIX
+
+ =item VERBINST
+
+ If true, make install will be verbose
+
+ =item VERSION
+
+ Your version number for distributing the package. This defaults to
+ 0.1.
+
+ =item VERSION_FROM
+
+ Instead of specifying the VERSION in the Makefile.PL you can let
+ MakeMaker parse a file to determine the version number. The parsing
+ routine requires that the file named by VERSION_FROM contains one
+ single line to compute the version number. The first line in the file
+ that contains something like a $VERSION assignment or C<package Name
+ VERSION> will be used. The following lines will be parsed o.k.:
+
+ # Good
+ package Foo::Bar 1.23; # 1.23
+ $VERSION = '1.00'; # 1.00
+ *VERSION = \'1.01'; # 1.01
+ ($VERSION) = q$Revision$ =~ /(\d+)/g; # The digits in $Revision$
+ $FOO::VERSION = '1.10'; # 1.10
+ *FOO::VERSION = \'1.11'; # 1.11
+
+ but these will fail:
+
+ # Bad
+ my $VERSION = '1.01';
+ local $VERSION = '1.02';
+ local $FOO::VERSION = '1.30';
+
+ (Putting C<my> or C<local> on the preceding line will work o.k.)
+
+ "Version strings" are incompatible and should not be used.
+
+ # Bad
+ $VERSION = 1.2.3;
+ $VERSION = v1.2.3;
+
+ L<version> objects are fine. As of MakeMaker 6.35 version.pm will be
+ automatically loaded, but you must declare the dependency on version.pm.
+ For compatibility with older MakeMaker you should load on the same line
+ as $VERSION is declared.
+
+ # All on one line
+ use version; our $VERSION = qv(1.2.3);
+
+ The file named in VERSION_FROM is not added as a dependency to
+ Makefile. This is not really correct, but it would be a major pain
+ during development to have to rewrite the Makefile for any smallish
+ change in that file. If you want to make sure that the Makefile
+ contains the correct VERSION macro after any change of the file, you
+ would have to do something like
+
+ depend => { Makefile => '$(VERSION_FROM)' }
+
+ See attribute C<depend> below.
+
+ =item VERSION_SYM
+
+ A sanitized VERSION with . replaced by _. For places where . has
+ special meaning (some filesystems, RCS labels, etc...)
+
+ =item XS
+
+ Hashref of .xs files. MakeMaker will default this. e.g.
+
+ {'name_of_file.xs' => 'name_of_file.c'}
+
+ The .c files will automatically be included in the list of files
+ deleted by a make clean.
+
+ =item XSBUILD
+
+ Hashref with options controlling the operation of C<XSMULTI>:
+
+ {
+ xs => {
+ all => {
+ # options applying to all .xs files for this distribution
+ },
+ 'lib/Class/Name/File' => { # specifically for this file
+ DEFINE => '-Dfunktastic', # defines for only this file
+ INC => "-I$funkyliblocation", # include flags for only this file
+ # OBJECT => 'lib/Class/Name/File$(OBJ_EXT)', # default
+ LDFROM => "lib/Class/Name/File\$(OBJ_EXT) $otherfile\$(OBJ_EXT)", # what's linked
+ },
+ },
+ }
+
+ Note C<xs> is the file-extension. More possibilities may arise in the
+ future. Note that object names are specified without their XS extension.
+
+ C<LDFROM> defaults to the same as C<OBJECT>. C<OBJECT> defaults to,
+ for C<XSMULTI>, just the XS filename with the extension replaced with
+ the compiler-specific object-file extension.
+
+ The distinction between C<OBJECT> and C<LDFROM>: C<OBJECT> is the make
+ target, so make will try to build it. However, C<LDFROM> is what will
+ actually be linked together to make the shared object or static library
+ (SO/SL), so if you override it, make sure it includes what you want to
+ make the final SO/SL, almost certainly including the XS basename with
+ C<$(OBJ_EXT)> appended.
+
+ =item XSMULTI
+
+ When this is set to C<1>, multiple XS files may be placed under F<lib/>
+ next to their corresponding C<*.pm> files (this is essential for compiling
+ with the correct C<VERSION> values). This feature should be considered
+ experimental, and details of it may change.
+
+ This feature was inspired by, and small portions of code copied from,
+ L<ExtUtils::MakeMaker::BigHelper>. Hopefully this feature will render
+ that module mainly obsolete.
+
+ =item XSOPT
+
+ String of options to pass to xsubpp. This might include C<-C++> or
+ C<-extern>. Do not include typemaps here; the TYPEMAP parameter exists for
+ that purpose.
+
+ =item XSPROTOARG
+
+ May be set to C<-protoypes>, C<-noprototypes> or the empty string. The
+ empty string is equivalent to the xsubpp default, or C<-noprototypes>.
+ See the xsubpp documentation for details. MakeMaker
+ defaults to the empty string.
+
+ =item XS_VERSION
+
+ Your version number for the .xs file of this package. This defaults
+ to the value of the VERSION attribute.
+
+ =back
+
+ =head2 Additional lowercase attributes
+
+ can be used to pass parameters to the methods which implement that
+ part of the Makefile. Parameters are specified as a hash ref but are
+ passed to the method as a hash.
+
+ =over 2
+
+ =item clean
+
+ {FILES => "*.xyz foo"}
+
+ =item depend
+
+ {ANY_TARGET => ANY_DEPENDENCY, ...}
+
+ (ANY_TARGET must not be given a double-colon rule by MakeMaker.)
+
+ =item dist
+
+ {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz',
+ SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
+ ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }
+
+ If you specify COMPRESS, then SUFFIX should also be altered, as it is
+ needed to tell make the target file of the compression. Setting
+ DIST_CP to ln can be useful, if you need to preserve the timestamps on
+ your files. DIST_CP can take the values 'cp', which copies the file,
+ 'ln', which links the file, and 'best' which copies symbolic links and
+ links the rest. Default is 'best'.
+
+ =item dynamic_lib
+
+ {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'}
+
+ =item linkext
+
+ {LINKTYPE => 'static', 'dynamic' or ''}
+
+ NB: Extensions that have nothing but *.pm files had to say
+
+ {LINKTYPE => ''}
+
+ with Pre-5.0 MakeMakers. Since version 5.00 of MakeMaker such a line
+ can be deleted safely. MakeMaker recognizes when there's nothing to
+ be linked.
+
+ =item macro
+
+ {ANY_MACRO => ANY_VALUE, ...}
+
+ =item postamble
+
+ Anything put here will be passed to MY::postamble() if you have one.
+
+ =item realclean
+
+ {FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
+
+ =item test
+
+ Specify the targets for testing.
+
+ {TESTS => 't/*.t'}
+
+ C<RECURSIVE_TEST_FILES> can be used to include all directories
+ recursively under C<t> that contain C<.t> files. It will be ignored if
+ you provide your own C<TESTS> attribute, defaults to false.
+
+ {RECURSIVE_TEST_FILES=>1}
+
+ =item tool_autosplit
+
+ {MAXLEN => 8}
+
+ =back
+
+ =head2 Overriding MakeMaker Methods
+
+ If you cannot achieve the desired Makefile behaviour by specifying
+ attributes you may define private subroutines in the Makefile.PL.
+ Each subroutine returns the text it wishes to have written to
+ the Makefile. To override a section of the Makefile you can
+ either say:
+
+ sub MY::c_o { "new literal text" }
+
+ or you can edit the default by saying something like:
+
+ package MY; # so that "SUPER" works right
+ sub c_o {
+ my $inherited = shift->SUPER::c_o(@_);
+ $inherited =~ s/old text/new text/;
+ $inherited;
+ }
+
+ If you are running experiments with embedding perl as a library into
+ other applications, you might find MakeMaker is not sufficient. You'd
+ better have a look at ExtUtils::Embed which is a collection of utilities
+ for embedding.
+
+ If you still need a different solution, try to develop another
+ subroutine that fits your needs and submit the diffs to
+ C<makemaker@perl.org>
+
+ For a complete description of all MakeMaker methods see
+ L<ExtUtils::MM_Unix>.
+
+ Here is a simple example of how to add a new target to the generated
+ Makefile:
+
+ sub MY::postamble {
+ return <<'MAKE_FRAG';
+ $(MYEXTLIB): sdbm/Makefile
+ cd sdbm && $(MAKE) all
+
+ MAKE_FRAG
+ }
+
+ =head2 The End Of Cargo Cult Programming
+
+ WriteMakefile() now does some basic sanity checks on its parameters to
+ protect against typos and malformatted values. This means some things
+ which happened to work in the past will now throw warnings and
+ possibly produce internal errors.
+
+ Some of the most common mistakes:
+
+ =over 2
+
+ =item C<< MAN3PODS => ' ' >>
+
+ This is commonly used to suppress the creation of man pages. MAN3PODS
+ takes a hash ref not a string, but the above worked by accident in old
+ versions of MakeMaker.
+
+ The correct code is C<< MAN3PODS => { } >>.
+
+ =back
+
+
+ =head2 Hintsfile support
+
+ MakeMaker.pm uses the architecture-specific information from
+ Config.pm. In addition it evaluates architecture specific hints files
+ in a C<hints/> directory. The hints files are expected to be named
+ like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
+ name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
+ MakeMaker within the WriteMakefile() subroutine, and can be used to
+ execute commands as well as to include special variables. The rules
+ which hintsfile is chosen are the same as in Configure.
+
+ The hintsfile is eval()ed immediately after the arguments given to
+ WriteMakefile are stuffed into a hash reference $self but before this
+ reference becomes blessed. So if you want to do the equivalent to
+ override or create an attribute you would say something like
+
+ $self->{LIBS} = ['-ldbm -lucb -lc'];
+
+ =head2 Distribution Support
+
+ For authors of extensions MakeMaker provides several Makefile
+ targets. Most of the support comes from the ExtUtils::Manifest module,
+ where additional documentation can be found.
+
+ =over 4
+
+ =item make distcheck
+
+ reports which files are below the build directory but not in the
+ MANIFEST file and vice versa. (See ExtUtils::Manifest::fullcheck() for
+ details)
+
+ =item make skipcheck
+
+ reports which files are skipped due to the entries in the
+ C<MANIFEST.SKIP> file (See ExtUtils::Manifest::skipcheck() for
+ details)
+
+ =item make distclean
+
+ does a realclean first and then the distcheck. Note that this is not
+ needed to build a new distribution as long as you are sure that the
+ MANIFEST file is ok.
+
+ =item make veryclean
+
+ does a realclean first and then removes backup files such as C<*~>,
+ C<*.bak>, C<*.old> and C<*.orig>
+
+ =item make manifest
+
+ rewrites the MANIFEST file, adding all remaining files found (See
+ ExtUtils::Manifest::mkmanifest() for details)
+
+ =item make distdir
+
+ Copies all the files that are in the MANIFEST file to a newly created
+ directory with the name C<$(DISTNAME)-$(VERSION)>. If that directory
+ exists, it will be removed first.
+
+ Additionally, it will create META.yml and META.json module meta-data file
+ in the distdir and add this to the distdir's MANIFEST. You can shut this
+ behavior off with the NO_META flag.
+
+ =item make disttest
+
+ Makes a distdir first, and runs a C<perl Makefile.PL>, a make, and
+ a make test in that directory.
+
+ =item make tardist
+
+ First does a distdir. Then a command $(PREOP) which defaults to a null
+ command, followed by $(TO_UNIX), which defaults to a null command under
+ UNIX, and will convert files in distribution directory to UNIX format
+ otherwise. Next it runs C<tar> on that directory into a tarfile and
+ deletes the directory. Finishes with a command $(POSTOP) which
+ defaults to a null command.
+
+ =item make dist
+
+ Defaults to $(DIST_DEFAULT) which in turn defaults to tardist.
+
+ =item make uutardist
+
+ Runs a tardist first and uuencodes the tarfile.
+
+ =item make shdist
+
+ First does a distdir. Then a command $(PREOP) which defaults to a null
+ command. Next it runs C<shar> on that directory into a sharfile and
+ deletes the intermediate directory again. Finishes with a command
+ $(POSTOP) which defaults to a null command. Note: For shdist to work
+ properly a C<shar> program that can handle directories is mandatory.
+
+ =item make zipdist
+
+ First does a distdir. Then a command $(PREOP) which defaults to a null
+ command. Runs C<$(ZIP) $(ZIPFLAGS)> on that directory into a
+ zipfile. Then deletes that directory. Finishes with a command
+ $(POSTOP) which defaults to a null command.
+
+ =item make ci
+
+ Does a $(CI) and a $(RCS_LABEL) on all files in the MANIFEST file.
+
+ =back
+
+ Customization of the dist targets can be done by specifying a hash
+ reference to the dist attribute of the WriteMakefile call. The
+ following parameters are recognized:
+
+ CI ('ci -u')
+ COMPRESS ('gzip --best')
+ POSTOP ('@ :')
+ PREOP ('@ :')
+ TO_UNIX (depends on the system)
+ RCS_LABEL ('rcs -q -Nv$(VERSION_SYM):')
+ SHAR ('shar')
+ SUFFIX ('.gz')
+ TAR ('tar')
+ TARFLAGS ('cvf')
+ ZIP ('zip')
+ ZIPFLAGS ('-r')
+
+ An example:
+
+ WriteMakefile(
+ ...other options...
+ dist => {
+ COMPRESS => "bzip2",
+ SUFFIX => ".bz2"
+ }
+ );
+
+
+ =head2 Module Meta-Data (META and MYMETA)
+
+ Long plaguing users of MakeMaker based modules has been the problem of
+ getting basic information about the module out of the sources
+ I<without> running the F<Makefile.PL> and doing a bunch of messy
+ heuristics on the resulting F<Makefile>. Over the years, it has become
+ standard to keep this information in one or more CPAN Meta files
+ distributed with each distribution.
+
+ The original format of CPAN Meta files was L<YAML> and the corresponding
+ file was called F<META.yml>. In 2010, version 2 of the L<CPAN::Meta::Spec>
+ was released, which mandates JSON format for the metadata in order to
+ overcome certain compatibility issues between YAML serializers and to
+ avoid breaking older clients unable to handle a new version of the spec.
+ The L<CPAN::Meta> library is now standard for accessing old and new-style
+ Meta files.
+
+ If L<CPAN::Meta> is installed, MakeMaker will automatically generate
+ F<META.json> and F<META.yml> files for you and add them to your F<MANIFEST> as
+ part of the 'distdir' target (and thus the 'dist' target). This is intended to
+ seamlessly and rapidly populate CPAN with module meta-data. If you wish to
+ shut this feature off, set the C<NO_META> C<WriteMakefile()> flag to true.
+
+ At the 2008 QA Hackathon in Oslo, Perl module toolchain maintainers agrees
+ to use the CPAN Meta format to communicate post-configuration requirements
+ between toolchain components. These files, F<MYMETA.json> and F<MYMETA.yml>,
+ are generated when F<Makefile.PL> generates a F<Makefile> (if L<CPAN::Meta>
+ is installed). Clients like L<CPAN> or L<CPANPLUS> will read this
+ files to see what prerequisites must be fulfilled before building or testing
+ the distribution. If you with to shut this feature off, set the C<NO_MYMETA>
+ C<WriteMakeFile()> flag to true.
+
+ =head2 Disabling an extension
+
+ If some events detected in F<Makefile.PL> imply that there is no way
+ to create the Module, but this is a normal state of things, then you
+ can create a F<Makefile> which does nothing, but succeeds on all the
+ "usual" build targets. To do so, use
+
+ use ExtUtils::MakeMaker qw(WriteEmptyMakefile);
+ WriteEmptyMakefile();
+
+ instead of WriteMakefile().
+
+ This may be useful if other modules expect this module to be I<built>
+ OK, as opposed to I<work> OK (say, this system-dependent module builds
+ in a subdirectory of some other distribution, or is listed as a
+ dependency in a CPAN::Bundle, but the functionality is supported by
+ different means on the current architecture).
+
+ =head2 Other Handy Functions
+
+ =over 4
+
+ =item prompt
+
+ my $value = prompt($message);
+ my $value = prompt($message, $default);
+
+ The C<prompt()> function provides an easy way to request user input
+ used to write a makefile. It displays the $message as a prompt for
+ input. If a $default is provided it will be used as a default. The
+ function returns the $value selected by the user.
+
+ If C<prompt()> detects that it is not running interactively and there
+ is nothing on STDIN or if the PERL_MM_USE_DEFAULT environment variable
+ is set to true, the $default will be used without prompting. This
+ prevents automated processes from blocking on user input.
+
+ If no $default is provided an empty string will be used instead.
+
+ =back
+
+ =head2 Supported versions of Perl
+
+ Please note that while this module works on Perl 5.6, it is no longer
+ being routinely tested on 5.6 - the earliest Perl version being routinely
+ tested, and expressly supported, is 5.8.1. However, patches to repair
+ any breakage on 5.6 are still being accepted.
+
+ =head1 ENVIRONMENT
+
+ =over 4
+
+ =item PERL_MM_OPT
+
+ Command line options used by C<MakeMaker-E<gt>new()>, and thus by
+ C<WriteMakefile()>. The string is split as the shell would, and the result
+ is processed before any actual command line arguments are processed.
+
+ PERL_MM_OPT='CCFLAGS="-Wl,-rpath -Wl,/foo/bar/lib" LIBS="-lwibble -lwobble"'
+
+ =item PERL_MM_USE_DEFAULT
+
+ If set to a true value then MakeMaker's prompt function will
+ always return the default without waiting for user input.
+
+ =item PERL_CORE
+
+ Same as the PERL_CORE parameter. The parameter overrides this.
+
+ =back
+
+ =head1 SEE ALSO
+
+ L<Module::Build> is a pure-Perl alternative to MakeMaker which does
+ not rely on make or any other external utility. It is easier to
+ extend to suit your needs.
+
+ L<Module::Install> is a wrapper around MakeMaker which adds features
+ not normally available.
+
+ L<ExtUtils::ModuleMaker> and L<Module::Starter> are both modules to
+ help you setup your distribution.
+
+ L<CPAN::Meta> and L<CPAN::Meta::Spec> explain CPAN Meta files in detail.
+
+ L<File::ShareDir::Install> makes it easy to install static, sometimes
+ also referred to as 'shared' files. L<File::ShareDir> helps accessing
+ the shared files after installation.
+
+ L<Dist::Zilla> makes it easy for the module author to create MakeMaker-based
+ distributions with lots of bells and whistles.
+
+ =head1 AUTHORS
+
+ Andy Dougherty C<doughera@lafayette.edu>, Andreas KE<ouml>nig
+ C<andreas.koenig@mind.de>, Tim Bunce C<timb@cpan.org>. VMS
+ support by Charles Bailey C<bailey@newman.upenn.edu>. OS/2 support
+ by Ilya Zakharevich C<ilya@math.ohio-state.edu>.
+
+ Currently maintained by Michael G Schwern C<schwern@pobox.com>
+
+ Send patches and ideas to C<makemaker@perl.org>.
+
+ Send bug reports via http://rt.cpan.org/. Please send your
+ generated Makefile along with your report.
+
+ For more up-to-date information, see L<https://metacpan.org/release/ExtUtils-MakeMaker>.
+
+ Repository available at L<https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker>.
+
+ =head1 LICENSE
+
+ This program is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+ See L<http://www.perl.com/perl/misc/Artistic.html>
+
+
+ =cut
+EXTUTILS_MAKEMAKER
+
+$fatpacked{"ExtUtils/MakeMaker/Config.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MAKEMAKER_CONFIG';
+ package ExtUtils::MakeMaker::Config;
+
+ use strict;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ use Config ();
+
+ # Give us an overridable config.
+ our %Config = %Config::Config;
+
+ sub import {
+ my $caller = caller;
+
+ no strict 'refs'; ## no critic
+ *{$caller.'::Config'} = \%Config;
+ }
+
+ 1;
+
+
+ =head1 NAME
+
+ ExtUtils::MakeMaker::Config - Wrapper around Config.pm
+
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::MakeMaker::Config;
+ print $Config{installbin}; # or whatever
+
+
+ =head1 DESCRIPTION
+
+ B<FOR INTERNAL USE ONLY>
+
+ A very thin wrapper around Config.pm so MakeMaker is easier to test.
+
+ =cut
+EXTUTILS_MAKEMAKER_CONFIG
+
+$fatpacked{"ExtUtils/MakeMaker/Locale.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MAKEMAKER_LOCALE';
+ package ExtUtils::MakeMaker::Locale;
+
+ use strict;
+ our $VERSION = "7.06";
+ $VERSION = eval $VERSION;
+
+ use base 'Exporter';
+ our @EXPORT_OK = qw(
+ decode_argv env
+ $ENCODING_LOCALE $ENCODING_LOCALE_FS
+ $ENCODING_CONSOLE_IN $ENCODING_CONSOLE_OUT
+ );
+
+ use Encode ();
+ use Encode::Alias ();
+
+ our $ENCODING_LOCALE;
+ our $ENCODING_LOCALE_FS;
+ our $ENCODING_CONSOLE_IN;
+ our $ENCODING_CONSOLE_OUT;
+
+ sub DEBUG () { 0 }
+
+ sub _init {
+ if ($^O eq "MSWin32") {
+ unless ($ENCODING_LOCALE) {
+ # Try to obtain what the Windows ANSI code page is
+ eval {
+ unless (defined &GetConsoleCP) {
+ require Win32;
+ # no point falling back to Win32::GetConsoleCP from this
+ # as added same time, 0.45
+ eval { Win32::GetConsoleCP() };
+ # manually "import" it since Win32->import refuses
+ *GetConsoleCP = sub { &Win32::GetConsoleCP } unless $@;
+ }
+ unless (defined &GetConsoleCP) {
+ require Win32::API;
+ Win32::API->Import('kernel32', 'int GetConsoleCP()');
+ }
+ if (defined &GetConsoleCP) {
+ my $cp = GetConsoleCP();
+ $ENCODING_LOCALE = "cp$cp" if $cp;
+ }
+ };
+ }
+
+ unless ($ENCODING_CONSOLE_IN) {
+ # only test one since set together
+ unless (defined &GetInputCP) {
+ eval {
+ require Win32;
+ eval { Win32::GetConsoleCP() };
+ # manually "import" it since Win32->import refuses
+ *GetInputCP = sub { &Win32::GetConsoleCP } unless $@;
+ *GetOutputCP = sub { &Win32::GetConsoleOutputCP } unless $@;
+ };
+ unless (defined &GetInputCP) {
+ eval {
+ # try Win32::Console module for codepage to use
+ require Win32::Console;
+ eval { Win32::Console::InputCP() };
+ *GetInputCP = sub { &Win32::Console::InputCP }
+ unless $@;
+ *GetOutputCP = sub { &Win32::Console::OutputCP }
+ unless $@;
+ };
+ }
+ unless (defined &GetInputCP) {
+ # final fallback
+ *GetInputCP = *GetOutputCP = sub {
+ # another fallback that could work is:
+ # reg query HKLM\System\CurrentControlSet\Control\Nls\CodePage /v ACP
+ ((qx(chcp) || '') =~ /^Active code page: (\d+)/)
+ ? $1 : ();
+ };
+ }
+ }
+ my $cp = GetInputCP();
+ $ENCODING_CONSOLE_IN = "cp$cp" if $cp;
+ $cp = GetOutputCP();
+ $ENCODING_CONSOLE_OUT = "cp$cp" if $cp;
+ }
+ }
+
+ unless ($ENCODING_LOCALE) {
+ eval {
+ require I18N::Langinfo;
+ $ENCODING_LOCALE = I18N::Langinfo::langinfo(I18N::Langinfo::CODESET());
+
+ # Workaround of Encode < v2.25. The "646" encoding alias was
+ # introduced in Encode-2.25, but we don't want to require that version
+ # quite yet. Should avoid the CPAN testers failure reported from
+ # openbsd-4.7/perl-5.10.0 combo.
+ $ENCODING_LOCALE = "ascii" if $ENCODING_LOCALE eq "646";
+
+ # https://rt.cpan.org/Ticket/Display.html?id=66373
+ $ENCODING_LOCALE = "hp-roman8" if $^O eq "hpux" && $ENCODING_LOCALE eq "roman8";
+ };
+ $ENCODING_LOCALE ||= $ENCODING_CONSOLE_IN;
+ }
+
+ if ($^O eq "darwin") {
+ $ENCODING_LOCALE_FS ||= "UTF-8";
+ }
+
+ # final fallback
+ $ENCODING_LOCALE ||= $^O eq "MSWin32" ? "cp1252" : "UTF-8";
+ $ENCODING_LOCALE_FS ||= $ENCODING_LOCALE;
+ $ENCODING_CONSOLE_IN ||= $ENCODING_LOCALE;
+ $ENCODING_CONSOLE_OUT ||= $ENCODING_CONSOLE_IN;
+
+ unless (Encode::find_encoding($ENCODING_LOCALE)) {
+ my $foundit;
+ if (lc($ENCODING_LOCALE) eq "gb18030") {
+ eval {
+ require Encode::HanExtra;
+ };
+ if ($@) {
+ die "Need Encode::HanExtra to be installed to support locale codeset ($ENCODING_LOCALE), stopped";
+ }
+ $foundit++ if Encode::find_encoding($ENCODING_LOCALE);
+ }
+ die "The locale codeset ($ENCODING_LOCALE) isn't one that perl can decode, stopped"
+ unless $foundit;
+
+ }
+
+ # use Data::Dump; ddx $ENCODING_LOCALE, $ENCODING_LOCALE_FS, $ENCODING_CONSOLE_IN, $ENCODING_CONSOLE_OUT;
+ }
+
+ _init();
+ Encode::Alias::define_alias(sub {
+ no strict 'refs';
+ no warnings 'once';
+ return ${"ENCODING_" . uc(shift)};
+ }, "locale");
+
+ sub _flush_aliases {
+ no strict 'refs';
+ for my $a (keys %Encode::Alias::Alias) {
+ if (defined ${"ENCODING_" . uc($a)}) {
+ delete $Encode::Alias::Alias{$a};
+ warn "Flushed alias cache for $a" if DEBUG;
+ }
+ }
+ }
+
+ sub reinit {
+ $ENCODING_LOCALE = shift;
+ $ENCODING_LOCALE_FS = shift;
+ $ENCODING_CONSOLE_IN = $ENCODING_LOCALE;
+ $ENCODING_CONSOLE_OUT = $ENCODING_LOCALE;
+ _init();
+ _flush_aliases();
+ }
+
+ sub decode_argv {
+ die if defined wantarray;
+ for (@ARGV) {
+ $_ = Encode::decode(locale => $_, @_);
+ }
+ }
+
+ sub env {
+ my $k = Encode::encode(locale => shift);
+ my $old = $ENV{$k};
+ if (@_) {
+ my $v = shift;
+ if (defined $v) {
+ $ENV{$k} = Encode::encode(locale => $v);
+ }
+ else {
+ delete $ENV{$k};
+ }
+ }
+ return Encode::decode(locale => $old) if defined wantarray;
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ ExtUtils::MakeMaker::Locale - bundled Encode::Locale
+
+ =head1 SYNOPSIS
+
+ use Encode::Locale;
+ use Encode;
+
+ $string = decode(locale => $bytes);
+ $bytes = encode(locale => $string);
+
+ if (-t) {
+ binmode(STDIN, ":encoding(console_in)");
+ binmode(STDOUT, ":encoding(console_out)");
+ binmode(STDERR, ":encoding(console_out)");
+ }
+
+ # Processing file names passed in as arguments
+ my $uni_filename = decode(locale => $ARGV[0]);
+ open(my $fh, "<", encode(locale_fs => $uni_filename))
+ || die "Can't open '$uni_filename': $!";
+ binmode($fh, ":encoding(locale)");
+ ...
+
+ =head1 DESCRIPTION
+
+ In many applications it's wise to let Perl use Unicode for the strings it
+ processes. Most of the interfaces Perl has to the outside world are still byte
+ based. Programs therefore need to decode byte strings that enter the program
+ from the outside and encode them again on the way out.
+
+ The POSIX locale system is used to specify both the language conventions
+ requested by the user and the preferred character set to consume and
+ output. The C<Encode::Locale> module looks up the charset and encoding (called
+ a CODESET in the locale jargon) and arranges for the L<Encode> module to know
+ this encoding under the name "locale". It means bytes obtained from the
+ environment can be converted to Unicode strings by calling C<<
+ Encode::encode(locale => $bytes) >> and converted back again with C<<
+ Encode::decode(locale => $string) >>.
+
+ Where file systems interfaces pass file names in and out of the program we also
+ need care. The trend is for operating systems to use a fixed file encoding
+ that don't actually depend on the locale; and this module determines the most
+ appropriate encoding for file names. The L<Encode> module will know this
+ encoding under the name "locale_fs". For traditional Unix systems this will
+ be an alias to the same encoding as "locale".
+
+ For programs running in a terminal window (called a "Console" on some systems)
+ the "locale" encoding is usually a good choice for what to expect as input and
+ output. Some systems allows us to query the encoding set for the terminal and
+ C<Encode::Locale> will do that if available and make these encodings known
+ under the C<Encode> aliases "console_in" and "console_out". For systems where
+ we can't determine the terminal encoding these will be aliased as the same
+ encoding as "locale". The advice is to use "console_in" for input known to
+ come from the terminal and "console_out" for output to the terminal.
+
+ In addition to arranging for various Encode aliases the following functions and
+ variables are provided:
+
+ =over
+
+ =item decode_argv( )
+
+ =item decode_argv( Encode::FB_CROAK )
+
+ This will decode the command line arguments to perl (the C<@ARGV> array) in-place.
+
+ The function will by default replace characters that can't be decoded by
+ "\x{FFFD}", the Unicode replacement character.
+
+ Any argument provided is passed as CHECK to underlying Encode::decode() call.
+ Pass the value C<Encode::FB_CROAK> to have the decoding croak if not all the
+ command line arguments can be decoded. See L<Encode/"Handling Malformed Data">
+ for details on other options for CHECK.
+
+ =item env( $uni_key )
+
+ =item env( $uni_key => $uni_value )
+
+ Interface to get/set environment variables. Returns the current value as a
+ Unicode string. The $uni_key and $uni_value arguments are expected to be
+ Unicode strings as well. Passing C<undef> as $uni_value deletes the
+ environment variable named $uni_key.
+
+ The returned value will have the characters that can't be decoded replaced by
+ "\x{FFFD}", the Unicode replacement character.
+
+ There is no interface to request alternative CHECK behavior as for
+ decode_argv(). If you need that you need to call encode/decode yourself.
+ For example:
+
+ my $key = Encode::encode(locale => $uni_key, Encode::FB_CROAK);
+ my $uni_value = Encode::decode(locale => $ENV{$key}, Encode::FB_CROAK);
+
+ =item reinit( )
+
+ =item reinit( $encoding )
+
+ Reinitialize the encodings from the locale. You want to call this function if
+ you changed anything in the environment that might influence the locale.
+
+ This function will croak if the determined encoding isn't recognized by
+ the Encode module.
+
+ With argument force $ENCODING_... variables to set to the given value.
+
+ =item $ENCODING_LOCALE
+
+ The encoding name determined to be suitable for the current locale.
+ L<Encode> know this encoding as "locale".
+
+ =item $ENCODING_LOCALE_FS
+
+ The encoding name determined to be suitable for file system interfaces
+ involving file names.
+ L<Encode> know this encoding as "locale_fs".
+
+ =item $ENCODING_CONSOLE_IN
+
+ =item $ENCODING_CONSOLE_OUT
+
+ The encodings to be used for reading and writing output to the a console.
+ L<Encode> know these encodings as "console_in" and "console_out".
+
+ =back
+
+ =head1 NOTES
+
+ This table summarizes the mapping of the encodings set up
+ by the C<Encode::Locale> module:
+
+ Encode | | |
+ Alias | Windows | Mac OS X | POSIX
+ ------------+---------+--------------+------------
+ locale | ANSI | nl_langinfo | nl_langinfo
+ locale_fs | ANSI | UTF-8 | nl_langinfo
+ console_in | OEM | nl_langinfo | nl_langinfo
+ console_out | OEM | nl_langinfo | nl_langinfo
+
+ =head2 Windows
+
+ Windows has basically 2 sets of APIs. A wide API (based on passing UTF-16
+ strings) and a byte based API based a character set called ANSI. The
+ regular Perl interfaces to the OS currently only uses the ANSI APIs.
+ Unfortunately ANSI is not a single character set.
+
+ The encoding that corresponds to ANSI varies between different editions of
+ Windows. For many western editions of Windows ANSI corresponds to CP-1252
+ which is a character set similar to ISO-8859-1. Conceptually the ANSI
+ character set is a similar concept to the POSIX locale CODESET so this module
+ figures out what the ANSI code page is and make this available as
+ $ENCODING_LOCALE and the "locale" Encoding alias.
+
+ Windows systems also operate with another byte based character set.
+ It's called the OEM code page. This is the encoding that the Console
+ takes as input and output. It's common for the OEM code page to
+ differ from the ANSI code page.
+
+ =head2 Mac OS X
+
+ On Mac OS X the file system encoding is always UTF-8 while the locale
+ can otherwise be set up as normal for POSIX systems.
+
+ File names on Mac OS X will at the OS-level be converted to
+ NFD-form. A file created by passing a NFC-filename will come
+ in NFD-form from readdir(). See L<Unicode::Normalize> for details
+ of NFD/NFC.
+
+ Actually, Apple does not follow the Unicode NFD standard since not all
+ character ranges are decomposed. The claim is that this avoids problems with
+ round trip conversions from old Mac text encodings. See L<Encode::UTF8Mac> for
+ details.
+
+ =head2 POSIX (Linux and other Unixes)
+
+ File systems might vary in what encoding is to be used for
+ filenames. Since this module has no way to actually figure out
+ what the is correct it goes with the best guess which is to
+ assume filenames are encoding according to the current locale.
+ Users are advised to always specify UTF-8 as the locale charset.
+
+ =head1 SEE ALSO
+
+ L<I18N::Langinfo>, L<Encode>, L<Term::Encoding>
+
+ =head1 AUTHOR
+
+ Copyright 2010 Gisle Aas <gisle@aas.no>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+ =cut
+EXTUTILS_MAKEMAKER_LOCALE
+
+$fatpacked{"ExtUtils/MakeMaker/version.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MAKEMAKER_VERSION';
+ #--------------------------------------------------------------------------#
+ # This is a modified copy of version.pm 0.9909, bundled exclusively for
+ # use by ExtUtils::Makemaker and its dependencies to bootstrap when
+ # version.pm is not available. It should not be used by ordinary modules.
+ #
+ # When loaded, it will try to load version.pm. If that fails, it will load
+ # ExtUtils::MakeMaker::version::vpp and alias various *version functions
+ # to functions in that module. It will also override UNIVERSAL::VERSION.
+ #--------------------------------------------------------------------------#
+
+ package ExtUtils::MakeMaker::version;
+
+ use 5.006001;
+ use strict;
+
+ use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);
+
+ $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+ $CLASS = 'version';
+
+ {
+ local $SIG{'__DIE__'};
+ eval "use version";
+ if ( $@ ) { # don't have any version.pm installed
+ eval "use ExtUtils::MakeMaker::version::vpp";
+ die "$@" if ( $@ );
+ local $^W;
+ delete $INC{'version.pm'};
+ $INC{'version.pm'} = $INC{'ExtUtils/MakeMaker/version.pm'};
+ push @version::ISA, "ExtUtils::MakeMaker::version::vpp";
+ $version::VERSION = $VERSION;
+ *version::qv = \&ExtUtils::MakeMaker::version::vpp::qv;
+ *version::declare = \&ExtUtils::MakeMaker::version::vpp::declare;
+ *version::_VERSION = \&ExtUtils::MakeMaker::version::vpp::_VERSION;
+ *version::vcmp = \&ExtUtils::MakeMaker::version::vpp::vcmp;
+ *version::new = \&ExtUtils::MakeMaker::version::vpp::new;
+ if ($] >= 5.009000) {
+ no strict 'refs';
+ *version::stringify = \&ExtUtils::MakeMaker::version::vpp::stringify;
+ *{'version::(""'} = \&ExtUtils::MakeMaker::version::vpp::stringify;
+ *{'version::(<=>'} = \&ExtUtils::MakeMaker::version::vpp::vcmp;
+ *version::parse = \&ExtUtils::MakeMaker::version::vpp::parse;
+ }
+ require ExtUtils::MakeMaker::version::regex;
+ *version::is_lax = \&ExtUtils::MakeMaker::version::regex::is_lax;
+ *version::is_strict = \&ExtUtils::MakeMaker::version::regex::is_strict;
+ *LAX = \$ExtUtils::MakeMaker::version::regex::LAX;
+ *STRICT = \$ExtUtils::MakeMaker::version::regex::STRICT;
+ }
+ elsif ( ! version->can('is_qv') ) {
+ *version::is_qv = sub { exists $_[0]->{qv} };
+ }
+ }
+
+ 1;
+EXTUTILS_MAKEMAKER_VERSION
+
+$fatpacked{"ExtUtils/MakeMaker/version/regex.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MAKEMAKER_VERSION_REGEX';
+ #--------------------------------------------------------------------------#
+ # This is a modified copy of version.pm 0.9909, bundled exclusively for
+ # use by ExtUtils::Makemaker and its dependencies to bootstrap when
+ # version.pm is not available. It should not be used by ordinary modules.
+ #--------------------------------------------------------------------------#
+
+ package ExtUtils::MakeMaker::version::regex;
+
+ use strict;
+
+ use vars qw($VERSION $CLASS $STRICT $LAX);
+
+ $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ #--------------------------------------------------------------------------#
+ # Version regexp components
+ #--------------------------------------------------------------------------#
+
+ # Fraction part of a decimal version number. This is a common part of
+ # both strict and lax decimal versions
+
+ my $FRACTION_PART = qr/\.[0-9]+/;
+
+ # First part of either decimal or dotted-decimal strict version number.
+ # Unsigned integer with no leading zeroes (except for zero itself) to
+ # avoid confusion with octal.
+
+ my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/;
+
+ # First part of either decimal or dotted-decimal lax version number.
+ # Unsigned integer, but allowing leading zeros. Always interpreted
+ # as decimal. However, some forms of the resulting syntax give odd
+ # results if used as ordinary Perl expressions, due to how perl treats
+ # octals. E.g.
+ # version->new("010" ) == 10
+ # version->new( 010 ) == 8
+ # version->new( 010.2) == 82 # "8" . "2"
+
+ my $LAX_INTEGER_PART = qr/[0-9]+/;
+
+ # Second and subsequent part of a strict dotted-decimal version number.
+ # Leading zeroes are permitted, and the number is always decimal.
+ # Limited to three digits to avoid overflow when converting to decimal
+ # form and also avoid problematic style with excessive leading zeroes.
+
+ my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/;
+
+ # Second and subsequent part of a lax dotted-decimal version number.
+ # Leading zeroes are permitted, and the number is always decimal. No
+ # limit on the numerical value or number of digits, so there is the
+ # possibility of overflow when converting to decimal form.
+
+ my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/;
+
+ # Alpha suffix part of lax version number syntax. Acts like a
+ # dotted-decimal part.
+
+ my $LAX_ALPHA_PART = qr/_[0-9]+/;
+
+ #--------------------------------------------------------------------------#
+ # Strict version regexp definitions
+ #--------------------------------------------------------------------------#
+
+ # Strict decimal version number.
+
+ my $STRICT_DECIMAL_VERSION =
+ qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x;
+
+ # Strict dotted-decimal version number. Must have both leading "v" and
+ # at least three parts, to avoid confusion with decimal syntax.
+
+ my $STRICT_DOTTED_DECIMAL_VERSION =
+ qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x;
+
+ # Complete strict version number syntax -- should generally be used
+ # anchored: qr/ \A $STRICT \z /x
+
+ $STRICT =
+ qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x;
+
+ #--------------------------------------------------------------------------#
+ # Lax version regexp definitions
+ #--------------------------------------------------------------------------#
+
+ # Lax decimal version number. Just like the strict one except for
+ # allowing an alpha suffix or allowing a leading or trailing
+ # decimal-point
+
+ my $LAX_DECIMAL_VERSION =
+ qr/ $LAX_INTEGER_PART (?: \. | $FRACTION_PART $LAX_ALPHA_PART? )?
+ |
+ $FRACTION_PART $LAX_ALPHA_PART?
+ /x;
+
+ # Lax dotted-decimal version number. Distinguished by having either
+ # leading "v" or at least three non-alpha parts. Alpha part is only
+ # permitted if there are at least two non-alpha parts. Strangely
+ # enough, without the leading "v", Perl takes .1.2 to mean v0.1.2,
+ # so when there is no "v", the leading part is optional
+
+ my $LAX_DOTTED_DECIMAL_VERSION =
+ qr/
+ v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )?
+ |
+ $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART?
+ /x;
+
+ # Complete lax version number syntax -- should generally be used
+ # anchored: qr/ \A $LAX \z /x
+ #
+ # The string 'undef' is a special case to make for easier handling
+ # of return values from ExtUtils::MM->parse_version
+
+ $LAX =
+ qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x;
+
+ #--------------------------------------------------------------------------#
+
+ # Preloaded methods go here.
+ sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x }
+ sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x }
+
+ 1;
+EXTUTILS_MAKEMAKER_VERSION_REGEX
+
+$fatpacked{"ExtUtils/MakeMaker/version/vpp.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MAKEMAKER_VERSION_VPP';
+ #--------------------------------------------------------------------------#
+ # This is a modified copy of version.pm 0.9909, bundled exclusively for
+ # use by ExtUtils::Makemaker and its dependencies to bootstrap when
+ # version.pm is not available. It should not be used by ordinary modules.
+ #--------------------------------------------------------------------------#
+
+ package ExtUtils::MakeMaker::charstar;
+ # a little helper class to emulate C char* semantics in Perl
+ # so that prescan_version can use the same code as in C
+
+ use overload (
+ '""' => \&thischar,
+ '0+' => \&thischar,
+ '++' => \&increment,
+ '--' => \&decrement,
+ '+' => \&plus,
+ '-' => \&minus,
+ '*' => \&multiply,
+ 'cmp' => \&cmp,
+ '<=>' => \&spaceship,
+ 'bool' => \&thischar,
+ '=' => \&clone,
+ );
+
+ sub new {
+ my ($self, $string) = @_;
+ my $class = ref($self) || $self;
+
+ my $obj = {
+ string => [split(//,$string)],
+ current => 0,
+ };
+ return bless $obj, $class;
+ }
+
+ sub thischar {
+ my ($self) = @_;
+ my $last = $#{$self->{string}};
+ my $curr = $self->{current};
+ if ($curr >= 0 && $curr <= $last) {
+ return $self->{string}->[$curr];
+ }
+ else {
+ return '';
+ }
+ }
+
+ sub increment {
+ my ($self) = @_;
+ $self->{current}++;
+ }
+
+ sub decrement {
+ my ($self) = @_;
+ $self->{current}--;
+ }
+
+ sub plus {
+ my ($self, $offset) = @_;
+ my $rself = $self->clone;
+ $rself->{current} += $offset;
+ return $rself;
+ }
+
+ sub minus {
+ my ($self, $offset) = @_;
+ my $rself = $self->clone;
+ $rself->{current} -= $offset;
+ return $rself;
+ }
+
+ sub multiply {
+ my ($left, $right, $swapped) = @_;
+ my $char = $left->thischar();
+ return $char * $right;
+ }
+
+ sub spaceship {
+ my ($left, $right, $swapped) = @_;
+ unless (ref($right)) { # not an object already
+ $right = $left->new($right);
+ }
+ return $left->{current} <=> $right->{current};
+ }
+
+ sub cmp {
+ my ($left, $right, $swapped) = @_;
+ unless (ref($right)) { # not an object already
+ if (length($right) == 1) { # comparing single character only
+ return $left->thischar cmp $right;
+ }
+ $right = $left->new($right);
+ }
+ return $left->currstr cmp $right->currstr;
+ }
+
+ sub bool {
+ my ($self) = @_;
+ my $char = $self->thischar;
+ return ($char ne '');
+ }
+
+ sub clone {
+ my ($left, $right, $swapped) = @_;
+ $right = {
+ string => [@{$left->{string}}],
+ current => $left->{current},
+ };
+ return bless $right, ref($left);
+ }
+
+ sub currstr {
+ my ($self, $s) = @_;
+ my $curr = $self->{current};
+ my $last = $#{$self->{string}};
+ if (defined($s) && $s->{current} < $last) {
+ $last = $s->{current};
+ }
+
+ my $string = join('', @{$self->{string}}[$curr..$last]);
+ return $string;
+ }
+
+ package ExtUtils::MakeMaker::version::vpp;
+
+ use 5.006001;
+ use strict;
+
+ use Config;
+ use vars qw($VERSION $CLASS @ISA $LAX $STRICT);
+ $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+ $CLASS = 'ExtUtils::MakeMaker::version::vpp';
+
+ require ExtUtils::MakeMaker::version::regex;
+ *ExtUtils::MakeMaker::version::vpp::is_strict = \&ExtUtils::MakeMaker::version::regex::is_strict;
+ *ExtUtils::MakeMaker::version::vpp::is_lax = \&ExtUtils::MakeMaker::version::regex::is_lax;
+ *LAX = \$ExtUtils::MakeMaker::version::regex::LAX;
+ *STRICT = \$ExtUtils::MakeMaker::version::regex::STRICT;
+
+ use overload (
+ '""' => \&stringify,
+ '0+' => \&numify,
+ 'cmp' => \&vcmp,
+ '<=>' => \&vcmp,
+ 'bool' => \&vbool,
+ '+' => \&vnoop,
+ '-' => \&vnoop,
+ '*' => \&vnoop,
+ '/' => \&vnoop,
+ '+=' => \&vnoop,
+ '-=' => \&vnoop,
+ '*=' => \&vnoop,
+ '/=' => \&vnoop,
+ 'abs' => \&vnoop,
+ );
+
+ eval "use warnings";
+ if ($@) {
+ eval '
+ package
+ warnings;
+ sub enabled {return $^W;}
+ 1;
+ ';
+ }
+
+ sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq $CLASS) {
+ local $^W;
+ *{$class.'::declare'} = \&{$CLASS.'::declare'};
+ *{$class.'::qv'} = \&{$CLASS.'::qv'};
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg.'::declare'} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg.'::qv'} =
+ sub {return $class->qv(shift) }
+ unless defined(&{$callpkg.'::qv'});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ local $^W;
+ *UNIVERSAL::VERSION
+ = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg.'::VERSION'} = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'is_strict'})) {
+ *{$callpkg.'::is_strict'} = \&{$CLASS.'::is_strict'}
+ unless defined(&{$callpkg.'::is_strict'});
+ }
+
+ if (exists($args{'is_lax'})) {
+ *{$callpkg.'::is_lax'} = \&{$CLASS.'::is_lax'}
+ unless defined(&{$callpkg.'::is_lax'});
+ }
+ }
+
+ my $VERSION_MAX = 0x7FFFFFFF;
+
+ # implement prescan_version as closely to the C version as possible
+ use constant TRUE => 1;
+ use constant FALSE => 0;
+
+ sub isDIGIT {
+ my ($char) = shift->thischar();
+ return ($char =~ /\d/);
+ }
+
+ sub isALPHA {
+ my ($char) = shift->thischar();
+ return ($char =~ /[a-zA-Z]/);
+ }
+
+ sub isSPACE {
+ my ($char) = shift->thischar();
+ return ($char =~ /\s/);
+ }
+
+ sub BADVERSION {
+ my ($s, $errstr, $error) = @_;
+ if ($errstr) {
+ $$errstr = $error;
+ }
+ return $s;
+ }
+
+ sub prescan_version {
+ my ($s, $strict, $errstr, $sqv, $ssaw_decimal, $swidth, $salpha) = @_;
+ my $qv = defined $sqv ? $$sqv : FALSE;
+ my $saw_decimal = defined $ssaw_decimal ? $$ssaw_decimal : 0;
+ my $width = defined $swidth ? $$swidth : 3;
+ my $alpha = defined $salpha ? $$salpha : FALSE;
+
+ my $d = $s;
+
+ if ($qv && isDIGIT($d)) {
+ goto dotted_decimal_version;
+ }
+
+ if ($d eq 'v') { # explicit v-string
+ $d++;
+ if (isDIGIT($d)) {
+ $qv = TRUE;
+ }
+ else { # degenerate v-string
+ # requires v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+
+ dotted_decimal_version:
+ if ($strict && $d eq '0' && isDIGIT($d+1)) {
+ # no leading zeros allowed
+ return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)");
+ }
+
+ while (isDIGIT($d)) { # integer part
+ $d++;
+ }
+
+ if ($d eq '.')
+ {
+ $saw_decimal++;
+ $d++; # decimal point
+ }
+ else
+ {
+ if ($strict) {
+ # require v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+ else {
+ goto version_prescan_finish;
+ }
+ }
+
+ {
+ my $i = 0;
+ my $j = 0;
+ while (isDIGIT($d)) { # just keep reading
+ $i++;
+ while (isDIGIT($d)) {
+ $d++; $j++;
+ # maximum 3 digits between decimal
+ if ($strict && $j > 3) {
+ return BADVERSION($s,$errstr,"Invalid version format (maximum 3 digits between decimals)");
+ }
+ }
+ if ($d eq '_') {
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ if ( $alpha ) {
+ return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)");
+ }
+ $d++;
+ $alpha = TRUE;
+ }
+ elsif ($d eq '.') {
+ if ($alpha) {
+ return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)");
+ }
+ $saw_decimal++;
+ $d++;
+ }
+ elsif (!isDIGIT($d)) {
+ last;
+ }
+ $j = 0;
+ }
+
+ if ($strict && $i < 2) {
+ # requires v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+ }
+ } # end if dotted-decimal
+ else
+ { # decimal versions
+ my $j = 0;
+ # special $strict case for leading '.' or '0'
+ if ($strict) {
+ if ($d eq '.') {
+ return BADVERSION($s,$errstr,"Invalid version format (0 before decimal required)");
+ }
+ if ($d eq '0' && isDIGIT($d+1)) {
+ return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)");
+ }
+ }
+
+ # and we never support negative version numbers
+ if ($d eq '-') {
+ return BADVERSION($s,$errstr,"Invalid version format (negative version number)");
+ }
+
+ # consume all of the integer part
+ while (isDIGIT($d)) {
+ $d++;
+ }
+
+ # look for a fractional part
+ if ($d eq '.') {
+ # we found it, so consume it
+ $saw_decimal++;
+ $d++;
+ }
+ elsif (!$d || $d eq ';' || isSPACE($d) || $d eq '}') {
+ if ( $d == $s ) {
+ # found nothing
+ return BADVERSION($s,$errstr,"Invalid version format (version required)");
+ }
+ # found just an integer
+ goto version_prescan_finish;
+ }
+ elsif ( $d == $s ) {
+ # didn't find either integer or period
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+ elsif ($d eq '_') {
+ # underscore can't come after integer part
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ elsif (isDIGIT($d+1)) {
+ return BADVERSION($s,$errstr,"Invalid version format (alpha without decimal)");
+ }
+ else {
+ return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)");
+ }
+ }
+ elsif ($d) {
+ # anything else after integer part is just invalid data
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+
+ # scan the fractional part after the decimal point
+ if ($d && !isDIGIT($d) && ($strict || ! ($d eq ';' || isSPACE($d) || $d eq '}') )) {
+ # $strict or lax-but-not-the-end
+ return BADVERSION($s,$errstr,"Invalid version format (fractional part required)");
+ }
+
+ while (isDIGIT($d)) {
+ $d++; $j++;
+ if ($d eq '.' && isDIGIT($d-1)) {
+ if ($alpha) {
+ return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)");
+ }
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions must begin with 'v')");
+ }
+ $d = $s; # start all over again
+ $qv = TRUE;
+ goto dotted_decimal_version;
+ }
+ if ($d eq '_') {
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ if ( $alpha ) {
+ return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)");
+ }
+ if ( ! isDIGIT($d+1) ) {
+ return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)");
+ }
+ $width = $j;
+ $d++;
+ $alpha = TRUE;
+ }
+ }
+ }
+
+ version_prescan_finish:
+ while (isSPACE($d)) {
+ $d++;
+ }
+
+ if ($d && !isDIGIT($d) && (! ($d eq ';' || $d eq '}') )) {
+ # trailing non-numeric data
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+
+ if (defined $sqv) {
+ $$sqv = $qv;
+ }
+ if (defined $swidth) {
+ $$swidth = $width;
+ }
+ if (defined $ssaw_decimal) {
+ $$ssaw_decimal = $saw_decimal;
+ }
+ if (defined $salpha) {
+ $$salpha = $alpha;
+ }
+ return $d;
+ }
+
+ sub scan_version {
+ my ($s, $rv, $qv) = @_;
+ my $start;
+ my $pos;
+ my $last;
+ my $errstr;
+ my $saw_decimal = 0;
+ my $width = 3;
+ my $alpha = FALSE;
+ my $vinf = FALSE;
+ my @av;
+
+ $s = new ExtUtils::MakeMaker::charstar $s;
+
+ while (isSPACE($s)) { # leading whitespace is OK
+ $s++;
+ }
+
+ $last = prescan_version($s, FALSE, \$errstr, \$qv, \$saw_decimal,
+ \$width, \$alpha);
+
+ if ($errstr) {
+ # 'undef' is a special case and not an error
+ if ( $s ne 'undef') {
+ require Carp;
+ Carp::croak($errstr);
+ }
+ }
+
+ $start = $s;
+ if ($s eq 'v') {
+ $s++;
+ }
+ $pos = $s;
+
+ if ( $qv ) {
+ $$rv->{qv} = $qv;
+ }
+ if ( $alpha ) {
+ $$rv->{alpha} = $alpha;
+ }
+ if ( !$qv && $width < 3 ) {
+ $$rv->{width} = $width;
+ }
+
+ while (isDIGIT($pos)) {
+ $pos++;
+ }
+ if (!isALPHA($pos)) {
+ my $rev;
+
+ for (;;) {
+ $rev = 0;
+ {
+ # this is atoi() that delimits on underscores
+ my $end = $pos;
+ my $mult = 1;
+ my $orev;
+
+ # the following if() will only be true after the decimal
+ # point of a version originally created with a bare
+ # floating point number, i.e. not quoted in any way
+ #
+ if ( !$qv && $s > $start && $saw_decimal == 1 ) {
+ $mult *= 100;
+ while ( $s < $end ) {
+ $orev = $rev;
+ $rev += $s * $mult;
+ $mult /= 10;
+ if ( (abs($orev) > abs($rev))
+ || (abs($rev) > $VERSION_MAX )) {
+ warn("Integer overflow in version %d",
+ $VERSION_MAX);
+ $s = $end - 1;
+ $rev = $VERSION_MAX;
+ $vinf = 1;
+ }
+ $s++;
+ if ( $s eq '_' ) {
+ $s++;
+ }
+ }
+ }
+ else {
+ while (--$end >= $s) {
+ $orev = $rev;
+ $rev += $end * $mult;
+ $mult *= 10;
+ if ( (abs($orev) > abs($rev))
+ || (abs($rev) > $VERSION_MAX )) {
+ warn("Integer overflow in version");
+ $end = $s - 1;
+ $rev = $VERSION_MAX;
+ $vinf = 1;
+ }
+ }
+ }
+ }
+
+ # Append revision
+ push @av, $rev;
+ if ( $vinf ) {
+ $s = $last;
+ last;
+ }
+ elsif ( $pos eq '.' ) {
+ $s = ++$pos;
+ }
+ elsif ( $pos eq '_' && isDIGIT($pos+1) ) {
+ $s = ++$pos;
+ }
+ elsif ( $pos eq ',' && isDIGIT($pos+1) ) {
+ $s = ++$pos;
+ }
+ elsif ( isDIGIT($pos) ) {
+ $s = $pos;
+ }
+ else {
+ $s = $pos;
+ last;
+ }
+ if ( $qv ) {
+ while ( isDIGIT($pos) ) {
+ $pos++;
+ }
+ }
+ else {
+ my $digits = 0;
+ while ( ( isDIGIT($pos) || $pos eq '_' ) && $digits < 3 ) {
+ if ( $pos ne '_' ) {
+ $digits++;
+ }
+ $pos++;
+ }
+ }
+ }
+ }
+ if ( $qv ) { # quoted versions always get at least three terms
+ my $len = $#av;
+ # This for loop appears to trigger a compiler bug on OS X, as it
+ # loops infinitely. Yes, len is negative. No, it makes no sense.
+ # Compiler in question is:
+ # gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
+ # for ( len = 2 - len; len > 0; len-- )
+ # av_push(MUTABLE_AV(sv), newSViv(0));
+ #
+ $len = 2 - $len;
+ while ($len-- > 0) {
+ push @av, 0;
+ }
+ }
+
+ # need to save off the current version string for later
+ if ( $vinf ) {
+ $$rv->{original} = "v.Inf";
+ $$rv->{vinf} = 1;
+ }
+ elsif ( $s > $start ) {
+ $$rv->{original} = $start->currstr($s);
+ if ( $qv && $saw_decimal == 1 && $start ne 'v' ) {
+ # need to insert a v to be consistent
+ $$rv->{original} = 'v' . $$rv->{original};
+ }
+ }
+ else {
+ $$rv->{original} = '0';
+ push(@av, 0);
+ }
+
+ # And finally, store the AV in the hash
+ $$rv->{version} = \@av;
+
+ # fix RT#19517 - special case 'undef' as string
+ if ($s eq 'undef') {
+ $s += 5;
+ }
+
+ return $s;
+ }
+
+ sub new {
+ my $class = shift;
+ unless (defined $class or $#_ > 1) {
+ require Carp;
+ Carp::croak('Usage: version::new(class, version)');
+ }
+
+ my $self = bless ({}, ref ($class) || $class);
+ my $qv = FALSE;
+
+ if ( $#_ == 1 ) { # must be CVS-style
+ $qv = TRUE;
+ }
+ my $value = pop; # always going to be the last element
+
+ if ( ref($value) && eval('$value->isa("version")') ) {
+ # Can copy the elements directly
+ $self->{version} = [ @{$value->{version} } ];
+ $self->{qv} = 1 if $value->{qv};
+ $self->{alpha} = 1 if $value->{alpha};
+ $self->{original} = ''.$value->{original};
+ return $self;
+ }
+
+ if ( not defined $value or $value =~ /^undef$/ ) {
+ # RT #19517 - special case for undef comparison
+ # or someone forgot to pass a value
+ push @{$self->{version}}, 0;
+ $self->{original} = "0";
+ return ($self);
+ }
+
+
+ if (ref($value) =~ m/ARRAY|HASH/) {
+ require Carp;
+ Carp::croak("Invalid version format (non-numeric data)");
+ }
+
+ $value = _un_vstring($value);
+
+ if ($Config{d_setlocale} && eval { require POSIX } ) {
+ require locale;
+ my $currlocale = POSIX::setlocale(&POSIX::LC_ALL);
+
+ # if the current locale uses commas for decimal points, we
+ # just replace commas with decimal places, rather than changing
+ # locales
+ if ( POSIX::localeconv()->{decimal_point} eq ',' ) {
+ $value =~ tr/,/./;
+ }
+ }
+
+ # exponential notation
+ if ( $value =~ /\d+.?\d*e[-+]?\d+/ ) {
+ $value = sprintf("%.9f",$value);
+ $value =~ s/(0+)$//; # trim trailing zeros
+ }
+
+ my $s = scan_version($value, \$self, $qv);
+
+ if ($s) { # must be something left over
+ warn("Version string '%s' contains invalid data; "
+ ."ignoring: '%s'", $value, $s);
+ }
+
+ return ($self);
+ }
+
+ *parse = \&new;
+
+ sub numify {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $width = $self->{width} || 3;
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("%d.", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ if ( $width < 3 ) {
+ my $denom = 10**(3-$width);
+ my $quot = int($digit/$denom);
+ my $rem = $digit - ($quot * $denom);
+ $string .= sprintf("%0".$width."d_%d", $quot, $rem);
+ }
+ else {
+ $string .= sprintf("%03d", $digit);
+ }
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha && $width == 3 ) {
+ $string .= "_";
+ }
+ $string .= sprintf("%0".$width."d", $digit);
+ }
+ else # $len = 0
+ {
+ $string .= sprintf("000");
+ }
+
+ return $string;
+ }
+
+ sub normal {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("v%d", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ $string .= sprintf(".%d", $digit);
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha ) {
+ $string .= sprintf("_%0d", $digit);
+ }
+ else {
+ $string .= sprintf(".%0d", $digit);
+ }
+ }
+
+ if ( $len <= 2 ) {
+ for ( $len = 2 - $len; $len != 0; $len-- ) {
+ $string .= sprintf(".%0d", 0);
+ }
+ }
+
+ return $string;
+ }
+
+ sub stringify {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ return exists $self->{original}
+ ? $self->{original}
+ : exists $self->{qv}
+ ? $self->normal
+ : $self->numify;
+ }
+
+ sub vcmp {
+ require UNIVERSAL;
+ my ($left,$right,$swap) = @_;
+ my $class = ref($left);
+ unless ( UNIVERSAL::isa($right, $class) ) {
+ $right = $class->new($right);
+ }
+
+ if ( $swap ) {
+ ($left, $right) = ($right, $left);
+ }
+ unless (_verify($left)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ unless (_verify($right)) {
+ require Carp;
+ Carp::croak("Invalid version format");
+ }
+ my $l = $#{$left->{version}};
+ my $r = $#{$right->{version}};
+ my $m = $l < $r ? $l : $r;
+ my $lalpha = $left->is_alpha;
+ my $ralpha = $right->is_alpha;
+ my $retval = 0;
+ my $i = 0;
+ while ( $i <= $m && $retval == 0 ) {
+ $retval = $left->{version}[$i] <=> $right->{version}[$i];
+ $i++;
+ }
+
+ # tiebreaker for alpha with identical terms
+ if ( $retval == 0
+ && $l == $r
+ && $left->{version}[$m] == $right->{version}[$m]
+ && ( $lalpha || $ralpha ) ) {
+
+ if ( $lalpha && !$ralpha ) {
+ $retval = -1;
+ }
+ elsif ( $ralpha && !$lalpha) {
+ $retval = +1;
+ }
+ }
+
+ # possible match except for trailing 0's
+ if ( $retval == 0 && $l != $r ) {
+ if ( $l < $r ) {
+ while ( $i <= $r && $retval == 0 ) {
+ if ( $right->{version}[$i] != 0 ) {
+ $retval = -1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ else {
+ while ( $i <= $l && $retval == 0 ) {
+ if ( $left->{version}[$i] != 0 ) {
+ $retval = +1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $retval;
+ }
+
+ sub vbool {
+ my ($self) = @_;
+ return vcmp($self,$self->new("0"),1);
+ }
+
+ sub vnoop {
+ require Carp;
+ Carp::croak("operation not supported with version object");
+ }
+
+ sub is_alpha {
+ my ($self) = @_;
+ return (exists $self->{alpha});
+ }
+
+ sub qv {
+ my $value = shift;
+ my $class = $CLASS;
+ if (@_) {
+ $class = ref($value) || $value;
+ $value = shift;
+ }
+
+ $value = _un_vstring($value);
+ $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/;
+ my $obj = $CLASS->new($value);
+ return bless $obj, $class;
+ }
+
+ *declare = \&qv;
+
+ sub is_qv {
+ my ($self) = @_;
+ return (exists $self->{qv});
+ }
+
+
+ sub _verify {
+ my ($self) = @_;
+ if ( ref($self)
+ && eval { exists $self->{version} }
+ && ref($self->{version}) eq 'ARRAY'
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ sub _is_non_alphanumeric {
+ my $s = shift;
+ $s = new ExtUtils::MakeMaker::charstar $s;
+ while ($s) {
+ return 0 if isSPACE($s); # early out
+ return 1 unless (isALPHA($s) || isDIGIT($s) || $s =~ /[.-]/);
+ $s++;
+ }
+ return 0;
+ }
+
+ sub _un_vstring {
+ my $value = shift;
+ # may be a v-string
+ if ( length($value) >= 3 && $value !~ /[._]/
+ && _is_non_alphanumeric($value)) {
+ my $tvalue;
+ if ( $] ge 5.008_001 ) {
+ $tvalue = _find_magic_vstring($value);
+ $value = $tvalue if length $tvalue;
+ }
+ elsif ( $] ge 5.006_000 ) {
+ $tvalue = sprintf("v%vd",$value);
+ if ( $tvalue =~ /^v\d+(\.\d+){2,}$/ ) {
+ # must be a v-string
+ $value = $tvalue;
+ }
+ }
+ }
+ return $value;
+ }
+
+ sub _find_magic_vstring {
+ my $value = shift;
+ my $tvalue = '';
+ require B;
+ my $sv = B::svref_2object(\$value);
+ my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
+ while ( $magic ) {
+ if ( $magic->TYPE eq 'V' ) {
+ $tvalue = $magic->PTR;
+ $tvalue =~ s/^v?(.+)$/v$1/;
+ last;
+ }
+ else {
+ $magic = $magic->MOREMAGIC;
+ }
+ }
+ return $tvalue;
+ }
+
+ sub _VERSION {
+ my ($obj, $req) = @_;
+ my $class = ref($obj) || $obj;
+
+ no strict 'refs';
+ if ( exists $INC{"$class.pm"} and not %{"$class\::"} and $] >= 5.008) {
+ # file but no package
+ require Carp;
+ Carp::croak( "$class defines neither package nor VERSION"
+ ."--version check failed");
+ }
+
+ my $version = eval "\$$class\::VERSION";
+ if ( defined $version ) {
+ local $^W if $] <= 5.008;
+ $version = ExtUtils::MakeMaker::version::vpp->new($version);
+ }
+
+ if ( defined $req ) {
+ unless ( defined $version ) {
+ require Carp;
+ my $msg = $] < 5.006
+ ? "$class version $req required--this is only version "
+ : "$class does not define \$$class\::VERSION"
+ ."--version check failed";
+
+ if ( $ENV{VERSION_DEBUG} ) {
+ Carp::confess($msg);
+ }
+ else {
+ Carp::croak($msg);
+ }
+ }
+
+ $req = ExtUtils::MakeMaker::version::vpp->new($req);
+
+ if ( $req > $version ) {
+ require Carp;
+ if ( $req->is_qv ) {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->normal, $version->normal)
+ );
+ }
+ else {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->stringify, $version->stringify)
+ );
+ }
+ }
+ }
+
+ return defined $version ? $version->stringify : undef;
+ }
+
+ 1; #this line is important and will help the module return a true value
+EXTUTILS_MAKEMAKER_VERSION_VPP
+
+$fatpacked{"ExtUtils/Manifest.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MANIFEST';
+ package ExtUtils::Manifest;
+
+ require Exporter;
+ use Config;
+ use File::Basename;
+ use File::Copy 'copy';
+ use File::Find;
+ use File::Spec 0.8;
+ use Carp;
+ use strict;
+ use warnings;
+
+ our $VERSION = '1.70';
+ our @ISA = ('Exporter');
+ our @EXPORT_OK = qw(mkmanifest
+ manicheck filecheck fullcheck skipcheck
+ manifind maniread manicopy maniadd
+ maniskip
+ );
+
+ our $Is_MacOS = $^O eq 'MacOS';
+ our $Is_VMS = $^O eq 'VMS';
+ our $Is_VMS_mode = 0;
+ our $Is_VMS_lc = 0;
+ our $Is_VMS_nodot = 0; # No dots in dir names or double dots in files
+
+ if ($Is_VMS) {
+ require VMS::Filespec if $Is_VMS;
+ my $vms_unix_rpt;
+ my $vms_efs;
+ my $vms_case;
+
+ $Is_VMS_mode = 1;
+ $Is_VMS_lc = 1;
+ $Is_VMS_nodot = 1;
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $vms_unix_rpt = VMS::Feature::current("filename_unix_report");
+ $vms_efs = VMS::Feature::current("efs_charset");
+ $vms_case = VMS::Feature::current("efs_case_preserve");
+ } else {
+ my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || '';
+ my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+ $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i;
+ $vms_efs = $efs_charset =~ /^[ET1]/i;
+ $vms_case = $efs_case =~ /^[ET1]/i;
+ }
+ $Is_VMS_lc = 0 if ($vms_case);
+ $Is_VMS_mode = 0 if ($vms_unix_rpt);
+ $Is_VMS_nodot = 0 if ($vms_efs);
+ }
+
+ our $Debug = $ENV{PERL_MM_MANIFEST_DEBUG} || 0;
+ our $Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ?
+ $ENV{PERL_MM_MANIFEST_VERBOSE} : 1;
+ our $Quiet = 0;
+ our $MANIFEST = 'MANIFEST';
+
+ our $DEFAULT_MSKIP = File::Spec->catfile( dirname(__FILE__), "$MANIFEST.SKIP" );
+
+
+ =head1 NAME
+
+ ExtUtils::Manifest - utilities to write and check a MANIFEST file
+
+ =head1 VERSION
+
+ version 1.70
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::Manifest qw(...funcs to import...);
+
+ mkmanifest();
+
+ my @missing_files = manicheck;
+ my @skipped = skipcheck;
+ my @extra_files = filecheck;
+ my($missing, $extra) = fullcheck;
+
+ my $found = manifind();
+
+ my $manifest = maniread();
+
+ manicopy($read,$target);
+
+ maniadd({$file => $comment, ...});
+
+
+ =head1 DESCRIPTION
+
+ =head2 Functions
+
+ ExtUtils::Manifest exports no functions by default. The following are
+ exported on request
+
+ =over 4
+
+ =item mkmanifest
+
+ mkmanifest();
+
+ Writes all files in and below the current directory to your F<MANIFEST>.
+ It works similar to the result of the Unix command
+
+ find . > MANIFEST
+
+ All files that match any regular expression in a file F<MANIFEST.SKIP>
+ (if it exists) are ignored.
+
+ Any existing F<MANIFEST> file will be saved as F<MANIFEST.bak>.
+
+ =cut
+
+ sub _sort {
+ return sort { lc $a cmp lc $b } @_;
+ }
+
+ sub mkmanifest {
+ my $manimiss = 0;
+ my $read = (-r 'MANIFEST' && maniread()) or $manimiss++;
+ $read = {} if $manimiss;
+ local *M;
+ my $bakbase = $MANIFEST;
+ $bakbase =~ s/\./_/g if $Is_VMS_nodot; # avoid double dots
+ rename $MANIFEST, "$bakbase.bak" unless $manimiss;
+ open M, "> $MANIFEST" or die "Could not open $MANIFEST: $!";
+ binmode M, ':raw';
+ my $skip = maniskip();
+ my $found = manifind();
+ my($key,$val,$file,%all);
+ %all = (%$found, %$read);
+ $all{$MANIFEST} = ($Is_VMS_mode ? "$MANIFEST\t\t" : '') .
+ 'This list of files'
+ if $manimiss; # add new MANIFEST to known file list
+ foreach $file (_sort keys %all) {
+ if ($skip->($file)) {
+ # Policy: only remove files if they're listed in MANIFEST.SKIP.
+ # Don't remove files just because they don't exist.
+ warn "Removed from $MANIFEST: $file\n" if $Verbose and exists $read->{$file};
+ next;
+ }
+ if ($Verbose){
+ warn "Added to $MANIFEST: $file\n" unless exists $read->{$file};
+ }
+ my $text = $all{$file};
+ $file = _unmacify($file);
+ my $tabs = (5 - (length($file)+1)/8);
+ $tabs = 1 if $tabs < 1;
+ $tabs = 0 unless $text;
+ if ($file =~ /\s/) {
+ $file =~ s/([\\'])/\\$1/g;
+ $file = "'$file'";
+ }
+ print M $file, "\t" x $tabs, $text, "\n";
+ }
+ close M;
+ }
+
+ # Geez, shouldn't this use File::Spec or File::Basename or something?
+ # Why so careful about dependencies?
+ sub clean_up_filename {
+ my $filename = shift;
+ $filename =~ s|^\./||;
+ $filename =~ s/^:([^:]+)$/$1/ if $Is_MacOS;
+ if ( $Is_VMS ) {
+ $filename =~ s/\.$//; # trim trailing dot
+ $filename = VMS::Filespec::unixify($filename); # unescape spaces, etc.
+ if( $Is_VMS_lc ) {
+ $filename = lc($filename);
+ $filename = uc($filename) if $filename =~ /^MANIFEST(\.SKIP)?$/i;
+ }
+ }
+ return $filename;
+ }
+
+
+ =item manifind
+
+ my $found = manifind();
+
+ returns a hash reference. The keys of the hash are the files found
+ below the current directory.
+
+ =cut
+
+ sub manifind {
+ my $p = shift || {};
+ my $found = {};
+
+ my $wanted = sub {
+ my $name = clean_up_filename($File::Find::name);
+ warn "Debug: diskfile $name\n" if $Debug;
+ return if -d $_;
+ $found->{$name} = "";
+ };
+
+ # We have to use "$File::Find::dir/$_" in preprocess, because
+ # $File::Find::name is unavailable.
+ # Also, it's okay to use / here, because MANIFEST files use Unix-style
+ # paths.
+ find({wanted => $wanted, follow_fast => 1},
+ $Is_MacOS ? ":" : ".");
+
+ return $found;
+ }
+
+
+ =item manicheck
+
+ my @missing_files = manicheck();
+
+ checks if all the files within a C<MANIFEST> in the current directory
+ really do exist. If C<MANIFEST> and the tree below the current
+ directory are in sync it silently returns an empty list.
+ Otherwise it returns a list of files which are listed in the
+ C<MANIFEST> but missing from the directory, and by default also
+ outputs these names to STDERR.
+
+ =cut
+
+ sub manicheck {
+ return _check_files();
+ }
+
+
+ =item filecheck
+
+ my @extra_files = filecheck();
+
+ finds files below the current directory that are not mentioned in the
+ C<MANIFEST> file. An optional file C<MANIFEST.SKIP> will be
+ consulted. Any file matching a regular expression in such a file will
+ not be reported as missing in the C<MANIFEST> file. The list of any
+ extraneous files found is returned, and by default also reported to
+ STDERR.
+
+ =cut
+
+ sub filecheck {
+ return _check_manifest();
+ }
+
+
+ =item fullcheck
+
+ my($missing, $extra) = fullcheck();
+
+ does both a manicheck() and a filecheck(), returning then as two array
+ refs.
+
+ =cut
+
+ sub fullcheck {
+ return [_check_files()], [_check_manifest()];
+ }
+
+
+ =item skipcheck
+
+ my @skipped = skipcheck();
+
+ lists all the files that are skipped due to your C<MANIFEST.SKIP>
+ file.
+
+ =cut
+
+ sub skipcheck {
+ my($p) = @_;
+ my $found = manifind();
+ my $matches = maniskip();
+
+ my @skipped = ();
+ foreach my $file (_sort keys %$found){
+ if (&$matches($file)){
+ warn "Skipping $file\n" unless $Quiet;
+ push @skipped, $file;
+ next;
+ }
+ }
+
+ return @skipped;
+ }
+
+
+ sub _check_files {
+ my $p = shift;
+ my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0);
+ my $read = maniread() || {};
+ my $found = manifind($p);
+
+ my(@missfile) = ();
+ foreach my $file (_sort keys %$read){
+ warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug;
+ if ($dosnames){
+ $file = lc $file;
+ $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge;
+ $file =~ s=((\w|-)+)=substr ($1,0,8)=ge;
+ }
+ unless ( exists $found->{$file} ) {
+ warn "No such file: $file\n" unless $Quiet;
+ push @missfile, $file;
+ }
+ }
+
+ return @missfile;
+ }
+
+
+ sub _check_manifest {
+ my($p) = @_;
+ my $read = maniread() || {};
+ my $found = manifind($p);
+ my $skip = maniskip();
+
+ my @missentry = ();
+ foreach my $file (_sort keys %$found){
+ next if $skip->($file);
+ warn "Debug: manicheck checking from disk $file\n" if $Debug;
+ unless ( exists $read->{$file} ) {
+ my $canon = $Is_MacOS ? "\t" . _unmacify($file) : '';
+ warn "Not in $MANIFEST: $file$canon\n" unless $Quiet;
+ push @missentry, $file;
+ }
+ }
+
+ return @missentry;
+ }
+
+
+ =item maniread
+
+ my $manifest = maniread();
+ my $manifest = maniread($manifest_file);
+
+ reads a named C<MANIFEST> file (defaults to C<MANIFEST> in the current
+ directory) and returns a HASH reference with files being the keys and
+ comments being the values of the HASH. Blank lines and lines which
+ start with C<#> in the C<MANIFEST> file are discarded.
+
+ =cut
+
+ sub maniread {
+ my ($mfile) = @_;
+ $mfile ||= $MANIFEST;
+ my $read = {};
+ local *M;
+ unless (open M, "< $mfile"){
+ warn "Problem opening $mfile: $!";
+ return $read;
+ }
+ local $_;
+ while (<M>){
+ chomp;
+ next if /^\s*#/;
+
+ my($file, $comment);
+
+ # filename may contain spaces if enclosed in ''
+ # (in which case, \\ and \' are escapes)
+ if (($file, $comment) = /^'((?:\\[\\']|.+)+)'\s*(.*)/) {
+ $file =~ s/\\([\\'])/$1/g;
+ }
+ else {
+ ($file, $comment) = /^(\S+)\s*(.*)/;
+ }
+ next unless $file;
+
+ if ($Is_MacOS) {
+ $file = _macify($file);
+ $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge;
+ }
+ elsif ($Is_VMS_mode) {
+ require File::Basename;
+ my($base,$dir) = File::Basename::fileparse($file);
+ # Resolve illegal file specifications in the same way as tar
+ if ($Is_VMS_nodot) {
+ $dir =~ tr/./_/;
+ my(@pieces) = split(/\./,$base);
+ if (@pieces > 2)
+ { $base = shift(@pieces) . '.' . join('_',@pieces); }
+ my $okfile = "$dir$base";
+ warn "Debug: Illegal name $file changed to $okfile\n" if $Debug;
+ $file = $okfile;
+ }
+ if( $Is_VMS_lc ) {
+ $file = lc($file);
+ $file = uc($file) if $file =~ /^MANIFEST(\.SKIP)?$/i;
+ }
+ }
+
+ $read->{$file} = $comment;
+ }
+ close M;
+ $read;
+ }
+
+ =item maniskip
+
+ my $skipchk = maniskip();
+ my $skipchk = maniskip($manifest_skip_file);
+
+ if ($skipchk->($file)) { .. }
+
+ reads a named C<MANIFEST.SKIP> file (defaults to C<MANIFEST.SKIP> in
+ the current directory) and returns a CODE reference that tests whether
+ a given filename should be skipped.
+
+ =cut
+
+ # returns an anonymous sub that decides if an argument matches
+ sub maniskip {
+ my @skip ;
+ my $mfile = shift || "$MANIFEST.SKIP";
+ _check_mskip_directives($mfile) if -f $mfile;
+ local(*M, $_);
+ open M, "< $mfile" or open M, "< $DEFAULT_MSKIP" or return sub {0};
+ while (<M>){
+ chomp;
+ s/\r//;
+ $_ =~ qr{^\s*(?:(?:'([^\\']*(?:\\.[^\\']*)*)')|([^#\s]\S*))?(?:(?:\s*)|(?:\s+(.*?)\s*))$};
+ #my $comment = $3;
+ my $filename = $2;
+ if ( defined($1) ) {
+ $filename = $1;
+ $filename =~ s/\\(['\\])/$1/g;
+ }
+ next if (not defined($filename) or not $filename);
+ push @skip, _macify($filename);
+ }
+ close M;
+ return sub {0} unless (scalar @skip > 0);
+
+ my $opts = $Is_VMS_mode ? '(?i)' : '';
+
+ # Make sure each entry is isolated in its own parentheses, in case
+ # any of them contain alternations
+ my $regex = join '|', map "(?:$_)", @skip;
+
+ return sub { $_[0] =~ qr{$opts$regex} };
+ }
+
+ # checks for the special directives
+ # #!include_default
+ # #!include /path/to/some/manifest.skip
+ # in a custom MANIFEST.SKIP for, for including
+ # the content of, respectively, the default MANIFEST.SKIP
+ # and an external manifest.skip file
+ sub _check_mskip_directives {
+ my $mfile = shift;
+ local (*M, $_);
+ my @lines = ();
+ my $flag = 0;
+ unless (open M, "< $mfile") {
+ warn "Problem opening $mfile: $!";
+ return;
+ }
+ while (<M>) {
+ if (/^#!include_default\s*$/) {
+ if (my @default = _include_mskip_file()) {
+ push @lines, @default;
+ warn "Debug: Including default MANIFEST.SKIP\n" if $Debug;
+ $flag++;
+ }
+ next;
+ }
+ if (/^#!include\s+(.*)\s*$/) {
+ my $external_file = $1;
+ if (my @external = _include_mskip_file($external_file)) {
+ push @lines, @external;
+ warn "Debug: Including external $external_file\n" if $Debug;
+ $flag++;
+ }
+ next;
+ }
+ push @lines, $_;
+ }
+ close M;
+ return unless $flag;
+ my $bakbase = $mfile;
+ $bakbase =~ s/\./_/g if $Is_VMS_nodot; # avoid double dots
+ rename $mfile, "$bakbase.bak";
+ warn "Debug: Saving original $mfile as $bakbase.bak\n" if $Debug;
+ unless (open M, "> $mfile") {
+ warn "Problem opening $mfile: $!";
+ return;
+ }
+ binmode M, ':raw';
+ print M $_ for (@lines);
+ close M;
+ return;
+ }
+
+ # returns an array containing the lines of an external
+ # manifest.skip file, if given, or $DEFAULT_MSKIP
+ sub _include_mskip_file {
+ my $mskip = shift || $DEFAULT_MSKIP;
+ unless (-f $mskip) {
+ warn qq{Included file "$mskip" not found - skipping};
+ return;
+ }
+ local (*M, $_);
+ unless (open M, "< $mskip") {
+ warn "Problem opening $mskip: $!";
+ return;
+ }
+ my @lines = ();
+ push @lines, "\n#!start included $mskip\n";
+ push @lines, $_ while <M>;
+ close M;
+ push @lines, "#!end included $mskip\n\n";
+ return @lines;
+ }
+
+ =item manicopy
+
+ manicopy(\%src, $dest_dir);
+ manicopy(\%src, $dest_dir, $how);
+
+ Copies the files that are the keys in %src to the $dest_dir. %src is
+ typically returned by the maniread() function.
+
+ manicopy( maniread(), $dest_dir );
+
+ This function is useful for producing a directory tree identical to the
+ intended distribution tree.
+
+ $how can be used to specify a different methods of "copying". Valid
+ values are C<cp>, which actually copies the files, C<ln> which creates
+ hard links, and C<best> which mostly links the files but copies any
+ symbolic link to make a tree without any symbolic link. C<cp> is the
+ default.
+
+ =cut
+
+ sub manicopy {
+ my($read,$target,$how)=@_;
+ croak "manicopy() called without target argument" unless defined $target;
+ $how ||= 'cp';
+ require File::Path;
+ require File::Basename;
+
+ $target = VMS::Filespec::unixify($target) if $Is_VMS_mode;
+ File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755);
+ foreach my $file (keys %$read){
+ if ($Is_MacOS) {
+ if ($file =~ m!:!) {
+ my $dir = _maccat($target, $file);
+ $dir =~ s/[^:]+$//;
+ File::Path::mkpath($dir,1,0755);
+ }
+ cp_if_diff($file, _maccat($target, $file), $how);
+ } else {
+ $file = VMS::Filespec::unixify($file) if $Is_VMS_mode;
+ if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not?
+ my $dir = File::Basename::dirname($file);
+ $dir = VMS::Filespec::unixify($dir) if $Is_VMS_mode;
+ File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755);
+ }
+ cp_if_diff($file, "$target/$file", $how);
+ }
+ }
+ }
+
+ sub cp_if_diff {
+ my($from, $to, $how)=@_;
+ if (! -f $from) {
+ carp "$from not found";
+ return;
+ }
+ my($diff) = 0;
+ local(*F,*T);
+ open(F,"< $from\0") or die "Can't read $from: $!\n";
+ if (open(T,"< $to\0")) {
+ local $_;
+ while (<F>) { $diff++,last if $_ ne <T>; }
+ $diff++ unless eof(T);
+ close T;
+ }
+ else { $diff++; }
+ close F;
+ if ($diff) {
+ if (-e $to) {
+ unlink($to) or confess "unlink $to: $!";
+ }
+ STRICT_SWITCH: {
+ best($from,$to), last STRICT_SWITCH if $how eq 'best';
+ cp($from,$to), last STRICT_SWITCH if $how eq 'cp';
+ ln($from,$to), last STRICT_SWITCH if $how eq 'ln';
+ croak("ExtUtils::Manifest::cp_if_diff " .
+ "called with illegal how argument [$how]. " .
+ "Legal values are 'best', 'cp', and 'ln'.");
+ }
+ }
+ }
+
+ sub cp {
+ my ($srcFile, $dstFile) = @_;
+ my ($access,$mod) = (stat $srcFile)[8,9];
+
+ copy($srcFile,$dstFile);
+ utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile;
+ _manicopy_chmod($srcFile, $dstFile);
+ }
+
+
+ sub ln {
+ my ($srcFile, $dstFile) = @_;
+ # Fix-me - VMS can support links.
+ return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95());
+ link($srcFile, $dstFile);
+
+ unless( _manicopy_chmod($srcFile, $dstFile) ) {
+ unlink $dstFile;
+ return;
+ }
+ 1;
+ }
+
+ # 1) Strip off all group and world permissions.
+ # 2) Let everyone read it.
+ # 3) If the owner can execute it, everyone can.
+ sub _manicopy_chmod {
+ my($srcFile, $dstFile) = @_;
+
+ my $perm = 0444 | (stat $srcFile)[2] & 0700;
+ chmod( $perm | ( $perm & 0100 ? 0111 : 0 ), $dstFile );
+ }
+
+ # Files that are often modified in the distdir. Don't hard link them.
+ my @Exceptions = qw(MANIFEST META.yml SIGNATURE);
+ sub best {
+ my ($srcFile, $dstFile) = @_;
+
+ my $is_exception = grep $srcFile =~ /$_/, @Exceptions;
+ if ($is_exception or !$Config{d_link} or -l $srcFile) {
+ cp($srcFile, $dstFile);
+ } else {
+ ln($srcFile, $dstFile) or cp($srcFile, $dstFile);
+ }
+ }
+
+ sub _macify {
+ my($file) = @_;
+
+ return $file unless $Is_MacOS;
+
+ $file =~ s|^\./||;
+ if ($file =~ m|/|) {
+ $file =~ s|/+|:|g;
+ $file = ":$file";
+ }
+
+ $file;
+ }
+
+ sub _maccat {
+ my($f1, $f2) = @_;
+
+ return "$f1/$f2" unless $Is_MacOS;
+
+ $f1 .= ":$f2";
+ $f1 =~ s/([^:]:):/$1/g;
+ return $f1;
+ }
+
+ sub _unmacify {
+ my($file) = @_;
+
+ return $file unless $Is_MacOS;
+
+ $file =~ s|^:||;
+ $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge;
+ $file =~ y|:|/|;
+
+ $file;
+ }
+
+
+ =item maniadd
+
+ maniadd({ $file => $comment, ...});
+
+ Adds an entry to an existing F<MANIFEST> unless its already there.
+
+ $file will be normalized (ie. Unixified). B<UNIMPLEMENTED>
+
+ =cut
+
+ sub maniadd {
+ my($additions) = shift;
+
+ _normalize($additions);
+ _fix_manifest($MANIFEST);
+
+ my $manifest = maniread();
+ my @needed = grep { !exists $manifest->{$_} } keys %$additions;
+ return 1 unless @needed;
+
+ open(MANIFEST, ">>$MANIFEST") or
+ die "maniadd() could not open $MANIFEST: $!";
+ binmode MANIFEST, ':raw';
+
+ foreach my $file (_sort @needed) {
+ my $comment = $additions->{$file} || '';
+ if ($file =~ /\s/) {
+ $file =~ s/([\\'])/\\$1/g;
+ $file = "'$file'";
+ }
+ printf MANIFEST "%-40s %s\n", $file, $comment;
+ }
+ close MANIFEST or die "Error closing $MANIFEST: $!";
+
+ return 1;
+ }
+
+
+ # Make sure this MANIFEST is consistently written with native
+ # newlines and has a terminal newline.
+ sub _fix_manifest {
+ my $manifest_file = shift;
+
+ open MANIFEST, $MANIFEST or die "Could not open $MANIFEST: $!";
+ local $/;
+ my @manifest = split /(\015\012|\012|\015)/, <MANIFEST>, -1;
+ close MANIFEST;
+ my $must_rewrite = "";
+ if ($manifest[-1] eq ""){
+ # sane case: last line had a terminal newline
+ pop @manifest;
+ for (my $i=1; $i<=$#manifest; $i+=2) {
+ unless ($manifest[$i] eq "\n") {
+ $must_rewrite = "not a newline at pos $i";
+ last;
+ }
+ }
+ } else {
+ $must_rewrite = "last line without newline";
+ }
+
+ if ( $must_rewrite ) {
+ 1 while unlink $MANIFEST; # avoid multiple versions on VMS
+ open MANIFEST, ">", $MANIFEST or die "(must_rewrite=$must_rewrite) Could not open >$MANIFEST: $!";
+ binmode MANIFEST, ':raw';
+ for (my $i=0; $i<=$#manifest; $i+=2) {
+ print MANIFEST "$manifest[$i]\n";
+ }
+ close MANIFEST or die "could not write $MANIFEST: $!";
+ }
+ }
+
+
+ # UNIMPLEMENTED
+ sub _normalize {
+ return;
+ }
+
+
+ =back
+
+ =head2 MANIFEST
+
+ A list of files in the distribution, one file per line. The MANIFEST
+ always uses Unix filepath conventions even if you're not on Unix. This
+ means F<foo/bar> style not F<foo\bar>.
+
+ Anything between white space and an end of line within a C<MANIFEST>
+ file is considered to be a comment. Any line beginning with # is also
+ a comment. Beginning with ExtUtils::Manifest 1.52, a filename may
+ contain whitespace characters if it is enclosed in single quotes; single
+ quotes or backslashes in that filename must be backslash-escaped.
+
+ # this a comment
+ some/file
+ some/other/file comment about some/file
+ 'some/third file' comment
+
+
+ =head2 MANIFEST.SKIP
+
+ The file MANIFEST.SKIP may contain regular expressions of files that
+ should be ignored by mkmanifest() and filecheck(). The regular
+ expressions should appear one on each line. Blank lines and lines
+ which start with C<#> are skipped. Use C<\#> if you need a regular
+ expression to start with a C<#>.
+
+ For example:
+
+ # Version control files and dirs.
+ \bRCS\b
+ \bCVS\b
+ ,v$
+ \B\.svn\b
+
+ # Makemaker generated files and dirs.
+ ^MANIFEST\.
+ ^Makefile$
+ ^blib/
+ ^MakeMaker-\d
+
+ # Temp, old and emacs backup files.
+ ~$
+ \.old$
+ ^#.*#$
+ ^\.#
+
+ If no MANIFEST.SKIP file is found, a default set of skips will be
+ used, similar to the example above. If you want nothing skipped,
+ simply make an empty MANIFEST.SKIP file.
+
+ In one's own MANIFEST.SKIP file, certain directives
+ can be used to include the contents of other MANIFEST.SKIP
+ files. At present two such directives are recognized.
+
+ =over 4
+
+ =item #!include_default
+
+ This inserts the contents of the default MANIFEST.SKIP file
+
+ =item #!include /Path/to/another/manifest.skip
+
+ This inserts the contents of the specified external file
+
+ =back
+
+ The included contents will be inserted into the MANIFEST.SKIP
+ file in between I<#!start included /path/to/manifest.skip>
+ and I<#!end included /path/to/manifest.skip> markers.
+ The original MANIFEST.SKIP is saved as MANIFEST.SKIP.bak.
+
+ =head2 EXPORT_OK
+
+ C<&mkmanifest>, C<&manicheck>, C<&filecheck>, C<&fullcheck>,
+ C<&maniread>, and C<&manicopy> are exportable.
+
+ =head2 GLOBAL VARIABLES
+
+ C<$ExtUtils::Manifest::MANIFEST> defaults to C<MANIFEST>. Changing it
+ results in both a different C<MANIFEST> and a different
+ C<MANIFEST.SKIP> file. This is useful if you want to maintain
+ different distributions for different audiences (say a user version
+ and a developer version including RCS).
+
+ C<$ExtUtils::Manifest::Quiet> defaults to 0. If set to a true value,
+ all functions act silently.
+
+ C<$ExtUtils::Manifest::Debug> defaults to 0. If set to a true value,
+ or if PERL_MM_MANIFEST_DEBUG is true, debugging output will be
+ produced.
+
+ =head1 DIAGNOSTICS
+
+ All diagnostic output is sent to C<STDERR>.
+
+ =over 4
+
+ =item C<Not in MANIFEST:> I<file>
+
+ is reported if a file is found which is not in C<MANIFEST>.
+
+ =item C<Skipping> I<file>
+
+ is reported if a file is skipped due to an entry in C<MANIFEST.SKIP>.
+
+ =item C<No such file:> I<file>
+
+ is reported if a file mentioned in a C<MANIFEST> file does not
+ exist.
+
+ =item C<MANIFEST:> I<$!>
+
+ is reported if C<MANIFEST> could not be opened.
+
+ =item C<Added to MANIFEST:> I<file>
+
+ is reported by mkmanifest() if $Verbose is set and a file is added
+ to MANIFEST. $Verbose is set to 1 by default.
+
+ =back
+
+ =head1 ENVIRONMENT
+
+ =over 4
+
+ =item B<PERL_MM_MANIFEST_DEBUG>
+
+ Turns on debugging
+
+ =back
+
+ =head1 SEE ALSO
+
+ L<ExtUtils::MakeMaker> which has handy targets for most of the functionality.
+
+ =head1 AUTHOR
+
+ Andreas Koenig C<andreas.koenig@anima.de>
+
+ Currently maintained by the Perl Toolchain Gang.
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 1996- by Andreas Koenig.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+
+ 1;
+EXTUTILS_MANIFEST
+
+$fatpacked{"ExtUtils/Mkbootstrap.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MKBOOTSTRAP';
+ package ExtUtils::Mkbootstrap;
+
+ # There's just too much Dynaloader incest here to turn on strict vars.
+ use strict 'refs';
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ require Exporter;
+ our @ISA = ('Exporter');
+ our @EXPORT = ('&Mkbootstrap');
+
+ use Config;
+
+ our $Verbose = 0;
+
+
+ sub Mkbootstrap {
+ my($baseext, @bsloadlibs)=@_;
+ @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
+
+ print " bsloadlibs=@bsloadlibs\n" if $Verbose;
+
+ # We need DynaLoader here because we and/or the *_BS file may
+ # call dl_findfile(). We don't say `use' here because when
+ # first building perl extensions the DynaLoader will not have
+ # been built when MakeMaker gets first used.
+ require DynaLoader;
+
+ rename "$baseext.bs", "$baseext.bso"
+ if -s "$baseext.bs";
+
+ if (-f "${baseext}_BS"){
+ $_ = "${baseext}_BS";
+ package DynaLoader; # execute code as if in DynaLoader
+ local($osname, $dlsrc) = (); # avoid warnings
+ ($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)};
+ $bscode = "";
+ unshift @INC, ".";
+ require $_;
+ shift @INC;
+ }
+
+ if ($Config{'dlsrc'} =~ /^dl_dld/){
+ package DynaLoader;
+ push(@dl_resolve_using, dl_findfile('-lc'));
+ }
+
+ my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
+ my($method) = '';
+ if (@all || (defined $DynaLoader::bscode && length $DynaLoader::bscode)){
+ open my $bs, ">", "$baseext.bs"
+ or die "Unable to open $baseext.bs: $!";
+ print "Writing $baseext.bs\n";
+ print " containing: @all" if $Verbose;
+ print $bs "# $baseext DynaLoader bootstrap file for $^O architecture.\n";
+ print $bs "# Do not edit this file, changes will be lost.\n";
+ print $bs "# This file was automatically generated by the\n";
+ print $bs "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n";
+ if (@all) {
+ print $bs "\@DynaLoader::dl_resolve_using = ";
+ # If @all contains names in the form -lxxx or -Lxxx then it's asking for
+ # runtime library location so we automatically add a call to dl_findfile()
+ if (" @all" =~ m/ -[lLR]/){
+ print $bs " dl_findfile(qw(\n @all\n ));\n";
+ } else {
+ print $bs " qw(@all);\n";
+ }
+ }
+ # write extra code if *_BS says so
+ print $bs $DynaLoader::bscode if $DynaLoader::bscode;
+ print $bs "\n1;\n";
+ close $bs;
+ }
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+
+ =head1 SYNOPSIS
+
+ C<Mkbootstrap>
+
+ =head1 DESCRIPTION
+
+ Mkbootstrap typically gets called from an extension Makefile.
+
+ There is no C<*.bs> file supplied with the extension. Instead, there may
+ be a C<*_BS> file which has code for the special cases, like posix for
+ berkeley db on the NeXT.
+
+ This file will get parsed, and produce a maybe empty
+ C<@DynaLoader::dl_resolve_using> array for the current architecture.
+ That will be extended by $BSLOADLIBS, which was computed by
+ ExtUtils::Liblist::ext(). If this array still is empty, we do nothing,
+ else we write a .bs file with an C<@DynaLoader::dl_resolve_using>
+ array.
+
+ The C<*_BS> file can put some code into the generated C<*.bs> file by
+ placing it in C<$bscode>. This is a handy 'escape' mechanism that may
+ prove useful in complex situations.
+
+ If @DynaLoader::dl_resolve_using contains C<-L*> or C<-l*> entries then
+ Mkbootstrap will automatically add a dl_findfile() call to the
+ generated C<*.bs> file.
+
+ =cut
+EXTUTILS_MKBOOTSTRAP
+
+$fatpacked{"ExtUtils/Mksymlists.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_MKSYMLISTS';
+ package ExtUtils::Mksymlists;
+
+ use 5.006;
+ use strict qw[ subs refs ];
+ # no strict 'vars'; # until filehandles are exempted
+
+ use Carp;
+ use Exporter;
+ use Config;
+
+ our @ISA = qw(Exporter);
+ our @EXPORT = qw(&Mksymlists);
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ sub Mksymlists {
+ my(%spec) = @_;
+ my($osname) = $^O;
+
+ croak("Insufficient information specified to Mksymlists")
+ unless ( $spec{NAME} or
+ ($spec{FILE} and ($spec{DL_FUNCS} or $spec{FUNCLIST})) );
+
+ $spec{DL_VARS} = [] unless $spec{DL_VARS};
+ ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE};
+ $spec{FUNCLIST} = [] unless $spec{FUNCLIST};
+ $spec{DL_FUNCS} = { $spec{NAME} => [] }
+ unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or
+ @{$spec{FUNCLIST}});
+ if (defined $spec{DL_FUNCS}) {
+ foreach my $package (sort keys %{$spec{DL_FUNCS}}) {
+ my($packprefix,$bootseen);
+ ($packprefix = $package) =~ s/\W/_/g;
+ foreach my $sym (@{$spec{DL_FUNCS}->{$package}}) {
+ if ($sym =~ /^boot_/) {
+ push(@{$spec{FUNCLIST}},$sym);
+ $bootseen++;
+ }
+ else {
+ push(@{$spec{FUNCLIST}},"XS_${packprefix}_$sym");
+ }
+ }
+ push(@{$spec{FUNCLIST}},"boot_$packprefix") unless $bootseen;
+ }
+ }
+
+ # We'll need this if we ever add any OS which uses mod2fname
+ # not as pseudo-builtin.
+ # require DynaLoader;
+ if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) {
+ $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
+ }
+
+ if ($osname eq 'aix') { _write_aix(\%spec); }
+ elsif ($osname eq 'MacOS'){ _write_aix(\%spec) }
+ elsif ($osname eq 'VMS') { _write_vms(\%spec) }
+ elsif ($osname eq 'os2') { _write_os2(\%spec) }
+ elsif ($osname eq 'MSWin32') { _write_win32(\%spec) }
+ else {
+ croak("Don't know how to create linker option file for $osname\n");
+ }
+ }
+
+
+ sub _write_aix {
+ my($data) = @_;
+
+ rename "$data->{FILE}.exp", "$data->{FILE}.exp_old";
+
+ open( my $exp, ">", "$data->{FILE}.exp")
+ or croak("Can't create $data->{FILE}.exp: $!\n");
+ print $exp join("\n",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
+ print $exp join("\n",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
+ close $exp;
+ }
+
+
+ sub _write_os2 {
+ my($data) = @_;
+ require Config;
+ my $threaded = ($Config::Config{archname} =~ /-thread/ ? " threaded" : "");
+
+ if (not $data->{DLBASE}) {
+ ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+ $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+ }
+ my $distname = $data->{DISTNAME} || $data->{NAME};
+ $distname = "Distribution $distname";
+ my $patchlevel = " pl$Config{perl_patchlevel}" || '';
+ my $comment = sprintf "Perl (v%s%s%s) module %s",
+ $Config::Config{version}, $threaded, $patchlevel, $data->{NAME};
+ chomp $comment;
+ if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') {
+ $distname = 'perl5-porters@perl.org';
+ $comment = "Core $comment";
+ }
+ $comment = "$comment (Perl-config: $Config{config_args})";
+ $comment = substr($comment, 0, 200) . "...)" if length $comment > 203;
+ rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+ open(my $def, ">", "$data->{FILE}.def")
+ or croak("Can't create $data->{FILE}.def: $!\n");
+ print $def "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n";
+ print $def "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n";
+ print $def "CODE LOADONCALL\n";
+ print $def "DATA LOADONCALL NONSHARED MULTIPLE\n";
+ print $def "EXPORTS\n ";
+ print $def join("\n ",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
+ print $def join("\n ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
+ _print_imports($def, $data);
+ close $def;
+ }
+
+ sub _print_imports {
+ my ($def, $data)= @_;
+ my $imports= $data->{IMPORTS}
+ or return;
+ if ( keys %$imports ) {
+ print $def "IMPORTS\n";
+ foreach my $name (sort keys %$imports) {
+ print $def " $name=$imports->{$name}\n";
+ }
+ }
+ }
+
+ sub _write_win32 {
+ my($data) = @_;
+
+ require Config;
+ if (not $data->{DLBASE}) {
+ ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+ $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+ }
+ rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+ open( my $def, ">", "$data->{FILE}.def" )
+ or croak("Can't create $data->{FILE}.def: $!\n");
+ # put library name in quotes (it could be a keyword, like 'Alias')
+ if ($Config::Config{'cc'} !~ /\bgcc/i) {
+ print $def "LIBRARY \"$data->{DLBASE}\"\n";
+ }
+ print $def "EXPORTS\n ";
+ my @syms;
+ # Export public symbols both with and without underscores to
+ # ensure compatibility between DLLs from Borland C and Visual C
+ # NOTE: DynaLoader itself only uses the names without underscores,
+ # so this is only to cover the case when the extension DLL may be
+ # linked to directly from C. GSAR 97-07-10
+
+ #bcc dropped in 5.16, so dont create useless extra symbols for export table
+ unless($] >= 5.016) {
+ if ($Config::Config{'cc'} =~ /^bcc/i) {
+ push @syms, "_$_", "$_ = _$_"
+ for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}});
+ }
+ else {
+ push @syms, "$_", "_$_ = $_"
+ for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}});
+ }
+ } else {
+ push @syms, "$_"
+ for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}});
+ }
+ print $def join("\n ",@syms, "\n") if @syms;
+ _print_imports($def, $data);
+ close $def;
+ }
+
+
+ sub _write_vms {
+ my($data) = @_;
+
+ require Config; # a reminder for once we do $^O
+ require ExtUtils::XSSymSet;
+
+ my($isvax) = $Config::Config{'archname'} =~ /VAX/i;
+ my($set) = new ExtUtils::XSSymSet;
+
+ rename "$data->{FILE}.opt", "$data->{FILE}.opt_old";
+
+ open(my $opt,">", "$data->{FILE}.opt")
+ or croak("Can't create $data->{FILE}.opt: $!\n");
+
+ # Options file declaring universal symbols
+ # Used when linking shareable image for dynamic extension,
+ # or when linking PerlShr into which we've added this package
+ # as a static extension
+ # We don't do anything to preserve order, so we won't relax
+ # the GSMATCH criteria for a dynamic extension
+
+ print $opt "case_sensitive=yes\n"
+ if $Config::Config{d_vms_case_sensitive_symbols};
+
+ foreach my $sym (@{$data->{FUNCLIST}}) {
+ my $safe = $set->addsym($sym);
+ if ($isvax) { print $opt "UNIVERSAL=$safe\n" }
+ else { print $opt "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
+ }
+
+ foreach my $sym (@{$data->{DL_VARS}}) {
+ my $safe = $set->addsym($sym);
+ print $opt "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
+ if ($isvax) { print $opt "UNIVERSAL=$safe\n" }
+ else { print $opt "SYMBOL_VECTOR=($safe=DATA)\n"; }
+ }
+
+ close $opt;
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ ExtUtils::Mksymlists - write linker options files for dynamic extension
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::Mksymlists;
+ Mksymlists( NAME => $name ,
+ DL_VARS => [ $var1, $var2, $var3 ],
+ DL_FUNCS => { $pkg1 => [ $func1, $func2 ],
+ $pkg2 => [ $func3 ] );
+
+ =head1 DESCRIPTION
+
+ C<ExtUtils::Mksymlists> produces files used by the linker under some OSs
+ during the creation of shared libraries for dynamic extensions. It is
+ normally called from a MakeMaker-generated Makefile when the extension
+ is built. The linker option file is generated by calling the function
+ C<Mksymlists>, which is exported by default from C<ExtUtils::Mksymlists>.
+ It takes one argument, a list of key-value pairs, in which the following
+ keys are recognized:
+
+ =over 4
+
+ =item DLBASE
+
+ This item specifies the name by which the linker knows the
+ extension, which may be different from the name of the
+ extension itself (for instance, some linkers add an '_' to the
+ name of the extension). If it is not specified, it is derived
+ from the NAME attribute. It is presently used only by OS2 and Win32.
+
+ =item DL_FUNCS
+
+ This is identical to the DL_FUNCS attribute available via MakeMaker,
+ from which it is usually taken. Its value is a reference to an
+ associative array, in which each key is the name of a package, and
+ each value is an a reference to an array of function names which
+ should be exported by the extension. For instance, one might say
+ C<DL_FUNCS =E<gt> { Homer::Iliad =E<gt> [ qw(trojans greeks) ],
+ Homer::Odyssey =E<gt> [ qw(travellers family suitors) ] }>. The
+ function names should be identical to those in the XSUB code;
+ C<Mksymlists> will alter the names written to the linker option
+ file to match the changes made by F<xsubpp>. In addition, if
+ none of the functions in a list begin with the string B<boot_>,
+ C<Mksymlists> will add a bootstrap function for that package,
+ just as xsubpp does. (If a B<boot_E<lt>pkgE<gt>> function is
+ present in the list, it is passed through unchanged.) If
+ DL_FUNCS is not specified, it defaults to the bootstrap
+ function for the extension specified in NAME.
+
+ =item DL_VARS
+
+ This is identical to the DL_VARS attribute available via MakeMaker,
+ and, like DL_FUNCS, it is usually specified via MakeMaker. Its
+ value is a reference to an array of variable names which should
+ be exported by the extension.
+
+ =item FILE
+
+ This key can be used to specify the name of the linker option file
+ (minus the OS-specific extension), if for some reason you do not
+ want to use the default value, which is the last word of the NAME
+ attribute (I<e.g.> for C<Tk::Canvas>, FILE defaults to C<Canvas>).
+
+ =item FUNCLIST
+
+ This provides an alternate means to specify function names to be
+ exported from the extension. Its value is a reference to an
+ array of function names to be exported by the extension. These
+ names are passed through unaltered to the linker options file.
+ Specifying a value for the FUNCLIST attribute suppresses automatic
+ generation of the bootstrap function for the package. To still create
+ the bootstrap name you have to specify the package name in the
+ DL_FUNCS hash:
+
+ Mksymlists( NAME => $name ,
+ FUNCLIST => [ $func1, $func2 ],
+ DL_FUNCS => { $pkg => [] } );
+
+
+ =item IMPORTS
+
+ This attribute is used to specify names to be imported into the
+ extension. It is currently only used by OS/2 and Win32.
+
+ =item NAME
+
+ This gives the name of the extension (I<e.g.> C<Tk::Canvas>) for which
+ the linker option file will be produced.
+
+ =back
+
+ When calling C<Mksymlists>, one should always specify the NAME
+ attribute. In most cases, this is all that's necessary. In
+ the case of unusual extensions, however, the other attributes
+ can be used to provide additional information to the linker.
+
+ =head1 AUTHOR
+
+ Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>>
+
+ =head1 REVISION
+
+ Last revised 14-Feb-1996, for Perl 5.002.
+EXTUTILS_MKSYMLISTS
+
+$fatpacked{"ExtUtils/testlib.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXTUTILS_TESTLIB';
+ package ExtUtils::testlib;
+
+ use strict;
+ use warnings;
+
+ our $VERSION = '7.06';
+ $VERSION = eval $VERSION;
+
+ use Cwd;
+ use File::Spec;
+
+ # So the tests can chdir around and not break @INC.
+ # We use getcwd() because otherwise rel2abs will blow up under taint
+ # mode pre-5.8. We detaint is so @INC won't be tainted. This is
+ # no worse, and probably better, than just shoving an untainted,
+ # relative "blib/lib" onto @INC.
+ my $cwd;
+ BEGIN {
+ ($cwd) = getcwd() =~ /(.*)/;
+ }
+ use lib map { File::Spec->rel2abs($_, $cwd) } qw(blib/arch blib/lib);
+ 1;
+ __END__
+
+ =head1 NAME
+
+ ExtUtils::testlib - add blib/* directories to @INC
+
+ =head1 SYNOPSIS
+
+ use ExtUtils::testlib;
+
+ =head1 DESCRIPTION
+
+ After an extension has been built and before it is installed it may be
+ desirable to test it bypassing C<make test>. By adding
+
+ use ExtUtils::testlib;
+
+ to a test program the intermediate directories used by C<make> are
+ added to @INC.
+
+EXTUTILS_TESTLIB
+
+$fatpacked{"Getopt/Long.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'GETOPT_LONG';
+ #! perl
+
+ # Getopt::Long.pm -- Universal options parsing
+ # Author : Johan Vromans
+ # Created On : Tue Sep 11 15:00:12 1990
+ # Last Modified By: Johan Vromans
+ # Last Modified On: Tue Jun 16 15:28:03 2015
+ # Update Count : 1695
+ # Status : Released
+
+ ################ Module Preamble ################
+
+ package Getopt::Long;
+
+ use 5.004;
+
+ use strict;
+
+ use vars qw($VERSION);
+ $VERSION = 2.47;
+ # For testing versions only.
+ use vars qw($VERSION_STRING);
+ $VERSION_STRING = "2.47";
+
+ use Exporter;
+ use vars qw(@ISA @EXPORT @EXPORT_OK);
+ @ISA = qw(Exporter);
+
+ # Exported subroutines.
+ sub GetOptions(@); # always
+ sub GetOptionsFromArray(@); # on demand
+ sub GetOptionsFromString(@); # on demand
+ sub Configure(@); # on demand
+ sub HelpMessage(@); # on demand
+ sub VersionMessage(@); # in demand
+
+ BEGIN {
+ # Init immediately so their contents can be used in the 'use vars' below.
+ @EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER);
+ @EXPORT_OK = qw(&HelpMessage &VersionMessage &Configure
+ &GetOptionsFromArray &GetOptionsFromString);
+ }
+
+ # User visible variables.
+ use vars @EXPORT, @EXPORT_OK;
+ use vars qw($error $debug $major_version $minor_version);
+ # Deprecated visible variables.
+ use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order
+ $passthrough);
+ # Official invisible variables.
+ use vars qw($genprefix $caller $gnu_compat $auto_help $auto_version $longprefix);
+
+ # Really invisible variables.
+ my $bundling_values;
+
+ # Public subroutines.
+ sub config(@); # deprecated name
+
+ # Private subroutines.
+ sub ConfigDefaults();
+ sub ParseOptionSpec($$);
+ sub OptCtl($);
+ sub FindOption($$$$$);
+ sub ValidValue ($$$$$);
+
+ ################ Local Variables ################
+
+ # $requested_version holds the version that was mentioned in the 'use'
+ # or 'require', if any. It can be used to enable or disable specific
+ # features.
+ my $requested_version = 0;
+
+ ################ Resident subroutines ################
+
+ sub ConfigDefaults() {
+ # Handle POSIX compliancy.
+ if ( defined $ENV{"POSIXLY_CORRECT"} ) {
+ $genprefix = "(--|-)";
+ $autoabbrev = 0; # no automatic abbrev of options
+ $bundling = 0; # no bundling of single letter switches
+ $getopt_compat = 0; # disallow '+' to start options
+ $order = $REQUIRE_ORDER;
+ }
+ else {
+ $genprefix = "(--|-|\\+)";
+ $autoabbrev = 1; # automatic abbrev of options
+ $bundling = 0; # bundling off by default
+ $getopt_compat = 1; # allow '+' to start options
+ $order = $PERMUTE;
+ }
+ # Other configurable settings.
+ $debug = 0; # for debugging
+ $error = 0; # error tally
+ $ignorecase = 1; # ignore case when matching options
+ $passthrough = 0; # leave unrecognized options alone
+ $gnu_compat = 0; # require --opt=val if value is optional
+ $longprefix = "(--)"; # what does a long prefix look like
+ $bundling_values = 0; # no bundling of values
+ }
+
+ # Override import.
+ sub import {
+ my $pkg = shift; # package
+ my @syms = (); # symbols to import
+ my @config = (); # configuration
+ my $dest = \@syms; # symbols first
+ for ( @_ ) {
+ if ( $_ eq ':config' ) {
+ $dest = \@config; # config next
+ next;
+ }
+ push(@$dest, $_); # push
+ }
+ # Hide one level and call super.
+ local $Exporter::ExportLevel = 1;
+ push(@syms, qw(&GetOptions)) if @syms; # always export GetOptions
+ $requested_version = 0;
+ $pkg->SUPER::import(@syms);
+ # And configure.
+ Configure(@config) if @config;
+ }
+
+ ################ Initialization ################
+
+ # Values for $order. See GNU getopt.c for details.
+ ($REQUIRE_ORDER, $PERMUTE, $RETURN_IN_ORDER) = (0..2);
+ # Version major/minor numbers.
+ ($major_version, $minor_version) = $VERSION =~ /^(\d+)\.(\d+)/;
+
+ ConfigDefaults();
+
+ ################ OO Interface ################
+
+ package Getopt::Long::Parser;
+
+ # Store a copy of the default configuration. Since ConfigDefaults has
+ # just been called, what we get from Configure is the default.
+ my $default_config = do {
+ Getopt::Long::Configure ()
+ };
+
+ sub new {
+ my $that = shift;
+ my $class = ref($that) || $that;
+ my %atts = @_;
+
+ # Register the callers package.
+ my $self = { caller_pkg => (caller)[0] };
+
+ bless ($self, $class);
+
+ # Process config attributes.
+ if ( defined $atts{config} ) {
+ my $save = Getopt::Long::Configure ($default_config, @{$atts{config}});
+ $self->{settings} = Getopt::Long::Configure ($save);
+ delete ($atts{config});
+ }
+ # Else use default config.
+ else {
+ $self->{settings} = $default_config;
+ }
+
+ if ( %atts ) { # Oops
+ die(__PACKAGE__.": unhandled attributes: ".
+ join(" ", sort(keys(%atts)))."\n");
+ }
+
+ $self;
+ }
+
+ sub configure {
+ my ($self) = shift;
+
+ # Restore settings, merge new settings in.
+ my $save = Getopt::Long::Configure ($self->{settings}, @_);
+
+ # Restore orig config and save the new config.
+ $self->{settings} = Getopt::Long::Configure ($save);
+ }
+
+ sub getoptions {
+ my ($self) = shift;
+
+ return $self->getoptionsfromarray(\@ARGV, @_);
+ }
+
+ sub getoptionsfromarray {
+ my ($self) = shift;
+
+ # Restore config settings.
+ my $save = Getopt::Long::Configure ($self->{settings});
+
+ # Call main routine.
+ my $ret = 0;
+ $Getopt::Long::caller = $self->{caller_pkg};
+
+ eval {
+ # Locally set exception handler to default, otherwise it will
+ # be called implicitly here, and again explicitly when we try
+ # to deliver the messages.
+ local ($SIG{__DIE__}) = 'DEFAULT';
+ $ret = Getopt::Long::GetOptionsFromArray (@_);
+ };
+
+ # Restore saved settings.
+ Getopt::Long::Configure ($save);
+
+ # Handle errors and return value.
+ die ($@) if $@;
+ return $ret;
+ }
+
+ package Getopt::Long;
+
+ ################ Back to Normal ################
+
+ # Indices in option control info.
+ # Note that ParseOptions uses the fields directly. Search for 'hard-wired'.
+ use constant CTL_TYPE => 0;
+ #use constant CTL_TYPE_FLAG => '';
+ #use constant CTL_TYPE_NEG => '!';
+ #use constant CTL_TYPE_INCR => '+';
+ #use constant CTL_TYPE_INT => 'i';
+ #use constant CTL_TYPE_INTINC => 'I';
+ #use constant CTL_TYPE_XINT => 'o';
+ #use constant CTL_TYPE_FLOAT => 'f';
+ #use constant CTL_TYPE_STRING => 's';
+
+ use constant CTL_CNAME => 1;
+
+ use constant CTL_DEFAULT => 2;
+
+ use constant CTL_DEST => 3;
+ use constant CTL_DEST_SCALAR => 0;
+ use constant CTL_DEST_ARRAY => 1;
+ use constant CTL_DEST_HASH => 2;
+ use constant CTL_DEST_CODE => 3;
+
+ use constant CTL_AMIN => 4;
+ use constant CTL_AMAX => 5;
+
+ # FFU.
+ #use constant CTL_RANGE => ;
+ #use constant CTL_REPEAT => ;
+
+ # Rather liberal patterns to match numbers.
+ use constant PAT_INT => "[-+]?_*[0-9][0-9_]*";
+ use constant PAT_XINT =>
+ "(?:".
+ "[-+]?_*[1-9][0-9_]*".
+ "|".
+ "0x_*[0-9a-f][0-9a-f_]*".
+ "|".
+ "0b_*[01][01_]*".
+ "|".
+ "0[0-7_]*".
+ ")";
+ use constant PAT_FLOAT =>
+ "[-+]?". # optional sign
+ "(?=[0-9.])". # must start with digit or dec.point
+ "[0-9_]*". # digits before the dec.point
+ "(\.[0-9_]+)?". # optional fraction
+ "([eE][-+]?[0-9_]+)?"; # optional exponent
+
+ sub GetOptions(@) {
+ # Shift in default array.
+ unshift(@_, \@ARGV);
+ # Try to keep caller() and Carp consistent.
+ goto &GetOptionsFromArray;
+ }
+
+ sub GetOptionsFromString(@) {
+ my ($string) = shift;
+ require Text::ParseWords;
+ my $args = [ Text::ParseWords::shellwords($string) ];
+ $caller ||= (caller)[0]; # current context
+ my $ret = GetOptionsFromArray($args, @_);
+ return ( $ret, $args ) if wantarray;
+ if ( @$args ) {
+ $ret = 0;
+ warn("GetOptionsFromString: Excess data \"@$args\" in string \"$string\"\n");
+ }
+ $ret;
+ }
+
+ sub GetOptionsFromArray(@) {
+
+ my ($argv, @optionlist) = @_; # local copy of the option descriptions
+ my $argend = '--'; # option list terminator
+ my %opctl = (); # table of option specs
+ my $pkg = $caller || (caller)[0]; # current context
+ # Needed if linkage is omitted.
+ my @ret = (); # accum for non-options
+ my %linkage; # linkage
+ my $userlinkage; # user supplied HASH
+ my $opt; # current option
+ my $prefix = $genprefix; # current prefix
+
+ $error = '';
+
+ if ( $debug ) {
+ # Avoid some warnings if debugging.
+ local ($^W) = 0;
+ print STDERR
+ ("Getopt::Long $Getopt::Long::VERSION ",
+ "called from package \"$pkg\".",
+ "\n ",
+ "argv: ",
+ defined($argv)
+ ? UNIVERSAL::isa( $argv, 'ARRAY' ) ? "(@$argv)" : $argv
+ : "<undef>",
+ "\n ",
+ "autoabbrev=$autoabbrev,".
+ "bundling=$bundling,",
+ "bundling_values=$bundling_values,",
+ "getopt_compat=$getopt_compat,",
+ "gnu_compat=$gnu_compat,",
+ "order=$order,",
+ "\n ",
+ "ignorecase=$ignorecase,",
+ "requested_version=$requested_version,",
+ "passthrough=$passthrough,",
+ "genprefix=\"$genprefix\",",
+ "longprefix=\"$longprefix\".",
+ "\n");
+ }
+
+ # Check for ref HASH as first argument.
+ # First argument may be an object. It's OK to use this as long
+ # as it is really a hash underneath.
+ $userlinkage = undef;
+ if ( @optionlist && ref($optionlist[0]) and
+ UNIVERSAL::isa($optionlist[0],'HASH') ) {
+ $userlinkage = shift (@optionlist);
+ print STDERR ("=> user linkage: $userlinkage\n") if $debug;
+ }
+
+ # See if the first element of the optionlist contains option
+ # starter characters.
+ # Be careful not to interpret '<>' as option starters.
+ if ( @optionlist && $optionlist[0] =~ /^\W+$/
+ && !($optionlist[0] eq '<>'
+ && @optionlist > 0
+ && ref($optionlist[1])) ) {
+ $prefix = shift (@optionlist);
+ # Turn into regexp. Needs to be parenthesized!
+ $prefix =~ s/(\W)/\\$1/g;
+ $prefix = "([" . $prefix . "])";
+ print STDERR ("=> prefix=\"$prefix\"\n") if $debug;
+ }
+
+ # Verify correctness of optionlist.
+ %opctl = ();
+ while ( @optionlist ) {
+ my $opt = shift (@optionlist);
+
+ unless ( defined($opt) ) {
+ $error .= "Undefined argument in option spec\n";
+ next;
+ }
+
+ # Strip leading prefix so people can specify "--foo=i" if they like.
+ $opt = $+ if $opt =~ /^$prefix+(.*)$/s;
+
+ if ( $opt eq '<>' ) {
+ if ( (defined $userlinkage)
+ && !(@optionlist > 0 && ref($optionlist[0]))
+ && (exists $userlinkage->{$opt})
+ && ref($userlinkage->{$opt}) ) {
+ unshift (@optionlist, $userlinkage->{$opt});
+ }
+ unless ( @optionlist > 0
+ && ref($optionlist[0]) && ref($optionlist[0]) eq 'CODE' ) {
+ $error .= "Option spec <> requires a reference to a subroutine\n";
+ # Kill the linkage (to avoid another error).
+ shift (@optionlist)
+ if @optionlist && ref($optionlist[0]);
+ next;
+ }
+ $linkage{'<>'} = shift (@optionlist);
+ next;
+ }
+
+ # Parse option spec.
+ my ($name, $orig) = ParseOptionSpec ($opt, \%opctl);
+ unless ( defined $name ) {
+ # Failed. $orig contains the error message. Sorry for the abuse.
+ $error .= $orig;
+ # Kill the linkage (to avoid another error).
+ shift (@optionlist)
+ if @optionlist && ref($optionlist[0]);
+ next;
+ }
+
+ # If no linkage is supplied in the @optionlist, copy it from
+ # the userlinkage if available.
+ if ( defined $userlinkage ) {
+ unless ( @optionlist > 0 && ref($optionlist[0]) ) {
+ if ( exists $userlinkage->{$orig} &&
+ ref($userlinkage->{$orig}) ) {
+ print STDERR ("=> found userlinkage for \"$orig\": ",
+ "$userlinkage->{$orig}\n")
+ if $debug;
+ unshift (@optionlist, $userlinkage->{$orig});
+ }
+ else {
+ # Do nothing. Being undefined will be handled later.
+ next;
+ }
+ }
+ }
+
+ # Copy the linkage. If omitted, link to global variable.
+ if ( @optionlist > 0 && ref($optionlist[0]) ) {
+ print STDERR ("=> link \"$orig\" to $optionlist[0]\n")
+ if $debug;
+ my $rl = ref($linkage{$orig} = shift (@optionlist));
+
+ if ( $rl eq "ARRAY" ) {
+ $opctl{$name}[CTL_DEST] = CTL_DEST_ARRAY;
+ }
+ elsif ( $rl eq "HASH" ) {
+ $opctl{$name}[CTL_DEST] = CTL_DEST_HASH;
+ }
+ elsif ( $rl eq "SCALAR" || $rl eq "REF" ) {
+ # if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) {
+ # my $t = $linkage{$orig};
+ # $$t = $linkage{$orig} = [];
+ # }
+ # elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) {
+ # }
+ # else {
+ # Ok.
+ # }
+ }
+ elsif ( $rl eq "CODE" ) {
+ # Ok.
+ }
+ else {
+ $error .= "Invalid option linkage for \"$opt\"\n";
+ }
+ }
+ else {
+ # Link to global $opt_XXX variable.
+ # Make sure a valid perl identifier results.
+ my $ov = $orig;
+ $ov =~ s/\W/_/g;
+ if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) {
+ print STDERR ("=> link \"$orig\" to \@$pkg","::opt_$ov\n")
+ if $debug;
+ eval ("\$linkage{\$orig} = \\\@".$pkg."::opt_$ov;");
+ }
+ elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) {
+ print STDERR ("=> link \"$orig\" to \%$pkg","::opt_$ov\n")
+ if $debug;
+ eval ("\$linkage{\$orig} = \\\%".$pkg."::opt_$ov;");
+ }
+ else {
+ print STDERR ("=> link \"$orig\" to \$$pkg","::opt_$ov\n")
+ if $debug;
+ eval ("\$linkage{\$orig} = \\\$".$pkg."::opt_$ov;");
+ }
+ }
+
+ if ( $opctl{$name}[CTL_TYPE] eq 'I'
+ && ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY
+ || $opctl{$name}[CTL_DEST] == CTL_DEST_HASH )
+ ) {
+ $error .= "Invalid option linkage for \"$opt\"\n";
+ }
+
+ }
+
+ $error .= "GetOptionsFromArray: 1st parameter is not an array reference\n"
+ unless $argv && UNIVERSAL::isa( $argv, 'ARRAY' );
+
+ # Bail out if errors found.
+ die ($error) if $error;
+ $error = 0;
+
+ # Supply --version and --help support, if needed and allowed.
+ if ( defined($auto_version) ? $auto_version : ($requested_version >= 2.3203) ) {
+ if ( !defined($opctl{version}) ) {
+ $opctl{version} = ['','version',0,CTL_DEST_CODE,undef];
+ $linkage{version} = \&VersionMessage;
+ }
+ $auto_version = 1;
+ }
+ if ( defined($auto_help) ? $auto_help : ($requested_version >= 2.3203) ) {
+ if ( !defined($opctl{help}) && !defined($opctl{'?'}) ) {
+ $opctl{help} = $opctl{'?'} = ['','help',0,CTL_DEST_CODE,undef];
+ $linkage{help} = \&HelpMessage;
+ }
+ $auto_help = 1;
+ }
+
+ # Show the options tables if debugging.
+ if ( $debug ) {
+ my ($arrow, $k, $v);
+ $arrow = "=> ";
+ while ( ($k,$v) = each(%opctl) ) {
+ print STDERR ($arrow, "\$opctl{$k} = $v ", OptCtl($v), "\n");
+ $arrow = " ";
+ }
+ }
+
+ # Process argument list
+ my $goon = 1;
+ while ( $goon && @$argv > 0 ) {
+
+ # Get next argument.
+ $opt = shift (@$argv);
+ print STDERR ("=> arg \"", $opt, "\"\n") if $debug;
+
+ # Double dash is option list terminator.
+ if ( defined($opt) && $opt eq $argend ) {
+ push (@ret, $argend) if $passthrough;
+ last;
+ }
+
+ # Look it up.
+ my $tryopt = $opt;
+ my $found; # success status
+ my $key; # key (if hash type)
+ my $arg; # option argument
+ my $ctl; # the opctl entry
+
+ ($found, $opt, $ctl, $arg, $key) =
+ FindOption ($argv, $prefix, $argend, $opt, \%opctl);
+
+ if ( $found ) {
+
+ # FindOption undefines $opt in case of errors.
+ next unless defined $opt;
+
+ my $argcnt = 0;
+ while ( defined $arg ) {
+
+ # Get the canonical name.
+ print STDERR ("=> cname for \"$opt\" is ") if $debug;
+ $opt = $ctl->[CTL_CNAME];
+ print STDERR ("\"$ctl->[CTL_CNAME]\"\n") if $debug;
+
+ if ( defined $linkage{$opt} ) {
+ print STDERR ("=> ref(\$L{$opt}) -> ",
+ ref($linkage{$opt}), "\n") if $debug;
+
+ if ( ref($linkage{$opt}) eq 'SCALAR'
+ || ref($linkage{$opt}) eq 'REF' ) {
+ if ( $ctl->[CTL_TYPE] eq '+' ) {
+ print STDERR ("=> \$\$L{$opt} += \"$arg\"\n")
+ if $debug;
+ if ( defined ${$linkage{$opt}} ) {
+ ${$linkage{$opt}} += $arg;
+ }
+ else {
+ ${$linkage{$opt}} = $arg;
+ }
+ }
+ elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) {
+ print STDERR ("=> ref(\$L{$opt}) auto-vivified",
+ " to ARRAY\n")
+ if $debug;
+ my $t = $linkage{$opt};
+ $$t = $linkage{$opt} = [];
+ print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n")
+ if $debug;
+ push (@{$linkage{$opt}}, $arg);
+ }
+ elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) {
+ print STDERR ("=> ref(\$L{$opt}) auto-vivified",
+ " to HASH\n")
+ if $debug;
+ my $t = $linkage{$opt};
+ $$t = $linkage{$opt} = {};
+ print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n")
+ if $debug;
+ $linkage{$opt}->{$key} = $arg;
+ }
+ else {
+ print STDERR ("=> \$\$L{$opt} = \"$arg\"\n")
+ if $debug;
+ ${$linkage{$opt}} = $arg;
+ }
+ }
+ elsif ( ref($linkage{$opt}) eq 'ARRAY' ) {
+ print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n")
+ if $debug;
+ push (@{$linkage{$opt}}, $arg);
+ }
+ elsif ( ref($linkage{$opt}) eq 'HASH' ) {
+ print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n")
+ if $debug;
+ $linkage{$opt}->{$key} = $arg;
+ }
+ elsif ( ref($linkage{$opt}) eq 'CODE' ) {
+ print STDERR ("=> &L{$opt}(\"$opt\"",
+ $ctl->[CTL_DEST] == CTL_DEST_HASH ? ", \"$key\"" : "",
+ ", \"$arg\")\n")
+ if $debug;
+ my $eval_error = do {
+ local $@;
+ local $SIG{__DIE__} = 'DEFAULT';
+ eval {
+ &{$linkage{$opt}}
+ (Getopt::Long::CallBack->new
+ (name => $opt,
+ ctl => $ctl,
+ opctl => \%opctl,
+ linkage => \%linkage,
+ prefix => $prefix,
+ ),
+ $ctl->[CTL_DEST] == CTL_DEST_HASH ? ($key) : (),
+ $arg);
+ };
+ $@;
+ };
+ print STDERR ("=> die($eval_error)\n")
+ if $debug && $eval_error ne '';
+ if ( $eval_error =~ /^!/ ) {
+ if ( $eval_error =~ /^!FINISH\b/ ) {
+ $goon = 0;
+ }
+ }
+ elsif ( $eval_error ne '' ) {
+ warn ($eval_error);
+ $error++;
+ }
+ }
+ else {
+ print STDERR ("Invalid REF type \"", ref($linkage{$opt}),
+ "\" in linkage\n");
+ die("Getopt::Long -- internal error!\n");
+ }
+ }
+ # No entry in linkage means entry in userlinkage.
+ elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) {
+ if ( defined $userlinkage->{$opt} ) {
+ print STDERR ("=> push(\@{\$L{$opt}}, \"$arg\")\n")
+ if $debug;
+ push (@{$userlinkage->{$opt}}, $arg);
+ }
+ else {
+ print STDERR ("=>\$L{$opt} = [\"$arg\"]\n")
+ if $debug;
+ $userlinkage->{$opt} = [$arg];
+ }
+ }
+ elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) {
+ if ( defined $userlinkage->{$opt} ) {
+ print STDERR ("=> \$L{$opt}->{$key} = \"$arg\"\n")
+ if $debug;
+ $userlinkage->{$opt}->{$key} = $arg;
+ }
+ else {
+ print STDERR ("=>\$L{$opt} = {$key => \"$arg\"}\n")
+ if $debug;
+ $userlinkage->{$opt} = {$key => $arg};
+ }
+ }
+ else {
+ if ( $ctl->[CTL_TYPE] eq '+' ) {
+ print STDERR ("=> \$L{$opt} += \"$arg\"\n")
+ if $debug;
+ if ( defined $userlinkage->{$opt} ) {
+ $userlinkage->{$opt} += $arg;
+ }
+ else {
+ $userlinkage->{$opt} = $arg;
+ }
+ }
+ else {
+ print STDERR ("=>\$L{$opt} = \"$arg\"\n") if $debug;
+ $userlinkage->{$opt} = $arg;
+ }
+ }
+
+ $argcnt++;
+ last if $argcnt >= $ctl->[CTL_AMAX] && $ctl->[CTL_AMAX] != -1;
+ undef($arg);
+
+ # Need more args?
+ if ( $argcnt < $ctl->[CTL_AMIN] ) {
+ if ( @$argv ) {
+ if ( ValidValue($ctl, $argv->[0], 1, $argend, $prefix) ) {
+ $arg = shift(@$argv);
+ if ( $ctl->[CTL_TYPE] =~ /^[iIo]$/ ) {
+ $arg =~ tr/_//d;
+ $arg = $ctl->[CTL_TYPE] eq 'o' && $arg =~ /^0/
+ ? oct($arg)
+ : 0+$arg
+ }
+ ($key,$arg) = $arg =~ /^([^=]+)=(.*)/
+ if $ctl->[CTL_DEST] == CTL_DEST_HASH;
+ next;
+ }
+ warn("Value \"$$argv[0]\" invalid for option $opt\n");
+ $error++;
+ }
+ else {
+ warn("Insufficient arguments for option $opt\n");
+ $error++;
+ }
+ }
+
+ # Any more args?
+ if ( @$argv && ValidValue($ctl, $argv->[0], 0, $argend, $prefix) ) {
+ $arg = shift(@$argv);
+ if ( $ctl->[CTL_TYPE] =~ /^[iIo]$/ ) {
+ $arg =~ tr/_//d;
+ $arg = $ctl->[CTL_TYPE] eq 'o' && $arg =~ /^0/
+ ? oct($arg)
+ : 0+$arg
+ }
+ ($key,$arg) = $arg =~ /^([^=]+)=(.*)/
+ if $ctl->[CTL_DEST] == CTL_DEST_HASH;
+ next;
+ }
+ }
+ }
+
+ # Not an option. Save it if we $PERMUTE and don't have a <>.
+ elsif ( $order == $PERMUTE ) {
+ # Try non-options call-back.
+ my $cb;
+ if ( defined ($cb = $linkage{'<>'}) ) {
+ print STDERR ("=> &L{$tryopt}(\"$tryopt\")\n")
+ if $debug;
+ my $eval_error = do {
+ local $@;
+ local $SIG{__DIE__} = 'DEFAULT';
+ eval {
+ # The arg to <> cannot be the CallBack object
+ # since it may be passed to other modules that
+ # get confused (e.g., Archive::Tar). Well,
+ # it's not relevant for this callback anyway.
+ &$cb($tryopt);
+ };
+ $@;
+ };
+ print STDERR ("=> die($eval_error)\n")
+ if $debug && $eval_error ne '';
+ if ( $eval_error =~ /^!/ ) {
+ if ( $eval_error =~ /^!FINISH\b/ ) {
+ $goon = 0;
+ }
+ }
+ elsif ( $eval_error ne '' ) {
+ warn ($eval_error);
+ $error++;
+ }
+ }
+ else {
+ print STDERR ("=> saving \"$tryopt\" ",
+ "(not an option, may permute)\n") if $debug;
+ push (@ret, $tryopt);
+ }
+ next;
+ }
+
+ # ...otherwise, terminate.
+ else {
+ # Push this one back and exit.
+ unshift (@$argv, $tryopt);
+ return ($error == 0);
+ }
+
+ }
+
+ # Finish.
+ if ( @ret && $order == $PERMUTE ) {
+ # Push back accumulated arguments
+ print STDERR ("=> restoring \"", join('" "', @ret), "\"\n")
+ if $debug;
+ unshift (@$argv, @ret);
+ }
+
+ return ($error == 0);
+ }
+
+ # A readable representation of what's in an optbl.
+ sub OptCtl ($) {
+ my ($v) = @_;
+ my @v = map { defined($_) ? ($_) : ("<undef>") } @$v;
+ "[".
+ join(",",
+ "\"$v[CTL_TYPE]\"",
+ "\"$v[CTL_CNAME]\"",
+ "\"$v[CTL_DEFAULT]\"",
+ ("\$","\@","\%","\&")[$v[CTL_DEST] || 0],
+ $v[CTL_AMIN] || '',
+ $v[CTL_AMAX] || '',
+ # $v[CTL_RANGE] || '',
+ # $v[CTL_REPEAT] || '',
+ ). "]";
+ }
+
+ # Parse an option specification and fill the tables.
+ sub ParseOptionSpec ($$) {
+ my ($opt, $opctl) = @_;
+
+ # Match option spec.
+ if ( $opt !~ m;^
+ (
+ # Option name
+ (?: \w+[-\w]* )
+ # Alias names, or "?"
+ (?: \| (?: \? | \w[-\w]* ) )*
+ # Aliases
+ (?: \| (?: [^-|!+=:][^|!+=:]* )? )*
+ )?
+ (
+ # Either modifiers ...
+ [!+]
+ |
+ # ... or a value/dest/repeat specification
+ [=:] [ionfs] [@%]? (?: \{\d*,?\d*\} )?
+ |
+ # ... or an optional-with-default spec
+ : (?: -?\d+ | \+ ) [@%]?
+ )?
+ $;x ) {
+ return (undef, "Error in option spec: \"$opt\"\n");
+ }
+
+ my ($names, $spec) = ($1, $2);
+ $spec = '' unless defined $spec;
+
+ # $orig keeps track of the primary name the user specified.
+ # This name will be used for the internal or external linkage.
+ # In other words, if the user specifies "FoO|BaR", it will
+ # match any case combinations of 'foo' and 'bar', but if a global
+ # variable needs to be set, it will be $opt_FoO in the exact case
+ # as specified.
+ my $orig;
+
+ my @names;
+ if ( defined $names ) {
+ @names = split (/\|/, $names);
+ $orig = $names[0];
+ }
+ else {
+ @names = ('');
+ $orig = '';
+ }
+
+ # Construct the opctl entries.
+ my $entry;
+ if ( $spec eq '' || $spec eq '+' || $spec eq '!' ) {
+ # Fields are hard-wired here.
+ $entry = [$spec,$orig,undef,CTL_DEST_SCALAR,0,0];
+ }
+ elsif ( $spec =~ /^:(-?\d+|\+)([@%])?$/ ) {
+ my $def = $1;
+ my $dest = $2;
+ my $type = $def eq '+' ? 'I' : 'i';
+ $dest ||= '$';
+ $dest = $dest eq '@' ? CTL_DEST_ARRAY
+ : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR;
+ # Fields are hard-wired here.
+ $entry = [$type,$orig,$def eq '+' ? undef : $def,
+ $dest,0,1];
+ }
+ else {
+ my ($mand, $type, $dest) =
+ $spec =~ /^([=:])([ionfs])([@%])?(\{(\d+)?(,)?(\d+)?\})?$/;
+ return (undef, "Cannot repeat while bundling: \"$opt\"\n")
+ if $bundling && defined($4);
+ my ($mi, $cm, $ma) = ($5, $6, $7);
+ return (undef, "{0} is useless in option spec: \"$opt\"\n")
+ if defined($mi) && !$mi && !defined($ma) && !defined($cm);
+
+ $type = 'i' if $type eq 'n';
+ $dest ||= '$';
+ $dest = $dest eq '@' ? CTL_DEST_ARRAY
+ : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR;
+ # Default minargs to 1/0 depending on mand status.
+ $mi = $mand eq '=' ? 1 : 0 unless defined $mi;
+ # Adjust mand status according to minargs.
+ $mand = $mi ? '=' : ':';
+ # Adjust maxargs.
+ $ma = $mi ? $mi : 1 unless defined $ma || defined $cm;
+ return (undef, "Max must be greater than zero in option spec: \"$opt\"\n")
+ if defined($ma) && !$ma;
+ return (undef, "Max less than min in option spec: \"$opt\"\n")
+ if defined($ma) && $ma < $mi;
+
+ # Fields are hard-wired here.
+ $entry = [$type,$orig,undef,$dest,$mi,$ma||-1];
+ }
+
+ # Process all names. First is canonical, the rest are aliases.
+ my $dups = '';
+ foreach ( @names ) {
+
+ $_ = lc ($_)
+ if $ignorecase > (($bundling && length($_) == 1) ? 1 : 0);
+
+ if ( exists $opctl->{$_} ) {
+ $dups .= "Duplicate specification \"$opt\" for option \"$_\"\n";
+ }
+
+ if ( $spec eq '!' ) {
+ $opctl->{"no$_"} = $entry;
+ $opctl->{"no-$_"} = $entry;
+ $opctl->{$_} = [@$entry];
+ $opctl->{$_}->[CTL_TYPE] = '';
+ }
+ else {
+ $opctl->{$_} = $entry;
+ }
+ }
+
+ if ( $dups && $^W ) {
+ foreach ( split(/\n+/, $dups) ) {
+ warn($_."\n");
+ }
+ }
+ ($names[0], $orig);
+ }
+
+ # Option lookup.
+ sub FindOption ($$$$$) {
+
+ # returns (1, $opt, $ctl, $arg, $key) if okay,
+ # returns (1, undef) if option in error,
+ # returns (0) otherwise.
+
+ my ($argv, $prefix, $argend, $opt, $opctl) = @_;
+
+ print STDERR ("=> find \"$opt\"\n") if $debug;
+
+ return (0) unless defined($opt);
+ return (0) unless $opt =~ /^($prefix)(.*)$/s;
+ return (0) if $opt eq "-" && !defined $opctl->{''};
+
+ $opt = substr( $opt, length($1) ); # retain taintedness
+ my $starter = $1;
+
+ print STDERR ("=> split \"$starter\"+\"$opt\"\n") if $debug;
+
+ my $optarg; # value supplied with --opt=value
+ my $rest; # remainder from unbundling
+
+ # If it is a long option, it may include the value.
+ # With getopt_compat, only if not bundling.
+ if ( ($starter=~/^$longprefix$/
+ || ($getopt_compat && ($bundling == 0 || $bundling == 2)))
+ && (my $oppos = index($opt, '=', 1)) > 0) {
+ my $optorg = $opt;
+ $opt = substr($optorg, 0, $oppos);
+ $optarg = substr($optorg, $oppos + 1); # retain tainedness
+ print STDERR ("=> option \"", $opt,
+ "\", optarg = \"$optarg\"\n") if $debug;
+ }
+
+ #### Look it up ###
+
+ my $tryopt = $opt; # option to try
+
+ if ( ( $bundling || $bundling_values ) && $starter eq '-' ) {
+
+ # To try overrides, obey case ignore.
+ $tryopt = $ignorecase ? lc($opt) : $opt;
+
+ # If bundling == 2, long options can override bundles.
+ if ( $bundling == 2 && length($tryopt) > 1
+ && defined ($opctl->{$tryopt}) ) {
+ print STDERR ("=> $starter$tryopt overrides unbundling\n")
+ if $debug;
+ }
+
+ # If bundling_values, option may be followed by the value.
+ elsif ( $bundling_values ) {
+ $tryopt = $opt;
+ # Unbundle single letter option.
+ $rest = length ($tryopt) > 0 ? substr ($tryopt, 1) : '';
+ $tryopt = substr ($tryopt, 0, 1);
+ $tryopt = lc ($tryopt) if $ignorecase > 1;
+ print STDERR ("=> $starter$tryopt unbundled from ",
+ "$starter$tryopt$rest\n") if $debug;
+ # Whatever remains may not be considered an option.
+ $optarg = $rest eq '' ? undef : $rest;
+ $rest = undef;
+ }
+
+ # Split off a single letter and leave the rest for
+ # further processing.
+ else {
+ $tryopt = $opt;
+ # Unbundle single letter option.
+ $rest = length ($tryopt) > 0 ? substr ($tryopt, 1) : '';
+ $tryopt = substr ($tryopt, 0, 1);
+ $tryopt = lc ($tryopt) if $ignorecase > 1;
+ print STDERR ("=> $starter$tryopt unbundled from ",
+ "$starter$tryopt$rest\n") if $debug;
+ $rest = undef unless $rest ne '';
+ }
+ }
+
+ # Try auto-abbreviation.
+ elsif ( $autoabbrev && $opt ne "" ) {
+ # Sort the possible long option names.
+ my @names = sort(keys (%$opctl));
+ # Downcase if allowed.
+ $opt = lc ($opt) if $ignorecase;
+ $tryopt = $opt;
+ # Turn option name into pattern.
+ my $pat = quotemeta ($opt);
+ # Look up in option names.
+ my @hits = grep (/^$pat/, @names);
+ print STDERR ("=> ", scalar(@hits), " hits (@hits) with \"$pat\" ",
+ "out of ", scalar(@names), "\n") if $debug;
+
+ # Check for ambiguous results.
+ unless ( (@hits <= 1) || (grep ($_ eq $opt, @hits) == 1) ) {
+ # See if all matches are for the same option.
+ my %hit;
+ foreach ( @hits ) {
+ my $hit = $opctl->{$_}->[CTL_CNAME]
+ if defined $opctl->{$_}->[CTL_CNAME];
+ $hit = "no" . $hit if $opctl->{$_}->[CTL_TYPE] eq '!';
+ $hit{$hit} = 1;
+ }
+ # Remove auto-supplied options (version, help).
+ if ( keys(%hit) == 2 ) {
+ if ( $auto_version && exists($hit{version}) ) {
+ delete $hit{version};
+ }
+ elsif ( $auto_help && exists($hit{help}) ) {
+ delete $hit{help};
+ }
+ }
+ # Now see if it really is ambiguous.
+ unless ( keys(%hit) == 1 ) {
+ return (0) if $passthrough;
+ warn ("Option ", $opt, " is ambiguous (",
+ join(", ", @hits), ")\n");
+ $error++;
+ return (1, undef);
+ }
+ @hits = keys(%hit);
+ }
+
+ # Complete the option name, if appropriate.
+ if ( @hits == 1 && $hits[0] ne $opt ) {
+ $tryopt = $hits[0];
+ $tryopt = lc ($tryopt) if $ignorecase;
+ print STDERR ("=> option \"$opt\" -> \"$tryopt\"\n")
+ if $debug;
+ }
+ }
+
+ # Map to all lowercase if ignoring case.
+ elsif ( $ignorecase ) {
+ $tryopt = lc ($opt);
+ }
+
+ # Check validity by fetching the info.
+ my $ctl = $opctl->{$tryopt};
+ unless ( defined $ctl ) {
+ return (0) if $passthrough;
+ # Pretend one char when bundling.
+ if ( $bundling == 1 && length($starter) == 1 ) {
+ $opt = substr($opt,0,1);
+ unshift (@$argv, $starter.$rest) if defined $rest;
+ }
+ if ( $opt eq "" ) {
+ warn ("Missing option after ", $starter, "\n");
+ }
+ else {
+ warn ("Unknown option: ", $opt, "\n");
+ }
+ $error++;
+ return (1, undef);
+ }
+ # Apparently valid.
+ $opt = $tryopt;
+ print STDERR ("=> found ", OptCtl($ctl),
+ " for \"", $opt, "\"\n") if $debug;
+
+ #### Determine argument status ####
+
+ # If it is an option w/o argument, we're almost finished with it.
+ my $type = $ctl->[CTL_TYPE];
+ my $arg;
+
+ if ( $type eq '' || $type eq '!' || $type eq '+' ) {
+ if ( defined $optarg ) {
+ return (0) if $passthrough;
+ warn ("Option ", $opt, " does not take an argument\n");
+ $error++;
+ undef $opt;
+ undef $optarg if $bundling_values;
+ }
+ elsif ( $type eq '' || $type eq '+' ) {
+ # Supply explicit value.
+ $arg = 1;
+ }
+ else {
+ $opt =~ s/^no-?//i; # strip NO prefix
+ $arg = 0; # supply explicit value
+ }
+ unshift (@$argv, $starter.$rest) if defined $rest;
+ return (1, $opt, $ctl, $arg);
+ }
+
+ # Get mandatory status and type info.
+ my $mand = $ctl->[CTL_AMIN];
+
+ # Check if there is an option argument available.
+ if ( $gnu_compat && defined $optarg && $optarg eq '' ) {
+ return (1, $opt, $ctl, $type eq 's' ? '' : 0) ;#unless $mand;
+ $optarg = 0 unless $type eq 's';
+ }
+
+ # Check if there is an option argument available.
+ if ( defined $optarg
+ ? ($optarg eq '')
+ : !(defined $rest || @$argv > 0) ) {
+ # Complain if this option needs an argument.
+ # if ( $mand && !($type eq 's' ? defined($optarg) : 0) ) {
+ if ( $mand ) {
+ return (0) if $passthrough;
+ warn ("Option ", $opt, " requires an argument\n");
+ $error++;
+ return (1, undef);
+ }
+ if ( $type eq 'I' ) {
+ # Fake incremental type.
+ my @c = @$ctl;
+ $c[CTL_TYPE] = '+';
+ return (1, $opt, \@c, 1);
+ }
+ return (1, $opt, $ctl,
+ defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] :
+ $type eq 's' ? '' : 0);
+ }
+
+ # Get (possibly optional) argument.
+ $arg = (defined $rest ? $rest
+ : (defined $optarg ? $optarg : shift (@$argv)));
+
+ # Get key if this is a "name=value" pair for a hash option.
+ my $key;
+ if ($ctl->[CTL_DEST] == CTL_DEST_HASH && defined $arg) {
+ ($key, $arg) = ($arg =~ /^([^=]*)=(.*)$/s) ? ($1, $2)
+ : ($arg, defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] :
+ ($mand ? undef : ($type eq 's' ? "" : 1)));
+ if (! defined $arg) {
+ warn ("Option $opt, key \"$key\", requires a value\n");
+ $error++;
+ # Push back.
+ unshift (@$argv, $starter.$rest) if defined $rest;
+ return (1, undef);
+ }
+ }
+
+ #### Check if the argument is valid for this option ####
+
+ my $key_valid = $ctl->[CTL_DEST] == CTL_DEST_HASH ? "[^=]+=" : "";
+
+ if ( $type eq 's' ) { # string
+ # A mandatory string takes anything.
+ return (1, $opt, $ctl, $arg, $key) if $mand;
+
+ # Same for optional string as a hash value
+ return (1, $opt, $ctl, $arg, $key)
+ if $ctl->[CTL_DEST] == CTL_DEST_HASH;
+
+ # An optional string takes almost anything.
+ return (1, $opt, $ctl, $arg, $key)
+ if defined $optarg || defined $rest;
+ return (1, $opt, $ctl, $arg, $key) if $arg eq "-"; # ??
+
+ # Check for option or option list terminator.
+ if ($arg eq $argend ||
+ $arg =~ /^$prefix.+/) {
+ # Push back.
+ unshift (@$argv, $arg);
+ # Supply empty value.
+ $arg = '';
+ }
+ }
+
+ elsif ( $type eq 'i' # numeric/integer
+ || $type eq 'I' # numeric/integer w/ incr default
+ || $type eq 'o' ) { # dec/oct/hex/bin value
+
+ my $o_valid = $type eq 'o' ? PAT_XINT : PAT_INT;
+
+ if ( $bundling && defined $rest
+ && $rest =~ /^($key_valid)($o_valid)(.*)$/si ) {
+ ($key, $arg, $rest) = ($1, $2, $+);
+ chop($key) if $key;
+ $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg;
+ unshift (@$argv, $starter.$rest) if defined $rest && $rest ne '';
+ }
+ elsif ( $arg =~ /^$o_valid$/si ) {
+ $arg =~ tr/_//d;
+ $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg;
+ }
+ else {
+ if ( defined $optarg || $mand ) {
+ if ( $passthrough ) {
+ unshift (@$argv, defined $rest ? $starter.$rest : $arg)
+ unless defined $optarg;
+ return (0);
+ }
+ warn ("Value \"", $arg, "\" invalid for option ",
+ $opt, " (",
+ $type eq 'o' ? "extended " : '',
+ "number expected)\n");
+ $error++;
+ # Push back.
+ unshift (@$argv, $starter.$rest) if defined $rest;
+ return (1, undef);
+ }
+ else {
+ # Push back.
+ unshift (@$argv, defined $rest ? $starter.$rest : $arg);
+ if ( $type eq 'I' ) {
+ # Fake incremental type.
+ my @c = @$ctl;
+ $c[CTL_TYPE] = '+';
+ return (1, $opt, \@c, 1);
+ }
+ # Supply default value.
+ $arg = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : 0;
+ }
+ }
+ }
+
+ elsif ( $type eq 'f' ) { # real number, int is also ok
+ my $o_valid = PAT_FLOAT;
+ if ( $bundling && defined $rest &&
+ $rest =~ /^($key_valid)($o_valid)(.*)$/s ) {
+ $arg =~ tr/_//d;
+ ($key, $arg, $rest) = ($1, $2, $+);
+ chop($key) if $key;
+ unshift (@$argv, $starter.$rest) if defined $rest && $rest ne '';
+ }
+ elsif ( $arg =~ /^$o_valid$/ ) {
+ $arg =~ tr/_//d;
+ }
+ else {
+ if ( defined $optarg || $mand ) {
+ if ( $passthrough ) {
+ unshift (@$argv, defined $rest ? $starter.$rest : $arg)
+ unless defined $optarg;
+ return (0);
+ }
+ warn ("Value \"", $arg, "\" invalid for option ",
+ $opt, " (real number expected)\n");
+ $error++;
+ # Push back.
+ unshift (@$argv, $starter.$rest) if defined $rest;
+ return (1, undef);
+ }
+ else {
+ # Push back.
+ unshift (@$argv, defined $rest ? $starter.$rest : $arg);
+ # Supply default value.
+ $arg = 0.0;
+ }
+ }
+ }
+ else {
+ die("Getopt::Long internal error (Can't happen)\n");
+ }
+ return (1, $opt, $ctl, $arg, $key);
+ }
+
+ sub ValidValue ($$$$$) {
+ my ($ctl, $arg, $mand, $argend, $prefix) = @_;
+
+ if ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) {
+ return 0 unless $arg =~ /[^=]+=(.*)/;
+ $arg = $1;
+ }
+
+ my $type = $ctl->[CTL_TYPE];
+
+ if ( $type eq 's' ) { # string
+ # A mandatory string takes anything.
+ return (1) if $mand;
+
+ return (1) if $arg eq "-";
+
+ # Check for option or option list terminator.
+ return 0 if $arg eq $argend || $arg =~ /^$prefix.+/;
+ return 1;
+ }
+
+ elsif ( $type eq 'i' # numeric/integer
+ || $type eq 'I' # numeric/integer w/ incr default
+ || $type eq 'o' ) { # dec/oct/hex/bin value
+
+ my $o_valid = $type eq 'o' ? PAT_XINT : PAT_INT;
+ return $arg =~ /^$o_valid$/si;
+ }
+
+ elsif ( $type eq 'f' ) { # real number, int is also ok
+ my $o_valid = PAT_FLOAT;
+ return $arg =~ /^$o_valid$/;
+ }
+ die("ValidValue: Cannot happen\n");
+ }
+
+ # Getopt::Long Configuration.
+ sub Configure (@) {
+ my (@options) = @_;
+
+ my $prevconfig =
+ [ $error, $debug, $major_version, $minor_version, $caller,
+ $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
+ $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help,
+ $longprefix, $bundling_values ];
+
+ if ( ref($options[0]) eq 'ARRAY' ) {
+ ( $error, $debug, $major_version, $minor_version, $caller,
+ $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
+ $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help,
+ $longprefix, $bundling_values ) = @{shift(@options)};
+ }
+
+ my $opt;
+ foreach $opt ( @options ) {
+ my $try = lc ($opt);
+ my $action = 1;
+ if ( $try =~ /^no_?(.*)$/s ) {
+ $action = 0;
+ $try = $+;
+ }
+ if ( ($try eq 'default' or $try eq 'defaults') && $action ) {
+ ConfigDefaults ();
+ }
+ elsif ( ($try eq 'posix_default' or $try eq 'posix_defaults') ) {
+ local $ENV{POSIXLY_CORRECT};
+ $ENV{POSIXLY_CORRECT} = 1 if $action;
+ ConfigDefaults ();
+ }
+ elsif ( $try eq 'auto_abbrev' or $try eq 'autoabbrev' ) {
+ $autoabbrev = $action;
+ }
+ elsif ( $try eq 'getopt_compat' ) {
+ $getopt_compat = $action;
+ $genprefix = $action ? "(--|-|\\+)" : "(--|-)";
+ }
+ elsif ( $try eq 'gnu_getopt' ) {
+ if ( $action ) {
+ $gnu_compat = 1;
+ $bundling = 1;
+ $getopt_compat = 0;
+ $genprefix = "(--|-)";
+ $order = $PERMUTE;
+ $bundling_values = 0;
+ }
+ }
+ elsif ( $try eq 'gnu_compat' ) {
+ $gnu_compat = $action;
+ }
+ elsif ( $try =~ /^(auto_?)?version$/ ) {
+ $auto_version = $action;
+ }
+ elsif ( $try =~ /^(auto_?)?help$/ ) {
+ $auto_help = $action;
+ }
+ elsif ( $try eq 'ignorecase' or $try eq 'ignore_case' ) {
+ $ignorecase = $action;
+ }
+ elsif ( $try eq 'ignorecase_always' or $try eq 'ignore_case_always' ) {
+ $ignorecase = $action ? 2 : 0;
+ }
+ elsif ( $try eq 'bundling' ) {
+ $bundling = $action;
+ $bundling_values = 0 if $action;
+ }
+ elsif ( $try eq 'bundling_override' ) {
+ $bundling = $action ? 2 : 0;
+ $bundling_values = 0 if $action;
+ }
+ elsif ( $try eq 'bundling_values' ) {
+ $bundling_values = $action;
+ $bundling = 0 if $action;
+ }
+ elsif ( $try eq 'require_order' ) {
+ $order = $action ? $REQUIRE_ORDER : $PERMUTE;
+ }
+ elsif ( $try eq 'permute' ) {
+ $order = $action ? $PERMUTE : $REQUIRE_ORDER;
+ }
+ elsif ( $try eq 'pass_through' or $try eq 'passthrough' ) {
+ $passthrough = $action;
+ }
+ elsif ( $try =~ /^prefix=(.+)$/ && $action ) {
+ $genprefix = $1;
+ # Turn into regexp. Needs to be parenthesized!
+ $genprefix = "(" . quotemeta($genprefix) . ")";
+ eval { '' =~ /$genprefix/; };
+ die("Getopt::Long: invalid pattern \"$genprefix\"\n") if $@;
+ }
+ elsif ( $try =~ /^prefix_pattern=(.+)$/ && $action ) {
+ $genprefix = $1;
+ # Parenthesize if needed.
+ $genprefix = "(" . $genprefix . ")"
+ unless $genprefix =~ /^\(.*\)$/;
+ eval { '' =~ m"$genprefix"; };
+ die("Getopt::Long: invalid pattern \"$genprefix\"\n") if $@;
+ }
+ elsif ( $try =~ /^long_prefix_pattern=(.+)$/ && $action ) {
+ $longprefix = $1;
+ # Parenthesize if needed.
+ $longprefix = "(" . $longprefix . ")"
+ unless $longprefix =~ /^\(.*\)$/;
+ eval { '' =~ m"$longprefix"; };
+ die("Getopt::Long: invalid long prefix pattern \"$longprefix\"\n") if $@;
+ }
+ elsif ( $try eq 'debug' ) {
+ $debug = $action;
+ }
+ else {
+ die("Getopt::Long: unknown or erroneous config parameter \"$opt\"\n")
+ }
+ }
+ $prevconfig;
+ }
+
+ # Deprecated name.
+ sub config (@) {
+ Configure (@_);
+ }
+
+ # Issue a standard message for --version.
+ #
+ # The arguments are mostly the same as for Pod::Usage::pod2usage:
+ #
+ # - a number (exit value)
+ # - a string (lead in message)
+ # - a hash with options. See Pod::Usage for details.
+ #
+ sub VersionMessage(@) {
+ # Massage args.
+ my $pa = setup_pa_args("version", @_);
+
+ my $v = $main::VERSION;
+ my $fh = $pa->{-output} ||
+ ($pa->{-exitval} eq "NOEXIT" || $pa->{-exitval} < 2) ? \*STDOUT : \*STDERR;
+
+ print $fh (defined($pa->{-message}) ? $pa->{-message} : (),
+ $0, defined $v ? " version $v" : (),
+ "\n",
+ "(", __PACKAGE__, "::", "GetOptions",
+ " version ",
+ defined($Getopt::Long::VERSION_STRING)
+ ? $Getopt::Long::VERSION_STRING : $VERSION, ";",
+ " Perl version ",
+ $] >= 5.006 ? sprintf("%vd", $^V) : $],
+ ")\n");
+ exit($pa->{-exitval}) unless $pa->{-exitval} eq "NOEXIT";
+ }
+
+ # Issue a standard message for --help.
+ #
+ # The arguments are the same as for Pod::Usage::pod2usage:
+ #
+ # - a number (exit value)
+ # - a string (lead in message)
+ # - a hash with options. See Pod::Usage for details.
+ #
+ sub HelpMessage(@) {
+ eval {
+ require Pod::Usage;
+ import Pod::Usage;
+ 1;
+ } || die("Cannot provide help: cannot load Pod::Usage\n");
+
+ # Note that pod2usage will issue a warning if -exitval => NOEXIT.
+ pod2usage(setup_pa_args("help", @_));
+
+ }
+
+ # Helper routine to set up a normalized hash ref to be used as
+ # argument to pod2usage.
+ sub setup_pa_args($@) {
+ my $tag = shift; # who's calling
+
+ # If called by direct binding to an option, it will get the option
+ # name and value as arguments. Remove these, if so.
+ @_ = () if @_ == 2 && $_[0] eq $tag;
+
+ my $pa;
+ if ( @_ > 1 ) {
+ $pa = { @_ };
+ }
+ else {
+ $pa = shift || {};
+ }
+
+ # At this point, $pa can be a number (exit value), string
+ # (message) or hash with options.
+
+ if ( UNIVERSAL::isa($pa, 'HASH') ) {
+ # Get rid of -msg vs. -message ambiguity.
+ $pa->{-message} = $pa->{-msg};
+ delete($pa->{-msg});
+ }
+ elsif ( $pa =~ /^-?\d+$/ ) {
+ $pa = { -exitval => $pa };
+ }
+ else {
+ $pa = { -message => $pa };
+ }
+
+ # These are _our_ defaults.
+ $pa->{-verbose} = 0 unless exists($pa->{-verbose});
+ $pa->{-exitval} = 0 unless exists($pa->{-exitval});
+ $pa;
+ }
+
+ # Sneak way to know what version the user requested.
+ sub VERSION {
+ $requested_version = $_[1];
+ shift->SUPER::VERSION(@_);
+ }
+
+ package Getopt::Long::CallBack;
+
+ sub new {
+ my ($pkg, %atts) = @_;
+ bless { %atts }, $pkg;
+ }
+
+ sub name {
+ my $self = shift;
+ ''.$self->{name};
+ }
+
+ use overload
+ # Treat this object as an ordinary string for legacy API.
+ '""' => \&name,
+ fallback => 1;
+
+ 1;
+
+ ################ Documentation ################
+
+ =head1 NAME
+
+ Getopt::Long - Extended processing of command line options
+
+ =head1 SYNOPSIS
+
+ use Getopt::Long;
+ my $data = "file.dat";
+ my $length = 24;
+ my $verbose;
+ GetOptions ("length=i" => \$length, # numeric
+ "file=s" => \$data, # string
+ "verbose" => \$verbose) # flag
+ or die("Error in command line arguments\n");
+
+ =head1 DESCRIPTION
+
+ The Getopt::Long module implements an extended getopt function called
+ GetOptions(). It parses the command line from C<@ARGV>, recognizing
+ and removing specified options and their possible values.
+
+ This function adheres to the POSIX syntax for command
+ line options, with GNU extensions. In general, this means that options
+ have long names instead of single letters, and are introduced with a
+ double dash "--". Support for bundling of command line options, as was
+ the case with the more traditional single-letter approach, is provided
+ but not enabled by default.
+
+ =head1 Command Line Options, an Introduction
+
+ Command line operated programs traditionally take their arguments from
+ the command line, for example filenames or other information that the
+ program needs to know. Besides arguments, these programs often take
+ command line I<options> as well. Options are not necessary for the
+ program to work, hence the name 'option', but are used to modify its
+ default behaviour. For example, a program could do its job quietly,
+ but with a suitable option it could provide verbose information about
+ what it did.
+
+ Command line options come in several flavours. Historically, they are
+ preceded by a single dash C<->, and consist of a single letter.
+
+ -l -a -c
+
+ Usually, these single-character options can be bundled:
+
+ -lac
+
+ Options can have values, the value is placed after the option
+ character. Sometimes with whitespace in between, sometimes not:
+
+ -s 24 -s24
+
+ Due to the very cryptic nature of these options, another style was
+ developed that used long names. So instead of a cryptic C<-l> one
+ could use the more descriptive C<--long>. To distinguish between a
+ bundle of single-character options and a long one, two dashes are used
+ to precede the option name. Early implementations of long options used
+ a plus C<+> instead. Also, option values could be specified either
+ like
+
+ --size=24
+
+ or
+
+ --size 24
+
+ The C<+> form is now obsolete and strongly deprecated.
+
+ =head1 Getting Started with Getopt::Long
+
+ Getopt::Long is the Perl5 successor of C<newgetopt.pl>. This was the
+ first Perl module that provided support for handling the new style of
+ command line options, in particular long option names, hence the Perl5
+ name Getopt::Long. This module also supports single-character options
+ and bundling.
+
+ To use Getopt::Long from a Perl program, you must include the
+ following line in your Perl program:
+
+ use Getopt::Long;
+
+ This will load the core of the Getopt::Long module and prepare your
+ program for using it. Most of the actual Getopt::Long code is not
+ loaded until you really call one of its functions.
+
+ In the default configuration, options names may be abbreviated to
+ uniqueness, case does not matter, and a single dash is sufficient,
+ even for long option names. Also, options may be placed between
+ non-option arguments. See L<Configuring Getopt::Long> for more
+ details on how to configure Getopt::Long.
+
+ =head2 Simple options
+
+ The most simple options are the ones that take no values. Their mere
+ presence on the command line enables the option. Popular examples are:
+
+ --all --verbose --quiet --debug
+
+ Handling simple options is straightforward:
+
+ my $verbose = ''; # option variable with default value (false)
+ my $all = ''; # option variable with default value (false)
+ GetOptions ('verbose' => \$verbose, 'all' => \$all);
+
+ The call to GetOptions() parses the command line arguments that are
+ present in C<@ARGV> and sets the option variable to the value C<1> if
+ the option did occur on the command line. Otherwise, the option
+ variable is not touched. Setting the option value to true is often
+ called I<enabling> the option.
+
+ The option name as specified to the GetOptions() function is called
+ the option I<specification>. Later we'll see that this specification
+ can contain more than just the option name. The reference to the
+ variable is called the option I<destination>.
+
+ GetOptions() will return a true value if the command line could be
+ processed successfully. Otherwise, it will write error messages using
+ die() and warn(), and return a false result.
+
+ =head2 A little bit less simple options
+
+ Getopt::Long supports two useful variants of simple options:
+ I<negatable> options and I<incremental> options.
+
+ A negatable option is specified with an exclamation mark C<!> after the
+ option name:
+
+ my $verbose = ''; # option variable with default value (false)
+ GetOptions ('verbose!' => \$verbose);
+
+ Now, using C<--verbose> on the command line will enable C<$verbose>,
+ as expected. But it is also allowed to use C<--noverbose>, which will
+ disable C<$verbose> by setting its value to C<0>. Using a suitable
+ default value, the program can find out whether C<$verbose> is false
+ by default, or disabled by using C<--noverbose>.
+
+ An incremental option is specified with a plus C<+> after the
+ option name:
+
+ my $verbose = ''; # option variable with default value (false)
+ GetOptions ('verbose+' => \$verbose);
+
+ Using C<--verbose> on the command line will increment the value of
+ C<$verbose>. This way the program can keep track of how many times the
+ option occurred on the command line. For example, each occurrence of
+ C<--verbose> could increase the verbosity level of the program.
+
+ =head2 Mixing command line option with other arguments
+
+ Usually programs take command line options as well as other arguments,
+ for example, file names. It is good practice to always specify the
+ options first, and the other arguments last. Getopt::Long will,
+ however, allow the options and arguments to be mixed and 'filter out'
+ all the options before passing the rest of the arguments to the
+ program. To stop Getopt::Long from processing further arguments,
+ insert a double dash C<--> on the command line:
+
+ --size 24 -- --all
+
+ In this example, C<--all> will I<not> be treated as an option, but
+ passed to the program unharmed, in C<@ARGV>.
+
+ =head2 Options with values
+
+ For options that take values it must be specified whether the option
+ value is required or not, and what kind of value the option expects.
+
+ Three kinds of values are supported: integer numbers, floating point
+ numbers, and strings.
+
+ If the option value is required, Getopt::Long will take the
+ command line argument that follows the option and assign this to the
+ option variable. If, however, the option value is specified as
+ optional, this will only be done if that value does not look like a
+ valid command line option itself.
+
+ my $tag = ''; # option variable with default value
+ GetOptions ('tag=s' => \$tag);
+
+ In the option specification, the option name is followed by an equals
+ sign C<=> and the letter C<s>. The equals sign indicates that this
+ option requires a value. The letter C<s> indicates that this value is
+ an arbitrary string. Other possible value types are C<i> for integer
+ values, and C<f> for floating point values. Using a colon C<:> instead
+ of the equals sign indicates that the option value is optional. In
+ this case, if no suitable value is supplied, string valued options get
+ an empty string C<''> assigned, while numeric options are set to C<0>.
+
+ =head2 Options with multiple values
+
+ Options sometimes take several values. For example, a program could
+ use multiple directories to search for library files:
+
+ --library lib/stdlib --library lib/extlib
+
+ To accomplish this behaviour, simply specify an array reference as the
+ destination for the option:
+
+ GetOptions ("library=s" => \@libfiles);
+
+ Alternatively, you can specify that the option can have multiple
+ values by adding a "@", and pass a scalar reference as the
+ destination:
+
+ GetOptions ("library=s@" => \$libfiles);
+
+ Used with the example above, C<@libfiles> (or C<@$libfiles>) would
+ contain two strings upon completion: C<"lib/stdlib"> and
+ C<"lib/extlib">, in that order. It is also possible to specify that
+ only integer or floating point numbers are acceptable values.
+
+ Often it is useful to allow comma-separated lists of values as well as
+ multiple occurrences of the options. This is easy using Perl's split()
+ and join() operators:
+
+ GetOptions ("library=s" => \@libfiles);
+ @libfiles = split(/,/,join(',',@libfiles));
+
+ Of course, it is important to choose the right separator string for
+ each purpose.
+
+ Warning: What follows is an experimental feature.
+
+ Options can take multiple values at once, for example
+
+ --coordinates 52.2 16.4 --rgbcolor 255 255 149
+
+ This can be accomplished by adding a repeat specifier to the option
+ specification. Repeat specifiers are very similar to the C<{...}>
+ repeat specifiers that can be used with regular expression patterns.
+ For example, the above command line would be handled as follows:
+
+ GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
+
+ The destination for the option must be an array or array reference.
+
+ It is also possible to specify the minimal and maximal number of
+ arguments an option takes. C<foo=s{2,4}> indicates an option that
+ takes at least two and at most 4 arguments. C<foo=s{1,}> indicates one
+ or more values; C<foo:s{,}> indicates zero or more option values.
+
+ =head2 Options with hash values
+
+ If the option destination is a reference to a hash, the option will
+ take, as value, strings of the form I<key>C<=>I<value>. The value will
+ be stored with the specified key in the hash.
+
+ GetOptions ("define=s" => \%defines);
+
+ Alternatively you can use:
+
+ GetOptions ("define=s%" => \$defines);
+
+ When used with command line options:
+
+ --define os=linux --define vendor=redhat
+
+ the hash C<%defines> (or C<%$defines>) will contain two keys, C<"os">
+ with value C<"linux"> and C<"vendor"> with value C<"redhat">. It is
+ also possible to specify that only integer or floating point numbers
+ are acceptable values. The keys are always taken to be strings.
+
+ =head2 User-defined subroutines to handle options
+
+ Ultimate control over what should be done when (actually: each time)
+ an option is encountered on the command line can be achieved by
+ designating a reference to a subroutine (or an anonymous subroutine)
+ as the option destination. When GetOptions() encounters the option, it
+ will call the subroutine with two or three arguments. The first
+ argument is the name of the option. (Actually, it is an object that
+ stringifies to the name of the option.) For a scalar or array destination,
+ the second argument is the value to be stored. For a hash destination,
+ the second argument is the key to the hash, and the third argument
+ the value to be stored. It is up to the subroutine to store the value,
+ or do whatever it thinks is appropriate.
+
+ A trivial application of this mechanism is to implement options that
+ are related to each other. For example:
+
+ my $verbose = ''; # option variable with default value (false)
+ GetOptions ('verbose' => \$verbose,
+ 'quiet' => sub { $verbose = 0 });
+
+ Here C<--verbose> and C<--quiet> control the same variable
+ C<$verbose>, but with opposite values.
+
+ If the subroutine needs to signal an error, it should call die() with
+ the desired error message as its argument. GetOptions() will catch the
+ die(), issue the error message, and record that an error result must
+ be returned upon completion.
+
+ If the text of the error message starts with an exclamation mark C<!>
+ it is interpreted specially by GetOptions(). There is currently one
+ special command implemented: C<die("!FINISH")> will cause GetOptions()
+ to stop processing options, as if it encountered a double dash C<-->.
+
+ In version 2.37 the first argument to the callback function was
+ changed from string to object. This was done to make room for
+ extensions and more detailed control. The object stringifies to the
+ option name so this change should not introduce compatibility
+ problems.
+
+ Here is an example of how to access the option name and value from within
+ a subroutine:
+
+ GetOptions ('opt=i' => \&handler);
+ sub handler {
+ my ($opt_name, $opt_value) = @_;
+ print("Option name is $opt_name and value is $opt_value\n");
+ }
+
+ =head2 Options with multiple names
+
+ Often it is user friendly to supply alternate mnemonic names for
+ options. For example C<--height> could be an alternate name for
+ C<--length>. Alternate names can be included in the option
+ specification, separated by vertical bar C<|> characters. To implement
+ the above example:
+
+ GetOptions ('length|height=f' => \$length);
+
+ The first name is called the I<primary> name, the other names are
+ called I<aliases>. When using a hash to store options, the key will
+ always be the primary name.
+
+ Multiple alternate names are possible.
+
+ =head2 Case and abbreviations
+
+ Without additional configuration, GetOptions() will ignore the case of
+ option names, and allow the options to be abbreviated to uniqueness.
+
+ GetOptions ('length|height=f' => \$length, "head" => \$head);
+
+ This call will allow C<--l> and C<--L> for the length option, but
+ requires a least C<--hea> and C<--hei> for the head and height options.
+
+ =head2 Summary of Option Specifications
+
+ Each option specifier consists of two parts: the name specification
+ and the argument specification.
+
+ The name specification contains the name of the option, optionally
+ followed by a list of alternative names separated by vertical bar
+ characters.
+
+ length option name is "length"
+ length|size|l name is "length", aliases are "size" and "l"
+
+ The argument specification is optional. If omitted, the option is
+ considered boolean, a value of 1 will be assigned when the option is
+ used on the command line.
+
+ The argument specification can be
+
+ =over 4
+
+ =item !
+
+ The option does not take an argument and may be negated by prefixing
+ it with "no" or "no-". E.g. C<"foo!"> will allow C<--foo> (a value of
+ 1 will be assigned) as well as C<--nofoo> and C<--no-foo> (a value of
+ 0 will be assigned). If the option has aliases, this applies to the
+ aliases as well.
+
+ Using negation on a single letter option when bundling is in effect is
+ pointless and will result in a warning.
+
+ =item +
+
+ The option does not take an argument and will be incremented by 1
+ every time it appears on the command line. E.g. C<"more+">, when used
+ with C<--more --more --more>, will increment the value three times,
+ resulting in a value of 3 (provided it was 0 or undefined at first).
+
+ The C<+> specifier is ignored if the option destination is not a scalar.
+
+ =item = I<type> [ I<desttype> ] [ I<repeat> ]
+
+ The option requires an argument of the given type. Supported types
+ are:
+
+ =over 4
+
+ =item s
+
+ String. An arbitrary sequence of characters. It is valid for the
+ argument to start with C<-> or C<-->.
+
+ =item i
+
+ Integer. An optional leading plus or minus sign, followed by a
+ sequence of digits.
+
+ =item o
+
+ Extended integer, Perl style. This can be either an optional leading
+ plus or minus sign, followed by a sequence of digits, or an octal
+ string (a zero, optionally followed by '0', '1', .. '7'), or a
+ hexadecimal string (C<0x> followed by '0' .. '9', 'a' .. 'f', case
+ insensitive), or a binary string (C<0b> followed by a series of '0'
+ and '1').
+
+ =item f
+
+ Real number. For example C<3.14>, C<-6.23E24> and so on.
+
+ =back
+
+ The I<desttype> can be C<@> or C<%> to specify that the option is
+ list or a hash valued. This is only needed when the destination for
+ the option value is not otherwise specified. It should be omitted when
+ not needed.
+
+ The I<repeat> specifies the number of values this option takes per
+ occurrence on the command line. It has the format C<{> [ I<min> ] [ C<,> [ I<max> ] ] C<}>.
+
+ I<min> denotes the minimal number of arguments. It defaults to 1 for
+ options with C<=> and to 0 for options with C<:>, see below. Note that
+ I<min> overrules the C<=> / C<:> semantics.
+
+ I<max> denotes the maximum number of arguments. It must be at least
+ I<min>. If I<max> is omitted, I<but the comma is not>, there is no
+ upper bound to the number of argument values taken.
+
+ =item : I<type> [ I<desttype> ]
+
+ Like C<=>, but designates the argument as optional.
+ If omitted, an empty string will be assigned to string values options,
+ and the value zero to numeric options.
+
+ Note that if a string argument starts with C<-> or C<-->, it will be
+ considered an option on itself.
+
+ =item : I<number> [ I<desttype> ]
+
+ Like C<:i>, but if the value is omitted, the I<number> will be assigned.
+
+ =item : + [ I<desttype> ]
+
+ Like C<:i>, but if the value is omitted, the current value for the
+ option will be incremented.
+
+ =back
+
+ =head1 Advanced Possibilities
+
+ =head2 Object oriented interface
+
+ Getopt::Long can be used in an object oriented way as well:
+
+ use Getopt::Long;
+ $p = Getopt::Long::Parser->new;
+ $p->configure(...configuration options...);
+ if ($p->getoptions(...options descriptions...)) ...
+ if ($p->getoptionsfromarray( \@array, ...options descriptions...)) ...
+
+ Configuration options can be passed to the constructor:
+
+ $p = new Getopt::Long::Parser
+ config => [...configuration options...];
+
+ =head2 Thread Safety
+
+ Getopt::Long is thread safe when using ithreads as of Perl 5.8. It is
+ I<not> thread safe when using the older (experimental and now
+ obsolete) threads implementation that was added to Perl 5.005.
+
+ =head2 Documentation and help texts
+
+ Getopt::Long encourages the use of Pod::Usage to produce help
+ messages. For example:
+
+ use Getopt::Long;
+ use Pod::Usage;
+
+ my $man = 0;
+ my $help = 0;
+
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-exitval => 0, -verbose => 2) if $man;
+
+ __END__
+
+ =head1 NAME
+
+ sample - Using Getopt::Long and Pod::Usage
+
+ =head1 SYNOPSIS
+
+ sample [options] [file ...]
+
+ Options:
+ -help brief help message
+ -man full documentation
+
+ =head1 OPTIONS
+
+ =over 8
+
+ =item B<-help>
+
+ Print a brief help message and exits.
+
+ =item B<-man>
+
+ Prints the manual page and exits.
+
+ =back
+
+ =head1 DESCRIPTION
+
+ B<This program> will read the given input file(s) and do something
+ useful with the contents thereof.
+
+ =cut
+
+ See L<Pod::Usage> for details.
+
+ =head2 Parsing options from an arbitrary array
+
+ By default, GetOptions parses the options that are present in the
+ global array C<@ARGV>. A special entry C<GetOptionsFromArray> can be
+ used to parse options from an arbitrary array.
+
+ use Getopt::Long qw(GetOptionsFromArray);
+ $ret = GetOptionsFromArray(\@myopts, ...);
+
+ When used like this, options and their possible values are removed
+ from C<@myopts>, the global C<@ARGV> is not touched at all.
+
+ The following two calls behave identically:
+
+ $ret = GetOptions( ... );
+ $ret = GetOptionsFromArray(\@ARGV, ... );
+
+ This also means that a first argument hash reference now becomes the
+ second argument:
+
+ $ret = GetOptions(\%opts, ... );
+ $ret = GetOptionsFromArray(\@ARGV, \%opts, ... );
+
+ =head2 Parsing options from an arbitrary string
+
+ A special entry C<GetOptionsFromString> can be used to parse options
+ from an arbitrary string.
+
+ use Getopt::Long qw(GetOptionsFromString);
+ $ret = GetOptionsFromString($string, ...);
+
+ The contents of the string are split into arguments using a call to
+ C<Text::ParseWords::shellwords>. As with C<GetOptionsFromArray>, the
+ global C<@ARGV> is not touched.
+
+ It is possible that, upon completion, not all arguments in the string
+ have been processed. C<GetOptionsFromString> will, when called in list
+ context, return both the return status and an array reference to any
+ remaining arguments:
+
+ ($ret, $args) = GetOptionsFromString($string, ... );
+
+ If any arguments remain, and C<GetOptionsFromString> was not called in
+ list context, a message will be given and C<GetOptionsFromString> will
+ return failure.
+
+ As with GetOptionsFromArray, a first argument hash reference now
+ becomes the second argument.
+
+ =head2 Storing options values in a hash
+
+ Sometimes, for example when there are a lot of options, having a
+ separate variable for each of them can be cumbersome. GetOptions()
+ supports, as an alternative mechanism, storing options values in a
+ hash.
+
+ To obtain this, a reference to a hash must be passed I<as the first
+ argument> to GetOptions(). For each option that is specified on the
+ command line, the option value will be stored in the hash with the
+ option name as key. Options that are not actually used on the command
+ line will not be put in the hash, on other words,
+ C<exists($h{option})> (or defined()) can be used to test if an option
+ was used. The drawback is that warnings will be issued if the program
+ runs under C<use strict> and uses C<$h{option}> without testing with
+ exists() or defined() first.
+
+ my %h = ();
+ GetOptions (\%h, 'length=i'); # will store in $h{length}
+
+ For options that take list or hash values, it is necessary to indicate
+ this by appending an C<@> or C<%> sign after the type:
+
+ GetOptions (\%h, 'colours=s@'); # will push to @{$h{colours}}
+
+ To make things more complicated, the hash may contain references to
+ the actual destinations, for example:
+
+ my $len = 0;
+ my %h = ('length' => \$len);
+ GetOptions (\%h, 'length=i'); # will store in $len
+
+ This example is fully equivalent with:
+
+ my $len = 0;
+ GetOptions ('length=i' => \$len); # will store in $len
+
+ Any mixture is possible. For example, the most frequently used options
+ could be stored in variables while all other options get stored in the
+ hash:
+
+ my $verbose = 0; # frequently referred
+ my $debug = 0; # frequently referred
+ my %h = ('verbose' => \$verbose, 'debug' => \$debug);
+ GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
+ if ( $verbose ) { ... }
+ if ( exists $h{filter} ) { ... option 'filter' was specified ... }
+
+ =head2 Bundling
+
+ With bundling it is possible to set several single-character options
+ at once. For example if C<a>, C<v> and C<x> are all valid options,
+
+ -vax
+
+ will set all three.
+
+ Getopt::Long supports three styles of bundling. To enable bundling, a
+ call to Getopt::Long::Configure is required.
+
+ The simplest style of bundling can be enabled with:
+
+ Getopt::Long::Configure ("bundling");
+
+ Configured this way, single-character options can be bundled but long
+ options B<must> always start with a double dash C<--> to avoid
+ ambiguity. For example, when C<vax>, C<a>, C<v> and C<x> are all valid
+ options,
+
+ -vax
+
+ will set C<a>, C<v> and C<x>, but
+
+ --vax
+
+ will set C<vax>.
+
+ The second style of bundling lifts this restriction. It can be enabled
+ with:
+
+ Getopt::Long::Configure ("bundling_override");
+
+ Now, C<-vax> will set the option C<vax>.
+
+ In all of the above cases, option values may be inserted in the
+ bundle. For example:
+
+ -h24w80
+
+ is equivalent to
+
+ -h 24 -w 80
+
+ A third style of bundling allows only values to be bundled with
+ options. It can be enabled with:
+
+ Getopt::Long::Configure ("bundling_values");
+
+ Now, C<-h24> will set the option C<h> to C<24>, but option bundles
+ like C<-vxa> and C<-h24w80> are flagged as errors.
+
+ Enabling C<bundling_values> will disable the other two styles of
+ bundling.
+
+ When configured for bundling, single-character options are matched
+ case sensitive while long options are matched case insensitive. To
+ have the single-character options matched case insensitive as well,
+ use:
+
+ Getopt::Long::Configure ("bundling", "ignorecase_always");
+
+ It goes without saying that bundling can be quite confusing.
+
+ =head2 The lonesome dash
+
+ Normally, a lone dash C<-> on the command line will not be considered
+ an option. Option processing will terminate (unless "permute" is
+ configured) and the dash will be left in C<@ARGV>.
+
+ It is possible to get special treatment for a lone dash. This can be
+ achieved by adding an option specification with an empty name, for
+ example:
+
+ GetOptions ('' => \$stdio);
+
+ A lone dash on the command line will now be a legal option, and using
+ it will set variable C<$stdio>.
+
+ =head2 Argument callback
+
+ A special option 'name' C<< <> >> can be used to designate a subroutine
+ to handle non-option arguments. When GetOptions() encounters an
+ argument that does not look like an option, it will immediately call this
+ subroutine and passes it one parameter: the argument name. Well, actually
+ it is an object that stringifies to the argument name.
+
+ For example:
+
+ my $width = 80;
+ sub process { ... }
+ GetOptions ('width=i' => \$width, '<>' => \&process);
+
+ When applied to the following command line:
+
+ arg1 --width=72 arg2 --width=60 arg3
+
+ This will call
+ C<process("arg1")> while C<$width> is C<80>,
+ C<process("arg2")> while C<$width> is C<72>, and
+ C<process("arg3")> while C<$width> is C<60>.
+
+ This feature requires configuration option B<permute>, see section
+ L<Configuring Getopt::Long>.
+
+ =head1 Configuring Getopt::Long
+
+ Getopt::Long can be configured by calling subroutine
+ Getopt::Long::Configure(). This subroutine takes a list of quoted
+ strings, each specifying a configuration option to be enabled, e.g.
+ C<ignore_case>, or disabled, e.g. C<no_ignore_case>. Case does not
+ matter. Multiple calls to Configure() are possible.
+
+ Alternatively, as of version 2.24, the configuration options may be
+ passed together with the C<use> statement:
+
+ use Getopt::Long qw(:config no_ignore_case bundling);
+
+ The following options are available:
+
+ =over 12
+
+ =item default
+
+ This option causes all configuration options to be reset to their
+ default values.
+
+ =item posix_default
+
+ This option causes all configuration options to be reset to their
+ default values as if the environment variable POSIXLY_CORRECT had
+ been set.
+
+ =item auto_abbrev
+
+ Allow option names to be abbreviated to uniqueness.
+ Default is enabled unless environment variable
+ POSIXLY_CORRECT has been set, in which case C<auto_abbrev> is disabled.
+
+ =item getopt_compat
+
+ Allow C<+> to start options.
+ Default is enabled unless environment variable
+ POSIXLY_CORRECT has been set, in which case C<getopt_compat> is disabled.
+
+ =item gnu_compat
+
+ C<gnu_compat> controls whether C<--opt=> is allowed, and what it should
+ do. Without C<gnu_compat>, C<--opt=> gives an error. With C<gnu_compat>,
+ C<--opt=> will give option C<opt> and empty value.
+ This is the way GNU getopt_long() does it.
+
+ =item gnu_getopt
+
+ This is a short way of setting C<gnu_compat> C<bundling> C<permute>
+ C<no_getopt_compat>. With C<gnu_getopt>, command line handling should be
+ fully compatible with GNU getopt_long().
+
+ =item require_order
+
+ Whether command line arguments are allowed to be mixed with options.
+ Default is disabled unless environment variable
+ POSIXLY_CORRECT has been set, in which case C<require_order> is enabled.
+
+ See also C<permute>, which is the opposite of C<require_order>.
+
+ =item permute
+
+ Whether command line arguments are allowed to be mixed with options.
+ Default is enabled unless environment variable
+ POSIXLY_CORRECT has been set, in which case C<permute> is disabled.
+ Note that C<permute> is the opposite of C<require_order>.
+
+ If C<permute> is enabled, this means that
+
+ --foo arg1 --bar arg2 arg3
+
+ is equivalent to
+
+ --foo --bar arg1 arg2 arg3
+
+ If an argument callback routine is specified, C<@ARGV> will always be
+ empty upon successful return of GetOptions() since all options have been
+ processed. The only exception is when C<--> is used:
+
+ --foo arg1 --bar arg2 -- arg3
+
+ This will call the callback routine for arg1 and arg2, and then
+ terminate GetOptions() leaving C<"arg3"> in C<@ARGV>.
+
+ If C<require_order> is enabled, options processing
+ terminates when the first non-option is encountered.
+
+ --foo arg1 --bar arg2 arg3
+
+ is equivalent to
+
+ --foo -- arg1 --bar arg2 arg3
+
+ If C<pass_through> is also enabled, options processing will terminate
+ at the first unrecognized option, or non-option, whichever comes
+ first.
+
+ =item bundling (default: disabled)
+
+ Enabling this option will allow single-character options to be
+ bundled. To distinguish bundles from long option names, long options
+ I<must> be introduced with C<--> and bundles with C<->.
+
+ Note that, if you have options C<a>, C<l> and C<all>, and
+ auto_abbrev enabled, possible arguments and option settings are:
+
+ using argument sets option(s)
+ ------------------------------------------
+ -a, --a a
+ -l, --l l
+ -al, -la, -ala, -all,... a, l
+ --al, --all all
+
+ The surprising part is that C<--a> sets option C<a> (due to auto
+ completion), not C<all>.
+
+ Note: disabling C<bundling> also disables C<bundling_override>.
+
+ =item bundling_override (default: disabled)
+
+ If C<bundling_override> is enabled, bundling is enabled as with
+ C<bundling> but now long option names override option bundles.
+
+ Note: disabling C<bundling_override> also disables C<bundling>.
+
+ B<Note:> Using option bundling can easily lead to unexpected results,
+ especially when mixing long options and bundles. Caveat emptor.
+
+ =item ignore_case (default: enabled)
+
+ If enabled, case is ignored when matching option names. If, however,
+ bundling is enabled as well, single character options will be treated
+ case-sensitive.
+
+ With C<ignore_case>, option specifications for options that only
+ differ in case, e.g., C<"foo"> and C<"Foo">, will be flagged as
+ duplicates.
+
+ Note: disabling C<ignore_case> also disables C<ignore_case_always>.
+
+ =item ignore_case_always (default: disabled)
+
+ When bundling is in effect, case is ignored on single-character
+ options also.
+
+ Note: disabling C<ignore_case_always> also disables C<ignore_case>.
+
+ =item auto_version (default:disabled)
+
+ Automatically provide support for the B<--version> option if
+ the application did not specify a handler for this option itself.
+
+ Getopt::Long will provide a standard version message that includes the
+ program name, its version (if $main::VERSION is defined), and the
+ versions of Getopt::Long and Perl. The message will be written to
+ standard output and processing will terminate.
+
+ C<auto_version> will be enabled if the calling program explicitly
+ specified a version number higher than 2.32 in the C<use> or
+ C<require> statement.
+
+ =item auto_help (default:disabled)
+
+ Automatically provide support for the B<--help> and B<-?> options if
+ the application did not specify a handler for this option itself.
+
+ Getopt::Long will provide a help message using module L<Pod::Usage>. The
+ message, derived from the SYNOPSIS POD section, will be written to
+ standard output and processing will terminate.
+
+ C<auto_help> will be enabled if the calling program explicitly
+ specified a version number higher than 2.32 in the C<use> or
+ C<require> statement.
+
+ =item pass_through (default: disabled)
+
+ With C<pass_through> anything that is unknown, ambiguous or supplied with
+ an invalid option will not be flagged as an error. Instead the unknown
+ option(s) will be passed to the catchall C<< <> >> if present, otherwise
+ through to C<@ARGV>. This makes it possible to write wrapper scripts that
+ process only part of the user supplied command line arguments, and pass the
+ remaining options to some other program.
+
+ If C<require_order> is enabled, options processing will terminate at the
+ first unrecognized option, or non-option, whichever comes first and all
+ remaining arguments are passed to C<@ARGV> instead of the catchall
+ C<< <> >> if present. However, if C<permute> is enabled instead, results
+ can become confusing.
+
+ Note that the options terminator (default C<-->), if present, will
+ also be passed through in C<@ARGV>.
+
+ =item prefix
+
+ The string that starts options. If a constant string is not
+ sufficient, see C<prefix_pattern>.
+
+ =item prefix_pattern
+
+ A Perl pattern that identifies the strings that introduce options.
+ Default is C<--|-|\+> unless environment variable
+ POSIXLY_CORRECT has been set, in which case it is C<--|->.
+
+ =item long_prefix_pattern
+
+ A Perl pattern that allows the disambiguation of long and short
+ prefixes. Default is C<-->.
+
+ Typically you only need to set this if you are using nonstandard
+ prefixes and want some or all of them to have the same semantics as
+ '--' does under normal circumstances.
+
+ For example, setting prefix_pattern to C<--|-|\+|\/> and
+ long_prefix_pattern to C<--|\/> would add Win32 style argument
+ handling.
+
+ =item debug (default: disabled)
+
+ Enable debugging output.
+
+ =back
+
+ =head1 Exportable Methods
+
+ =over
+
+ =item VersionMessage
+
+ This subroutine provides a standard version message. Its argument can be:
+
+ =over 4
+
+ =item *
+
+ A string containing the text of a message to print I<before> printing
+ the standard message.
+
+ =item *
+
+ A numeric value corresponding to the desired exit status.
+
+ =item *
+
+ A reference to a hash.
+
+ =back
+
+ If more than one argument is given then the entire argument list is
+ assumed to be a hash. If a hash is supplied (either as a reference or
+ as a list) it should contain one or more elements with the following
+ keys:
+
+ =over 4
+
+ =item C<-message>
+
+ =item C<-msg>
+
+ The text of a message to print immediately prior to printing the
+ program's usage message.
+
+ =item C<-exitval>
+
+ The desired exit status to pass to the B<exit()> function.
+ This should be an integer, or else the string "NOEXIT" to
+ indicate that control should simply be returned without
+ terminating the invoking process.
+
+ =item C<-output>
+
+ A reference to a filehandle, or the pathname of a file to which the
+ usage message should be written. The default is C<\*STDERR> unless the
+ exit value is less than 2 (in which case the default is C<\*STDOUT>).
+
+ =back
+
+ You cannot tie this routine directly to an option, e.g.:
+
+ GetOptions("version" => \&VersionMessage);
+
+ Use this instead:
+
+ GetOptions("version" => sub { VersionMessage() });
+
+ =item HelpMessage
+
+ This subroutine produces a standard help message, derived from the
+ program's POD section SYNOPSIS using L<Pod::Usage>. It takes the same
+ arguments as VersionMessage(). In particular, you cannot tie it
+ directly to an option, e.g.:
+
+ GetOptions("help" => \&HelpMessage);
+
+ Use this instead:
+
+ GetOptions("help" => sub { HelpMessage() });
+
+ =back
+
+ =head1 Return values and Errors
+
+ Configuration errors and errors in the option definitions are
+ signalled using die() and will terminate the calling program unless
+ the call to Getopt::Long::GetOptions() was embedded in C<eval { ...
+ }>, or die() was trapped using C<$SIG{__DIE__}>.
+
+ GetOptions returns true to indicate success.
+ It returns false when the function detected one or more errors during
+ option parsing. These errors are signalled using warn() and can be
+ trapped with C<$SIG{__WARN__}>.
+
+ =head1 Legacy
+
+ The earliest development of C<newgetopt.pl> started in 1990, with Perl
+ version 4. As a result, its development, and the development of
+ Getopt::Long, has gone through several stages. Since backward
+ compatibility has always been extremely important, the current version
+ of Getopt::Long still supports a lot of constructs that nowadays are
+ no longer necessary or otherwise unwanted. This section describes
+ briefly some of these 'features'.
+
+ =head2 Default destinations
+
+ When no destination is specified for an option, GetOptions will store
+ the resultant value in a global variable named C<opt_>I<XXX>, where
+ I<XXX> is the primary name of this option. When a program executes
+ under C<use strict> (recommended), these variables must be
+ pre-declared with our() or C<use vars>.
+
+ our $opt_length = 0;
+ GetOptions ('length=i'); # will store in $opt_length
+
+ To yield a usable Perl variable, characters that are not part of the
+ syntax for variables are translated to underscores. For example,
+ C<--fpp-struct-return> will set the variable
+ C<$opt_fpp_struct_return>. Note that this variable resides in the
+ namespace of the calling program, not necessarily C<main>. For
+ example:
+
+ GetOptions ("size=i", "sizes=i@");
+
+ with command line "-size 10 -sizes 24 -sizes 48" will perform the
+ equivalent of the assignments
+
+ $opt_size = 10;
+ @opt_sizes = (24, 48);
+
+ =head2 Alternative option starters
+
+ A string of alternative option starter characters may be passed as the
+ first argument (or the first argument after a leading hash reference
+ argument).
+
+ my $len = 0;
+ GetOptions ('/', 'length=i' => $len);
+
+ Now the command line may look like:
+
+ /length 24 -- arg
+
+ Note that to terminate options processing still requires a double dash
+ C<-->.
+
+ GetOptions() will not interpret a leading C<< "<>" >> as option starters
+ if the next argument is a reference. To force C<< "<" >> and C<< ">" >> as
+ option starters, use C<< "><" >>. Confusing? Well, B<using a starter
+ argument is strongly deprecated> anyway.
+
+ =head2 Configuration variables
+
+ Previous versions of Getopt::Long used variables for the purpose of
+ configuring. Although manipulating these variables still work, it is
+ strongly encouraged to use the C<Configure> routine that was introduced
+ in version 2.17. Besides, it is much easier.
+
+ =head1 Tips and Techniques
+
+ =head2 Pushing multiple values in a hash option
+
+ Sometimes you want to combine the best of hashes and arrays. For
+ example, the command line:
+
+ --list add=first --list add=second --list add=third
+
+ where each successive 'list add' option will push the value of add
+ into array ref $list->{'add'}. The result would be like
+
+ $list->{add} = [qw(first second third)];
+
+ This can be accomplished with a destination routine:
+
+ GetOptions('list=s%' =>
+ sub { push(@{$list{$_[1]}}, $_[2]) });
+
+ =head1 Troubleshooting
+
+ =head2 GetOptions does not return a false result when an option is not supplied
+
+ That's why they're called 'options'.
+
+ =head2 GetOptions does not split the command line correctly
+
+ The command line is not split by GetOptions, but by the command line
+ interpreter (CLI). On Unix, this is the shell. On Windows, it is
+ COMMAND.COM or CMD.EXE. Other operating systems have other CLIs.
+
+ It is important to know that these CLIs may behave different when the
+ command line contains special characters, in particular quotes or
+ backslashes. For example, with Unix shells you can use single quotes
+ (C<'>) and double quotes (C<">) to group words together. The following
+ alternatives are equivalent on Unix:
+
+ "two words"
+ 'two words'
+ two\ words
+
+ In case of doubt, insert the following statement in front of your Perl
+ program:
+
+ print STDERR (join("|",@ARGV),"\n");
+
+ to verify how your CLI passes the arguments to the program.
+
+ =head2 Undefined subroutine &main::GetOptions called
+
+ Are you running Windows, and did you write
+
+ use GetOpt::Long;
+
+ (note the capital 'O')?
+
+ =head2 How do I put a "-?" option into a Getopt::Long?
+
+ You can only obtain this using an alias, and Getopt::Long of at least
+ version 2.13.
+
+ use Getopt::Long;
+ GetOptions ("help|?"); # -help and -? will both set $opt_help
+
+ Other characters that can't appear in Perl identifiers are also supported
+ as aliases with Getopt::Long of at least version 2.39.
+
+ As of version 2.32 Getopt::Long provides auto-help, a quick and easy way
+ to add the options --help and -? to your program, and handle them.
+
+ See C<auto_help> in section L<Configuring Getopt::Long>.
+
+ =head1 AUTHOR
+
+ Johan Vromans <jvromans@squirrel.nl>
+
+ =head1 COPYRIGHT AND DISCLAIMER
+
+ This program is Copyright 1990,2015 by Johan Vromans.
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the Perl Artistic License or the
+ 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.
+
+ If you do not have a copy of the GNU General Public License write to
+ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+
+ =cut
+
+GETOPT_LONG
+
+$fatpacked{"JSON.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON';
+ package JSON;
+
+
+ use strict;
+ use Carp ();
+ use base qw(Exporter);
+ @JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_json);
+
+ BEGIN {
+ $JSON::VERSION = '2.90';
+ $JSON::DEBUG = 0 unless (defined $JSON::DEBUG);
+ $JSON::DEBUG = $ENV{ PERL_JSON_DEBUG } if exists $ENV{ PERL_JSON_DEBUG };
+ }
+
+ my $Module_XS = 'JSON::XS';
+ my $Module_PP = 'JSON::PP';
+ my $Module_bp = 'JSON::backportPP'; # included in JSON distribution
+ my $PP_Version = '2.27203';
+ my $XS_Version = '2.34';
+
+
+ # XS and PP common methods
+
+ my @PublicMethods = qw/
+ ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref
+ allow_blessed convert_blessed filter_json_object filter_json_single_key_object
+ shrink max_depth max_size encode decode decode_prefix allow_unknown
+ /;
+
+ my @Properties = qw/
+ ascii latin1 utf8 indent space_before space_after relaxed canonical allow_nonref
+ allow_blessed convert_blessed shrink max_depth max_size allow_unknown
+ /;
+
+ my @XSOnlyMethods = qw/allow_tags/; # Currently nothing
+
+ my @PPOnlyMethods = qw/
+ indent_length sort_by
+ allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed
+ /; # JSON::PP specific
+
+
+ # used in _load_xs and _load_pp ($INSTALL_ONLY is not used currently)
+ my $_INSTALL_DONT_DIE = 1; # When _load_xs fails to load XS, don't die.
+ my $_INSTALL_ONLY = 2; # Don't call _set_methods()
+ my $_ALLOW_UNSUPPORTED = 0;
+ my $_UNIV_CONV_BLESSED = 0;
+ my $_USSING_bpPP = 0;
+
+
+ # Check the environment variable to decide worker module.
+
+ unless ($JSON::Backend) {
+ $JSON::DEBUG and Carp::carp("Check used worker module...");
+
+ my $backend = exists $ENV{PERL_JSON_BACKEND} ? $ENV{PERL_JSON_BACKEND} : 1;
+
+ if ($backend eq '1' or $backend =~ /JSON::XS\s*,\s*JSON::PP/) {
+ _load_xs($_INSTALL_DONT_DIE) or _load_pp();
+ }
+ elsif ($backend eq '0' or $backend eq 'JSON::PP') {
+ _load_pp();
+ }
+ elsif ($backend eq '2' or $backend eq 'JSON::XS') {
+ _load_xs();
+ }
+ elsif ($backend eq 'JSON::backportPP') {
+ $_USSING_bpPP = 1;
+ _load_pp();
+ }
+ else {
+ Carp::croak "The value of environmental variable 'PERL_JSON_BACKEND' is invalid.";
+ }
+ }
+
+
+ sub import {
+ my $pkg = shift;
+ my @what_to_export;
+ my $no_export;
+
+ for my $tag (@_) {
+ if ($tag eq '-support_by_pp') {
+ if (!$_ALLOW_UNSUPPORTED++) {
+ JSON::Backend::XS
+ ->support_by_pp(@PPOnlyMethods) if ($JSON::Backend eq $Module_XS);
+ }
+ next;
+ }
+ elsif ($tag eq '-no_export') {
+ $no_export++, next;
+ }
+ elsif ( $tag eq '-convert_blessed_universally' ) {
+ eval q|
+ require B;
+ *UNIVERSAL::TO_JSON = sub {
+ my $b_obj = B::svref_2object( $_[0] );
+ return $b_obj->isa('B::HV') ? { %{ $_[0] } }
+ : $b_obj->isa('B::AV') ? [ @{ $_[0] } ]
+ : undef
+ ;
+ }
+ | if ( !$_UNIV_CONV_BLESSED++ );
+ next;
+ }
+ push @what_to_export, $tag;
+ }
+
+ return if ($no_export);
+
+ __PACKAGE__->export_to_level(1, $pkg, @what_to_export);
+ }
+
+
+ # OBSOLETED
+
+ sub jsonToObj {
+ my $alternative = 'from_json';
+ if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
+ shift @_; $alternative = 'decode';
+ }
+ Carp::carp "'jsonToObj' will be obsoleted. Please use '$alternative' instead.";
+ return JSON::from_json(@_);
+ };
+
+ sub objToJson {
+ my $alternative = 'to_json';
+ if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
+ shift @_; $alternative = 'encode';
+ }
+ Carp::carp "'objToJson' will be obsoleted. Please use '$alternative' instead.";
+ JSON::to_json(@_);
+ };
+
+
+ # INTERFACES
+
+ sub to_json ($@) {
+ if (
+ ref($_[0]) eq 'JSON'
+ or (@_ > 2 and $_[0] eq 'JSON')
+ ) {
+ Carp::croak "to_json should not be called as a method.";
+ }
+ my $json = JSON->new;
+
+ if (@_ == 2 and ref $_[1] eq 'HASH') {
+ my $opt = $_[1];
+ for my $method (keys %$opt) {
+ $json->$method( $opt->{$method} );
+ }
+ }
+
+ $json->encode($_[0]);
+ }
+
+
+ sub from_json ($@) {
+ if ( ref($_[0]) eq 'JSON' or $_[0] eq 'JSON' ) {
+ Carp::croak "from_json should not be called as a method.";
+ }
+ my $json = JSON->new;
+
+ if (@_ == 2 and ref $_[1] eq 'HASH') {
+ my $opt = $_[1];
+ for my $method (keys %$opt) {
+ $json->$method( $opt->{$method} );
+ }
+ }
+
+ return $json->decode( $_[0] );
+ }
+
+
+
+ sub true { $JSON::true }
+
+ sub false { $JSON::false }
+
+ sub null { undef; }
+
+
+ sub require_xs_version { $XS_Version; }
+
+ sub backend {
+ my $proto = shift;
+ $JSON::Backend;
+ }
+
+ #*module = *backend;
+
+
+ sub is_xs {
+ return $_[0]->backend eq $Module_XS;
+ }
+
+
+ sub is_pp {
+ return not $_[0]->is_xs;
+ }
+
+
+ sub pureperl_only_methods { @PPOnlyMethods; }
+
+
+ sub property {
+ my ($self, $name, $value) = @_;
+
+ if (@_ == 1) {
+ my %props;
+ for $name (@Properties) {
+ my $method = 'get_' . $name;
+ if ($name eq 'max_size') {
+ my $value = $self->$method();
+ $props{$name} = $value == 1 ? 0 : $value;
+ next;
+ }
+ $props{$name} = $self->$method();
+ }
+ return \%props;
+ }
+ elsif (@_ > 3) {
+ Carp::croak('property() can take only the option within 2 arguments.');
+ }
+ elsif (@_ == 2) {
+ if ( my $method = $self->can('get_' . $name) ) {
+ if ($name eq 'max_size') {
+ my $value = $self->$method();
+ return $value == 1 ? 0 : $value;
+ }
+ $self->$method();
+ }
+ }
+ else {
+ $self->$name($value);
+ }
+
+ }
+
+
+
+ # INTERNAL
+
+ sub _load_xs {
+ my $opt = shift;
+
+ $JSON::DEBUG and Carp::carp "Load $Module_XS.";
+
+ # if called after install module, overload is disable.... why?
+ JSON::Boolean::_overrride_overload($Module_XS);
+ JSON::Boolean::_overrride_overload($Module_PP);
+
+ eval qq|
+ use $Module_XS $XS_Version ();
+ |;
+
+ if ($@) {
+ if (defined $opt and $opt & $_INSTALL_DONT_DIE) {
+ $JSON::DEBUG and Carp::carp "Can't load $Module_XS...($@)";
+ return 0;
+ }
+ Carp::croak $@;
+ }
+
+ unless (defined $opt and $opt & $_INSTALL_ONLY) {
+ _set_module( $JSON::Backend = $Module_XS );
+ my $data = join("", <DATA>); # this code is from Jcode 2.xx.
+ close(DATA);
+ eval $data;
+ JSON::Backend::XS->init;
+ }
+
+ return 1;
+ };
+
+
+ sub _load_pp {
+ my $opt = shift;
+ my $backend = $_USSING_bpPP ? $Module_bp : $Module_PP;
+
+ $JSON::DEBUG and Carp::carp "Load $backend.";
+
+ # if called after install module, overload is disable.... why?
+ JSON::Boolean::_overrride_overload($Module_XS);
+ JSON::Boolean::_overrride_overload($backend);
+
+ if ( $_USSING_bpPP ) {
+ eval qq| require $backend |;
+ }
+ else {
+ eval qq| use $backend $PP_Version () |;
+ }
+
+ if ($@) {
+ if ( $backend eq $Module_PP ) {
+ $JSON::DEBUG and Carp::carp "Can't load $Module_PP ($@), so try to load $Module_bp";
+ $_USSING_bpPP++;
+ $backend = $Module_bp;
+ JSON::Boolean::_overrride_overload($backend);
+ local $^W; # if PP installed but invalid version, backportPP redefines methods.
+ eval qq| require $Module_bp |;
+ }
+ Carp::croak $@ if $@;
+ }
+
+ unless (defined $opt and $opt & $_INSTALL_ONLY) {
+ _set_module( $JSON::Backend = $Module_PP ); # even if backportPP, set $Backend with 'JSON::PP'
+ JSON::Backend::PP->init;
+ }
+ };
+
+
+ sub _set_module {
+ return if defined $JSON::true;
+
+ my $module = shift;
+
+ local $^W;
+ no strict qw(refs);
+
+ $JSON::true = ${"$module\::true"};
+ $JSON::false = ${"$module\::false"};
+
+ push @JSON::ISA, $module;
+ if ( JSON->is_xs and JSON->backend->VERSION < 3 ) {
+ eval 'package JSON::PP::Boolean';
+ push @{"$module\::Boolean::ISA"}, qw(JSON::PP::Boolean);
+ }
+
+ *{"JSON::is_bool"} = \&{"$module\::is_bool"};
+
+ for my $method ($module eq $Module_XS ? @PPOnlyMethods : @XSOnlyMethods) {
+ *{"JSON::$method"} = sub {
+ Carp::carp("$method is not supported in $module.");
+ $_[0];
+ };
+ }
+
+ return 1;
+ }
+
+
+
+ #
+ # JSON Boolean
+ #
+
+ package JSON::Boolean;
+
+ my %Installed;
+
+ sub _overrride_overload {
+ return; # this function is currently disable.
+ return if ($Installed{ $_[0] }++);
+
+ my $boolean = $_[0] . '::Boolean';
+
+ eval sprintf(q|
+ package %s;
+ use overload (
+ '""' => sub { ${$_[0]} == 1 ? 'true' : 'false' },
+ 'eq' => sub {
+ my ($obj, $op) = ref ($_[0]) ? ($_[0], $_[1]) : ($_[1], $_[0]);
+ if ($op eq 'true' or $op eq 'false') {
+ return "$obj" eq 'true' ? 'true' eq $op : 'false' eq $op;
+ }
+ else {
+ return $obj ? 1 == $op : 0 == $op;
+ }
+ },
+ );
+ |, $boolean);
+
+ if ($@) { Carp::croak $@; }
+
+ if ( exists $INC{'JSON/XS.pm'} and $boolean eq 'JSON::XS::Boolean' ) {
+ local $^W;
+ my $true = do { bless \(my $dummy = 1), $boolean };
+ my $false = do { bless \(my $dummy = 0), $boolean };
+ *JSON::XS::true = sub () { $true };
+ *JSON::XS::false = sub () { $false };
+ }
+ elsif ( exists $INC{'JSON/PP.pm'} and $boolean eq 'JSON::PP::Boolean' ) {
+ local $^W;
+ my $true = do { bless \(my $dummy = 1), $boolean };
+ my $false = do { bless \(my $dummy = 0), $boolean };
+ *JSON::PP::true = sub { $true };
+ *JSON::PP::false = sub { $false };
+ }
+
+ return 1;
+ }
+
+
+ #
+ # Helper classes for Backend Module (PP)
+ #
+
+ package JSON::Backend::PP;
+
+ sub init {
+ local $^W;
+ no strict qw(refs); # this routine may be called after JSON::Backend::XS init was called.
+ *{"JSON::decode_json"} = \&{"JSON::PP::decode_json"};
+ *{"JSON::encode_json"} = \&{"JSON::PP::encode_json"};
+ *{"JSON::PP::is_xs"} = sub { 0 };
+ *{"JSON::PP::is_pp"} = sub { 1 };
+ return 1;
+ }
+
+ #
+ # To save memory, the below lines are read only when XS backend is used.
+ #
+
+ package JSON;
+
+ 1;
+ __DATA__
+
+
+ #
+ # Helper classes for Backend Module (XS)
+ #
+
+ package JSON::Backend::XS;
+
+ use constant INDENT_LENGTH_FLAG => 15 << 12;
+
+ use constant UNSUPPORTED_ENCODE_FLAG => {
+ ESCAPE_SLASH => 0x00000010,
+ ALLOW_BIGNUM => 0x00000020,
+ AS_NONBLESSED => 0x00000040,
+ EXPANDED => 0x10000000, # for developer's
+ };
+
+ use constant UNSUPPORTED_DECODE_FLAG => {
+ LOOSE => 0x00000001,
+ ALLOW_BIGNUM => 0x00000002,
+ ALLOW_BAREKEY => 0x00000004,
+ ALLOW_SINGLEQUOTE => 0x00000008,
+ EXPANDED => 0x20000000, # for developer's
+ };
+
+
+ sub init {
+ local $^W;
+ no strict qw(refs);
+ *{"JSON::decode_json"} = \&{"JSON::XS::decode_json"};
+ *{"JSON::encode_json"} = \&{"JSON::XS::encode_json"};
+ *{"JSON::XS::is_xs"} = sub { 1 };
+ *{"JSON::XS::is_pp"} = sub { 0 };
+ return 1;
+ }
+
+
+ sub support_by_pp {
+ my ($class, @methods) = @_;
+
+ local $^W;
+ no strict qw(refs);
+
+ my $JSON_XS_encode_orignal = \&JSON::XS::encode;
+ my $JSON_XS_decode_orignal = \&JSON::XS::decode;
+ my $JSON_XS_incr_parse_orignal = \&JSON::XS::incr_parse;
+
+ *JSON::XS::decode = \&JSON::Backend::XS::Supportable::_decode;
+ *JSON::XS::encode = \&JSON::Backend::XS::Supportable::_encode;
+ *JSON::XS::incr_parse = \&JSON::Backend::XS::Supportable::_incr_parse;
+
+ *{JSON::XS::_original_decode} = $JSON_XS_decode_orignal;
+ *{JSON::XS::_original_encode} = $JSON_XS_encode_orignal;
+ *{JSON::XS::_original_incr_parse} = $JSON_XS_incr_parse_orignal;
+
+ push @JSON::Backend::XS::Supportable::ISA, 'JSON';
+
+ my $pkg = 'JSON::Backend::XS::Supportable';
+
+ *{JSON::new} = sub {
+ my $proto = JSON::XS->new; $$proto = 0;
+ bless $proto, $pkg;
+ };
+
+
+ for my $method (@methods) {
+ my $flag = uc($method);
+ my $type |= (UNSUPPORTED_ENCODE_FLAG->{$flag} || 0);
+ $type |= (UNSUPPORTED_DECODE_FLAG->{$flag} || 0);
+
+ next unless($type);
+
+ $pkg->_make_unsupported_method($method => $type);
+ }
+
+ # push @{"JSON::XS::Boolean::ISA"}, qw(JSON::PP::Boolean);
+ # push @{"JSON::PP::Boolean::ISA"}, qw(JSON::Boolean);
+
+ $JSON::DEBUG and Carp::carp("set -support_by_pp mode.");
+
+ return 1;
+ }
+
+
+
+
+ #
+ # Helper classes for XS
+ #
+
+ package JSON::Backend::XS::Supportable;
+
+ $Carp::Internal{'JSON::Backend::XS::Supportable'} = 1;
+
+ sub _make_unsupported_method {
+ my ($pkg, $method, $type) = @_;
+
+ local $^W;
+ no strict qw(refs);
+
+ *{"$pkg\::$method"} = sub {
+ local $^W;
+ if (defined $_[1] ? $_[1] : 1) {
+ ${$_[0]} |= $type;
+ }
+ else {
+ ${$_[0]} &= ~$type;
+ }
+ $_[0];
+ };
+
+ *{"$pkg\::get_$method"} = sub {
+ ${$_[0]} & $type ? 1 : '';
+ };
+
+ }
+
+
+ sub _set_for_pp {
+ JSON::_load_pp( $_INSTALL_ONLY );
+
+ my $type = shift;
+ my $pp = JSON::PP->new;
+ my $prop = $_[0]->property;
+
+ for my $name (keys %$prop) {
+ $pp->$name( $prop->{$name} ? $prop->{$name} : 0 );
+ }
+
+ my $unsupported = $type eq 'encode' ? JSON::Backend::XS::UNSUPPORTED_ENCODE_FLAG
+ : JSON::Backend::XS::UNSUPPORTED_DECODE_FLAG;
+ my $flags = ${$_[0]} || 0;
+
+ for my $name (keys %$unsupported) {
+ next if ($name eq 'EXPANDED'); # for developer's
+ my $enable = ($flags & $unsupported->{$name}) ? 1 : 0;
+ my $method = lc $name;
+ $pp->$method($enable);
+ }
+
+ $pp->indent_length( $_[0]->get_indent_length );
+
+ return $pp;
+ }
+
+ sub _encode { # using with PP encode
+ if (${$_[0]}) {
+ _set_for_pp('encode' => @_)->encode($_[1]);
+ }
+ else {
+ $_[0]->_original_encode( $_[1] );
+ }
+ }
+
+
+ sub _decode { # if unsupported-flag is set, use PP
+ if (${$_[0]}) {
+ _set_for_pp('decode' => @_)->decode($_[1]);
+ }
+ else {
+ $_[0]->_original_decode( $_[1] );
+ }
+ }
+
+
+ sub decode_prefix { # if unsupported-flag is set, use PP
+ _set_for_pp('decode' => @_)->decode_prefix($_[1]);
+ }
+
+
+ sub _incr_parse {
+ if (${$_[0]}) {
+ _set_for_pp('decode' => @_)->incr_parse($_[1]);
+ }
+ else {
+ $_[0]->_original_incr_parse( $_[1] );
+ }
+ }
+
+
+ sub get_indent_length {
+ ${$_[0]} << 4 >> 16;
+ }
+
+
+ sub indent_length {
+ my $length = $_[1];
+
+ if (!defined $length or $length > 15 or $length < 0) {
+ Carp::carp "The acceptable range of indent_length() is 0 to 15.";
+ }
+ else {
+ local $^W;
+ $length <<= 12;
+ ${$_[0]} &= ~ JSON::Backend::XS::INDENT_LENGTH_FLAG;
+ ${$_[0]} |= $length;
+ *JSON::XS::encode = \&JSON::Backend::XS::Supportable::_encode;
+ }
+
+ $_[0];
+ }
+
+
+ 1;
+ __END__
+
+ =head1 NAME
+
+ JSON - JSON (JavaScript Object Notation) encoder/decoder
+
+ =head1 SYNOPSIS
+
+ use JSON; # imports encode_json, decode_json, to_json and from_json.
+
+ # simple and fast interfaces (expect/generate UTF-8)
+
+ $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
+ $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text;
+
+ # OO-interface
+
+ $json = JSON->new->allow_nonref;
+
+ $json_text = $json->encode( $perl_scalar );
+ $perl_scalar = $json->decode( $json_text );
+
+ $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing
+
+ # If you want to use PP only support features, call with '-support_by_pp'
+ # When XS unsupported feature is enable, using PP (de|en)code instead of XS ones.
+
+ use JSON -support_by_pp;
+
+ # option-acceptable interfaces (expect/generate UNICODE by default)
+
+ $json_text = to_json( $perl_scalar, { ascii => 1, pretty => 1 } );
+ $perl_scalar = from_json( $json_text, { utf8 => 1 } );
+
+ # Between (en|de)code_json and (to|from)_json, if you want to write
+ # a code which communicates to an outer world (encoded in UTF-8),
+ # recommend to use (en|de)code_json.
+
+ =head1 VERSION
+
+ 2.90
+
+ This version is compatible with JSON::XS B<2.34> and later.
+ (Not yet compatble to JSON::XS B<3.0x>.)
+
+
+ =head1 NOTE
+
+ JSON::PP was earlier included in the C<JSON> distribution, but
+ has since Perl 5.14 been a core module. For this reason,
+ L<JSON::PP> was removed from the JSON distribution and can now
+ be found also in the Perl5 repository at
+
+ =over
+
+ =item * L<http://perl5.git.perl.org/perl.git>
+
+ =back
+
+ (The newest JSON::PP version still exists in CPAN.)
+
+ Instead, the C<JSON> distribution will include JSON::backportPP
+ for backwards computability. JSON.pm should thus work as it did
+ before.
+
+ =head1 DESCRIPTION
+
+ *************************** CAUTION **************************************
+ * *
+ * INCOMPATIBLE CHANGE (JSON::XS version 2.90) *
+ * *
+ * JSON.pm had patched JSON::XS::Boolean and JSON::PP::Boolean internally *
+ * on loading time for making these modules inherit JSON::Boolean. *
+ * But since JSON::XS v3.0 it use Types::Serialiser as boolean class. *
+ * Then now JSON.pm breaks boolean classe overload features and *
+ * -support_by_pp if JSON::XS v3.0 or later is installed. *
+ * *
+ * JSON::true and JSON::false returned JSON::Boolean objects. *
+ * For workaround, they return JSON::PP::Boolean objects in this version. *
+ * *
+ * isa_ok(JSON::true, 'JSON::PP::Boolean'); *
+ * *
+ * And it discards a feature: *
+ * *
+ * ok(JSON::true eq 'true'); *
+ * *
+ * In other word, JSON::PP::Boolean overload numeric only. *
+ * *
+ * ok( JSON::true == 1 ); *
+ * *
+ **************************************************************************
+
+ ************************** CAUTION ********************************
+ * This is 'JSON module version 2' and there are many differences *
+ * to version 1.xx *
+ * Please check your applications using old version. *
+ * See to 'INCOMPATIBLE CHANGES TO OLD VERSION' *
+ *******************************************************************
+
+ JSON (JavaScript Object Notation) is a simple data format.
+ See to L<http://www.json.org/> and C<RFC4627>(L<http://www.ietf.org/rfc/rfc4627.txt>).
+
+ This module converts Perl data structures to JSON and vice versa using either
+ L<JSON::XS> or L<JSON::PP>.
+
+ JSON::XS is the fastest and most proper JSON module on CPAN which must be
+ compiled and installed in your environment.
+ JSON::PP is a pure-Perl module which is bundled in this distribution and
+ has a strong compatibility to JSON::XS.
+
+ This module try to use JSON::XS by default and fail to it, use JSON::PP instead.
+ So its features completely depend on JSON::XS or JSON::PP.
+
+ See to L<BACKEND MODULE DECISION>.
+
+ To distinguish the module name 'JSON' and the format type JSON,
+ the former is quoted by CE<lt>E<gt> (its results vary with your using media),
+ and the latter is left just as it is.
+
+ Module name : C<JSON>
+
+ Format type : JSON
+
+ =head2 FEATURES
+
+ =over
+
+ =item * correct unicode handling
+
+ This module (i.e. backend modules) knows how to handle Unicode, documents
+ how and when it does so, and even documents what "correct" means.
+
+ Even though there are limitations, this feature is available since Perl version 5.6.
+
+ JSON::XS requires Perl 5.8.2 (but works correctly in 5.8.8 or later), so in older versions
+ C<JSON> should call JSON::PP as the backend which can be used since Perl 5.005.
+
+ With Perl 5.8.x JSON::PP works, but from 5.8.0 to 5.8.2, because of a Perl side problem,
+ JSON::PP works slower in the versions. And in 5.005, the Unicode handling is not available.
+ See to L<JSON::PP/UNICODE HANDLING ON PERLS> for more information.
+
+ See also to L<JSON::XS/A FEW NOTES ON UNICODE AND PERL>
+ and L<JSON::XS/ENCODING/CODESET_FLAG_NOTES>.
+
+
+ =item * round-trip integrity
+
+ When you serialise a perl data structure using only data types supported
+ by JSON and Perl, the deserialised data structure is identical on the Perl
+ level. (e.g. the string "2.0" doesn't suddenly become "2" just because
+ it looks like a number). There I<are> minor exceptions to this, read the
+ L</MAPPING> section below to learn about those.
+
+
+ =item * strict checking of JSON correctness
+
+ There is no guessing, no generating of illegal JSON texts by default,
+ and only JSON is accepted as input by default (the latter is a security
+ feature).
+
+ See to L<JSON::XS/FEATURES> and L<JSON::PP/FEATURES>.
+
+ =item * fast
+
+ This module returns a JSON::XS object itself if available.
+ Compared to other JSON modules and other serialisers such as Storable,
+ JSON::XS usually compares favorably in terms of speed, too.
+
+ If not available, C<JSON> returns a JSON::PP object instead of JSON::XS and
+ it is very slow as pure-Perl.
+
+ =item * simple to use
+
+ This module has both a simple functional interface as well as an
+ object oriented interface interface.
+
+ =item * reasonably versatile output formats
+
+ You can choose between the most compact guaranteed-single-line format possible
+ (nice for simple line-based protocols), a pure-ASCII format (for when your transport
+ is not 8-bit clean, still supports the whole Unicode range), or a pretty-printed
+ format (for when you want to read that stuff). Or you can combine those features
+ in whatever way you like.
+
+ =back
+
+ =head1 FUNCTIONAL INTERFACE
+
+ Some documents are copied and modified from L<JSON::XS/FUNCTIONAL INTERFACE>.
+ C<to_json> and C<from_json> are additional functions.
+
+ =head2 encode_json
+
+ $json_text = encode_json $perl_scalar
+
+ Converts the given Perl data structure to a UTF-8 encoded, binary string.
+
+ This function call is functionally identical to:
+
+ $json_text = JSON->new->utf8->encode($perl_scalar)
+
+ =head2 decode_json
+
+ $perl_scalar = decode_json $json_text
+
+ The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
+ to parse that as an UTF-8 encoded JSON text, returning the resulting
+ reference.
+
+ This function call is functionally identical to:
+
+ $perl_scalar = JSON->new->utf8->decode($json_text)
+
+
+ =head2 to_json
+
+ $json_text = to_json($perl_scalar)
+
+ Converts the given Perl data structure to a json string.
+
+ This function call is functionally identical to:
+
+ $json_text = JSON->new->encode($perl_scalar)
+
+ Takes a hash reference as the second.
+
+ $json_text = to_json($perl_scalar, $flag_hashref)
+
+ So,
+
+ $json_text = to_json($perl_scalar, {utf8 => 1, pretty => 1})
+
+ equivalent to:
+
+ $json_text = JSON->new->utf8(1)->pretty(1)->encode($perl_scalar)
+
+ If you want to write a modern perl code which communicates to outer world,
+ you should use C<encode_json> (supposed that JSON data are encoded in UTF-8).
+
+ =head2 from_json
+
+ $perl_scalar = from_json($json_text)
+
+ The opposite of C<to_json>: expects a json string and tries
+ to parse it, returning the resulting reference.
+
+ This function call is functionally identical to:
+
+ $perl_scalar = JSON->decode($json_text)
+
+ Takes a hash reference as the second.
+
+ $perl_scalar = from_json($json_text, $flag_hashref)
+
+ So,
+
+ $perl_scalar = from_json($json_text, {utf8 => 1})
+
+ equivalent to:
+
+ $perl_scalar = JSON->new->utf8(1)->decode($json_text)
+
+ If you want to write a modern perl code which communicates to outer world,
+ you should use C<decode_json> (supposed that JSON data are encoded in UTF-8).
+
+ =head2 JSON::is_bool
+
+ $is_boolean = JSON::is_bool($scalar)
+
+ Returns true if the passed scalar represents either JSON::true or
+ JSON::false, two constants that act like C<1> and C<0> respectively
+ and are also used to represent JSON C<true> and C<false> in Perl strings.
+
+ =head2 JSON::true
+
+ Returns JSON true value which is blessed object.
+ It C<isa> JSON::Boolean object.
+
+ =head2 JSON::false
+
+ Returns JSON false value which is blessed object.
+ It C<isa> JSON::Boolean object.
+
+ =head2 JSON::null
+
+ Returns C<undef>.
+
+ See L<MAPPING>, below, for more information on how JSON values are mapped to
+ Perl.
+
+ =head1 HOW DO I DECODE A DATA FROM OUTER AND ENCODE TO OUTER
+
+ This section supposes that your perl version is 5.8 or later.
+
+ If you know a JSON text from an outer world - a network, a file content, and so on,
+ is encoded in UTF-8, you should use C<decode_json> or C<JSON> module object
+ with C<utf8> enable. And the decoded result will contain UNICODE characters.
+
+ # from network
+ my $json = JSON->new->utf8;
+ my $json_text = CGI->new->param( 'json_data' );
+ my $perl_scalar = $json->decode( $json_text );
+
+ # from file content
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ $json_text = <$fh>;
+ $perl_scalar = decode_json( $json_text );
+
+ If an outer data is not encoded in UTF-8, firstly you should C<decode> it.
+
+ use Encode;
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ my $encoding = 'cp932';
+ my $unicode_json_text = decode( $encoding, <$fh> ); # UNICODE
+
+ # or you can write the below code.
+ #
+ # open( my $fh, "<:encoding($encoding)", 'json.data' );
+ # $unicode_json_text = <$fh>;
+
+ In this case, C<$unicode_json_text> is of course UNICODE string.
+ So you B<cannot> use C<decode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable or C<from_json>.
+
+ $perl_scalar = $json->utf8(0)->decode( $unicode_json_text );
+ # or
+ $perl_scalar = from_json( $unicode_json_text );
+
+ Or C<encode 'utf8'> and C<decode_json>:
+
+ $perl_scalar = decode_json( encode( 'utf8', $unicode_json_text ) );
+ # this way is not efficient.
+
+ And now, you want to convert your C<$perl_scalar> into JSON data and
+ send it to an outer world - a network or a file content, and so on.
+
+ Your data usually contains UNICODE strings and you want the converted data to be encoded
+ in UTF-8, you should use C<encode_json> or C<JSON> module object with C<utf8> enable.
+
+ print encode_json( $perl_scalar ); # to a network? file? or display?
+ # or
+ print $json->utf8->encode( $perl_scalar );
+
+ If C<$perl_scalar> does not contain UNICODE but C<$encoding>-encoded strings
+ for some reason, then its characters are regarded as B<latin1> for perl
+ (because it does not concern with your $encoding).
+ You B<cannot> use C<encode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable or C<to_json>.
+ Note that the resulted text is a UNICODE string but no problem to print it.
+
+ # $perl_scalar contains $encoding encoded string values
+ $unicode_json_text = $json->utf8(0)->encode( $perl_scalar );
+ # or
+ $unicode_json_text = to_json( $perl_scalar );
+ # $unicode_json_text consists of characters less than 0x100
+ print $unicode_json_text;
+
+ Or C<decode $encoding> all string values and C<encode_json>:
+
+ $perl_scalar->{ foo } = decode( $encoding, $perl_scalar->{ foo } );
+ # ... do it to each string values, then encode_json
+ $json_text = encode_json( $perl_scalar );
+
+ This method is a proper way but probably not efficient.
+
+ See to L<Encode>, L<perluniintro>.
+
+
+ =head1 COMMON OBJECT-ORIENTED INTERFACE
+
+ =head2 new
+
+ $json = JSON->new
+
+ Returns a new C<JSON> object inherited from either JSON::XS or JSON::PP
+ that can be used to de/encode JSON strings.
+
+ All boolean flags described below are by default I<disabled>.
+
+ The mutators for flags all return the JSON object again and thus calls can
+ be chained:
+
+ my $json = JSON->new->utf8->space_after->encode({a => [1,2]})
+ => {"a": [1, 2]}
+
+ =head2 ascii
+
+ $json = $json->ascii([$enable])
+
+ $enabled = $json->get_ascii
+
+ If $enable is true (or missing), then the encode method will not generate characters outside
+ the code range 0..127. Any Unicode characters outside that range will be escaped using either
+ a single \uXXXX or a double \uHHHH\uLLLLL escape sequence, as per RFC4627.
+
+ If $enable is false, then the encode method will not escape Unicode characters unless
+ required by the JSON syntax or other flags. This results in a faster and more compact format.
+
+ This feature depends on the used Perl version and environment.
+
+ See to L<JSON::PP/UNICODE HANDLING ON PERLS> if the backend is PP.
+
+ JSON->new->ascii(1)->encode([chr 0x10401])
+ => ["\ud801\udc01"]
+
+ =head2 latin1
+
+ $json = $json->latin1([$enable])
+
+ $enabled = $json->get_latin1
+
+ If $enable is true (or missing), then the encode method will encode the resulting JSON
+ text as latin1 (or iso-8859-1), escaping any characters outside the code range 0..255.
+
+ If $enable is false, then the encode method will not escape Unicode characters
+ unless required by the JSON syntax or other flags.
+
+ JSON->new->latin1->encode (["\x{89}\x{abc}"]
+ => ["\x{89}\\u0abc"] # (perl syntax, U+abc escaped, U+89 not)
+
+ =head2 utf8
+
+ $json = $json->utf8([$enable])
+
+ $enabled = $json->get_utf8
+
+ If $enable is true (or missing), then the encode method will encode the JSON result
+ into UTF-8, as required by many protocols, while the decode method expects to be handled
+ an UTF-8-encoded string. Please note that UTF-8-encoded strings do not contain any
+ characters outside the range 0..255, they are thus useful for bytewise/binary I/O.
+
+ In future versions, enabling this option might enable autodetection of the UTF-16 and UTF-32
+ encoding families, as described in RFC4627.
+
+ If $enable is false, then the encode method will return the JSON string as a (non-encoded)
+ Unicode string, while decode expects thus a Unicode string. Any decoding or encoding
+ (e.g. to UTF-8 or UTF-16) needs to be done yourself, e.g. using the Encode module.
+
+
+ Example, output UTF-16BE-encoded JSON:
+
+ use Encode;
+ $jsontext = encode "UTF-16BE", JSON::XS->new->encode ($object);
+
+ Example, decode UTF-32LE-encoded JSON:
+
+ use Encode;
+ $object = JSON::XS->new->decode (decode "UTF-32LE", $jsontext);
+
+ See to L<JSON::PP/UNICODE HANDLING ON PERLS> if the backend is PP.
+
+
+ =head2 pretty
+
+ $json = $json->pretty([$enable])
+
+ This enables (or disables) all of the C<indent>, C<space_before> and
+ C<space_after> (and in the future possibly more) flags in one call to
+ generate the most readable (or most compact) form possible.
+
+ Equivalent to:
+
+ $json->indent->space_before->space_after
+
+ The indent space length is three and JSON::XS cannot change the indent
+ space length.
+
+ =head2 indent
+
+ $json = $json->indent([$enable])
+
+ $enabled = $json->get_indent
+
+ If C<$enable> is true (or missing), then the C<encode> method will use a multiline
+ format as output, putting every array member or object/hash key-value pair
+ into its own line, identifying them properly.
+
+ If C<$enable> is false, no newlines or indenting will be produced, and the
+ resulting JSON text is guaranteed not to contain any C<newlines>.
+
+ This setting has no effect when decoding JSON texts.
+
+ The indent space length is three.
+ With JSON::PP, you can also access C<indent_length> to change indent space length.
+
+
+ =head2 space_before
+
+ $json = $json->space_before([$enable])
+
+ $enabled = $json->get_space_before
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space before the C<:> separating keys from values in JSON objects.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before enabled, space_after and indent disabled:
+
+ {"key" :"value"}
+
+
+ =head2 space_after
+
+ $json = $json->space_after([$enable])
+
+ $enabled = $json->get_space_after
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space after the C<:> separating keys from values in JSON objects
+ and extra whitespace after the C<,> separating key-value pairs and array
+ members.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before and indent disabled, space_after enabled:
+
+ {"key": "value"}
+
+
+ =head2 relaxed
+
+ $json = $json->relaxed([$enable])
+
+ $enabled = $json->get_relaxed
+
+ If C<$enable> is true (or missing), then C<decode> will accept some
+ extensions to normal JSON syntax (see below). C<encode> will not be
+ affected in anyway. I<Be aware that this option makes you accept invalid
+ JSON texts as if they were valid!>. I suggest only to use this option to
+ parse application-specific files written by humans (configuration files,
+ resource files etc.)
+
+ If C<$enable> is false (the default), then C<decode> will only accept
+ valid JSON texts.
+
+ Currently accepted extensions are:
+
+ =over 4
+
+ =item * list items can have an end-comma
+
+ JSON I<separates> array elements and key-value pairs with commas. This
+ can be annoying if you write JSON texts manually and want to be able to
+ quickly append elements, so this extension accepts comma at the end of
+ such items not just between them:
+
+ [
+ 1,
+ 2, <- this comma not normally allowed
+ ]
+ {
+ "k1": "v1",
+ "k2": "v2", <- this comma not normally allowed
+ }
+
+ =item * shell-style '#'-comments
+
+ Whenever JSON allows whitespace, shell-style comments are additionally
+ allowed. They are terminated by the first carriage-return or line-feed
+ character, after which more white-space and comments are allowed.
+
+ [
+ 1, # this comment not allowed in JSON
+ # neither this one...
+ ]
+
+ =back
+
+
+ =head2 canonical
+
+ $json = $json->canonical([$enable])
+
+ $enabled = $json->get_canonical
+
+ If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
+ by sorting their keys. This is adding a comparatively high overhead.
+
+ If C<$enable> is false, then the C<encode> method will output key-value
+ pairs in the order Perl stores them (which will likely change between runs
+ of the same script).
+
+ This option is useful if you want the same data structure to be encoded as
+ the same JSON text (given the same overall settings). If it is disabled,
+ the same hash might be encoded differently even if contains the same data,
+ as key-value pairs have no inherent ordering in Perl.
+
+ This setting has no effect when decoding JSON texts.
+
+ =head2 allow_nonref
+
+ $json = $json->allow_nonref([$enable])
+
+ $enabled = $json->get_allow_nonref
+
+ If C<$enable> is true (or missing), then the C<encode> method can convert a
+ non-reference into its corresponding string, number or null JSON value,
+ which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
+ values instead of croaking.
+
+ If C<$enable> is false, then the C<encode> method will croak if it isn't
+ passed an arrayref or hashref, as JSON texts must either be an object
+ or array. Likewise, C<decode> will croak if given something that is not a
+ JSON object or array.
+
+ JSON->new->allow_nonref->encode ("Hello, World!")
+ => "Hello, World!"
+
+ =head2 allow_unknown
+
+ $json = $json->allow_unknown ([$enable])
+
+ $enabled = $json->get_allow_unknown
+
+ If $enable is true (or missing), then "encode" will *not* throw an
+ exception when it encounters values it cannot represent in JSON (for
+ example, filehandles) but instead will encode a JSON "null" value.
+ Note that blessed objects are not included here and are handled
+ separately by c<allow_nonref>.
+
+ If $enable is false (the default), then "encode" will throw an
+ exception when it encounters anything it cannot encode as JSON.
+
+ This option does not affect "decode" in any way, and it is
+ recommended to leave it off unless you know your communications
+ partner.
+
+ =head2 allow_blessed
+
+ $json = $json->allow_blessed([$enable])
+
+ $enabled = $json->get_allow_blessed
+
+ If C<$enable> is true (or missing), then the C<encode> method will not
+ barf when it encounters a blessed reference. Instead, the value of the
+ B<convert_blessed> option will decide whether C<null> (C<convert_blessed>
+ disabled or no C<TO_JSON> method found) or a representation of the
+ object (C<convert_blessed> enabled and C<TO_JSON> method found) is being
+ encoded. Has no effect on C<decode>.
+
+ If C<$enable> is false (the default), then C<encode> will throw an
+ exception when it encounters a blessed object.
+
+
+ =head2 convert_blessed
+
+ $json = $json->convert_blessed([$enable])
+
+ $enabled = $json->get_convert_blessed
+
+ If C<$enable> is true (or missing), then C<encode>, upon encountering a
+ blessed object, will check for the availability of the C<TO_JSON> method
+ on the object's class. If found, it will be called in scalar context
+ and the resulting scalar will be encoded instead of the object. If no
+ C<TO_JSON> method is found, the value of C<allow_blessed> will decide what
+ to do.
+
+ The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
+ returns other blessed objects, those will be handled in the same
+ way. C<TO_JSON> must take care of not causing an endless recursion cycle
+ (== crash) in this case. The name of C<TO_JSON> was chosen because other
+ methods called by the Perl core (== not by the user of the object) are
+ usually in upper case letters and to avoid collisions with the C<to_json>
+ function or method.
+
+ This setting does not yet influence C<decode> in any way.
+
+ If C<$enable> is false, then the C<allow_blessed> setting will decide what
+ to do when a blessed object is found.
+
+ =over
+
+ =item convert_blessed_universally mode
+
+ If use C<JSON> with C<-convert_blessed_universally>, the C<UNIVERSAL::TO_JSON>
+ subroutine is defined as the below code:
+
+ *UNIVERSAL::TO_JSON = sub {
+ my $b_obj = B::svref_2object( $_[0] );
+ return $b_obj->isa('B::HV') ? { %{ $_[0] } }
+ : $b_obj->isa('B::AV') ? [ @{ $_[0] } ]
+ : undef
+ ;
+ }
+
+ This will cause that C<encode> method converts simple blessed objects into
+ JSON objects as non-blessed object.
+
+ JSON -convert_blessed_universally;
+ $json->allow_blessed->convert_blessed->encode( $blessed_object )
+
+ This feature is experimental and may be removed in the future.
+
+ =back
+
+ =head2 filter_json_object
+
+ $json = $json->filter_json_object([$coderef])
+
+ When C<$coderef> is specified, it will be called from C<decode> each
+ time it decodes a JSON object. The only argument passed to the coderef
+ is a reference to the newly-created hash. If the code references returns
+ a single scalar (which need not be a reference), this value
+ (i.e. a copy of that scalar to avoid aliasing) is inserted into the
+ deserialised data structure. If it returns an empty list
+ (NOTE: I<not> C<undef>, which is a valid scalar), the original deserialised
+ hash will be inserted. This setting can slow down decoding considerably.
+
+ When C<$coderef> is omitted or undefined, any existing callback will
+ be removed and C<decode> will not change the deserialised hash in any
+ way.
+
+ Example, convert all JSON objects into the integer 5:
+
+ my $js = JSON->new->filter_json_object (sub { 5 });
+ # returns [5]
+ $js->decode ('[{}]'); # the given subroutine takes a hash reference.
+ # throw an exception because allow_nonref is not enabled
+ # so a lone 5 is not allowed.
+ $js->decode ('{"a":1, "b":2}');
+
+
+ =head2 filter_json_single_key_object
+
+ $json = $json->filter_json_single_key_object($key [=> $coderef])
+
+ Works remotely similar to C<filter_json_object>, but is only called for
+ JSON objects having a single key named C<$key>.
+
+ This C<$coderef> is called before the one specified via
+ C<filter_json_object>, if any. It gets passed the single value in the JSON
+ object. If it returns a single value, it will be inserted into the data
+ structure. If it returns nothing (not even C<undef> but the empty list),
+ the callback from C<filter_json_object> will be called next, as if no
+ single-key callback were specified.
+
+ If C<$coderef> is omitted or undefined, the corresponding callback will be
+ disabled. There can only ever be one callback for a given key.
+
+ As this callback gets called less often then the C<filter_json_object>
+ one, decoding speed will not usually suffer as much. Therefore, single-key
+ objects make excellent targets to serialise Perl objects into, especially
+ as single-key JSON objects are as close to the type-tagged value concept
+ as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
+ support this in any way, so you need to make sure your data never looks
+ like a serialised Perl hash.
+
+ Typical names for the single object key are C<__class_whatever__>, or
+ C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
+ things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
+ with real hashes.
+
+ Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
+ into the corresponding C<< $WIDGET{<id>} >> object:
+
+ # return whatever is in $WIDGET{5}:
+ JSON
+ ->new
+ ->filter_json_single_key_object (__widget__ => sub {
+ $WIDGET{ $_[0] }
+ })
+ ->decode ('{"__widget__": 5')
+
+ # this can be used with a TO_JSON method in some "widget" class
+ # for serialisation to json:
+ sub WidgetBase::TO_JSON {
+ my ($self) = @_;
+
+ unless ($self->{id}) {
+ $self->{id} = ..get..some..id..;
+ $WIDGET{$self->{id}} = $self;
+ }
+
+ { __widget__ => $self->{id} }
+ }
+
+
+ =head2 shrink
+
+ $json = $json->shrink([$enable])
+
+ $enabled = $json->get_shrink
+
+ With JSON::XS, this flag resizes strings generated by either
+ C<encode> or C<decode> to their minimum size possible. This can save
+ memory when your JSON texts are either very very long or you have many
+ short strings. It will also try to downgrade any strings to octet-form
+ if possible: perl stores strings internally either in an encoding called
+ UTF-X or in octet-form. The latter cannot store everything but uses less
+ space in general (and some buggy Perl or C code might even rely on that
+ internal representation being used).
+
+ With JSON::PP, it is noop about resizing strings but tries
+ C<utf8::downgrade> to the returned string by C<encode>. See to L<utf8>.
+
+ See to L<JSON::XS/OBJECT-ORIENTED INTERFACE> and L<JSON::PP/METHODS>.
+
+ =head2 max_depth
+
+ $json = $json->max_depth([$maximum_nesting_depth])
+
+ $max_depth = $json->get_max_depth
+
+ Sets the maximum nesting level (default C<512>) accepted while encoding
+ or decoding. If a higher nesting level is detected in JSON text or a Perl
+ data structure, then the encoder and decoder will stop and croak at that
+ point.
+
+ Nesting level is defined by number of hash- or arrayrefs that the encoder
+ needs to traverse to reach a given point or the number of C<{> or C<[>
+ characters without their matching closing parenthesis crossed to reach a
+ given character in a string.
+
+ If no argument is given, the highest possible setting will be used, which
+ is rarely useful.
+
+ Note that nesting is implemented by recursion in C. The default value has
+ been chosen to be as large as typical operating systems allow without
+ crashing. (JSON::XS)
+
+ With JSON::PP as the backend, when a large value (100 or more) was set and
+ it de/encodes a deep nested object/text, it may raise a warning
+ 'Deep recursion on subroutine' at the perl runtime phase.
+
+ See L<JSON::XS/SECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ =head2 max_size
+
+ $json = $json->max_size([$maximum_string_size])
+
+ $max_size = $json->get_max_size
+
+ Set the maximum length a JSON text may have (in bytes) where decoding is
+ being attempted. The default is C<0>, meaning no limit. When C<decode>
+ is called on a string that is longer then this many bytes, it will not
+ attempt to decode the string but throw an exception. This setting has no
+ effect on C<encode> (yet).
+
+ If no argument is given, the limit check will be deactivated (same as when
+ C<0> is specified).
+
+ See L<JSON::XS/SECURITY CONSIDERATIONS>, below, for more info on why this is useful.
+
+ =head2 encode
+
+ $json_text = $json->encode($perl_scalar)
+
+ Converts the given Perl data structure (a simple scalar or a reference
+ to a hash or array) to its JSON representation. Simple scalars will be
+ converted into JSON string or number sequences, while references to arrays
+ become JSON arrays and references to hashes become JSON objects. Undefined
+ Perl values (e.g. C<undef>) become JSON C<null> values.
+ References to the integers C<0> and C<1> are converted into C<true> and C<false>.
+
+ =head2 decode
+
+ $perl_scalar = $json->decode($json_text)
+
+ The opposite of C<encode>: expects a JSON text and tries to parse it,
+ returning the resulting simple scalar or reference. Croaks on error.
+
+ JSON numbers and strings become simple Perl scalars. JSON arrays become
+ Perl arrayrefs and JSON objects become Perl hashrefs. C<true> becomes
+ C<1> (C<JSON::true>), C<false> becomes C<0> (C<JSON::false>) and
+ C<null> becomes C<undef>.
+
+ =head2 decode_prefix
+
+ ($perl_scalar, $characters) = $json->decode_prefix($json_text)
+
+ This works like the C<decode> method, but instead of raising an exception
+ when there is trailing garbage after the first JSON object, it will
+ silently stop parsing there and return the number of characters consumed
+ so far.
+
+ JSON->new->decode_prefix ("[1] the tail")
+ => ([], 3)
+
+ See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>
+
+ =head2 property
+
+ $boolean = $json->property($property_name)
+
+ Returns a boolean value about above some properties.
+
+ The available properties are C<ascii>, C<latin1>, C<utf8>,
+ C<indent>,C<space_before>, C<space_after>, C<relaxed>, C<canonical>,
+ C<allow_nonref>, C<allow_unknown>, C<allow_blessed>, C<convert_blessed>,
+ C<shrink>, C<max_depth> and C<max_size>.
+
+ $boolean = $json->property('utf8');
+ => 0
+ $json->utf8;
+ $boolean = $json->property('utf8');
+ => 1
+
+ Sets the property with a given boolean value.
+
+ $json = $json->property($property_name => $boolean);
+
+ With no argument, it returns all the above properties as a hash reference.
+
+ $flag_hashref = $json->property();
+
+ =head1 INCREMENTAL PARSING
+
+ Most of this section are copied and modified from L<JSON::XS/INCREMENTAL PARSING>.
+
+ In some cases, there is the need for incremental parsing of JSON texts.
+ This module does allow you to parse a JSON stream incrementally.
+ It does so by accumulating text until it has a full JSON object, which
+ it then can decode. This process is similar to using C<decode_prefix>
+ to see if a full JSON object is available, but is much more efficient
+ (and can be implemented with a minimum of method calls).
+
+ The backend module will only attempt to parse the JSON text once it is sure it
+ has enough text to get a decisive result, using a very simple but
+ truly incremental parser. This means that it sometimes won't stop as
+ early as the full parser, for example, it doesn't detect parenthesis
+ mismatches. The only thing it guarantees is that it starts decoding as
+ soon as a syntactically valid JSON text has been seen. This means you need
+ to set resource limits (e.g. C<max_size>) to ensure the parser will stop
+ parsing in the presence if syntax errors.
+
+ The following methods implement this incremental parser.
+
+ =head2 incr_parse
+
+ $json->incr_parse( [$string] ) # void context
+
+ $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
+
+ @obj_or_empty = $json->incr_parse( [$string] ) # list context
+
+ This is the central parsing function. It can both append new text and
+ extract objects from the stream accumulated so far (both of these
+ functions are optional).
+
+ If C<$string> is given, then this string is appended to the already
+ existing JSON fragment stored in the C<$json> object.
+
+ After that, if the function is called in void context, it will simply
+ return without doing anything further. This can be used to add more text
+ in as many chunks as you want.
+
+ If the method is called in scalar context, then it will try to extract
+ exactly I<one> JSON object. If that is successful, it will return this
+ object, otherwise it will return C<undef>. If there is a parse error,
+ this method will croak just as C<decode> would do (one can then use
+ C<incr_skip> to skip the erroneous part). This is the most common way of
+ using the method.
+
+ And finally, in list context, it will try to extract as many objects
+ from the stream as it can find and return them, or the empty list
+ otherwise. For this to work, there must be no separators between the JSON
+ objects or arrays, instead they must be concatenated back-to-back. If
+ an error occurs, an exception will be raised as in the scalar context
+ case. Note that in this case, any previously-parsed JSON texts will be
+ lost.
+
+ Example: Parse some JSON arrays/objects in a given string and return them.
+
+ my @objs = JSON->new->incr_parse ("[5][7][1,2]");
+
+ =head2 incr_text
+
+ $lvalue_string = $json->incr_text
+
+ This method returns the currently stored JSON fragment as an lvalue, that
+ is, you can manipulate it. This I<only> works when a preceding call to
+ C<incr_parse> in I<scalar context> successfully returned an object. Under
+ all other circumstances you must not call this function (I mean it.
+ although in simple tests it might actually work, it I<will> fail under
+ real world conditions). As a special exception, you can also call this
+ method before having parsed anything.
+
+ This function is useful in two cases: a) finding the trailing text after a
+ JSON object or b) parsing multiple JSON objects separated by non-JSON text
+ (such as commas).
+
+ $json->incr_text =~ s/\s*,\s*//;
+
+ In Perl 5.005, C<lvalue> attribute is not available.
+ You must write codes like the below:
+
+ $string = $json->incr_text;
+ $string =~ s/\s*,\s*//;
+ $json->incr_text( $string );
+
+ =head2 incr_skip
+
+ $json->incr_skip
+
+ This will reset the state of the incremental parser and will remove the
+ parsed text from the input buffer. This is useful after C<incr_parse>
+ died, in which case the input buffer and incremental parser state is left
+ unchanged, to skip the text parsed so far and to reset the parse state.
+
+ =head2 incr_reset
+
+ $json->incr_reset
+
+ This completely resets the incremental parser, that is, after this call,
+ it will be as if the parser had never parsed anything.
+
+ This is useful if you want to repeatedly parse JSON objects and want to
+ ignore any trailing data, which means you have to reset the parser after
+ each successful decode.
+
+ See to L<JSON::XS/INCREMENTAL PARSING> for examples.
+
+
+ =head1 JSON::PP SUPPORT METHODS
+
+ The below methods are JSON::PP own methods, so when C<JSON> works
+ with JSON::PP (i.e. the created object is a JSON::PP object), available.
+ See to L<JSON::PP/JSON::PP OWN METHODS> in detail.
+
+ If you use C<JSON> with additional C<-support_by_pp>, some methods
+ are available even with JSON::XS. See to L<USE PP FEATURES EVEN THOUGH XS BACKEND>.
+
+ BEING { $ENV{PERL_JSON_BACKEND} = 'JSON::XS' }
+
+ use JSON -support_by_pp;
+
+ my $json = JSON->new;
+ $json->allow_nonref->escape_slash->encode("/");
+
+ # functional interfaces too.
+ print to_json(["/"], {escape_slash => 1});
+ print from_json('["foo"]', {utf8 => 1});
+
+ If you do not want to all functions but C<-support_by_pp>,
+ use C<-no_export>.
+
+ use JSON -support_by_pp, -no_export;
+ # functional interfaces are not exported.
+
+ =head2 allow_singlequote
+
+ $json = $json->allow_singlequote([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ any JSON strings quoted by single quotations that are invalid JSON
+ format.
+
+ $json->allow_singlequote->decode({"foo":'bar'});
+ $json->allow_singlequote->decode({'foo':"bar"});
+ $json->allow_singlequote->decode({'foo':'bar'});
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+ =head2 allow_barekey
+
+ $json = $json->allow_barekey([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ bare keys of JSON object that are invalid JSON format.
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+ $json->allow_barekey->decode('{foo:"bar"}');
+
+ =head2 allow_bignum
+
+ $json = $json->allow_bignum([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will convert
+ the big integer Perl cannot handle as integer into a L<Math::BigInt>
+ object and convert a floating number (any) into a L<Math::BigFloat>.
+
+ On the contrary, C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers with C<allow_blessed> enable.
+
+ $json->allow_nonref->allow_blessed->allow_bignum;
+ $bigfloat = $json->decode('2.000000000000000000000000001');
+ print $json->encode($bigfloat);
+ # => 2.000000000000000000000000001
+
+ See to L<MAPPING> about the conversion of JSON number.
+
+ =head2 loose
+
+ $json = $json->loose([$enable])
+
+ The unescaped [\x00-\x1f\x22\x2f\x5c] strings are invalid in JSON strings
+ and the module doesn't allow to C<decode> to these (except for \x2f).
+ If C<$enable> is true (or missing), then C<decode> will accept these
+ unescaped strings.
+
+ $json->loose->decode(qq|["abc
+ def"]|);
+
+ See to L<JSON::PP/JSON::PP OWN METHODS>.
+
+ =head2 escape_slash
+
+ $json = $json->escape_slash([$enable])
+
+ According to JSON Grammar, I<slash> (U+002F) is escaped. But by default
+ JSON backend modules encode strings without escaping slash.
+
+ If C<$enable> is true (or missing), then C<encode> will escape slashes.
+
+ =head2 indent_length
+
+ $json = $json->indent_length($length)
+
+ With JSON::XS, The indent space length is 3 and cannot be changed.
+ With JSON::PP, it sets the indent space length with the given $length.
+ The default is 3. The acceptable range is 0 to 15.
+
+ =head2 sort_by
+
+ $json = $json->sort_by($function_name)
+ $json = $json->sort_by($subroutine_ref)
+
+ If $function_name or $subroutine_ref are set, its sort routine are used.
+
+ $js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ $js = $pc->sort_by('own_sort')->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ sub JSON::PP::own_sort { $JSON::PP::a cmp $JSON::PP::b }
+
+ As the sorting routine runs in the JSON::PP scope, the given
+ subroutine name and the special variables C<$a>, C<$b> will begin
+ with 'JSON::PP::'.
+
+ If $integer is set, then the effect is same as C<canonical> on.
+
+ See to L<JSON::PP/JSON::PP OWN METHODS>.
+
+ =head1 MAPPING
+
+ This section is copied from JSON::XS and modified to C<JSON>.
+ JSON::XS and JSON::PP mapping mechanisms are almost equivalent.
+
+ See to L<JSON::XS/MAPPING>.
+
+ =head2 JSON -> PERL
+
+ =over 4
+
+ =item object
+
+ A JSON object becomes a reference to a hash in Perl. No ordering of object
+ keys is preserved (JSON does not preserver object key ordering itself).
+
+ =item array
+
+ A JSON array becomes a reference to an array in Perl.
+
+ =item string
+
+ A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
+ are represented by the same codepoints in the Perl string, so no manual
+ decoding is necessary.
+
+ =item number
+
+ A JSON number becomes either an integer, numeric (floating point) or
+ string scalar in perl, depending on its range and any fractional parts. On
+ the Perl level, there is no difference between those as Perl handles all
+ the conversion details, but an integer may take slightly less memory and
+ might represent more values exactly than floating point numbers.
+
+ If the number consists of digits only, C<JSON> will try to represent
+ it as an integer value. If that fails, it will try to represent it as
+ a numeric (floating point) value if that is possible without loss of
+ precision. Otherwise it will preserve the number as a string value (in
+ which case you lose roundtripping ability, as the JSON number will be
+ re-encoded to a JSON string).
+
+ Numbers containing a fractional or exponential part will always be
+ represented as numeric (floating point) values, possibly at a loss of
+ precision (in which case you might lose perfect roundtripping ability, but
+ the JSON number will still be re-encoded as a JSON number).
+
+ Note that precision is not accuracy - binary floating point values cannot
+ represent most decimal fractions exactly, and when converting from and to
+ floating point, C<JSON> only guarantees precision up to but not including
+ the least significant bit.
+
+ If the backend is JSON::PP and C<allow_bignum> is enable, the big integers
+ and the numeric can be optionally converted into L<Math::BigInt> and
+ L<Math::BigFloat> objects.
+
+ =item true, false
+
+ These JSON atoms become C<JSON::true> and C<JSON::false>,
+ respectively. They are overloaded to act almost exactly like the numbers
+ C<1> and C<0>. You can check whether a scalar is a JSON boolean by using
+ the C<JSON::is_bool> function.
+
+ print JSON::true + 1;
+ => 1
+
+ ok(JSON::true eq '1');
+ ok(JSON::true == 1);
+
+ C<JSON> will install these missing overloading features to the backend modules.
+
+
+ =item null
+
+ A JSON null atom becomes C<undef> in Perl.
+
+ C<JSON::null> returns C<undef>.
+
+ =back
+
+
+ =head2 PERL -> JSON
+
+ The mapping from Perl to JSON is slightly more difficult, as Perl is a
+ truly typeless language, so we can only guess which JSON type is meant by
+ a Perl value.
+
+ =over 4
+
+ =item hash references
+
+ Perl hash references become JSON objects. As there is no inherent ordering
+ in hash keys (or JSON objects), they will usually be encoded in a
+ pseudo-random order that can change between runs of the same program but
+ stays generally the same within a single run of a program. C<JSON>
+ optionally sort the hash keys (determined by the I<canonical> flag), so
+ the same data structure will serialise to the same JSON text (given same
+ settings and version of JSON::XS), but this incurs a runtime overhead
+ and is only rarely useful, e.g. when you want to compare some JSON text
+ against another for equality.
+
+ In future, the ordered object feature will be added to JSON::PP using C<tie> mechanism.
+
+
+ =item array references
+
+ Perl array references become JSON arrays.
+
+ =item other references
+
+ Other unblessed references are generally not allowed and will cause an
+ exception to be thrown, except for references to the integers C<0> and
+ C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
+ also use C<JSON::false> and C<JSON::true> to improve readability.
+
+ to_json [\0,JSON::true] # yields [false,true]
+
+ =item JSON::true, JSON::false, JSON::null
+
+ These special values become JSON true and JSON false values,
+ respectively. You can also use C<\1> and C<\0> directly if you want.
+
+ JSON::null returns C<undef>.
+
+ =item blessed objects
+
+ Blessed objects are not directly representable in JSON. See the
+ C<allow_blessed> and C<convert_blessed> methods on various options on
+ how to deal with this: basically, you can choose between throwing an
+ exception, encoding the reference as if it weren't blessed, or provide
+ your own serialiser method.
+
+ With C<convert_blessed_universally> mode, C<encode> converts blessed
+ hash references or blessed array references (contains other blessed references)
+ into JSON members and arrays.
+
+ use JSON -convert_blessed_universally;
+ JSON->new->allow_blessed->convert_blessed->encode( $blessed_object );
+
+ See to L<convert_blessed>.
+
+ =item simple scalars
+
+ Simple Perl scalars (any scalar that is not a reference) are the most
+ difficult objects to encode: JSON::XS and JSON::PP will encode undefined scalars as
+ JSON C<null> values, scalars that have last been used in a string context
+ before encoding as JSON strings, and anything else as number value:
+
+ # dump as number
+ encode_json [2] # yields [2]
+ encode_json [-3.0e17] # yields [-3e+17]
+ my $value = 5; encode_json [$value] # yields [5]
+
+ # used as string, so dump as string
+ print $value;
+ encode_json [$value] # yields ["5"]
+
+ # undef becomes null
+ encode_json [undef] # yields [null]
+
+ You can force the type to be a string by stringifying it:
+
+ my $x = 3.1; # some variable containing a number
+ "$x"; # stringified
+ $x .= ""; # another, more awkward way to stringify
+ print $x; # perl does it for you, too, quite often
+
+ You can force the type to be a number by numifying it:
+
+ my $x = "3"; # some variable containing a string
+ $x += 0; # numify it, ensuring it will be dumped as a number
+ $x *= 1; # same thing, the choice is yours.
+
+ You can not currently force the type in other, less obscure, ways.
+
+ Note that numerical precision has the same meaning as under Perl (so
+ binary to decimal conversion follows the same rules as in Perl, which
+ can differ to other languages). Also, your perl interpreter might expose
+ extensions to the floating point numbers of your platform, such as
+ infinities or NaN's - these cannot be represented in JSON, and it is an
+ error to pass those in.
+
+ =item Big Number
+
+ If the backend is JSON::PP and C<allow_bignum> is enable,
+ C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers.
+
+
+ =back
+
+ =head1 JSON and ECMAscript
+
+ See to L<JSON::XS/JSON and ECMAscript>.
+
+ =head1 JSON and YAML
+
+ JSON is not a subset of YAML.
+ See to L<JSON::XS/JSON and YAML>.
+
+
+ =head1 BACKEND MODULE DECISION
+
+ When you use C<JSON>, C<JSON> tries to C<use> JSON::XS. If this call failed, it will
+ C<uses> JSON::PP. The required JSON::XS version is I<2.2> or later.
+
+ The C<JSON> constructor method returns an object inherited from the backend module,
+ and JSON::XS object is a blessed scalar reference while JSON::PP is a blessed hash
+ reference.
+
+ So, your program should not depend on the backend module, especially
+ returned objects should not be modified.
+
+ my $json = JSON->new; # XS or PP?
+ $json->{stash} = 'this is xs object'; # this code may raise an error!
+
+ To check the backend module, there are some methods - C<backend>, C<is_pp> and C<is_xs>.
+
+ JSON->backend; # 'JSON::XS' or 'JSON::PP'
+
+ JSON->backend->is_pp: # 0 or 1
+
+ JSON->backend->is_xs: # 1 or 0
+
+ $json->is_xs; # 1 or 0
+
+ $json->is_pp; # 0 or 1
+
+
+ If you set an environment variable C<PERL_JSON_BACKEND>, the calling action will be changed.
+
+ =over
+
+ =item PERL_JSON_BACKEND = 0 or PERL_JSON_BACKEND = 'JSON::PP'
+
+ Always use JSON::PP
+
+ =item PERL_JSON_BACKEND == 1 or PERL_JSON_BACKEND = 'JSON::XS,JSON::PP'
+
+ (The default) Use compiled JSON::XS if it is properly compiled & installed,
+ otherwise use JSON::PP.
+
+ =item PERL_JSON_BACKEND == 2 or PERL_JSON_BACKEND = 'JSON::XS'
+
+ Always use compiled JSON::XS, die if it isn't properly compiled & installed.
+
+ =item PERL_JSON_BACKEND = 'JSON::backportPP'
+
+ Always use JSON::backportPP.
+ JSON::backportPP is JSON::PP back port module.
+ C<JSON> includes JSON::backportPP instead of JSON::PP.
+
+ =back
+
+ These ideas come from L<DBI::PurePerl> mechanism.
+
+ example:
+
+ BEGIN { $ENV{PERL_JSON_BACKEND} = 'JSON::PP' }
+ use JSON; # always uses JSON::PP
+
+ In future, it may be able to specify another module.
+
+ =head1 USE PP FEATURES EVEN THOUGH XS BACKEND
+
+ Many methods are available with either JSON::XS or JSON::PP and
+ when the backend module is JSON::XS, if any JSON::PP specific (i.e. JSON::XS unsupported)
+ method is called, it will C<warn> and be noop.
+
+ But If you C<use> C<JSON> passing the optional string C<-support_by_pp>,
+ it makes a part of those unsupported methods available.
+ This feature is achieved by using JSON::PP in C<de/encode>.
+
+ BEGIN { $ENV{PERL_JSON_BACKEND} = 2 } # with JSON::XS
+ use JSON -support_by_pp;
+ my $json = JSON->new;
+ $json->allow_nonref->escape_slash->encode("/");
+
+ At this time, the returned object is a C<JSON::Backend::XS::Supportable>
+ object (re-blessed XS object), and by checking JSON::XS unsupported flags
+ in de/encoding, can support some unsupported methods - C<loose>, C<allow_bignum>,
+ C<allow_barekey>, C<allow_singlequote>, C<escape_slash> and C<indent_length>.
+
+ When any unsupported methods are not enable, C<XS de/encode> will be
+ used as is. The switch is achieved by changing the symbolic tables.
+
+ C<-support_by_pp> is effective only when the backend module is JSON::XS
+ and it makes the de/encoding speed down a bit.
+
+ See to L<JSON::PP SUPPORT METHODS>.
+
+ =head1 INCOMPATIBLE CHANGES TO OLD VERSION
+
+ There are big incompatibility between new version (2.00) and old (1.xx).
+ If you use old C<JSON> 1.xx in your code, please check it.
+
+ See to L<Transition ways from 1.xx to 2.xx.>
+
+ =over
+
+ =item jsonToObj and objToJson are obsoleted.
+
+ Non Perl-style name C<jsonToObj> and C<objToJson> are obsoleted
+ (but not yet deleted from the source).
+ If you use these functions in your code, please replace them
+ with C<from_json> and C<to_json>.
+
+
+ =item Global variables are no longer available.
+
+ C<JSON> class variables - C<$JSON::AUTOCONVERT>, C<$JSON::BareKey>, etc...
+ - are not available any longer.
+ Instead, various features can be used through object methods.
+
+
+ =item Package JSON::Converter and JSON::Parser are deleted.
+
+ Now C<JSON> bundles with JSON::PP which can handle JSON more properly than them.
+
+ =item Package JSON::NotString is deleted.
+
+ There was C<JSON::NotString> class which represents JSON value C<true>, C<false>, C<null>
+ and numbers. It was deleted and replaced by C<JSON::Boolean>.
+
+ C<JSON::Boolean> represents C<true> and C<false>.
+
+ C<JSON::Boolean> does not represent C<null>.
+
+ C<JSON::null> returns C<undef>.
+
+ C<JSON> makes L<JSON::XS::Boolean> and L<JSON::PP::Boolean> is-a relation
+ to L<JSON::Boolean>.
+
+ =item function JSON::Number is obsoleted.
+
+ C<JSON::Number> is now needless because JSON::XS and JSON::PP have
+ round-trip integrity.
+
+ =item JSONRPC modules are deleted.
+
+ Perl implementation of JSON-RPC protocol - C<JSONRPC >, C<JSONRPC::Transport::HTTP>
+ and C<Apache::JSONRPC > are deleted in this distribution.
+ Instead of them, there is L<JSON::RPC> which supports JSON-RPC protocol version 1.1.
+
+ =back
+
+ =head2 Transition ways from 1.xx to 2.xx.
+
+ You should set C<suport_by_pp> mode firstly, because
+ it is always successful for the below codes even with JSON::XS.
+
+ use JSON -support_by_pp;
+
+ =over
+
+ =item Exported jsonToObj (simple)
+
+ from_json($json_text);
+
+ =item Exported objToJson (simple)
+
+ to_json($perl_scalar);
+
+ =item Exported jsonToObj (advanced)
+
+ $flags = {allow_barekey => 1, allow_singlequote => 1};
+ from_json($json_text, $flags);
+
+ equivalent to:
+
+ $JSON::BareKey = 1;
+ $JSON::QuotApos = 1;
+ jsonToObj($json_text);
+
+ =item Exported objToJson (advanced)
+
+ $flags = {allow_blessed => 1, allow_barekey => 1};
+ to_json($perl_scalar, $flags);
+
+ equivalent to:
+
+ $JSON::BareKey = 1;
+ objToJson($perl_scalar);
+
+ =item jsonToObj as object method
+
+ $json->decode($json_text);
+
+ =item objToJson as object method
+
+ $json->encode($perl_scalar);
+
+ =item new method with parameters
+
+ The C<new> method in 2.x takes any parameters no longer.
+ You can set parameters instead;
+
+ $json = JSON->new->pretty;
+
+ =item $JSON::Pretty, $JSON::Indent, $JSON::Delimiter
+
+ If C<indent> is enable, that means C<$JSON::Pretty> flag set. And
+ C<$JSON::Delimiter> was substituted by C<space_before> and C<space_after>.
+ In conclusion:
+
+ $json->indent->space_before->space_after;
+
+ Equivalent to:
+
+ $json->pretty;
+
+ To change indent length, use C<indent_length>.
+
+ (Only with JSON::PP, if C<-support_by_pp> is not used.)
+
+ $json->pretty->indent_length(2)->encode($perl_scalar);
+
+ =item $JSON::BareKey
+
+ (Only with JSON::PP, if C<-support_by_pp> is not used.)
+
+ $json->allow_barekey->decode($json_text)
+
+ =item $JSON::ConvBlessed
+
+ use C<-convert_blessed_universally>. See to L<convert_blessed>.
+
+ =item $JSON::QuotApos
+
+ (Only with JSON::PP, if C<-support_by_pp> is not used.)
+
+ $json->allow_singlequote->decode($json_text)
+
+ =item $JSON::SingleQuote
+
+ Disable. C<JSON> does not make such a invalid JSON string any longer.
+
+ =item $JSON::KeySort
+
+ $json->canonical->encode($perl_scalar)
+
+ This is the ascii sort.
+
+ If you want to use with your own sort routine, check the C<sort_by> method.
+
+ (Only with JSON::PP, even if C<-support_by_pp> is used currently.)
+
+ $json->sort_by($sort_routine_ref)->encode($perl_scalar)
+
+ $json->sort_by(sub { $JSON::PP::a <=> $JSON::PP::b })->encode($perl_scalar)
+
+ Can't access C<$a> and C<$b> but C<$JSON::PP::a> and C<$JSON::PP::b>.
+
+ =item $JSON::SkipInvalid
+
+ $json->allow_unknown
+
+ =item $JSON::AUTOCONVERT
+
+ Needless. C<JSON> backend modules have the round-trip integrity.
+
+ =item $JSON::UTF8
+
+ Needless because C<JSON> (JSON::XS/JSON::PP) sets
+ the UTF8 flag on properly.
+
+ # With UTF8-flagged strings
+
+ $json->allow_nonref;
+ $str = chr(1000); # UTF8-flagged
+
+ $json_text = $json->utf8(0)->encode($str);
+ utf8::is_utf8($json_text);
+ # true
+ $json_text = $json->utf8(1)->encode($str);
+ utf8::is_utf8($json_text);
+ # false
+
+ $str = '"' . chr(1000) . '"'; # UTF8-flagged
+
+ $perl_scalar = $json->utf8(0)->decode($str);
+ utf8::is_utf8($perl_scalar);
+ # true
+ $perl_scalar = $json->utf8(1)->decode($str);
+ # died because of 'Wide character in subroutine'
+
+ See to L<JSON::XS/A FEW NOTES ON UNICODE AND PERL>.
+
+ =item $JSON::UnMapping
+
+ Disable. See to L<MAPPING>.
+
+ =item $JSON::SelfConvert
+
+ This option was deleted.
+ Instead of it, if a given blessed object has the C<TO_JSON> method,
+ C<TO_JSON> will be executed with C<convert_blessed>.
+
+ $json->convert_blessed->encode($blessed_hashref_or_arrayref)
+ # if need, call allow_blessed
+
+ Note that it was C<toJson> in old version, but now not C<toJson> but C<TO_JSON>.
+
+ =back
+
+ =head1 TODO
+
+ =over
+
+ =item example programs
+
+ =back
+
+ =head1 THREADS
+
+ No test with JSON::PP. If with JSON::XS, See to L<JSON::XS/THREADS>.
+
+
+ =head1 BUGS
+
+ Please report bugs relevant to C<JSON> to E<lt>makamaka[at]cpan.orgE<gt>.
+
+
+ =head1 SEE ALSO
+
+ Most of the document is copied and modified from JSON::XS doc.
+
+ L<JSON::XS>, L<JSON::PP>
+
+ C<RFC4627>(L<http://www.ietf.org/rfc/rfc4627.txt>)
+
+ =head1 AUTHOR
+
+ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
+
+ JSON::XS was written by Marc Lehmann <schmorp[at]schmorp.de>
+
+ The release of this new version owes to the courtesy of Marc Lehmann.
+
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 2005-2013 by Makamaka Hannyaharamitu
+
+ This library is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+
+JSON
+
+$fatpacked{"JSON/PP.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP';
+ package JSON::PP;
+
+ # JSON-2.0
+
+ use 5.005;
+ use strict;
+ use base qw(Exporter);
+ use overload ();
+
+ use Carp ();
+ use B ();
+ #use Devel::Peek;
+
+ $JSON::PP::VERSION = '2.27203';
+
+ @JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
+
+ # instead of hash-access, i tried index-access for speed.
+ # but this method is not faster than what i expected. so it will be changed.
+
+ use constant P_ASCII => 0;
+ use constant P_LATIN1 => 1;
+ use constant P_UTF8 => 2;
+ use constant P_INDENT => 3;
+ use constant P_CANONICAL => 4;
+ use constant P_SPACE_BEFORE => 5;
+ use constant P_SPACE_AFTER => 6;
+ use constant P_ALLOW_NONREF => 7;
+ use constant P_SHRINK => 8;
+ use constant P_ALLOW_BLESSED => 9;
+ use constant P_CONVERT_BLESSED => 10;
+ use constant P_RELAXED => 11;
+
+ use constant P_LOOSE => 12;
+ use constant P_ALLOW_BIGNUM => 13;
+ use constant P_ALLOW_BAREKEY => 14;
+ use constant P_ALLOW_SINGLEQUOTE => 15;
+ use constant P_ESCAPE_SLASH => 16;
+ use constant P_AS_NONBLESSED => 17;
+
+ use constant P_ALLOW_UNKNOWN => 18;
+
+ use constant OLD_PERL => $] < 5.008 ? 1 : 0;
+
+ BEGIN {
+ my @xs_compati_bit_properties = qw(
+ latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink
+ allow_blessed convert_blessed relaxed allow_unknown
+ );
+ my @pp_bit_properties = qw(
+ allow_singlequote allow_bignum loose
+ allow_barekey escape_slash as_nonblessed
+ );
+
+ # Perl version check, Unicode handling is enable?
+ # Helper module sets @JSON::PP::_properties.
+ if ($] < 5.008 ) {
+ my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';
+ eval qq| require $helper |;
+ if ($@) { Carp::croak $@; }
+ }
+
+ for my $name (@xs_compati_bit_properties, @pp_bit_properties) {
+ my $flag_name = 'P_' . uc($name);
+
+ eval qq/
+ sub $name {
+ my \$enable = defined \$_[1] ? \$_[1] : 1;
+
+ if (\$enable) {
+ \$_[0]->{PROPS}->[$flag_name] = 1;
+ }
+ else {
+ \$_[0]->{PROPS}->[$flag_name] = 0;
+ }
+
+ \$_[0];
+ }
+
+ sub get_$name {
+ \$_[0]->{PROPS}->[$flag_name] ? 1 : '';
+ }
+ /;
+ }
+
+ }
+
+
+
+ # Functions
+
+ my %encode_allow_method
+ = map {($_ => 1)} qw/utf8 pretty allow_nonref latin1 self_encode escape_slash
+ allow_blessed convert_blessed indent indent_length allow_bignum
+ as_nonblessed
+ /;
+ my %decode_allow_method
+ = map {($_ => 1)} qw/utf8 allow_nonref loose allow_singlequote allow_bignum
+ allow_barekey max_size relaxed/;
+
+
+ my $JSON; # cache
+
+ sub encode_json ($) { # encode
+ ($JSON ||= __PACKAGE__->new->utf8)->encode(@_);
+ }
+
+
+ sub decode_json { # decode
+ ($JSON ||= __PACKAGE__->new->utf8)->decode(@_);
+ }
+
+ # Obsoleted
+
+ sub to_json($) {
+ Carp::croak ("JSON::PP::to_json has been renamed to encode_json.");
+ }
+
+
+ sub from_json($) {
+ Carp::croak ("JSON::PP::from_json has been renamed to decode_json.");
+ }
+
+
+ # Methods
+
+ sub new {
+ my $class = shift;
+ my $self = {
+ max_depth => 512,
+ max_size => 0,
+ indent => 0,
+ FLAGS => 0,
+ fallback => sub { encode_error('Invalid value. JSON can only reference.') },
+ indent_length => 3,
+ };
+
+ bless $self, $class;
+ }
+
+
+ sub encode {
+ return $_[0]->PP_encode_json($_[1]);
+ }
+
+
+ sub decode {
+ return $_[0]->PP_decode_json($_[1], 0x00000000);
+ }
+
+
+ sub decode_prefix {
+ return $_[0]->PP_decode_json($_[1], 0x00000001);
+ }
+
+
+ # accessor
+
+
+ # pretty printing
+
+ sub pretty {
+ my ($self, $v) = @_;
+ my $enable = defined $v ? $v : 1;
+
+ if ($enable) { # indent_length(3) for JSON::XS compatibility
+ $self->indent(1)->indent_length(3)->space_before(1)->space_after(1);
+ }
+ else {
+ $self->indent(0)->space_before(0)->space_after(0);
+ }
+
+ $self;
+ }
+
+ # etc
+
+ sub max_depth {
+ my $max = defined $_[1] ? $_[1] : 0x80000000;
+ $_[0]->{max_depth} = $max;
+ $_[0];
+ }
+
+
+ sub get_max_depth { $_[0]->{max_depth}; }
+
+
+ sub max_size {
+ my $max = defined $_[1] ? $_[1] : 0;
+ $_[0]->{max_size} = $max;
+ $_[0];
+ }
+
+
+ sub get_max_size { $_[0]->{max_size}; }
+
+
+ sub filter_json_object {
+ $_[0]->{cb_object} = defined $_[1] ? $_[1] : 0;
+ $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
+ $_[0];
+ }
+
+ sub filter_json_single_key_object {
+ if (@_ > 1) {
+ $_[0]->{cb_sk_object}->{$_[1]} = $_[2];
+ }
+ $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
+ $_[0];
+ }
+
+ sub indent_length {
+ if (!defined $_[1] or $_[1] > 15 or $_[1] < 0) {
+ Carp::carp "The acceptable range of indent_length() is 0 to 15.";
+ }
+ else {
+ $_[0]->{indent_length} = $_[1];
+ }
+ $_[0];
+ }
+
+ sub get_indent_length {
+ $_[0]->{indent_length};
+ }
+
+ sub sort_by {
+ $_[0]->{sort_by} = defined $_[1] ? $_[1] : 1;
+ $_[0];
+ }
+
+ sub allow_bigint {
+ Carp::carp("allow_bigint() is obsoleted. use allow_bignum() insted.");
+ }
+
+ ###############################
+
+ ###
+ ### Perl => JSON
+ ###
+
+
+ { # Convert
+
+ my $max_depth;
+ my $indent;
+ my $ascii;
+ my $latin1;
+ my $utf8;
+ my $space_before;
+ my $space_after;
+ my $canonical;
+ my $allow_blessed;
+ my $convert_blessed;
+
+ my $indent_length;
+ my $escape_slash;
+ my $bignum;
+ my $as_nonblessed;
+
+ my $depth;
+ my $indent_count;
+ my $keysort;
+
+
+ sub PP_encode_json {
+ my $self = shift;
+ my $obj = shift;
+
+ $indent_count = 0;
+ $depth = 0;
+
+ my $idx = $self->{PROPS};
+
+ ($ascii, $latin1, $utf8, $indent, $canonical, $space_before, $space_after, $allow_blessed,
+ $convert_blessed, $escape_slash, $bignum, $as_nonblessed)
+ = @{$idx}[P_ASCII .. P_SPACE_AFTER, P_ALLOW_BLESSED, P_CONVERT_BLESSED,
+ P_ESCAPE_SLASH, P_ALLOW_BIGNUM, P_AS_NONBLESSED];
+
+ ($max_depth, $indent_length) = @{$self}{qw/max_depth indent_length/};
+
+ $keysort = $canonical ? sub { $a cmp $b } : undef;
+
+ if ($self->{sort_by}) {
+ $keysort = ref($self->{sort_by}) eq 'CODE' ? $self->{sort_by}
+ : $self->{sort_by} =~ /\D+/ ? $self->{sort_by}
+ : sub { $a cmp $b };
+ }
+
+ encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)")
+ if(!ref $obj and !$idx->[ P_ALLOW_NONREF ]);
+
+ my $str = $self->object_to_json($obj);
+
+ $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible
+
+ unless ($ascii or $latin1 or $utf8) {
+ utf8::upgrade($str);
+ }
+
+ if ($idx->[ P_SHRINK ]) {
+ utf8::downgrade($str, 1);
+ }
+
+ return $str;
+ }
+
+
+ sub object_to_json {
+ my ($self, $obj) = @_;
+ my $type = ref($obj);
+
+ if($type eq 'HASH'){
+ return $self->hash_to_json($obj);
+ }
+ elsif($type eq 'ARRAY'){
+ return $self->array_to_json($obj);
+ }
+ elsif ($type) { # blessed object?
+ if (blessed($obj)) {
+
+ return $self->value_to_json($obj) if ( $obj->isa('JSON::PP::Boolean') );
+
+ if ( $convert_blessed and $obj->can('TO_JSON') ) {
+ my $result = $obj->TO_JSON();
+ if ( defined $result and ref( $result ) ) {
+ if ( refaddr( $obj ) eq refaddr( $result ) ) {
+ encode_error( sprintf(
+ "%s::TO_JSON method returned same object as was passed instead of a new one",
+ ref $obj
+ ) );
+ }
+ }
+
+ return $self->object_to_json( $result );
+ }
+
+ return "$obj" if ( $bignum and _is_bignum($obj) );
+ return $self->blessed_to_json($obj) if ($allow_blessed and $as_nonblessed); # will be removed.
+
+ encode_error( sprintf("encountered object '%s', but neither allow_blessed "
+ . "nor convert_blessed settings are enabled", $obj)
+ ) unless ($allow_blessed);
+
+ return 'null';
+ }
+ else {
+ return $self->value_to_json($obj);
+ }
+ }
+ else{
+ return $self->value_to_json($obj);
+ }
+ }
+
+
+ sub hash_to_json {
+ my ($self, $obj) = @_;
+ my @res;
+
+ encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
+ if (++$depth > $max_depth);
+
+ my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
+ my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : '');
+
+ for my $k ( _sort( $obj ) ) {
+ if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized
+ push @res, string_to_json( $self, $k )
+ . $del
+ . ( $self->object_to_json( $obj->{$k} ) || $self->value_to_json( $obj->{$k} ) );
+ }
+
+ --$depth;
+ $self->_down_indent() if ($indent);
+
+ return '{' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . '}';
+ }
+
+
+ sub array_to_json {
+ my ($self, $obj) = @_;
+ my @res;
+
+ encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
+ if (++$depth > $max_depth);
+
+ my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
+
+ for my $v (@$obj){
+ push @res, $self->object_to_json($v) || $self->value_to_json($v);
+ }
+
+ --$depth;
+ $self->_down_indent() if ($indent);
+
+ return '[' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . ']';
+ }
+
+
+ sub value_to_json {
+ my ($self, $value) = @_;
+
+ return 'null' if(!defined $value);
+
+ my $b_obj = B::svref_2object(\$value); # for round trip problem
+ my $flags = $b_obj->FLAGS;
+
+ return $value # as is
+ if $flags & ( B::SVp_IOK | B::SVp_NOK ) and !( $flags & B::SVp_POK ); # SvTYPE is IV or NV?
+
+ my $type = ref($value);
+
+ if(!$type){
+ return string_to_json($self, $value);
+ }
+ elsif( blessed($value) and $value->isa('JSON::PP::Boolean') ){
+ return $$value == 1 ? 'true' : 'false';
+ }
+ elsif ($type) {
+ if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
+ return $self->value_to_json("$value");
+ }
+
+ if ($type eq 'SCALAR' and defined $$value) {
+ return $$value eq '1' ? 'true'
+ : $$value eq '0' ? 'false'
+ : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
+ : encode_error("cannot encode reference to scalar");
+ }
+
+ if ( $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ) {
+ return 'null';
+ }
+ else {
+ if ( $type eq 'SCALAR' or $type eq 'REF' ) {
+ encode_error("cannot encode reference to scalar");
+ }
+ else {
+ encode_error("encountered $value, but JSON can only represent references to arrays or hashes");
+ }
+ }
+
+ }
+ else {
+ return $self->{fallback}->($value)
+ if ($self->{fallback} and ref($self->{fallback}) eq 'CODE');
+ return 'null';
+ }
+
+ }
+
+
+ my %esc = (
+ "\n" => '\n',
+ "\r" => '\r',
+ "\t" => '\t',
+ "\f" => '\f',
+ "\b" => '\b',
+ "\"" => '\"',
+ "\\" => '\\\\',
+ "\'" => '\\\'',
+ );
+
+
+ sub string_to_json {
+ my ($self, $arg) = @_;
+
+ $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
+ $arg =~ s/\//\\\//g if ($escape_slash);
+ $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
+
+ if ($ascii) {
+ $arg = JSON_PP_encode_ascii($arg);
+ }
+
+ if ($latin1) {
+ $arg = JSON_PP_encode_latin1($arg);
+ }
+
+ if ($utf8) {
+ utf8::encode($arg);
+ }
+
+ return '"' . $arg . '"';
+ }
+
+
+ sub blessed_to_json {
+ my $reftype = reftype($_[1]) || '';
+ if ($reftype eq 'HASH') {
+ return $_[0]->hash_to_json($_[1]);
+ }
+ elsif ($reftype eq 'ARRAY') {
+ return $_[0]->array_to_json($_[1]);
+ }
+ else {
+ return 'null';
+ }
+ }
+
+
+ sub encode_error {
+ my $error = shift;
+ Carp::croak "$error";
+ }
+
+
+ sub _sort {
+ defined $keysort ? (sort $keysort (keys %{$_[0]})) : keys %{$_[0]};
+ }
+
+
+ sub _up_indent {
+ my $self = shift;
+ my $space = ' ' x $indent_length;
+
+ my ($pre,$post) = ('','');
+
+ $post = "\n" . $space x $indent_count;
+
+ $indent_count++;
+
+ $pre = "\n" . $space x $indent_count;
+
+ return ($pre,$post);
+ }
+
+
+ sub _down_indent { $indent_count--; }
+
+
+ sub PP_encode_box {
+ {
+ depth => $depth,
+ indent_count => $indent_count,
+ };
+ }
+
+ } # Convert
+
+
+ sub _encode_ascii {
+ join('',
+ map {
+ $_ <= 127 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
+ } unpack('U*', $_[0])
+ );
+ }
+
+
+ sub _encode_latin1 {
+ join('',
+ map {
+ $_ <= 255 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
+ } unpack('U*', $_[0])
+ );
+ }
+
+
+ sub _encode_surrogates { # from perlunicode
+ my $uni = $_[0] - 0x10000;
+ return ($uni / 0x400 + 0xD800, $uni % 0x400 + 0xDC00);
+ }
+
+
+ sub _is_bignum {
+ $_[0]->isa('Math::BigInt') or $_[0]->isa('Math::BigFloat');
+ }
+
+
+
+ #
+ # JSON => Perl
+ #
+
+ my $max_intsize;
+
+ BEGIN {
+ my $checkint = 1111;
+ for my $d (5..64) {
+ $checkint .= 1;
+ my $int = eval qq| $checkint |;
+ if ($int =~ /[eE]/) {
+ $max_intsize = $d - 1;
+ last;
+ }
+ }
+ }
+
+ { # PARSE
+
+ my %escapes = ( # by Jeremy Muhlich <jmuhlich [at] bitflood.org>
+ b => "\x8",
+ t => "\x9",
+ n => "\xA",
+ f => "\xC",
+ r => "\xD",
+ '\\' => '\\',
+ '"' => '"',
+ '/' => '/',
+ );
+
+ my $text; # json data
+ my $at; # offset
+ my $ch; # 1chracter
+ my $len; # text length (changed according to UTF8 or NON UTF8)
+ # INTERNAL
+ my $depth; # nest counter
+ my $encoding; # json text encoding
+ my $is_valid_utf8; # temp variable
+ my $utf8_len; # utf8 byte length
+ # FLAGS
+ my $utf8; # must be utf8
+ my $max_depth; # max nest nubmer of objects and arrays
+ my $max_size;
+ my $relaxed;
+ my $cb_object;
+ my $cb_sk_object;
+
+ my $F_HOOK;
+
+ my $allow_bigint; # using Math::BigInt
+ my $singlequote; # loosely quoting
+ my $loose; #
+ my $allow_barekey; # bareKey
+
+ # $opt flag
+ # 0x00000001 .... decode_prefix
+ # 0x10000000 .... incr_parse
+
+ sub PP_decode_json {
+ my ($self, $opt); # $opt is an effective flag during this decode_json.
+
+ ($self, $text, $opt) = @_;
+
+ ($at, $ch, $depth) = (0, '', 0);
+
+ if ( !defined $text or ref $text ) {
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+
+ my $idx = $self->{PROPS};
+
+ ($utf8, $relaxed, $loose, $allow_bigint, $allow_barekey, $singlequote)
+ = @{$idx}[P_UTF8, P_RELAXED, P_LOOSE .. P_ALLOW_SINGLEQUOTE];
+
+ if ( $utf8 ) {
+ utf8::downgrade( $text, 1 ) or Carp::croak("Wide character in subroutine entry");
+ }
+ else {
+ utf8::upgrade( $text );
+ }
+
+ $len = length $text;
+
+ ($max_depth, $max_size, $cb_object, $cb_sk_object, $F_HOOK)
+ = @{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/};
+
+ if ($max_size > 1) {
+ use bytes;
+ my $bytes = length $text;
+ decode_error(
+ sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s"
+ , $bytes, $max_size), 1
+ ) if ($bytes > $max_size);
+ }
+
+ # Currently no effect
+ # should use regexp
+ my @octets = unpack('C4', $text);
+ $encoding = ( $octets[0] and $octets[1]) ? 'UTF-8'
+ : (!$octets[0] and $octets[1]) ? 'UTF-16BE'
+ : (!$octets[0] and !$octets[1]) ? 'UTF-32BE'
+ : ( $octets[2] ) ? 'UTF-16LE'
+ : (!$octets[2] ) ? 'UTF-32LE'
+ : 'unknown';
+
+ white(); # remove head white space
+
+ my $valid_start = defined $ch; # Is there a first character for JSON structure?
+
+ my $result = value();
+
+ return undef if ( !$result && ( $opt & 0x10000000 ) ); # for incr_parse
+
+ decode_error("malformed JSON string, neither array, object, number, string or atom") unless $valid_start;
+
+ if ( !$idx->[ P_ALLOW_NONREF ] and !ref $result ) {
+ decode_error(
+ 'JSON text must be an object or array (but found number, string, true, false or null,'
+ . ' use allow_nonref to allow this)', 1);
+ }
+
+ Carp::croak('something wrong.') if $len < $at; # we won't arrive here.
+
+ my $consumed = defined $ch ? $at - 1 : $at; # consumed JSON text length
+
+ white(); # remove tail white space
+
+ if ( $ch ) {
+ return ( $result, $consumed ) if ($opt & 0x00000001); # all right if decode_prefix
+ decode_error("garbage after JSON object");
+ }
+
+ ( $opt & 0x00000001 ) ? ( $result, $consumed ) : $result;
+ }
+
+
+ sub next_chr {
+ return $ch = undef if($at >= $len);
+ $ch = substr($text, $at++, 1);
+ }
+
+
+ sub value {
+ white();
+ return if(!defined $ch);
+ return object() if($ch eq '{');
+ return array() if($ch eq '[');
+ return string() if($ch eq '"' or ($singlequote and $ch eq "'"));
+ return number() if($ch =~ /[0-9]/ or $ch eq '-');
+ return word();
+ }
+
+ sub string {
+ my ($i, $s, $t, $u);
+ my $utf16;
+ my $is_utf8;
+
+ ($is_valid_utf8, $utf8_len) = ('', 0);
+
+ $s = ''; # basically UTF8 flag on
+
+ if($ch eq '"' or ($singlequote and $ch eq "'")){
+ my $boundChar = $ch;
+
+ OUTER: while( defined(next_chr()) ){
+
+ if($ch eq $boundChar){
+ next_chr();
+
+ if ($utf16) {
+ decode_error("missing low surrogate character in surrogate pair");
+ }
+
+ utf8::decode($s) if($is_utf8);
+
+ return $s;
+ }
+ elsif($ch eq '\\'){
+ next_chr();
+ if(exists $escapes{$ch}){
+ $s .= $escapes{$ch};
+ }
+ elsif($ch eq 'u'){ # UNICODE handling
+ my $u = '';
+
+ for(1..4){
+ $ch = next_chr();
+ last OUTER if($ch !~ /[0-9a-fA-F]/);
+ $u .= $ch;
+ }
+
+ # U+D800 - U+DBFF
+ if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/) { # UTF-16 high surrogate?
+ $utf16 = $u;
+ }
+ # U+DC00 - U+DFFF
+ elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/) { # UTF-16 low surrogate?
+ unless (defined $utf16) {
+ decode_error("missing high surrogate character in surrogate pair");
+ }
+ $is_utf8 = 1;
+ $s .= JSON_PP_decode_surrogates($utf16, $u) || next;
+ $utf16 = undef;
+ }
+ else {
+ if (defined $utf16) {
+ decode_error("surrogate pair expected");
+ }
+
+ if ( ( my $hex = hex( $u ) ) > 127 ) {
+ $is_utf8 = 1;
+ $s .= JSON_PP_decode_unicode($u) || next;
+ }
+ else {
+ $s .= chr $hex;
+ }
+ }
+
+ }
+ else{
+ unless ($loose) {
+ $at -= 2;
+ decode_error('illegal backslash escape sequence in string');
+ }
+ $s .= $ch;
+ }
+ }
+ else{
+
+ if ( ord $ch > 127 ) {
+ if ( $utf8 ) {
+ unless( $ch = is_valid_utf8($ch) ) {
+ $at -= 1;
+ decode_error("malformed UTF-8 character in JSON string");
+ }
+ else {
+ $at += $utf8_len - 1;
+ }
+ }
+ else {
+ utf8::encode( $ch );
+ }
+
+ $is_utf8 = 1;
+ }
+
+ if (!$loose) {
+ if ($ch =~ /[\x00-\x1f\x22\x5c]/) { # '/' ok
+ $at--;
+ decode_error('invalid character encountered while parsing JSON string');
+ }
+ }
+
+ $s .= $ch;
+ }
+ }
+ }
+
+ decode_error("unexpected end of string while parsing JSON string");
+ }
+
+
+ sub white {
+ while( defined $ch ){
+ if($ch le ' '){
+ next_chr();
+ }
+ elsif($ch eq '/'){
+ next_chr();
+ if(defined $ch and $ch eq '/'){
+ 1 while(defined(next_chr()) and $ch ne "\n" and $ch ne "\r");
+ }
+ elsif(defined $ch and $ch eq '*'){
+ next_chr();
+ while(1){
+ if(defined $ch){
+ if($ch eq '*'){
+ if(defined(next_chr()) and $ch eq '/'){
+ next_chr();
+ last;
+ }
+ }
+ else{
+ next_chr();
+ }
+ }
+ else{
+ decode_error("Unterminated comment");
+ }
+ }
+ next;
+ }
+ else{
+ $at--;
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+ }
+ else{
+ if ($relaxed and $ch eq '#') { # correctly?
+ pos($text) = $at;
+ $text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g;
+ $at = pos($text);
+ next_chr;
+ next;
+ }
+
+ last;
+ }
+ }
+ }
+
+
+ sub array {
+ my $a = $_[0] || []; # you can use this code to use another array ref object.
+
+ decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
+ if (++$depth > $max_depth);
+
+ next_chr();
+ white();
+
+ if(defined $ch and $ch eq ']'){
+ --$depth;
+ next_chr();
+ return $a;
+ }
+ else {
+ while(defined($ch)){
+ push @$a, value();
+
+ white();
+
+ if (!defined $ch) {
+ last;
+ }
+
+ if($ch eq ']'){
+ --$depth;
+ next_chr();
+ return $a;
+ }
+
+ if($ch ne ','){
+ last;
+ }
+
+ next_chr();
+ white();
+
+ if ($relaxed and $ch eq ']') {
+ --$depth;
+ next_chr();
+ return $a;
+ }
+
+ }
+ }
+
+ decode_error(", or ] expected while parsing array");
+ }
+
+
+ sub object {
+ my $o = $_[0] || {}; # you can use this code to use another hash ref object.
+ my $k;
+
+ decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
+ if (++$depth > $max_depth);
+ next_chr();
+ white();
+
+ if(defined $ch and $ch eq '}'){
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+ else {
+ while (defined $ch) {
+ $k = ($allow_barekey and $ch ne '"' and $ch ne "'") ? bareKey() : string();
+ white();
+
+ if(!defined $ch or $ch ne ':'){
+ $at--;
+ decode_error("':' expected");
+ }
+
+ next_chr();
+ $o->{$k} = value();
+ white();
+
+ last if (!defined $ch);
+
+ if($ch eq '}'){
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+
+ if($ch ne ','){
+ last;
+ }
+
+ next_chr();
+ white();
+
+ if ($relaxed and $ch eq '}') {
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+
+ }
+
+ }
+
+ $at--;
+ decode_error(", or } expected while parsing object/hash");
+ }
+
+
+ sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition
+ my $key;
+ while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){
+ $key .= $ch;
+ next_chr();
+ }
+ return $key;
+ }
+
+
+ sub word {
+ my $word = substr($text,$at-1,4);
+
+ if($word eq 'true'){
+ $at += 3;
+ next_chr;
+ return $JSON::PP::true;
+ }
+ elsif($word eq 'null'){
+ $at += 3;
+ next_chr;
+ return undef;
+ }
+ elsif($word eq 'fals'){
+ $at += 3;
+ if(substr($text,$at,1) eq 'e'){
+ $at++;
+ next_chr;
+ return $JSON::PP::false;
+ }
+ }
+
+ $at--; # for decode_error report
+
+ decode_error("'null' expected") if ($word =~ /^n/);
+ decode_error("'true' expected") if ($word =~ /^t/);
+ decode_error("'false' expected") if ($word =~ /^f/);
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+
+
+ sub number {
+ my $n = '';
+ my $v;
+
+ # According to RFC4627, hex or oct digts are invalid.
+ if($ch eq '0'){
+ my $peek = substr($text,$at,1);
+ my $hex = $peek =~ /[xX]/; # 0 or 1
+
+ if($hex){
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ ($n) = ( substr($text, $at+1) =~ /^([0-9a-fA-F]+)/);
+ }
+ else{ # oct
+ ($n) = ( substr($text, $at) =~ /^([0-7]+)/);
+ if (defined $n and length $n > 1) {
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ }
+ }
+
+ if(defined $n and length($n)){
+ if (!$hex and length($n) == 1) {
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ }
+ $at += length($n) + $hex;
+ next_chr;
+ return $hex ? hex($n) : oct($n);
+ }
+ }
+
+ if($ch eq '-'){
+ $n = '-';
+ next_chr;
+ if (!defined $ch or $ch !~ /\d/) {
+ decode_error("malformed number (no digits after initial minus)");
+ }
+ }
+
+ while(defined $ch and $ch =~ /\d/){
+ $n .= $ch;
+ next_chr;
+ }
+
+ if(defined $ch and $ch eq '.'){
+ $n .= '.';
+
+ next_chr;
+ if (!defined $ch or $ch !~ /\d/) {
+ decode_error("malformed number (no digits after decimal point)");
+ }
+ else {
+ $n .= $ch;
+ }
+
+ while(defined(next_chr) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+ }
+
+ if(defined $ch and ($ch eq 'e' or $ch eq 'E')){
+ $n .= $ch;
+ next_chr;
+
+ if(defined($ch) and ($ch eq '+' or $ch eq '-')){
+ $n .= $ch;
+ next_chr;
+ if (!defined $ch or $ch =~ /\D/) {
+ decode_error("malformed number (no digits after exp sign)");
+ }
+ $n .= $ch;
+ }
+ elsif(defined($ch) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+ else {
+ decode_error("malformed number (no digits after exp sign)");
+ }
+
+ while(defined(next_chr) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+
+ }
+
+ $v .= $n;
+
+ if ($v !~ /[.eE]/ and length $v > $max_intsize) {
+ if ($allow_bigint) { # from Adam Sussman
+ require Math::BigInt;
+ return Math::BigInt->new($v);
+ }
+ else {
+ return "$v";
+ }
+ }
+ elsif ($allow_bigint) {
+ require Math::BigFloat;
+ return Math::BigFloat->new($v);
+ }
+
+ return 0+$v;
+ }
+
+
+ sub is_valid_utf8 {
+
+ $utf8_len = $_[0] =~ /[\x00-\x7F]/ ? 1
+ : $_[0] =~ /[\xC2-\xDF]/ ? 2
+ : $_[0] =~ /[\xE0-\xEF]/ ? 3
+ : $_[0] =~ /[\xF0-\xF4]/ ? 4
+ : 0
+ ;
+
+ return unless $utf8_len;
+
+ my $is_valid_utf8 = substr($text, $at - 1, $utf8_len);
+
+ return ( $is_valid_utf8 =~ /^(?:
+ [\x00-\x7F]
+ |[\xC2-\xDF][\x80-\xBF]
+ |[\xE0][\xA0-\xBF][\x80-\xBF]
+ |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
+ |[\xED][\x80-\x9F][\x80-\xBF]
+ |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
+ |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
+ )$/x ) ? $is_valid_utf8 : '';
+ }
+
+
+ sub decode_error {
+ my $error = shift;
+ my $no_rep = shift;
+ my $str = defined $text ? substr($text, $at) : '';
+ my $mess = '';
+ my $type = $] >= 5.008 ? 'U*'
+ : $] < 5.006 ? 'C*'
+ : utf8::is_utf8( $str ) ? 'U*' # 5.6
+ : 'C*'
+ ;
+
+ for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ?
+ $mess .= $c == 0x07 ? '\a'
+ : $c == 0x09 ? '\t'
+ : $c == 0x0a ? '\n'
+ : $c == 0x0d ? '\r'
+ : $c == 0x0c ? '\f'
+ : $c < 0x20 ? sprintf('\x{%x}', $c)
+ : $c == 0x5c ? '\\\\'
+ : $c < 0x80 ? chr($c)
+ : sprintf('\x{%x}', $c)
+ ;
+ if ( length $mess >= 20 ) {
+ $mess .= '...';
+ last;
+ }
+ }
+
+ unless ( length $mess ) {
+ $mess = '(end of string)';
+ }
+
+ Carp::croak (
+ $no_rep ? "$error" : "$error, at character offset $at (before \"$mess\")"
+ );
+
+ }
+
+
+ sub _json_object_hook {
+ my $o = $_[0];
+ my @ks = keys %{$o};
+
+ if ( $cb_sk_object and @ks == 1 and exists $cb_sk_object->{ $ks[0] } and ref $cb_sk_object->{ $ks[0] } ) {
+ my @val = $cb_sk_object->{ $ks[0] }->( $o->{$ks[0]} );
+ if (@val == 1) {
+ return $val[0];
+ }
+ }
+
+ my @val = $cb_object->($o) if ($cb_object);
+ if (@val == 0 or @val > 1) {
+ return $o;
+ }
+ else {
+ return $val[0];
+ }
+ }
+
+
+ sub PP_decode_box {
+ {
+ text => $text,
+ at => $at,
+ ch => $ch,
+ len => $len,
+ depth => $depth,
+ encoding => $encoding,
+ is_valid_utf8 => $is_valid_utf8,
+ };
+ }
+
+ } # PARSE
+
+
+ sub _decode_surrogates { # from perlunicode
+ my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00);
+ my $un = pack('U*', $uni);
+ utf8::encode( $un );
+ return $un;
+ }
+
+
+ sub _decode_unicode {
+ my $un = pack('U', hex shift);
+ utf8::encode( $un );
+ return $un;
+ }
+
+ #
+ # Setup for various Perl versions (the code from JSON::PP58)
+ #
+
+ BEGIN {
+
+ unless ( defined &utf8::is_utf8 ) {
+ require Encode;
+ *utf8::is_utf8 = *Encode::is_utf8;
+ }
+
+ if ( $] >= 5.008 ) {
+ *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii;
+ *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1;
+ *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
+ *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode;
+ }
+
+ if ($] >= 5.008 and $] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken.
+ package JSON::PP;
+ require subs;
+ subs->import('join');
+ eval q|
+ sub join {
+ return '' if (@_ < 2);
+ my $j = shift;
+ my $str = shift;
+ for (@_) { $str .= $j . $_; }
+ return $str;
+ }
+ |;
+ }
+
+
+ sub JSON::PP::incr_parse {
+ local $Carp::CarpLevel = 1;
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
+ }
+
+
+ sub JSON::PP::incr_skip {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
+ }
+
+
+ sub JSON::PP::incr_reset {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+ }
+
+ eval q{
+ sub JSON::PP::incr_text : lvalue {
+ $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
+
+ if ( $_[0]->{_incr_parser}->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+ $_[0]->{_incr_parser}->{incr_text};
+ }
+ } if ( $] >= 5.006 );
+
+ } # Setup for various Perl versions (the code from JSON::PP58)
+
+
+ ###############################
+ # Utilities
+ #
+
+ BEGIN {
+ eval 'require Scalar::Util';
+ unless($@){
+ *JSON::PP::blessed = \&Scalar::Util::blessed;
+ *JSON::PP::reftype = \&Scalar::Util::reftype;
+ *JSON::PP::refaddr = \&Scalar::Util::refaddr;
+ }
+ else{ # This code is from Sclar::Util.
+ # warn $@;
+ eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';
+ *JSON::PP::blessed = sub {
+ local($@, $SIG{__DIE__}, $SIG{__WARN__});
+ ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef;
+ };
+ my %tmap = qw(
+ B::NULL SCALAR
+ B::HV HASH
+ B::AV ARRAY
+ B::CV CODE
+ B::IO IO
+ B::GV GLOB
+ B::REGEXP REGEXP
+ );
+ *JSON::PP::reftype = sub {
+ my $r = shift;
+
+ return undef unless length(ref($r));
+
+ my $t = ref(B::svref_2object($r));
+
+ return
+ exists $tmap{$t} ? $tmap{$t}
+ : length(ref($$r)) ? 'REF'
+ : 'SCALAR';
+ };
+ *JSON::PP::refaddr = sub {
+ return undef unless length(ref($_[0]));
+
+ my $addr;
+ if(defined(my $pkg = blessed($_[0]))) {
+ $addr .= bless $_[0], 'Scalar::Util::Fake';
+ bless $_[0], $pkg;
+ }
+ else {
+ $addr .= $_[0]
+ }
+
+ $addr =~ /0x(\w+)/;
+ local $^W;
+ #no warnings 'portable';
+ hex($1);
+ }
+ }
+ }
+
+
+ # shamely copied and modified from JSON::XS code.
+
+ $JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
+ $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
+
+ sub is_bool { defined $_[0] and UNIVERSAL::isa($_[0], "JSON::PP::Boolean"); }
+
+ sub true { $JSON::PP::true }
+ sub false { $JSON::PP::false }
+ sub null { undef; }
+
+ ###############################
+
+ package JSON::PP::Boolean;
+
+ use overload (
+ "0+" => sub { ${$_[0]} },
+ "++" => sub { $_[0] = ${$_[0]} + 1 },
+ "--" => sub { $_[0] = ${$_[0]} - 1 },
+ fallback => 1,
+ );
+
+
+ ###############################
+
+ package JSON::PP::IncrParser;
+
+ use strict;
+
+ use constant INCR_M_WS => 0; # initial whitespace skipping
+ use constant INCR_M_STR => 1; # inside string
+ use constant INCR_M_BS => 2; # inside backslash
+ use constant INCR_M_JSON => 3; # outside anything, count nesting
+ use constant INCR_M_C0 => 4;
+ use constant INCR_M_C1 => 5;
+
+ $JSON::PP::IncrParser::VERSION = '1.01';
+
+ my $unpack_format = $] < 5.006 ? 'C*' : 'U*';
+
+ sub new {
+ my ( $class ) = @_;
+
+ bless {
+ incr_nest => 0,
+ incr_text => undef,
+ incr_parsing => 0,
+ incr_p => 0,
+ }, $class;
+ }
+
+
+ sub incr_parse {
+ my ( $self, $coder, $text ) = @_;
+
+ $self->{incr_text} = '' unless ( defined $self->{incr_text} );
+
+ if ( defined $text ) {
+ if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) {
+ utf8::upgrade( $self->{incr_text} ) ;
+ utf8::decode( $self->{incr_text} ) ;
+ }
+ $self->{incr_text} .= $text;
+ }
+
+
+ my $max_size = $coder->get_max_size;
+
+ if ( defined wantarray ) {
+
+ $self->{incr_mode} = INCR_M_WS unless defined $self->{incr_mode};
+
+ if ( wantarray ) {
+ my @ret;
+
+ $self->{incr_parsing} = 1;
+
+ do {
+ push @ret, $self->_incr_parse( $coder, $self->{incr_text} );
+
+ unless ( !$self->{incr_nest} and $self->{incr_mode} == INCR_M_JSON ) {
+ $self->{incr_mode} = INCR_M_WS if $self->{incr_mode} != INCR_M_STR;
+ }
+
+ } until ( length $self->{incr_text} >= $self->{incr_p} );
+
+ $self->{incr_parsing} = 0;
+
+ return @ret;
+ }
+ else { # in scalar context
+ $self->{incr_parsing} = 1;
+ my $obj = $self->_incr_parse( $coder, $self->{incr_text} );
+ $self->{incr_parsing} = 0 if defined $obj; # pointed by Martin J. Evans
+ return $obj ? $obj : undef; # $obj is an empty string, parsing was completed.
+ }
+
+ }
+
+ }
+
+
+ sub _incr_parse {
+ my ( $self, $coder, $text, $skip ) = @_;
+ my $p = $self->{incr_p};
+ my $restore = $p;
+
+ my @obj;
+ my $len = length $text;
+
+ if ( $self->{incr_mode} == INCR_M_WS ) {
+ while ( $len > $p ) {
+ my $s = substr( $text, $p, 1 );
+ $p++ and next if ( 0x20 >= unpack($unpack_format, $s) );
+ $self->{incr_mode} = INCR_M_JSON;
+ last;
+ }
+ }
+
+ while ( $len > $p ) {
+ my $s = substr( $text, $p++, 1 );
+
+ if ( $s eq '"' ) {
+ if (substr( $text, $p - 2, 1 ) eq '\\' ) {
+ next;
+ }
+
+ if ( $self->{incr_mode} != INCR_M_STR ) {
+ $self->{incr_mode} = INCR_M_STR;
+ }
+ else {
+ $self->{incr_mode} = INCR_M_JSON;
+ unless ( $self->{incr_nest} ) {
+ last;
+ }
+ }
+ }
+
+ if ( $self->{incr_mode} == INCR_M_JSON ) {
+
+ if ( $s eq '[' or $s eq '{' ) {
+ if ( ++$self->{incr_nest} > $coder->get_max_depth ) {
+ Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)');
+ }
+ }
+ elsif ( $s eq ']' or $s eq '}' ) {
+ last if ( --$self->{incr_nest} <= 0 );
+ }
+ elsif ( $s eq '#' ) {
+ while ( $len > $p ) {
+ last if substr( $text, $p++, 1 ) eq "\n";
+ }
+ }
+
+ }
+
+ }
+
+ $self->{incr_p} = $p;
+
+ return if ( $self->{incr_mode} == INCR_M_STR and not $self->{incr_nest} );
+ return if ( $self->{incr_mode} == INCR_M_JSON and $self->{incr_nest} > 0 );
+
+ return '' unless ( length substr( $self->{incr_text}, 0, $p ) );
+
+ local $Carp::CarpLevel = 2;
+
+ $self->{incr_p} = $restore;
+ $self->{incr_c} = $p;
+
+ my ( $obj, $tail ) = $coder->PP_decode_json( substr( $self->{incr_text}, 0, $p ), 0x10000001 );
+
+ $self->{incr_text} = substr( $self->{incr_text}, $p );
+ $self->{incr_p} = 0;
+
+ return $obj || '';
+ }
+
+
+ sub incr_text {
+ if ( $_[0]->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+ $_[0]->{incr_text};
+ }
+
+
+ sub incr_skip {
+ my $self = shift;
+ $self->{incr_text} = substr( $self->{incr_text}, $self->{incr_c} );
+ $self->{incr_p} = 0;
+ }
+
+
+ sub incr_reset {
+ my $self = shift;
+ $self->{incr_text} = undef;
+ $self->{incr_p} = 0;
+ $self->{incr_mode} = 0;
+ $self->{incr_nest} = 0;
+ $self->{incr_parsing} = 0;
+ }
+
+ ###############################
+
+
+ 1;
+ __END__
+ =pod
+
+ =head1 NAME
+
+ JSON::PP - JSON::XS compatible pure-Perl module.
+
+ =head1 SYNOPSIS
+
+ use JSON::PP;
+
+ # exported functions, they croak on error
+ # and expect/generate UTF-8
+
+ $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
+ $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text;
+
+ # OO-interface
+
+ $coder = JSON::PP->new->ascii->pretty->allow_nonref;
+
+ $json_text = $json->encode( $perl_scalar );
+ $perl_scalar = $json->decode( $json_text );
+
+ $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing
+
+ # Note that JSON version 2.0 and above will automatically use
+ # JSON::XS or JSON::PP, so you should be able to just:
+
+ use JSON;
+
+
+ =head1 VERSION
+
+ 2.27202
+
+ L<JSON::XS> 2.27 (~2.30) compatible.
+
+ =head1 NOTE
+
+ JSON::PP had been inculded in JSON distribution (CPAN module).
+ It was a perl core module in Perl 5.14.
+
+ =head1 DESCRIPTION
+
+ This module is L<JSON::XS> compatible pure Perl module.
+ (Perl 5.8 or later is recommended)
+
+ JSON::XS is the fastest and most proper JSON module on CPAN.
+ It is written by Marc Lehmann in C, so must be compiled and
+ installed in the used environment.
+
+ JSON::PP is a pure-Perl module and has compatibility to JSON::XS.
+
+
+ =head2 FEATURES
+
+ =over
+
+ =item * correct unicode handling
+
+ This module knows how to handle Unicode (depending on Perl version).
+
+ See to L<JSON::XS/A FEW NOTES ON UNICODE AND PERL> and L<UNICODE HANDLING ON PERLS>.
+
+
+ =item * round-trip integrity
+
+ When you serialise a perl data structure using only data types supported
+ by JSON and Perl, the deserialised data structure is identical on the Perl
+ level. (e.g. the string "2.0" doesn't suddenly become "2" just because
+ it looks like a number). There I<are> minor exceptions to this, read the
+ MAPPING section below to learn about those.
+
+
+ =item * strict checking of JSON correctness
+
+ There is no guessing, no generating of illegal JSON texts by default,
+ and only JSON is accepted as input by default (the latter is a security feature).
+ But when some options are set, loose chcking features are available.
+
+ =back
+
+ =head1 FUNCTIONAL INTERFACE
+
+ Some documents are copied and modified from L<JSON::XS/FUNCTIONAL INTERFACE>.
+
+ =head2 encode_json
+
+ $json_text = encode_json $perl_scalar
+
+ Converts the given Perl data structure to a UTF-8 encoded, binary string.
+
+ This function call is functionally identical to:
+
+ $json_text = JSON::PP->new->utf8->encode($perl_scalar)
+
+ =head2 decode_json
+
+ $perl_scalar = decode_json $json_text
+
+ The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
+ to parse that as an UTF-8 encoded JSON text, returning the resulting
+ reference.
+
+ This function call is functionally identical to:
+
+ $perl_scalar = JSON::PP->new->utf8->decode($json_text)
+
+ =head2 JSON::PP::is_bool
+
+ $is_boolean = JSON::PP::is_bool($scalar)
+
+ Returns true if the passed scalar represents either JSON::PP::true or
+ JSON::PP::false, two constants that act like C<1> and C<0> respectively
+ and are also used to represent JSON C<true> and C<false> in Perl strings.
+
+ =head2 JSON::PP::true
+
+ Returns JSON true value which is blessed object.
+ It C<isa> JSON::PP::Boolean object.
+
+ =head2 JSON::PP::false
+
+ Returns JSON false value which is blessed object.
+ It C<isa> JSON::PP::Boolean object.
+
+ =head2 JSON::PP::null
+
+ Returns C<undef>.
+
+ See L<MAPPING>, below, for more information on how JSON values are mapped to
+ Perl.
+
+
+ =head1 HOW DO I DECODE A DATA FROM OUTER AND ENCODE TO OUTER
+
+ This section supposes that your perl vresion is 5.8 or later.
+
+ If you know a JSON text from an outer world - a network, a file content, and so on,
+ is encoded in UTF-8, you should use C<decode_json> or C<JSON> module object
+ with C<utf8> enable. And the decoded result will contain UNICODE characters.
+
+ # from network
+ my $json = JSON::PP->new->utf8;
+ my $json_text = CGI->new->param( 'json_data' );
+ my $perl_scalar = $json->decode( $json_text );
+
+ # from file content
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ $json_text = <$fh>;
+ $perl_scalar = decode_json( $json_text );
+
+ If an outer data is not encoded in UTF-8, firstly you should C<decode> it.
+
+ use Encode;
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ my $encoding = 'cp932';
+ my $unicode_json_text = decode( $encoding, <$fh> ); # UNICODE
+
+ # or you can write the below code.
+ #
+ # open( my $fh, "<:encoding($encoding)", 'json.data' );
+ # $unicode_json_text = <$fh>;
+
+ In this case, C<$unicode_json_text> is of course UNICODE string.
+ So you B<cannot> use C<decode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable.
+
+ $perl_scalar = $json->utf8(0)->decode( $unicode_json_text );
+
+ Or C<encode 'utf8'> and C<decode_json>:
+
+ $perl_scalar = decode_json( encode( 'utf8', $unicode_json_text ) );
+ # this way is not efficient.
+
+ And now, you want to convert your C<$perl_scalar> into JSON data and
+ send it to an outer world - a network or a file content, and so on.
+
+ Your data usually contains UNICODE strings and you want the converted data to be encoded
+ in UTF-8, you should use C<encode_json> or C<JSON> module object with C<utf8> enable.
+
+ print encode_json( $perl_scalar ); # to a network? file? or display?
+ # or
+ print $json->utf8->encode( $perl_scalar );
+
+ If C<$perl_scalar> does not contain UNICODE but C<$encoding>-encoded strings
+ for some reason, then its characters are regarded as B<latin1> for perl
+ (because it does not concern with your $encoding).
+ You B<cannot> use C<encode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable.
+ Note that the resulted text is a UNICODE string but no problem to print it.
+
+ # $perl_scalar contains $encoding encoded string values
+ $unicode_json_text = $json->utf8(0)->encode( $perl_scalar );
+ # $unicode_json_text consists of characters less than 0x100
+ print $unicode_json_text;
+
+ Or C<decode $encoding> all string values and C<encode_json>:
+
+ $perl_scalar->{ foo } = decode( $encoding, $perl_scalar->{ foo } );
+ # ... do it to each string values, then encode_json
+ $json_text = encode_json( $perl_scalar );
+
+ This method is a proper way but probably not efficient.
+
+ See to L<Encode>, L<perluniintro>.
+
+
+ =head1 METHODS
+
+ Basically, check to L<JSON> or L<JSON::XS>.
+
+ =head2 new
+
+ $json = JSON::PP->new
+
+ Rturns a new JSON::PP object that can be used to de/encode JSON
+ strings.
+
+ All boolean flags described below are by default I<disabled>.
+
+ The mutators for flags all return the JSON object again and thus calls can
+ be chained:
+
+ my $json = JSON::PP->new->utf8->space_after->encode({a => [1,2]})
+ => {"a": [1, 2]}
+
+ =head2 ascii
+
+ $json = $json->ascii([$enable])
+
+ $enabled = $json->get_ascii
+
+ If $enable is true (or missing), then the encode method will not generate characters outside
+ the code range 0..127. Any Unicode characters outside that range will be escaped using either
+ a single \uXXXX or a double \uHHHH\uLLLLL escape sequence, as per RFC4627.
+ (See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>).
+
+ In Perl 5.005, there is no character having high value (more than 255).
+ See to L<UNICODE HANDLING ON PERLS>.
+
+ If $enable is false, then the encode method will not escape Unicode characters unless
+ required by the JSON syntax or other flags. This results in a faster and more compact format.
+
+ JSON::PP->new->ascii(1)->encode([chr 0x10401])
+ => ["\ud801\udc01"]
+
+ =head2 latin1
+
+ $json = $json->latin1([$enable])
+
+ $enabled = $json->get_latin1
+
+ If $enable is true (or missing), then the encode method will encode the resulting JSON
+ text as latin1 (or iso-8859-1), escaping any characters outside the code range 0..255.
+
+ If $enable is false, then the encode method will not escape Unicode characters
+ unless required by the JSON syntax or other flags.
+
+ JSON::XS->new->latin1->encode (["\x{89}\x{abc}"]
+ => ["\x{89}\\u0abc"] # (perl syntax, U+abc escaped, U+89 not)
+
+ See to L<UNICODE HANDLING ON PERLS>.
+
+ =head2 utf8
+
+ $json = $json->utf8([$enable])
+
+ $enabled = $json->get_utf8
+
+ If $enable is true (or missing), then the encode method will encode the JSON result
+ into UTF-8, as required by many protocols, while the decode method expects to be handled
+ an UTF-8-encoded string. Please note that UTF-8-encoded strings do not contain any
+ characters outside the range 0..255, they are thus useful for bytewise/binary I/O.
+
+ (In Perl 5.005, any character outside the range 0..255 does not exist.
+ See to L<UNICODE HANDLING ON PERLS>.)
+
+ In future versions, enabling this option might enable autodetection of the UTF-16 and UTF-32
+ encoding families, as described in RFC4627.
+
+ If $enable is false, then the encode method will return the JSON string as a (non-encoded)
+ Unicode string, while decode expects thus a Unicode string. Any decoding or encoding
+ (e.g. to UTF-8 or UTF-16) needs to be done yourself, e.g. using the Encode module.
+
+ Example, output UTF-16BE-encoded JSON:
+
+ use Encode;
+ $jsontext = encode "UTF-16BE", JSON::PP->new->encode ($object);
+
+ Example, decode UTF-32LE-encoded JSON:
+
+ use Encode;
+ $object = JSON::PP->new->decode (decode "UTF-32LE", $jsontext);
+
+
+ =head2 pretty
+
+ $json = $json->pretty([$enable])
+
+ This enables (or disables) all of the C<indent>, C<space_before> and
+ C<space_after> flags in one call to generate the most readable
+ (or most compact) form possible.
+
+ Equivalent to:
+
+ $json->indent->space_before->space_after
+
+ =head2 indent
+
+ $json = $json->indent([$enable])
+
+ $enabled = $json->get_indent
+
+ The default indent space length is three.
+ You can use C<indent_length> to change the length.
+
+ =head2 space_before
+
+ $json = $json->space_before([$enable])
+
+ $enabled = $json->get_space_before
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space before the C<:> separating keys from values in JSON objects.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before enabled, space_after and indent disabled:
+
+ {"key" :"value"}
+
+ =head2 space_after
+
+ $json = $json->space_after([$enable])
+
+ $enabled = $json->get_space_after
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space after the C<:> separating keys from values in JSON objects
+ and extra whitespace after the C<,> separating key-value pairs and array
+ members.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before and indent disabled, space_after enabled:
+
+ {"key": "value"}
+
+ =head2 relaxed
+
+ $json = $json->relaxed([$enable])
+
+ $enabled = $json->get_relaxed
+
+ If C<$enable> is true (or missing), then C<decode> will accept some
+ extensions to normal JSON syntax (see below). C<encode> will not be
+ affected in anyway. I<Be aware that this option makes you accept invalid
+ JSON texts as if they were valid!>. I suggest only to use this option to
+ parse application-specific files written by humans (configuration files,
+ resource files etc.)
+
+ If C<$enable> is false (the default), then C<decode> will only accept
+ valid JSON texts.
+
+ Currently accepted extensions are:
+
+ =over 4
+
+ =item * list items can have an end-comma
+
+ JSON I<separates> array elements and key-value pairs with commas. This
+ can be annoying if you write JSON texts manually and want to be able to
+ quickly append elements, so this extension accepts comma at the end of
+ such items not just between them:
+
+ [
+ 1,
+ 2, <- this comma not normally allowed
+ ]
+ {
+ "k1": "v1",
+ "k2": "v2", <- this comma not normally allowed
+ }
+
+ =item * shell-style '#'-comments
+
+ Whenever JSON allows whitespace, shell-style comments are additionally
+ allowed. They are terminated by the first carriage-return or line-feed
+ character, after which more white-space and comments are allowed.
+
+ [
+ 1, # this comment not allowed in JSON
+ # neither this one...
+ ]
+
+ =back
+
+ =head2 canonical
+
+ $json = $json->canonical([$enable])
+
+ $enabled = $json->get_canonical
+
+ If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
+ by sorting their keys. This is adding a comparatively high overhead.
+
+ If C<$enable> is false, then the C<encode> method will output key-value
+ pairs in the order Perl stores them (which will likely change between runs
+ of the same script).
+
+ This option is useful if you want the same data structure to be encoded as
+ the same JSON text (given the same overall settings). If it is disabled,
+ the same hash might be encoded differently even if contains the same data,
+ as key-value pairs have no inherent ordering in Perl.
+
+ This setting has no effect when decoding JSON texts.
+
+ If you want your own sorting routine, you can give a code referece
+ or a subroutine name to C<sort_by>. See to C<JSON::PP OWN METHODS>.
+
+ =head2 allow_nonref
+
+ $json = $json->allow_nonref([$enable])
+
+ $enabled = $json->get_allow_nonref
+
+ If C<$enable> is true (or missing), then the C<encode> method can convert a
+ non-reference into its corresponding string, number or null JSON value,
+ which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
+ values instead of croaking.
+
+ If C<$enable> is false, then the C<encode> method will croak if it isn't
+ passed an arrayref or hashref, as JSON texts must either be an object
+ or array. Likewise, C<decode> will croak if given something that is not a
+ JSON object or array.
+
+ JSON::PP->new->allow_nonref->encode ("Hello, World!")
+ => "Hello, World!"
+
+ =head2 allow_unknown
+
+ $json = $json->allow_unknown ([$enable])
+
+ $enabled = $json->get_allow_unknown
+
+ If $enable is true (or missing), then "encode" will *not* throw an
+ exception when it encounters values it cannot represent in JSON (for
+ example, filehandles) but instead will encode a JSON "null" value.
+ Note that blessed objects are not included here and are handled
+ separately by c<allow_nonref>.
+
+ If $enable is false (the default), then "encode" will throw an
+ exception when it encounters anything it cannot encode as JSON.
+
+ This option does not affect "decode" in any way, and it is
+ recommended to leave it off unless you know your communications
+ partner.
+
+ =head2 allow_blessed
+
+ $json = $json->allow_blessed([$enable])
+
+ $enabled = $json->get_allow_blessed
+
+ If C<$enable> is true (or missing), then the C<encode> method will not
+ barf when it encounters a blessed reference. Instead, the value of the
+ B<convert_blessed> option will decide whether C<null> (C<convert_blessed>
+ disabled or no C<TO_JSON> method found) or a representation of the
+ object (C<convert_blessed> enabled and C<TO_JSON> method found) is being
+ encoded. Has no effect on C<decode>.
+
+ If C<$enable> is false (the default), then C<encode> will throw an
+ exception when it encounters a blessed object.
+
+ =head2 convert_blessed
+
+ $json = $json->convert_blessed([$enable])
+
+ $enabled = $json->get_convert_blessed
+
+ If C<$enable> is true (or missing), then C<encode>, upon encountering a
+ blessed object, will check for the availability of the C<TO_JSON> method
+ on the object's class. If found, it will be called in scalar context
+ and the resulting scalar will be encoded instead of the object. If no
+ C<TO_JSON> method is found, the value of C<allow_blessed> will decide what
+ to do.
+
+ The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
+ returns other blessed objects, those will be handled in the same
+ way. C<TO_JSON> must take care of not causing an endless recursion cycle
+ (== crash) in this case. The name of C<TO_JSON> was chosen because other
+ methods called by the Perl core (== not by the user of the object) are
+ usually in upper case letters and to avoid collisions with the C<to_json>
+ function or method.
+
+ This setting does not yet influence C<decode> in any way.
+
+ If C<$enable> is false, then the C<allow_blessed> setting will decide what
+ to do when a blessed object is found.
+
+ =head2 filter_json_object
+
+ $json = $json->filter_json_object([$coderef])
+
+ When C<$coderef> is specified, it will be called from C<decode> each
+ time it decodes a JSON object. The only argument passed to the coderef
+ is a reference to the newly-created hash. If the code references returns
+ a single scalar (which need not be a reference), this value
+ (i.e. a copy of that scalar to avoid aliasing) is inserted into the
+ deserialised data structure. If it returns an empty list
+ (NOTE: I<not> C<undef>, which is a valid scalar), the original deserialised
+ hash will be inserted. This setting can slow down decoding considerably.
+
+ When C<$coderef> is omitted or undefined, any existing callback will
+ be removed and C<decode> will not change the deserialised hash in any
+ way.
+
+ Example, convert all JSON objects into the integer 5:
+
+ my $js = JSON::PP->new->filter_json_object (sub { 5 });
+ # returns [5]
+ $js->decode ('[{}]'); # the given subroutine takes a hash reference.
+ # throw an exception because allow_nonref is not enabled
+ # so a lone 5 is not allowed.
+ $js->decode ('{"a":1, "b":2}');
+
+ =head2 filter_json_single_key_object
+
+ $json = $json->filter_json_single_key_object($key [=> $coderef])
+
+ Works remotely similar to C<filter_json_object>, but is only called for
+ JSON objects having a single key named C<$key>.
+
+ This C<$coderef> is called before the one specified via
+ C<filter_json_object>, if any. It gets passed the single value in the JSON
+ object. If it returns a single value, it will be inserted into the data
+ structure. If it returns nothing (not even C<undef> but the empty list),
+ the callback from C<filter_json_object> will be called next, as if no
+ single-key callback were specified.
+
+ If C<$coderef> is omitted or undefined, the corresponding callback will be
+ disabled. There can only ever be one callback for a given key.
+
+ As this callback gets called less often then the C<filter_json_object>
+ one, decoding speed will not usually suffer as much. Therefore, single-key
+ objects make excellent targets to serialise Perl objects into, especially
+ as single-key JSON objects are as close to the type-tagged value concept
+ as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
+ support this in any way, so you need to make sure your data never looks
+ like a serialised Perl hash.
+
+ Typical names for the single object key are C<__class_whatever__>, or
+ C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
+ things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
+ with real hashes.
+
+ Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
+ into the corresponding C<< $WIDGET{<id>} >> object:
+
+ # return whatever is in $WIDGET{5}:
+ JSON::PP
+ ->new
+ ->filter_json_single_key_object (__widget__ => sub {
+ $WIDGET{ $_[0] }
+ })
+ ->decode ('{"__widget__": 5')
+
+ # this can be used with a TO_JSON method in some "widget" class
+ # for serialisation to json:
+ sub WidgetBase::TO_JSON {
+ my ($self) = @_;
+
+ unless ($self->{id}) {
+ $self->{id} = ..get..some..id..;
+ $WIDGET{$self->{id}} = $self;
+ }
+
+ { __widget__ => $self->{id} }
+ }
+
+ =head2 shrink
+
+ $json = $json->shrink([$enable])
+
+ $enabled = $json->get_shrink
+
+ In JSON::XS, this flag resizes strings generated by either
+ C<encode> or C<decode> to their minimum size possible.
+ It will also try to downgrade any strings to octet-form if possible.
+
+ In JSON::PP, it is noop about resizing strings but tries
+ C<utf8::downgrade> to the returned string by C<encode>.
+ See to L<utf8>.
+
+ See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>
+
+ =head2 max_depth
+
+ $json = $json->max_depth([$maximum_nesting_depth])
+
+ $max_depth = $json->get_max_depth
+
+ Sets the maximum nesting level (default C<512>) accepted while encoding
+ or decoding. If a higher nesting level is detected in JSON text or a Perl
+ data structure, then the encoder and decoder will stop and croak at that
+ point.
+
+ Nesting level is defined by number of hash- or arrayrefs that the encoder
+ needs to traverse to reach a given point or the number of C<{> or C<[>
+ characters without their matching closing parenthesis crossed to reach a
+ given character in a string.
+
+ If no argument is given, the highest possible setting will be used, which
+ is rarely useful.
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ When a large value (100 or more) was set and it de/encodes a deep nested object/text,
+ it may raise a warning 'Deep recursion on subroutin' at the perl runtime phase.
+
+ =head2 max_size
+
+ $json = $json->max_size([$maximum_string_size])
+
+ $max_size = $json->get_max_size
+
+ Set the maximum length a JSON text may have (in bytes) where decoding is
+ being attempted. The default is C<0>, meaning no limit. When C<decode>
+ is called on a string that is longer then this many bytes, it will not
+ attempt to decode the string but throw an exception. This setting has no
+ effect on C<encode> (yet).
+
+ If no argument is given, the limit check will be deactivated (same as when
+ C<0> is specified).
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ =head2 encode
+
+ $json_text = $json->encode($perl_scalar)
+
+ Converts the given Perl data structure (a simple scalar or a reference
+ to a hash or array) to its JSON representation. Simple scalars will be
+ converted into JSON string or number sequences, while references to arrays
+ become JSON arrays and references to hashes become JSON objects. Undefined
+ Perl values (e.g. C<undef>) become JSON C<null> values.
+ References to the integers C<0> and C<1> are converted into C<true> and C<false>.
+
+ =head2 decode
+
+ $perl_scalar = $json->decode($json_text)
+
+ The opposite of C<encode>: expects a JSON text and tries to parse it,
+ returning the resulting simple scalar or reference. Croaks on error.
+
+ JSON numbers and strings become simple Perl scalars. JSON arrays become
+ Perl arrayrefs and JSON objects become Perl hashrefs. C<true> becomes
+ C<1> (C<JSON::true>), C<false> becomes C<0> (C<JSON::false>) and
+ C<null> becomes C<undef>.
+
+ =head2 decode_prefix
+
+ ($perl_scalar, $characters) = $json->decode_prefix($json_text)
+
+ This works like the C<decode> method, but instead of raising an exception
+ when there is trailing garbage after the first JSON object, it will
+ silently stop parsing there and return the number of characters consumed
+ so far.
+
+ JSON->new->decode_prefix ("[1] the tail")
+ => ([], 3)
+
+ =head1 INCREMENTAL PARSING
+
+ Most of this section are copied and modified from L<JSON::XS/INCREMENTAL PARSING>.
+
+ In some cases, there is the need for incremental parsing of JSON texts.
+ This module does allow you to parse a JSON stream incrementally.
+ It does so by accumulating text until it has a full JSON object, which
+ it then can decode. This process is similar to using C<decode_prefix>
+ to see if a full JSON object is available, but is much more efficient
+ (and can be implemented with a minimum of method calls).
+
+ This module will only attempt to parse the JSON text once it is sure it
+ has enough text to get a decisive result, using a very simple but
+ truly incremental parser. This means that it sometimes won't stop as
+ early as the full parser, for example, it doesn't detect parenthese
+ mismatches. The only thing it guarantees is that it starts decoding as
+ soon as a syntactically valid JSON text has been seen. This means you need
+ to set resource limits (e.g. C<max_size>) to ensure the parser will stop
+ parsing in the presence if syntax errors.
+
+ The following methods implement this incremental parser.
+
+ =head2 incr_parse
+
+ $json->incr_parse( [$string] ) # void context
+
+ $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
+
+ @obj_or_empty = $json->incr_parse( [$string] ) # list context
+
+ This is the central parsing function. It can both append new text and
+ extract objects from the stream accumulated so far (both of these
+ functions are optional).
+
+ If C<$string> is given, then this string is appended to the already
+ existing JSON fragment stored in the C<$json> object.
+
+ After that, if the function is called in void context, it will simply
+ return without doing anything further. This can be used to add more text
+ in as many chunks as you want.
+
+ If the method is called in scalar context, then it will try to extract
+ exactly I<one> JSON object. If that is successful, it will return this
+ object, otherwise it will return C<undef>. If there is a parse error,
+ this method will croak just as C<decode> would do (one can then use
+ C<incr_skip> to skip the errornous part). This is the most common way of
+ using the method.
+
+ And finally, in list context, it will try to extract as many objects
+ from the stream as it can find and return them, or the empty list
+ otherwise. For this to work, there must be no separators between the JSON
+ objects or arrays, instead they must be concatenated back-to-back. If
+ an error occurs, an exception will be raised as in the scalar context
+ case. Note that in this case, any previously-parsed JSON texts will be
+ lost.
+
+ Example: Parse some JSON arrays/objects in a given string and return them.
+
+ my @objs = JSON->new->incr_parse ("[5][7][1,2]");
+
+ =head2 incr_text
+
+ $lvalue_string = $json->incr_text
+
+ This method returns the currently stored JSON fragment as an lvalue, that
+ is, you can manipulate it. This I<only> works when a preceding call to
+ C<incr_parse> in I<scalar context> successfully returned an object. Under
+ all other circumstances you must not call this function (I mean it.
+ although in simple tests it might actually work, it I<will> fail under
+ real world conditions). As a special exception, you can also call this
+ method before having parsed anything.
+
+ This function is useful in two cases: a) finding the trailing text after a
+ JSON object or b) parsing multiple JSON objects separated by non-JSON text
+ (such as commas).
+
+ $json->incr_text =~ s/\s*,\s*//;
+
+ In Perl 5.005, C<lvalue> attribute is not available.
+ You must write codes like the below:
+
+ $string = $json->incr_text;
+ $string =~ s/\s*,\s*//;
+ $json->incr_text( $string );
+
+ =head2 incr_skip
+
+ $json->incr_skip
+
+ This will reset the state of the incremental parser and will remove the
+ parsed text from the input buffer. This is useful after C<incr_parse>
+ died, in which case the input buffer and incremental parser state is left
+ unchanged, to skip the text parsed so far and to reset the parse state.
+
+ =head2 incr_reset
+
+ $json->incr_reset
+
+ This completely resets the incremental parser, that is, after this call,
+ it will be as if the parser had never parsed anything.
+
+ This is useful if you want ot repeatedly parse JSON objects and want to
+ ignore any trailing data, which means you have to reset the parser after
+ each successful decode.
+
+ See to L<JSON::XS/INCREMENTAL PARSING> for examples.
+
+
+ =head1 JSON::PP OWN METHODS
+
+ =head2 allow_singlequote
+
+ $json = $json->allow_singlequote([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ JSON strings quoted by single quotations that are invalid JSON
+ format.
+
+ $json->allow_singlequote->decode({"foo":'bar'});
+ $json->allow_singlequote->decode({'foo':"bar"});
+ $json->allow_singlequote->decode({'foo':'bar'});
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+
+ =head2 allow_barekey
+
+ $json = $json->allow_barekey([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ bare keys of JSON object that are invalid JSON format.
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+ $json->allow_barekey->decode('{foo:"bar"}');
+
+ =head2 allow_bignum
+
+ $json = $json->allow_bignum([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will convert
+ the big integer Perl cannot handle as integer into a L<Math::BigInt>
+ object and convert a floating number (any) into a L<Math::BigFloat>.
+
+ On the contary, C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers with C<allow_blessed> enable.
+
+ $json->allow_nonref->allow_blessed->allow_bignum;
+ $bigfloat = $json->decode('2.000000000000000000000000001');
+ print $json->encode($bigfloat);
+ # => 2.000000000000000000000000001
+
+ See to L<JSON::XS/MAPPING> aboout the normal conversion of JSON number.
+
+ =head2 loose
+
+ $json = $json->loose([$enable])
+
+ The unescaped [\x00-\x1f\x22\x2f\x5c] strings are invalid in JSON strings
+ and the module doesn't allow to C<decode> to these (except for \x2f).
+ If C<$enable> is true (or missing), then C<decode> will accept these
+ unescaped strings.
+
+ $json->loose->decode(qq|["abc
+ def"]|);
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS>.
+
+ =head2 escape_slash
+
+ $json = $json->escape_slash([$enable])
+
+ According to JSON Grammar, I<slash> (U+002F) is escaped. But default
+ JSON::PP (as same as JSON::XS) encodes strings without escaping slash.
+
+ If C<$enable> is true (or missing), then C<encode> will escape slashes.
+
+ =head2 indent_length
+
+ $json = $json->indent_length($length)
+
+ JSON::XS indent space length is 3 and cannot be changed.
+ JSON::PP set the indent space length with the given $length.
+ The default is 3. The acceptable range is 0 to 15.
+
+ =head2 sort_by
+
+ $json = $json->sort_by($function_name)
+ $json = $json->sort_by($subroutine_ref)
+
+ If $function_name or $subroutine_ref are set, its sort routine are used
+ in encoding JSON objects.
+
+ $js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ $js = $pc->sort_by('own_sort')->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ sub JSON::PP::own_sort { $JSON::PP::a cmp $JSON::PP::b }
+
+ As the sorting routine runs in the JSON::PP scope, the given
+ subroutine name and the special variables C<$a>, C<$b> will begin
+ 'JSON::PP::'.
+
+ If $integer is set, then the effect is same as C<canonical> on.
+
+ =head1 INTERNAL
+
+ For developers.
+
+ =over
+
+ =item PP_encode_box
+
+ Returns
+
+ {
+ depth => $depth,
+ indent_count => $indent_count,
+ }
+
+
+ =item PP_decode_box
+
+ Returns
+
+ {
+ text => $text,
+ at => $at,
+ ch => $ch,
+ len => $len,
+ depth => $depth,
+ encoding => $encoding,
+ is_valid_utf8 => $is_valid_utf8,
+ };
+
+ =back
+
+ =head1 MAPPING
+
+ This section is copied from JSON::XS and modified to C<JSON::PP>.
+ JSON::XS and JSON::PP mapping mechanisms are almost equivalent.
+
+ See to L<JSON::XS/MAPPING>.
+
+ =head2 JSON -> PERL
+
+ =over 4
+
+ =item object
+
+ A JSON object becomes a reference to a hash in Perl. No ordering of object
+ keys is preserved (JSON does not preserver object key ordering itself).
+
+ =item array
+
+ A JSON array becomes a reference to an array in Perl.
+
+ =item string
+
+ A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
+ are represented by the same codepoints in the Perl string, so no manual
+ decoding is necessary.
+
+ =item number
+
+ A JSON number becomes either an integer, numeric (floating point) or
+ string scalar in perl, depending on its range and any fractional parts. On
+ the Perl level, there is no difference between those as Perl handles all
+ the conversion details, but an integer may take slightly less memory and
+ might represent more values exactly than floating point numbers.
+
+ If the number consists of digits only, C<JSON> will try to represent
+ it as an integer value. If that fails, it will try to represent it as
+ a numeric (floating point) value if that is possible without loss of
+ precision. Otherwise it will preserve the number as a string value (in
+ which case you lose roundtripping ability, as the JSON number will be
+ re-encoded toa JSON string).
+
+ Numbers containing a fractional or exponential part will always be
+ represented as numeric (floating point) values, possibly at a loss of
+ precision (in which case you might lose perfect roundtripping ability, but
+ the JSON number will still be re-encoded as a JSON number).
+
+ Note that precision is not accuracy - binary floating point values cannot
+ represent most decimal fractions exactly, and when converting from and to
+ floating point, C<JSON> only guarantees precision up to but not including
+ the leats significant bit.
+
+ When C<allow_bignum> is enable, the big integers
+ and the numeric can be optionally converted into L<Math::BigInt> and
+ L<Math::BigFloat> objects.
+
+ =item true, false
+
+ These JSON atoms become C<JSON::PP::true> and C<JSON::PP::false>,
+ respectively. They are overloaded to act almost exactly like the numbers
+ C<1> and C<0>. You can check wether a scalar is a JSON boolean by using
+ the C<JSON::is_bool> function.
+
+ print JSON::PP::true . "\n";
+ => true
+ print JSON::PP::true + 1;
+ => 1
+
+ ok(JSON::true eq '1');
+ ok(JSON::true == 1);
+
+ C<JSON> will install these missing overloading features to the backend modules.
+
+
+ =item null
+
+ A JSON null atom becomes C<undef> in Perl.
+
+ C<JSON::PP::null> returns C<unddef>.
+
+ =back
+
+
+ =head2 PERL -> JSON
+
+ The mapping from Perl to JSON is slightly more difficult, as Perl is a
+ truly typeless language, so we can only guess which JSON type is meant by
+ a Perl value.
+
+ =over 4
+
+ =item hash references
+
+ Perl hash references become JSON objects. As there is no inherent ordering
+ in hash keys (or JSON objects), they will usually be encoded in a
+ pseudo-random order that can change between runs of the same program but
+ stays generally the same within a single run of a program. C<JSON>
+ optionally sort the hash keys (determined by the I<canonical> flag), so
+ the same datastructure will serialise to the same JSON text (given same
+ settings and version of JSON::XS), but this incurs a runtime overhead
+ and is only rarely useful, e.g. when you want to compare some JSON text
+ against another for equality.
+
+
+ =item array references
+
+ Perl array references become JSON arrays.
+
+ =item other references
+
+ Other unblessed references are generally not allowed and will cause an
+ exception to be thrown, except for references to the integers C<0> and
+ C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
+ also use C<JSON::false> and C<JSON::true> to improve readability.
+
+ to_json [\0,JSON::PP::true] # yields [false,true]
+
+ =item JSON::PP::true, JSON::PP::false, JSON::PP::null
+
+ These special values become JSON true and JSON false values,
+ respectively. You can also use C<\1> and C<\0> directly if you want.
+
+ JSON::PP::null returns C<undef>.
+
+ =item blessed objects
+
+ Blessed objects are not directly representable in JSON. See the
+ C<allow_blessed> and C<convert_blessed> methods on various options on
+ how to deal with this: basically, you can choose between throwing an
+ exception, encoding the reference as if it weren't blessed, or provide
+ your own serialiser method.
+
+ See to L<convert_blessed>.
+
+ =item simple scalars
+
+ Simple Perl scalars (any scalar that is not a reference) are the most
+ difficult objects to encode: JSON::XS and JSON::PP will encode undefined scalars as
+ JSON C<null> values, scalars that have last been used in a string context
+ before encoding as JSON strings, and anything else as number value:
+
+ # dump as number
+ encode_json [2] # yields [2]
+ encode_json [-3.0e17] # yields [-3e+17]
+ my $value = 5; encode_json [$value] # yields [5]
+
+ # used as string, so dump as string
+ print $value;
+ encode_json [$value] # yields ["5"]
+
+ # undef becomes null
+ encode_json [undef] # yields [null]
+
+ You can force the type to be a string by stringifying it:
+
+ my $x = 3.1; # some variable containing a number
+ "$x"; # stringified
+ $x .= ""; # another, more awkward way to stringify
+ print $x; # perl does it for you, too, quite often
+
+ You can force the type to be a number by numifying it:
+
+ my $x = "3"; # some variable containing a string
+ $x += 0; # numify it, ensuring it will be dumped as a number
+ $x *= 1; # same thing, the choise is yours.
+
+ You can not currently force the type in other, less obscure, ways.
+
+ Note that numerical precision has the same meaning as under Perl (so
+ binary to decimal conversion follows the same rules as in Perl, which
+ can differ to other languages). Also, your perl interpreter might expose
+ extensions to the floating point numbers of your platform, such as
+ infinities or NaN's - these cannot be represented in JSON, and it is an
+ error to pass those in.
+
+ =item Big Number
+
+ When C<allow_bignum> is enable,
+ C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers.
+
+
+ =back
+
+ =head1 UNICODE HANDLING ON PERLS
+
+ If you do not know about Unicode on Perl well,
+ please check L<JSON::XS/A FEW NOTES ON UNICODE AND PERL>.
+
+ =head2 Perl 5.8 and later
+
+ Perl can handle Unicode and the JSON::PP de/encode methods also work properly.
+
+ $json->allow_nonref->encode(chr hex 3042);
+ $json->allow_nonref->encode(chr hex 12345);
+
+ Reuturns C<"\u3042"> and C<"\ud808\udf45"> respectively.
+
+ $json->allow_nonref->decode('"\u3042"');
+ $json->allow_nonref->decode('"\ud808\udf45"');
+
+ Returns UTF-8 encoded strings with UTF8 flag, regarded as C<U+3042> and C<U+12345>.
+
+ Note that the versions from Perl 5.8.0 to 5.8.2, Perl built-in C<join> was broken,
+ so JSON::PP wraps the C<join> with a subroutine. Thus JSON::PP works slow in the versions.
+
+
+ =head2 Perl 5.6
+
+ Perl can handle Unicode and the JSON::PP de/encode methods also work.
+
+ =head2 Perl 5.005
+
+ Perl 5.005 is a byte sementics world -- all strings are sequences of bytes.
+ That means the unicode handling is not available.
+
+ In encoding,
+
+ $json->allow_nonref->encode(chr hex 3042); # hex 3042 is 12354.
+ $json->allow_nonref->encode(chr hex 12345); # hex 12345 is 74565.
+
+ Returns C<B> and C<E>, as C<chr> takes a value more than 255, it treats
+ as C<$value % 256>, so the above codes are equivalent to :
+
+ $json->allow_nonref->encode(chr 66);
+ $json->allow_nonref->encode(chr 69);
+
+ In decoding,
+
+ $json->decode('"\u00e3\u0081\u0082"');
+
+ The returned is a byte sequence C<0xE3 0x81 0x82> for UTF-8 encoded
+ japanese character (C<HIRAGANA LETTER A>).
+ And if it is represented in Unicode code point, C<U+3042>.
+
+ Next,
+
+ $json->decode('"\u3042"');
+
+ We ordinary expect the returned value is a Unicode character C<U+3042>.
+ But here is 5.005 world. This is C<0xE3 0x81 0x82>.
+
+ $json->decode('"\ud808\udf45"');
+
+ This is not a character C<U+12345> but bytes - C<0xf0 0x92 0x8d 0x85>.
+
+
+ =head1 TODO
+
+ =over
+
+ =item speed
+
+ =item memory saving
+
+ =back
+
+
+ =head1 SEE ALSO
+
+ Most of the document are copied and modified from JSON::XS doc.
+
+ L<JSON::XS>
+
+ RFC4627 (L<http://www.ietf.org/rfc/rfc4627.txt>)
+
+ =head1 AUTHOR
+
+ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
+
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 2007-2013 by Makamaka Hannyaharamitu
+
+ This library is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+JSON_PP
+
+$fatpacked{"JSON/PP/Boolean.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP_BOOLEAN';
+ =head1 NAME
+
+ JSON::PP::Boolean - dummy module providing JSON::PP::Boolean
+
+ =head1 SYNOPSIS
+
+ # do not "use" yourself
+
+ =head1 DESCRIPTION
+
+ This module exists only to provide overload resolution for Storable and similar modules. See
+ L<JSON::PP> for more info about this class.
+
+ =cut
+
+ use JSON::PP ();
+ use strict;
+
+ 1;
+
+ =head1 AUTHOR
+
+ This idea is from L<JSON::XS::Boolean> written by Marc Lehmann <schmorp[at]schmorp.de>
+
+ =cut
+
+JSON_PP_BOOLEAN
+
+$fatpacked{"JSON/backportPP.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_BACKPORTPP';
+ package # This is JSON::backportPP
+ JSON::PP;
+
+ # JSON-2.0
+
+ use 5.005;
+ use strict;
+ use base qw(Exporter);
+ use overload ();
+
+ use Carp ();
+ use B ();
+ #use Devel::Peek;
+
+ use vars qw($VERSION);
+ $VERSION = '2.27204';
+
+ @JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
+
+ # instead of hash-access, i tried index-access for speed.
+ # but this method is not faster than what i expected. so it will be changed.
+
+ use constant P_ASCII => 0;
+ use constant P_LATIN1 => 1;
+ use constant P_UTF8 => 2;
+ use constant P_INDENT => 3;
+ use constant P_CANONICAL => 4;
+ use constant P_SPACE_BEFORE => 5;
+ use constant P_SPACE_AFTER => 6;
+ use constant P_ALLOW_NONREF => 7;
+ use constant P_SHRINK => 8;
+ use constant P_ALLOW_BLESSED => 9;
+ use constant P_CONVERT_BLESSED => 10;
+ use constant P_RELAXED => 11;
+
+ use constant P_LOOSE => 12;
+ use constant P_ALLOW_BIGNUM => 13;
+ use constant P_ALLOW_BAREKEY => 14;
+ use constant P_ALLOW_SINGLEQUOTE => 15;
+ use constant P_ESCAPE_SLASH => 16;
+ use constant P_AS_NONBLESSED => 17;
+
+ use constant P_ALLOW_UNKNOWN => 18;
+
+ use constant OLD_PERL => $] < 5.008 ? 1 : 0;
+
+ BEGIN {
+ my @xs_compati_bit_properties = qw(
+ latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink
+ allow_blessed convert_blessed relaxed allow_unknown
+ );
+ my @pp_bit_properties = qw(
+ allow_singlequote allow_bignum loose
+ allow_barekey escape_slash as_nonblessed
+ );
+
+ # Perl version check, Unicode handling is enable?
+ # Helper module sets @JSON::PP::_properties.
+ if ($] < 5.008 ) {
+ my $helper = $] >= 5.006 ? 'JSON::backportPP::Compat5006' : 'JSON::backportPP::Compat5005';
+ eval qq| require $helper |;
+ if ($@) { Carp::croak $@; }
+ }
+
+ for my $name (@xs_compati_bit_properties, @pp_bit_properties) {
+ my $flag_name = 'P_' . uc($name);
+
+ eval qq/
+ sub $name {
+ my \$enable = defined \$_[1] ? \$_[1] : 1;
+
+ if (\$enable) {
+ \$_[0]->{PROPS}->[$flag_name] = 1;
+ }
+ else {
+ \$_[0]->{PROPS}->[$flag_name] = 0;
+ }
+
+ \$_[0];
+ }
+
+ sub get_$name {
+ \$_[0]->{PROPS}->[$flag_name] ? 1 : '';
+ }
+ /;
+ }
+
+ }
+
+
+
+ # Functions
+
+ my %encode_allow_method
+ = map {($_ => 1)} qw/utf8 pretty allow_nonref latin1 self_encode escape_slash
+ allow_blessed convert_blessed indent indent_length allow_bignum
+ as_nonblessed
+ /;
+ my %decode_allow_method
+ = map {($_ => 1)} qw/utf8 allow_nonref loose allow_singlequote allow_bignum
+ allow_barekey max_size relaxed/;
+
+
+ my $JSON; # cache
+
+ sub encode_json ($) { # encode
+ ($JSON ||= __PACKAGE__->new->utf8)->encode(@_);
+ }
+
+
+ sub decode_json { # decode
+ ($JSON ||= __PACKAGE__->new->utf8)->decode(@_);
+ }
+
+ # Obsoleted
+
+ sub to_json($) {
+ Carp::croak ("JSON::PP::to_json has been renamed to encode_json.");
+ }
+
+
+ sub from_json($) {
+ Carp::croak ("JSON::PP::from_json has been renamed to decode_json.");
+ }
+
+
+ # Methods
+
+ sub new {
+ my $class = shift;
+ my $self = {
+ max_depth => 512,
+ max_size => 0,
+ indent => 0,
+ FLAGS => 0,
+ fallback => sub { encode_error('Invalid value. JSON can only reference.') },
+ indent_length => 3,
+ };
+
+ bless $self, $class;
+ }
+
+
+ sub encode {
+ return $_[0]->PP_encode_json($_[1]);
+ }
+
+
+ sub decode {
+ return $_[0]->PP_decode_json($_[1], 0x00000000);
+ }
+
+
+ sub decode_prefix {
+ return $_[0]->PP_decode_json($_[1], 0x00000001);
+ }
+
+
+ # accessor
+
+
+ # pretty printing
+
+ sub pretty {
+ my ($self, $v) = @_;
+ my $enable = defined $v ? $v : 1;
+
+ if ($enable) { # indent_length(3) for JSON::XS compatibility
+ $self->indent(1)->indent_length(3)->space_before(1)->space_after(1);
+ }
+ else {
+ $self->indent(0)->space_before(0)->space_after(0);
+ }
+
+ $self;
+ }
+
+ # etc
+
+ sub max_depth {
+ my $max = defined $_[1] ? $_[1] : 0x80000000;
+ $_[0]->{max_depth} = $max;
+ $_[0];
+ }
+
+
+ sub get_max_depth { $_[0]->{max_depth}; }
+
+
+ sub max_size {
+ my $max = defined $_[1] ? $_[1] : 0;
+ $_[0]->{max_size} = $max;
+ $_[0];
+ }
+
+
+ sub get_max_size { $_[0]->{max_size}; }
+
+
+ sub filter_json_object {
+ $_[0]->{cb_object} = defined $_[1] ? $_[1] : 0;
+ $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
+ $_[0];
+ }
+
+ sub filter_json_single_key_object {
+ if (@_ > 1) {
+ $_[0]->{cb_sk_object}->{$_[1]} = $_[2];
+ }
+ $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
+ $_[0];
+ }
+
+ sub indent_length {
+ if (!defined $_[1] or $_[1] > 15 or $_[1] < 0) {
+ Carp::carp "The acceptable range of indent_length() is 0 to 15.";
+ }
+ else {
+ $_[0]->{indent_length} = $_[1];
+ }
+ $_[0];
+ }
+
+ sub get_indent_length {
+ $_[0]->{indent_length};
+ }
+
+ sub sort_by {
+ $_[0]->{sort_by} = defined $_[1] ? $_[1] : 1;
+ $_[0];
+ }
+
+ sub allow_bigint {
+ Carp::carp("allow_bigint() is obsoleted. use allow_bignum() insted.");
+ }
+
+ ###############################
+
+ ###
+ ### Perl => JSON
+ ###
+
+
+ { # Convert
+
+ my $max_depth;
+ my $indent;
+ my $ascii;
+ my $latin1;
+ my $utf8;
+ my $space_before;
+ my $space_after;
+ my $canonical;
+ my $allow_blessed;
+ my $convert_blessed;
+
+ my $indent_length;
+ my $escape_slash;
+ my $bignum;
+ my $as_nonblessed;
+
+ my $depth;
+ my $indent_count;
+ my $keysort;
+
+
+ sub PP_encode_json {
+ my $self = shift;
+ my $obj = shift;
+
+ $indent_count = 0;
+ $depth = 0;
+
+ my $idx = $self->{PROPS};
+
+ ($ascii, $latin1, $utf8, $indent, $canonical, $space_before, $space_after, $allow_blessed,
+ $convert_blessed, $escape_slash, $bignum, $as_nonblessed)
+ = @{$idx}[P_ASCII .. P_SPACE_AFTER, P_ALLOW_BLESSED, P_CONVERT_BLESSED,
+ P_ESCAPE_SLASH, P_ALLOW_BIGNUM, P_AS_NONBLESSED];
+
+ ($max_depth, $indent_length) = @{$self}{qw/max_depth indent_length/};
+
+ $keysort = $canonical ? sub { $a cmp $b } : undef;
+
+ if ($self->{sort_by}) {
+ $keysort = ref($self->{sort_by}) eq 'CODE' ? $self->{sort_by}
+ : $self->{sort_by} =~ /\D+/ ? $self->{sort_by}
+ : sub { $a cmp $b };
+ }
+
+ encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)")
+ if(!ref $obj and !$idx->[ P_ALLOW_NONREF ]);
+
+ my $str = $self->object_to_json($obj);
+
+ $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible
+
+ unless ($ascii or $latin1 or $utf8) {
+ utf8::upgrade($str);
+ }
+
+ if ($idx->[ P_SHRINK ]) {
+ utf8::downgrade($str, 1);
+ }
+
+ return $str;
+ }
+
+
+ sub object_to_json {
+ my ($self, $obj) = @_;
+ my $type = ref($obj);
+
+ if($type eq 'HASH'){
+ return $self->hash_to_json($obj);
+ }
+ elsif($type eq 'ARRAY'){
+ return $self->array_to_json($obj);
+ }
+ elsif ($type) { # blessed object?
+ if (blessed($obj)) {
+
+ return $self->value_to_json($obj) if ( $obj->isa('JSON::PP::Boolean') );
+
+ if ( $convert_blessed and $obj->can('TO_JSON') ) {
+ my $result = $obj->TO_JSON();
+ if ( defined $result and ref( $result ) ) {
+ if ( refaddr( $obj ) eq refaddr( $result ) ) {
+ encode_error( sprintf(
+ "%s::TO_JSON method returned same object as was passed instead of a new one",
+ ref $obj
+ ) );
+ }
+ }
+
+ return $self->object_to_json( $result );
+ }
+
+ return "$obj" if ( $bignum and _is_bignum($obj) );
+ return $self->blessed_to_json($obj) if ($allow_blessed and $as_nonblessed); # will be removed.
+
+ encode_error( sprintf("encountered object '%s', but neither allow_blessed "
+ . "nor convert_blessed settings are enabled", $obj)
+ ) unless ($allow_blessed);
+
+ return 'null';
+ }
+ else {
+ return $self->value_to_json($obj);
+ }
+ }
+ else{
+ return $self->value_to_json($obj);
+ }
+ }
+
+
+ sub hash_to_json {
+ my ($self, $obj) = @_;
+ my @res;
+
+ encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
+ if (++$depth > $max_depth);
+
+ my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
+ my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : '');
+
+ for my $k ( _sort( $obj ) ) {
+ if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized
+ push @res, string_to_json( $self, $k )
+ . $del
+ . ( $self->object_to_json( $obj->{$k} ) || $self->value_to_json( $obj->{$k} ) );
+ }
+
+ --$depth;
+ $self->_down_indent() if ($indent);
+
+ return '{' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . '}';
+ }
+
+
+ sub array_to_json {
+ my ($self, $obj) = @_;
+ my @res;
+
+ encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
+ if (++$depth > $max_depth);
+
+ my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
+
+ for my $v (@$obj){
+ push @res, $self->object_to_json($v) || $self->value_to_json($v);
+ }
+
+ --$depth;
+ $self->_down_indent() if ($indent);
+
+ return '[' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . ']';
+ }
+
+
+ sub value_to_json {
+ my ($self, $value) = @_;
+
+ return 'null' if(!defined $value);
+
+ my $b_obj = B::svref_2object(\$value); # for round trip problem
+ my $flags = $b_obj->FLAGS;
+
+ return $value # as is
+ if $flags & ( B::SVp_IOK | B::SVp_NOK ) and !( $flags & B::SVp_POK ); # SvTYPE is IV or NV?
+
+ my $type = ref($value);
+
+ if(!$type){
+ return string_to_json($self, $value);
+ }
+ elsif( blessed($value) and $value->isa('JSON::PP::Boolean') ){
+ return $$value == 1 ? 'true' : 'false';
+ }
+ elsif ($type) {
+ if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
+ return $self->value_to_json("$value");
+ }
+
+ if ($type eq 'SCALAR' and defined $$value) {
+ return $$value eq '1' ? 'true'
+ : $$value eq '0' ? 'false'
+ : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
+ : encode_error("cannot encode reference to scalar");
+ }
+
+ if ( $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ) {
+ return 'null';
+ }
+ else {
+ if ( $type eq 'SCALAR' or $type eq 'REF' ) {
+ encode_error("cannot encode reference to scalar");
+ }
+ else {
+ encode_error("encountered $value, but JSON can only represent references to arrays or hashes");
+ }
+ }
+
+ }
+ else {
+ return $self->{fallback}->($value)
+ if ($self->{fallback} and ref($self->{fallback}) eq 'CODE');
+ return 'null';
+ }
+
+ }
+
+
+ my %esc = (
+ "\n" => '\n',
+ "\r" => '\r',
+ "\t" => '\t',
+ "\f" => '\f',
+ "\b" => '\b',
+ "\"" => '\"',
+ "\\" => '\\\\',
+ "\'" => '\\\'',
+ );
+
+
+ sub string_to_json {
+ my ($self, $arg) = @_;
+
+ $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
+ $arg =~ s/\//\\\//g if ($escape_slash);
+ $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
+
+ if ($ascii) {
+ $arg = JSON_PP_encode_ascii($arg);
+ }
+
+ if ($latin1) {
+ $arg = JSON_PP_encode_latin1($arg);
+ }
+
+ if ($utf8) {
+ utf8::encode($arg);
+ }
+
+ return '"' . $arg . '"';
+ }
+
+
+ sub blessed_to_json {
+ my $reftype = reftype($_[1]) || '';
+ if ($reftype eq 'HASH') {
+ return $_[0]->hash_to_json($_[1]);
+ }
+ elsif ($reftype eq 'ARRAY') {
+ return $_[0]->array_to_json($_[1]);
+ }
+ else {
+ return 'null';
+ }
+ }
+
+
+ sub encode_error {
+ my $error = shift;
+ Carp::croak "$error";
+ }
+
+
+ sub _sort {
+ defined $keysort ? (sort $keysort (keys %{$_[0]})) : keys %{$_[0]};
+ }
+
+
+ sub _up_indent {
+ my $self = shift;
+ my $space = ' ' x $indent_length;
+
+ my ($pre,$post) = ('','');
+
+ $post = "\n" . $space x $indent_count;
+
+ $indent_count++;
+
+ $pre = "\n" . $space x $indent_count;
+
+ return ($pre,$post);
+ }
+
+
+ sub _down_indent { $indent_count--; }
+
+
+ sub PP_encode_box {
+ {
+ depth => $depth,
+ indent_count => $indent_count,
+ };
+ }
+
+ } # Convert
+
+
+ sub _encode_ascii {
+ join('',
+ map {
+ $_ <= 127 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
+ } unpack('U*', $_[0])
+ );
+ }
+
+
+ sub _encode_latin1 {
+ join('',
+ map {
+ $_ <= 255 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
+ } unpack('U*', $_[0])
+ );
+ }
+
+
+ sub _encode_surrogates { # from perlunicode
+ my $uni = $_[0] - 0x10000;
+ return ($uni / 0x400 + 0xD800, $uni % 0x400 + 0xDC00);
+ }
+
+
+ sub _is_bignum {
+ $_[0]->isa('Math::BigInt') or $_[0]->isa('Math::BigFloat');
+ }
+
+
+
+ #
+ # JSON => Perl
+ #
+
+ my $max_intsize;
+
+ BEGIN {
+ my $checkint = 1111;
+ for my $d (5..64) {
+ $checkint .= 1;
+ my $int = eval qq| $checkint |;
+ if ($int =~ /[eE]/) {
+ $max_intsize = $d - 1;
+ last;
+ }
+ }
+ }
+
+ { # PARSE
+
+ my %escapes = ( # by Jeremy Muhlich <jmuhlich [at] bitflood.org>
+ b => "\x8",
+ t => "\x9",
+ n => "\xA",
+ f => "\xC",
+ r => "\xD",
+ '\\' => '\\',
+ '"' => '"',
+ '/' => '/',
+ );
+
+ my $text; # json data
+ my $at; # offset
+ my $ch; # 1chracter
+ my $len; # text length (changed according to UTF8 or NON UTF8)
+ # INTERNAL
+ my $depth; # nest counter
+ my $encoding; # json text encoding
+ my $is_valid_utf8; # temp variable
+ my $utf8_len; # utf8 byte length
+ # FLAGS
+ my $utf8; # must be utf8
+ my $max_depth; # max nest number of objects and arrays
+ my $max_size;
+ my $relaxed;
+ my $cb_object;
+ my $cb_sk_object;
+
+ my $F_HOOK;
+
+ my $allow_bigint; # using Math::BigInt
+ my $singlequote; # loosely quoting
+ my $loose; #
+ my $allow_barekey; # bareKey
+
+ # $opt flag
+ # 0x00000001 .... decode_prefix
+ # 0x10000000 .... incr_parse
+
+ sub PP_decode_json {
+ my ($self, $opt); # $opt is an effective flag during this decode_json.
+
+ ($self, $text, $opt) = @_;
+
+ ($at, $ch, $depth) = (0, '', 0);
+
+ if ( !defined $text or ref $text ) {
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+
+ my $idx = $self->{PROPS};
+
+ ($utf8, $relaxed, $loose, $allow_bigint, $allow_barekey, $singlequote)
+ = @{$idx}[P_UTF8, P_RELAXED, P_LOOSE .. P_ALLOW_SINGLEQUOTE];
+
+ if ( $utf8 ) {
+ utf8::downgrade( $text, 1 ) or Carp::croak("Wide character in subroutine entry");
+ }
+ else {
+ utf8::upgrade( $text );
+ }
+
+ $len = length $text;
+
+ ($max_depth, $max_size, $cb_object, $cb_sk_object, $F_HOOK)
+ = @{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/};
+
+ if ($max_size > 1) {
+ use bytes;
+ my $bytes = length $text;
+ decode_error(
+ sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s"
+ , $bytes, $max_size), 1
+ ) if ($bytes > $max_size);
+ }
+
+ # Currently no effect
+ # should use regexp
+ my @octets = unpack('C4', $text);
+ $encoding = ( $octets[0] and $octets[1]) ? 'UTF-8'
+ : (!$octets[0] and $octets[1]) ? 'UTF-16BE'
+ : (!$octets[0] and !$octets[1]) ? 'UTF-32BE'
+ : ( $octets[2] ) ? 'UTF-16LE'
+ : (!$octets[2] ) ? 'UTF-32LE'
+ : 'unknown';
+
+ white(); # remove head white space
+
+ my $valid_start = defined $ch; # Is there a first character for JSON structure?
+
+ my $result = value();
+
+ return undef if ( !$result && ( $opt & 0x10000000 ) ); # for incr_parse
+
+ decode_error("malformed JSON string, neither array, object, number, string or atom") unless $valid_start;
+
+ if ( !$idx->[ P_ALLOW_NONREF ] and !ref $result ) {
+ decode_error(
+ 'JSON text must be an object or array (but found number, string, true, false or null,'
+ . ' use allow_nonref to allow this)', 1);
+ }
+
+ Carp::croak('something wrong.') if $len < $at; # we won't arrive here.
+
+ my $consumed = defined $ch ? $at - 1 : $at; # consumed JSON text length
+
+ white(); # remove tail white space
+
+ if ( $ch ) {
+ return ( $result, $consumed ) if ($opt & 0x00000001); # all right if decode_prefix
+ decode_error("garbage after JSON object");
+ }
+
+ ( $opt & 0x00000001 ) ? ( $result, $consumed ) : $result;
+ }
+
+
+ sub next_chr {
+ return $ch = undef if($at >= $len);
+ $ch = substr($text, $at++, 1);
+ }
+
+
+ sub value {
+ white();
+ return if(!defined $ch);
+ return object() if($ch eq '{');
+ return array() if($ch eq '[');
+ return string() if($ch eq '"' or ($singlequote and $ch eq "'"));
+ return number() if($ch =~ /[0-9]/ or $ch eq '-');
+ return word();
+ }
+
+ sub string {
+ my ($i, $s, $t, $u);
+ my $utf16;
+ my $is_utf8;
+
+ ($is_valid_utf8, $utf8_len) = ('', 0);
+
+ $s = ''; # basically UTF8 flag on
+
+ if($ch eq '"' or ($singlequote and $ch eq "'")){
+ my $boundChar = $ch;
+
+ OUTER: while( defined(next_chr()) ){
+
+ if($ch eq $boundChar){
+ next_chr();
+
+ if ($utf16) {
+ decode_error("missing low surrogate character in surrogate pair");
+ }
+
+ utf8::decode($s) if($is_utf8);
+
+ return $s;
+ }
+ elsif($ch eq '\\'){
+ next_chr();
+ if(exists $escapes{$ch}){
+ $s .= $escapes{$ch};
+ }
+ elsif($ch eq 'u'){ # UNICODE handling
+ my $u = '';
+
+ for(1..4){
+ $ch = next_chr();
+ last OUTER if($ch !~ /[0-9a-fA-F]/);
+ $u .= $ch;
+ }
+
+ # U+D800 - U+DBFF
+ if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/) { # UTF-16 high surrogate?
+ $utf16 = $u;
+ }
+ # U+DC00 - U+DFFF
+ elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/) { # UTF-16 low surrogate?
+ unless (defined $utf16) {
+ decode_error("missing high surrogate character in surrogate pair");
+ }
+ $is_utf8 = 1;
+ $s .= JSON_PP_decode_surrogates($utf16, $u) || next;
+ $utf16 = undef;
+ }
+ else {
+ if (defined $utf16) {
+ decode_error("surrogate pair expected");
+ }
+
+ if ( ( my $hex = hex( $u ) ) > 127 ) {
+ $is_utf8 = 1;
+ $s .= JSON_PP_decode_unicode($u) || next;
+ }
+ else {
+ $s .= chr $hex;
+ }
+ }
+
+ }
+ else{
+ unless ($loose) {
+ $at -= 2;
+ decode_error('illegal backslash escape sequence in string');
+ }
+ $s .= $ch;
+ }
+ }
+ else{
+
+ if ( ord $ch > 127 ) {
+ if ( $utf8 ) {
+ unless( $ch = is_valid_utf8($ch) ) {
+ $at -= 1;
+ decode_error("malformed UTF-8 character in JSON string");
+ }
+ else {
+ $at += $utf8_len - 1;
+ }
+ }
+ else {
+ utf8::encode( $ch );
+ }
+
+ $is_utf8 = 1;
+ }
+
+ if (!$loose) {
+ if ($ch =~ /[\x00-\x1f\x22\x5c]/) { # '/' ok
+ $at--;
+ decode_error('invalid character encountered while parsing JSON string');
+ }
+ }
+
+ $s .= $ch;
+ }
+ }
+ }
+
+ decode_error("unexpected end of string while parsing JSON string");
+ }
+
+
+ sub white {
+ while( defined $ch ){
+ if($ch le ' '){
+ next_chr();
+ }
+ elsif($ch eq '/'){
+ next_chr();
+ if(defined $ch and $ch eq '/'){
+ 1 while(defined(next_chr()) and $ch ne "\n" and $ch ne "\r");
+ }
+ elsif(defined $ch and $ch eq '*'){
+ next_chr();
+ while(1){
+ if(defined $ch){
+ if($ch eq '*'){
+ if(defined(next_chr()) and $ch eq '/'){
+ next_chr();
+ last;
+ }
+ }
+ else{
+ next_chr();
+ }
+ }
+ else{
+ decode_error("Unterminated comment");
+ }
+ }
+ next;
+ }
+ else{
+ $at--;
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+ }
+ else{
+ if ($relaxed and $ch eq '#') { # correctly?
+ pos($text) = $at;
+ $text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g;
+ $at = pos($text);
+ next_chr;
+ next;
+ }
+
+ last;
+ }
+ }
+ }
+
+
+ sub array {
+ my $a = $_[0] || []; # you can use this code to use another array ref object.
+
+ decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
+ if (++$depth > $max_depth);
+
+ next_chr();
+ white();
+
+ if(defined $ch and $ch eq ']'){
+ --$depth;
+ next_chr();
+ return $a;
+ }
+ else {
+ while(defined($ch)){
+ push @$a, value();
+
+ white();
+
+ if (!defined $ch) {
+ last;
+ }
+
+ if($ch eq ']'){
+ --$depth;
+ next_chr();
+ return $a;
+ }
+
+ if($ch ne ','){
+ last;
+ }
+
+ next_chr();
+ white();
+
+ if ($relaxed and $ch eq ']') {
+ --$depth;
+ next_chr();
+ return $a;
+ }
+
+ }
+ }
+
+ decode_error(", or ] expected while parsing array");
+ }
+
+
+ sub object {
+ my $o = $_[0] || {}; # you can use this code to use another hash ref object.
+ my $k;
+
+ decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
+ if (++$depth > $max_depth);
+ next_chr();
+ white();
+
+ if(defined $ch and $ch eq '}'){
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+ else {
+ while (defined $ch) {
+ $k = ($allow_barekey and $ch ne '"' and $ch ne "'") ? bareKey() : string();
+ white();
+
+ if(!defined $ch or $ch ne ':'){
+ $at--;
+ decode_error("':' expected");
+ }
+
+ next_chr();
+ $o->{$k} = value();
+ white();
+
+ last if (!defined $ch);
+
+ if($ch eq '}'){
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+
+ if($ch ne ','){
+ last;
+ }
+
+ next_chr();
+ white();
+
+ if ($relaxed and $ch eq '}') {
+ --$depth;
+ next_chr();
+ if ($F_HOOK) {
+ return _json_object_hook($o);
+ }
+ return $o;
+ }
+
+ }
+
+ }
+
+ $at--;
+ decode_error(", or } expected while parsing object/hash");
+ }
+
+
+ sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition
+ my $key;
+ while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){
+ $key .= $ch;
+ next_chr();
+ }
+ return $key;
+ }
+
+
+ sub word {
+ my $word = substr($text,$at-1,4);
+
+ if($word eq 'true'){
+ $at += 3;
+ next_chr;
+ return $JSON::PP::true;
+ }
+ elsif($word eq 'null'){
+ $at += 3;
+ next_chr;
+ return undef;
+ }
+ elsif($word eq 'fals'){
+ $at += 3;
+ if(substr($text,$at,1) eq 'e'){
+ $at++;
+ next_chr;
+ return $JSON::PP::false;
+ }
+ }
+
+ $at--; # for decode_error report
+
+ decode_error("'null' expected") if ($word =~ /^n/);
+ decode_error("'true' expected") if ($word =~ /^t/);
+ decode_error("'false' expected") if ($word =~ /^f/);
+ decode_error("malformed JSON string, neither array, object, number, string or atom");
+ }
+
+
+ sub number {
+ my $n = '';
+ my $v;
+
+ # According to RFC4627, hex or oct digits are invalid.
+ if($ch eq '0'){
+ my $peek = substr($text,$at,1);
+ my $hex = $peek =~ /[xX]/; # 0 or 1
+
+ if($hex){
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ ($n) = ( substr($text, $at+1) =~ /^([0-9a-fA-F]+)/);
+ }
+ else{ # oct
+ ($n) = ( substr($text, $at) =~ /^([0-7]+)/);
+ if (defined $n and length $n > 1) {
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ }
+ }
+
+ if(defined $n and length($n)){
+ if (!$hex and length($n) == 1) {
+ decode_error("malformed number (leading zero must not be followed by another digit)");
+ }
+ $at += length($n) + $hex;
+ next_chr;
+ return $hex ? hex($n) : oct($n);
+ }
+ }
+
+ if($ch eq '-'){
+ $n = '-';
+ next_chr;
+ if (!defined $ch or $ch !~ /\d/) {
+ decode_error("malformed number (no digits after initial minus)");
+ }
+ }
+
+ while(defined $ch and $ch =~ /\d/){
+ $n .= $ch;
+ next_chr;
+ }
+
+ if(defined $ch and $ch eq '.'){
+ $n .= '.';
+
+ next_chr;
+ if (!defined $ch or $ch !~ /\d/) {
+ decode_error("malformed number (no digits after decimal point)");
+ }
+ else {
+ $n .= $ch;
+ }
+
+ while(defined(next_chr) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+ }
+
+ if(defined $ch and ($ch eq 'e' or $ch eq 'E')){
+ $n .= $ch;
+ next_chr;
+
+ if(defined($ch) and ($ch eq '+' or $ch eq '-')){
+ $n .= $ch;
+ next_chr;
+ if (!defined $ch or $ch =~ /\D/) {
+ decode_error("malformed number (no digits after exp sign)");
+ }
+ $n .= $ch;
+ }
+ elsif(defined($ch) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+ else {
+ decode_error("malformed number (no digits after exp sign)");
+ }
+
+ while(defined(next_chr) and $ch =~ /\d/){
+ $n .= $ch;
+ }
+
+ }
+
+ $v .= $n;
+
+ if ($v !~ /[.eE]/ and length $v > $max_intsize) {
+ if ($allow_bigint) { # from Adam Sussman
+ require Math::BigInt;
+ return Math::BigInt->new($v);
+ }
+ else {
+ return "$v";
+ }
+ }
+ elsif ($allow_bigint) {
+ require Math::BigFloat;
+ return Math::BigFloat->new($v);
+ }
+
+ return 0+$v;
+ }
+
+
+ sub is_valid_utf8 {
+
+ $utf8_len = $_[0] =~ /[\x00-\x7F]/ ? 1
+ : $_[0] =~ /[\xC2-\xDF]/ ? 2
+ : $_[0] =~ /[\xE0-\xEF]/ ? 3
+ : $_[0] =~ /[\xF0-\xF4]/ ? 4
+ : 0
+ ;
+
+ return unless $utf8_len;
+
+ my $is_valid_utf8 = substr($text, $at - 1, $utf8_len);
+
+ return ( $is_valid_utf8 =~ /^(?:
+ [\x00-\x7F]
+ |[\xC2-\xDF][\x80-\xBF]
+ |[\xE0][\xA0-\xBF][\x80-\xBF]
+ |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
+ |[\xED][\x80-\x9F][\x80-\xBF]
+ |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
+ |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
+ )$/x ) ? $is_valid_utf8 : '';
+ }
+
+
+ sub decode_error {
+ my $error = shift;
+ my $no_rep = shift;
+ my $str = defined $text ? substr($text, $at) : '';
+ my $mess = '';
+ my $type = $] >= 5.008 ? 'U*'
+ : $] < 5.006 ? 'C*'
+ : utf8::is_utf8( $str ) ? 'U*' # 5.6
+ : 'C*'
+ ;
+
+ for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ?
+ $mess .= $c == 0x07 ? '\a'
+ : $c == 0x09 ? '\t'
+ : $c == 0x0a ? '\n'
+ : $c == 0x0d ? '\r'
+ : $c == 0x0c ? '\f'
+ : $c < 0x20 ? sprintf('\x{%x}', $c)
+ : $c == 0x5c ? '\\\\'
+ : $c < 0x80 ? chr($c)
+ : sprintf('\x{%x}', $c)
+ ;
+ if ( length $mess >= 20 ) {
+ $mess .= '...';
+ last;
+ }
+ }
+
+ unless ( length $mess ) {
+ $mess = '(end of string)';
+ }
+
+ Carp::croak (
+ $no_rep ? "$error" : "$error, at character offset $at (before \"$mess\")"
+ );
+
+ }
+
+
+ sub _json_object_hook {
+ my $o = $_[0];
+ my @ks = keys %{$o};
+
+ if ( $cb_sk_object and @ks == 1 and exists $cb_sk_object->{ $ks[0] } and ref $cb_sk_object->{ $ks[0] } ) {
+ my @val = $cb_sk_object->{ $ks[0] }->( $o->{$ks[0]} );
+ if (@val == 1) {
+ return $val[0];
+ }
+ }
+
+ my @val = $cb_object->($o) if ($cb_object);
+ if (@val == 0 or @val > 1) {
+ return $o;
+ }
+ else {
+ return $val[0];
+ }
+ }
+
+
+ sub PP_decode_box {
+ {
+ text => $text,
+ at => $at,
+ ch => $ch,
+ len => $len,
+ depth => $depth,
+ encoding => $encoding,
+ is_valid_utf8 => $is_valid_utf8,
+ };
+ }
+
+ } # PARSE
+
+
+ sub _decode_surrogates { # from perlunicode
+ my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00);
+ my $un = pack('U*', $uni);
+ utf8::encode( $un );
+ return $un;
+ }
+
+
+ sub _decode_unicode {
+ my $un = pack('U', hex shift);
+ utf8::encode( $un );
+ return $un;
+ }
+
+ #
+ # Setup for various Perl versions (the code from JSON::PP58)
+ #
+
+ BEGIN {
+
+ unless ( defined &utf8::is_utf8 ) {
+ require Encode;
+ *utf8::is_utf8 = *Encode::is_utf8;
+ }
+
+ if ( $] >= 5.008 ) {
+ *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii;
+ *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1;
+ *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
+ *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode;
+ }
+
+ if ($] >= 5.008 and $] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken.
+ package # hide from PAUSE
+ JSON::PP;
+ require subs;
+ subs->import('join');
+ eval q|
+ sub join {
+ return '' if (@_ < 2);
+ my $j = shift;
+ my $str = shift;
+ for (@_) { $str .= $j . $_; }
+ return $str;
+ }
+ |;
+ }
+
+
+ sub JSON::PP::incr_parse {
+ local $Carp::CarpLevel = 1;
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
+ }
+
+
+ sub JSON::PP::incr_skip {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
+ }
+
+
+ sub JSON::PP::incr_reset {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+ }
+
+ eval q{
+ sub JSON::PP::incr_text : lvalue {
+ $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
+
+ if ( $_[0]->{_incr_parser}->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+ $_[0]->{_incr_parser}->{incr_text};
+ }
+ } if ( $] >= 5.006 );
+
+ } # Setup for various Perl versions (the code from JSON::PP58)
+
+
+ ###############################
+ # Utilities
+ #
+
+ BEGIN {
+ eval 'require Scalar::Util';
+ unless($@){
+ *JSON::PP::blessed = \&Scalar::Util::blessed;
+ *JSON::PP::reftype = \&Scalar::Util::reftype;
+ *JSON::PP::refaddr = \&Scalar::Util::refaddr;
+ }
+ else{ # This code is from Scalar::Util.
+ # warn $@;
+ eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';
+ *JSON::PP::blessed = sub {
+ local($@, $SIG{__DIE__}, $SIG{__WARN__});
+ ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef;
+ };
+ my %tmap = qw(
+ B::NULL SCALAR
+ B::HV HASH
+ B::AV ARRAY
+ B::CV CODE
+ B::IO IO
+ B::GV GLOB
+ B::REGEXP REGEXP
+ );
+ *JSON::PP::reftype = sub {
+ my $r = shift;
+
+ return undef unless length(ref($r));
+
+ my $t = ref(B::svref_2object($r));
+
+ return
+ exists $tmap{$t} ? $tmap{$t}
+ : length(ref($$r)) ? 'REF'
+ : 'SCALAR';
+ };
+ *JSON::PP::refaddr = sub {
+ return undef unless length(ref($_[0]));
+
+ my $addr;
+ if(defined(my $pkg = blessed($_[0]))) {
+ $addr .= bless $_[0], 'Scalar::Util::Fake';
+ bless $_[0], $pkg;
+ }
+ else {
+ $addr .= $_[0]
+ }
+
+ $addr =~ /0x(\w+)/;
+ local $^W;
+ #no warnings 'portable';
+ hex($1);
+ }
+ }
+ }
+
+
+ # shamelessly copied and modified from JSON::XS code.
+
+ unless ( $INC{'JSON/PP.pm'} ) {
+ eval q|
+ package
+ JSON::PP::Boolean;
+
+ use overload (
+ "0+" => sub { ${$_[0]} },
+ "++" => sub { $_[0] = ${$_[0]} + 1 },
+ "--" => sub { $_[0] = ${$_[0]} - 1 },
+ fallback => 1,
+ );
+ |;
+ }
+
+ $JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
+ $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
+
+ sub is_bool { defined $_[0] and UNIVERSAL::isa($_[0], "JSON::PP::Boolean"); }
+
+ sub true { $JSON::PP::true }
+ sub false { $JSON::PP::false }
+ sub null { undef; }
+
+ ###############################
+
+ ###############################
+
+ package # hide from PAUSE
+ JSON::PP::IncrParser;
+
+ use strict;
+
+ use constant INCR_M_WS => 0; # initial whitespace skipping
+ use constant INCR_M_STR => 1; # inside string
+ use constant INCR_M_BS => 2; # inside backslash
+ use constant INCR_M_JSON => 3; # outside anything, count nesting
+ use constant INCR_M_C0 => 4;
+ use constant INCR_M_C1 => 5;
+
+ use vars qw($VERSION);
+ $VERSION = '1.01';
+
+ my $unpack_format = $] < 5.006 ? 'C*' : 'U*';
+
+ sub new {
+ my ( $class ) = @_;
+
+ bless {
+ incr_nest => 0,
+ incr_text => undef,
+ incr_parsing => 0,
+ incr_p => 0,
+ }, $class;
+ }
+
+
+ sub incr_parse {
+ my ( $self, $coder, $text ) = @_;
+
+ $self->{incr_text} = '' unless ( defined $self->{incr_text} );
+
+ if ( defined $text ) {
+ if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) {
+ utf8::upgrade( $self->{incr_text} ) ;
+ utf8::decode( $self->{incr_text} ) ;
+ }
+ $self->{incr_text} .= $text;
+ }
+
+
+ my $max_size = $coder->get_max_size;
+
+ if ( defined wantarray ) {
+
+ $self->{incr_mode} = INCR_M_WS unless defined $self->{incr_mode};
+
+ if ( wantarray ) {
+ my @ret;
+
+ $self->{incr_parsing} = 1;
+
+ do {
+ push @ret, $self->_incr_parse( $coder, $self->{incr_text} );
+
+ unless ( !$self->{incr_nest} and $self->{incr_mode} == INCR_M_JSON ) {
+ $self->{incr_mode} = INCR_M_WS if $self->{incr_mode} != INCR_M_STR;
+ }
+
+ } until ( length $self->{incr_text} >= $self->{incr_p} );
+
+ $self->{incr_parsing} = 0;
+
+ return @ret;
+ }
+ else { # in scalar context
+ $self->{incr_parsing} = 1;
+ my $obj = $self->_incr_parse( $coder, $self->{incr_text} );
+ $self->{incr_parsing} = 0 if defined $obj; # pointed by Martin J. Evans
+ return $obj ? $obj : undef; # $obj is an empty string, parsing was completed.
+ }
+
+ }
+
+ }
+
+
+ sub _incr_parse {
+ my ( $self, $coder, $text, $skip ) = @_;
+ my $p = $self->{incr_p};
+ my $restore = $p;
+
+ my @obj;
+ my $len = length $text;
+
+ if ( $self->{incr_mode} == INCR_M_WS ) {
+ while ( $len > $p ) {
+ my $s = substr( $text, $p, 1 );
+ $p++ and next if ( 0x20 >= unpack($unpack_format, $s) );
+ $self->{incr_mode} = INCR_M_JSON;
+ last;
+ }
+ }
+
+ while ( $len > $p ) {
+ my $s = substr( $text, $p++, 1 );
+
+ if ( $s eq '"' ) {
+ if (substr( $text, $p - 2, 1 ) eq '\\' ) {
+ next;
+ }
+
+ if ( $self->{incr_mode} != INCR_M_STR ) {
+ $self->{incr_mode} = INCR_M_STR;
+ }
+ else {
+ $self->{incr_mode} = INCR_M_JSON;
+ unless ( $self->{incr_nest} ) {
+ last;
+ }
+ }
+ }
+
+ if ( $self->{incr_mode} == INCR_M_JSON ) {
+
+ if ( $s eq '[' or $s eq '{' ) {
+ if ( ++$self->{incr_nest} > $coder->get_max_depth ) {
+ Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)');
+ }
+ }
+ elsif ( $s eq ']' or $s eq '}' ) {
+ last if ( --$self->{incr_nest} <= 0 );
+ }
+ elsif ( $s eq '#' ) {
+ while ( $len > $p ) {
+ last if substr( $text, $p++, 1 ) eq "\n";
+ }
+ }
+
+ }
+
+ }
+
+ $self->{incr_p} = $p;
+
+ return if ( $self->{incr_mode} == INCR_M_STR and not $self->{incr_nest} );
+ return if ( $self->{incr_mode} == INCR_M_JSON and $self->{incr_nest} > 0 );
+
+ return '' unless ( length substr( $self->{incr_text}, 0, $p ) );
+
+ local $Carp::CarpLevel = 2;
+
+ $self->{incr_p} = $restore;
+ $self->{incr_c} = $p;
+
+ my ( $obj, $tail ) = $coder->PP_decode_json( substr( $self->{incr_text}, 0, $p ), 0x10000001 );
+
+ $self->{incr_text} = substr( $self->{incr_text}, $p );
+ $self->{incr_p} = 0;
+
+ return $obj || '';
+ }
+
+
+ sub incr_text {
+ if ( $_[0]->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+ $_[0]->{incr_text};
+ }
+
+
+ sub incr_skip {
+ my $self = shift;
+ $self->{incr_text} = substr( $self->{incr_text}, $self->{incr_c} );
+ $self->{incr_p} = 0;
+ }
+
+
+ sub incr_reset {
+ my $self = shift;
+ $self->{incr_text} = undef;
+ $self->{incr_p} = 0;
+ $self->{incr_mode} = 0;
+ $self->{incr_nest} = 0;
+ $self->{incr_parsing} = 0;
+ }
+
+ ###############################
+
+
+ 1;
+ __END__
+ =pod
+
+ =head1 NAME
+
+ JSON::PP - JSON::XS compatible pure-Perl module.
+
+ =head1 SYNOPSIS
+
+ use JSON::PP;
+
+ # exported functions, they croak on error
+ # and expect/generate UTF-8
+
+ $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
+ $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text;
+
+ # OO-interface
+
+ $coder = JSON::PP->new->ascii->pretty->allow_nonref;
+
+ $json_text = $json->encode( $perl_scalar );
+ $perl_scalar = $json->decode( $json_text );
+
+ $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing
+
+ # Note that JSON version 2.0 and above will automatically use
+ # JSON::XS or JSON::PP, so you should be able to just:
+
+ use JSON;
+
+
+ =head1 VERSION
+
+ 2.27200
+
+ L<JSON::XS> 2.27 (~2.30) compatible.
+
+ =head1 DESCRIPTION
+
+ This module is L<JSON::XS> compatible pure Perl module.
+ (Perl 5.8 or later is recommended)
+
+ JSON::XS is the fastest and most proper JSON module on CPAN.
+ It is written by Marc Lehmann in C, so must be compiled and
+ installed in the used environment.
+
+ JSON::PP is a pure-Perl module and has compatibility to JSON::XS.
+
+
+ =head2 FEATURES
+
+ =over
+
+ =item * correct unicode handling
+
+ This module knows how to handle Unicode (depending on Perl version).
+
+ See to L<JSON::XS/A FEW NOTES ON UNICODE AND PERL> and
+ L<UNICODE HANDLING ON PERLS>.
+
+
+ =item * round-trip integrity
+
+ When you serialise a perl data structure using only data types
+ supported by JSON and Perl, the deserialised data structure is
+ identical on the Perl level. (e.g. the string "2.0" doesn't suddenly
+ become "2" just because it looks like a number). There I<are> minor
+ exceptions to this, read the MAPPING section below to learn about
+ those.
+
+
+ =item * strict checking of JSON correctness
+
+ There is no guessing, no generating of illegal JSON texts by default,
+ and only JSON is accepted as input by default (the latter is a
+ security feature). But when some options are set, loose checking
+ features are available.
+
+ =back
+
+ =head1 FUNCTIONAL INTERFACE
+
+ Some documents are copied and modified from L<JSON::XS/FUNCTIONAL INTERFACE>.
+
+ =head2 encode_json
+
+ $json_text = encode_json $perl_scalar
+
+ Converts the given Perl data structure to a UTF-8 encoded, binary string.
+
+ This function call is functionally identical to:
+
+ $json_text = JSON::PP->new->utf8->encode($perl_scalar)
+
+ =head2 decode_json
+
+ $perl_scalar = decode_json $json_text
+
+ The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
+ to parse that as an UTF-8 encoded JSON text, returning the resulting
+ reference.
+
+ This function call is functionally identical to:
+
+ $perl_scalar = JSON::PP->new->utf8->decode($json_text)
+
+ =head2 JSON::PP::is_bool
+
+ $is_boolean = JSON::PP::is_bool($scalar)
+
+ Returns true if the passed scalar represents either JSON::PP::true or
+ JSON::PP::false, two constants that act like C<1> and C<0> respectively
+ and are also used to represent JSON C<true> and C<false> in Perl strings.
+
+ =head2 JSON::PP::true
+
+ Returns JSON true value which is blessed object.
+ It C<isa> JSON::PP::Boolean object.
+
+ =head2 JSON::PP::false
+
+ Returns JSON false value which is blessed object.
+ It C<isa> JSON::PP::Boolean object.
+
+ =head2 JSON::PP::null
+
+ Returns C<undef>.
+
+ See L<MAPPING>, below, for more information on how JSON values are mapped to
+ Perl.
+
+
+ =head1 HOW DO I DECODE A DATA FROM OUTER AND ENCODE TO OUTER
+
+ This section supposes that your perl version is 5.8 or later.
+
+ If you know a JSON text from an outer world - a network, a file content, and so on,
+ is encoded in UTF-8, you should use C<decode_json> or C<JSON> module object
+ with C<utf8> enable. And the decoded result will contain UNICODE characters.
+
+ # from network
+ my $json = JSON::PP->new->utf8;
+ my $json_text = CGI->new->param( 'json_data' );
+ my $perl_scalar = $json->decode( $json_text );
+
+ # from file content
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ $json_text = <$fh>;
+ $perl_scalar = decode_json( $json_text );
+
+ If an outer data is not encoded in UTF-8, firstly you should C<decode> it.
+
+ use Encode;
+ local $/;
+ open( my $fh, '<', 'json.data' );
+ my $encoding = 'cp932';
+ my $unicode_json_text = decode( $encoding, <$fh> ); # UNICODE
+
+ # or you can write the below code.
+ #
+ # open( my $fh, "<:encoding($encoding)", 'json.data' );
+ # $unicode_json_text = <$fh>;
+
+ In this case, C<$unicode_json_text> is of course UNICODE string.
+ So you B<cannot> use C<decode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable.
+
+ $perl_scalar = $json->utf8(0)->decode( $unicode_json_text );
+
+ Or C<encode 'utf8'> and C<decode_json>:
+
+ $perl_scalar = decode_json( encode( 'utf8', $unicode_json_text ) );
+ # this way is not efficient.
+
+ And now, you want to convert your C<$perl_scalar> into JSON data and
+ send it to an outer world - a network or a file content, and so on.
+
+ Your data usually contains UNICODE strings and you want the converted data to be encoded
+ in UTF-8, you should use C<encode_json> or C<JSON> module object with C<utf8> enable.
+
+ print encode_json( $perl_scalar ); # to a network? file? or display?
+ # or
+ print $json->utf8->encode( $perl_scalar );
+
+ If C<$perl_scalar> does not contain UNICODE but C<$encoding>-encoded strings
+ for some reason, then its characters are regarded as B<latin1> for perl
+ (because it does not concern with your $encoding).
+ You B<cannot> use C<encode_json> nor C<JSON> module object with C<utf8> enable.
+ Instead of them, you use C<JSON> module object with C<utf8> disable.
+ Note that the resulted text is a UNICODE string but no problem to print it.
+
+ # $perl_scalar contains $encoding encoded string values
+ $unicode_json_text = $json->utf8(0)->encode( $perl_scalar );
+ # $unicode_json_text consists of characters less than 0x100
+ print $unicode_json_text;
+
+ Or C<decode $encoding> all string values and C<encode_json>:
+
+ $perl_scalar->{ foo } = decode( $encoding, $perl_scalar->{ foo } );
+ # ... do it to each string values, then encode_json
+ $json_text = encode_json( $perl_scalar );
+
+ This method is a proper way but probably not efficient.
+
+ See to L<Encode>, L<perluniintro>.
+
+
+ =head1 METHODS
+
+ Basically, check to L<JSON> or L<JSON::XS>.
+
+ =head2 new
+
+ $json = JSON::PP->new
+
+ Returns a new JSON::PP object that can be used to de/encode JSON
+ strings.
+
+ All boolean flags described below are by default I<disabled>.
+
+ The mutators for flags all return the JSON object again and thus calls can
+ be chained:
+
+ my $json = JSON::PP->new->utf8->space_after->encode({a => [1,2]})
+ => {"a": [1, 2]}
+
+ =head2 ascii
+
+ $json = $json->ascii([$enable])
+
+ $enabled = $json->get_ascii
+
+ If $enable is true (or missing), then the encode method will not generate characters outside
+ the code range 0..127. Any Unicode characters outside that range will be escaped using either
+ a single \uXXXX or a double \uHHHH\uLLLLL escape sequence, as per RFC4627.
+ (See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>).
+
+ In Perl 5.005, there is no character having high value (more than 255).
+ See to L<UNICODE HANDLING ON PERLS>.
+
+ If $enable is false, then the encode method will not escape Unicode characters unless
+ required by the JSON syntax or other flags. This results in a faster and more compact format.
+
+ JSON::PP->new->ascii(1)->encode([chr 0x10401])
+ => ["\ud801\udc01"]
+
+ =head2 latin1
+
+ $json = $json->latin1([$enable])
+
+ $enabled = $json->get_latin1
+
+ If $enable is true (or missing), then the encode method will encode the resulting JSON
+ text as latin1 (or iso-8859-1), escaping any characters outside the code range 0..255.
+
+ If $enable is false, then the encode method will not escape Unicode characters
+ unless required by the JSON syntax or other flags.
+
+ JSON::XS->new->latin1->encode (["\x{89}\x{abc}"]
+ => ["\x{89}\\u0abc"] # (perl syntax, U+abc escaped, U+89 not)
+
+ See to L<UNICODE HANDLING ON PERLS>.
+
+ =head2 utf8
+
+ $json = $json->utf8([$enable])
+
+ $enabled = $json->get_utf8
+
+ If $enable is true (or missing), then the encode method will encode the JSON result
+ into UTF-8, as required by many protocols, while the decode method expects to be handled
+ an UTF-8-encoded string. Please note that UTF-8-encoded strings do not contain any
+ characters outside the range 0..255, they are thus useful for bytewise/binary I/O.
+
+ (In Perl 5.005, any character outside the range 0..255 does not exist.
+ See to L<UNICODE HANDLING ON PERLS>.)
+
+ In future versions, enabling this option might enable autodetection of the UTF-16 and UTF-32
+ encoding families, as described in RFC4627.
+
+ If $enable is false, then the encode method will return the JSON string as a (non-encoded)
+ Unicode string, while decode expects thus a Unicode string. Any decoding or encoding
+ (e.g. to UTF-8 or UTF-16) needs to be done yourself, e.g. using the Encode module.
+
+ Example, output UTF-16BE-encoded JSON:
+
+ use Encode;
+ $jsontext = encode "UTF-16BE", JSON::PP->new->encode ($object);
+
+ Example, decode UTF-32LE-encoded JSON:
+
+ use Encode;
+ $object = JSON::PP->new->decode (decode "UTF-32LE", $jsontext);
+
+
+ =head2 pretty
+
+ $json = $json->pretty([$enable])
+
+ This enables (or disables) all of the C<indent>, C<space_before> and
+ C<space_after> flags in one call to generate the most readable
+ (or most compact) form possible.
+
+ Equivalent to:
+
+ $json->indent->space_before->space_after
+
+ =head2 indent
+
+ $json = $json->indent([$enable])
+
+ $enabled = $json->get_indent
+
+ The default indent space length is three.
+ You can use C<indent_length> to change the length.
+
+ =head2 space_before
+
+ $json = $json->space_before([$enable])
+
+ $enabled = $json->get_space_before
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space before the C<:> separating keys from values in JSON objects.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before enabled, space_after and indent disabled:
+
+ {"key" :"value"}
+
+ =head2 space_after
+
+ $json = $json->space_after([$enable])
+
+ $enabled = $json->get_space_after
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space after the C<:> separating keys from values in JSON objects
+ and extra whitespace after the C<,> separating key-value pairs and array
+ members.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before and indent disabled, space_after enabled:
+
+ {"key": "value"}
+
+ =head2 relaxed
+
+ $json = $json->relaxed([$enable])
+
+ $enabled = $json->get_relaxed
+
+ If C<$enable> is true (or missing), then C<decode> will accept some
+ extensions to normal JSON syntax (see below). C<encode> will not be
+ affected in anyway. I<Be aware that this option makes you accept invalid
+ JSON texts as if they were valid!>. I suggest only to use this option to
+ parse application-specific files written by humans (configuration files,
+ resource files etc.)
+
+ If C<$enable> is false (the default), then C<decode> will only accept
+ valid JSON texts.
+
+ Currently accepted extensions are:
+
+ =over 4
+
+ =item * list items can have an end-comma
+
+ JSON I<separates> array elements and key-value pairs with commas. This
+ can be annoying if you write JSON texts manually and want to be able to
+ quickly append elements, so this extension accepts comma at the end of
+ such items not just between them:
+
+ [
+ 1,
+ 2, <- this comma not normally allowed
+ ]
+ {
+ "k1": "v1",
+ "k2": "v2", <- this comma not normally allowed
+ }
+
+ =item * shell-style '#'-comments
+
+ Whenever JSON allows whitespace, shell-style comments are additionally
+ allowed. They are terminated by the first carriage-return or line-feed
+ character, after which more white-space and comments are allowed.
+
+ [
+ 1, # this comment not allowed in JSON
+ # neither this one...
+ ]
+
+ =back
+
+ =head2 canonical
+
+ $json = $json->canonical([$enable])
+
+ $enabled = $json->get_canonical
+
+ If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
+ by sorting their keys. This is adding a comparatively high overhead.
+
+ If C<$enable> is false, then the C<encode> method will output key-value
+ pairs in the order Perl stores them (which will likely change between runs
+ of the same script).
+
+ This option is useful if you want the same data structure to be encoded as
+ the same JSON text (given the same overall settings). If it is disabled,
+ the same hash might be encoded differently even if contains the same data,
+ as key-value pairs have no inherent ordering in Perl.
+
+ This setting has no effect when decoding JSON texts.
+
+ If you want your own sorting routine, you can give a code reference
+ or a subroutine name to C<sort_by>. See to C<JSON::PP OWN METHODS>.
+
+ =head2 allow_nonref
+
+ $json = $json->allow_nonref([$enable])
+
+ $enabled = $json->get_allow_nonref
+
+ If C<$enable> is true (or missing), then the C<encode> method can convert a
+ non-reference into its corresponding string, number or null JSON value,
+ which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
+ values instead of croaking.
+
+ If C<$enable> is false, then the C<encode> method will croak if it isn't
+ passed an arrayref or hashref, as JSON texts must either be an object
+ or array. Likewise, C<decode> will croak if given something that is not a
+ JSON object or array.
+
+ JSON::PP->new->allow_nonref->encode ("Hello, World!")
+ => "Hello, World!"
+
+ =head2 allow_unknown
+
+ $json = $json->allow_unknown ([$enable])
+
+ $enabled = $json->get_allow_unknown
+
+ If $enable is true (or missing), then "encode" will *not* throw an
+ exception when it encounters values it cannot represent in JSON (for
+ example, filehandles) but instead will encode a JSON "null" value.
+ Note that blessed objects are not included here and are handled
+ separately by c<allow_nonref>.
+
+ If $enable is false (the default), then "encode" will throw an
+ exception when it encounters anything it cannot encode as JSON.
+
+ This option does not affect "decode" in any way, and it is
+ recommended to leave it off unless you know your communications
+ partner.
+
+ =head2 allow_blessed
+
+ $json = $json->allow_blessed([$enable])
+
+ $enabled = $json->get_allow_blessed
+
+ If C<$enable> is true (or missing), then the C<encode> method will not
+ barf when it encounters a blessed reference. Instead, the value of the
+ B<convert_blessed> option will decide whether C<null> (C<convert_blessed>
+ disabled or no C<TO_JSON> method found) or a representation of the
+ object (C<convert_blessed> enabled and C<TO_JSON> method found) is being
+ encoded. Has no effect on C<decode>.
+
+ If C<$enable> is false (the default), then C<encode> will throw an
+ exception when it encounters a blessed object.
+
+ =head2 convert_blessed
+
+ $json = $json->convert_blessed([$enable])
+
+ $enabled = $json->get_convert_blessed
+
+ If C<$enable> is true (or missing), then C<encode>, upon encountering a
+ blessed object, will check for the availability of the C<TO_JSON> method
+ on the object's class. If found, it will be called in scalar context
+ and the resulting scalar will be encoded instead of the object. If no
+ C<TO_JSON> method is found, the value of C<allow_blessed> will decide what
+ to do.
+
+ The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
+ returns other blessed objects, those will be handled in the same
+ way. C<TO_JSON> must take care of not causing an endless recursion cycle
+ (== crash) in this case. The name of C<TO_JSON> was chosen because other
+ methods called by the Perl core (== not by the user of the object) are
+ usually in upper case letters and to avoid collisions with the C<to_json>
+ function or method.
+
+ This setting does not yet influence C<decode> in any way.
+
+ If C<$enable> is false, then the C<allow_blessed> setting will decide what
+ to do when a blessed object is found.
+
+ =head2 filter_json_object
+
+ $json = $json->filter_json_object([$coderef])
+
+ When C<$coderef> is specified, it will be called from C<decode> each
+ time it decodes a JSON object. The only argument passed to the coderef
+ is a reference to the newly-created hash. If the code references returns
+ a single scalar (which need not be a reference), this value
+ (i.e. a copy of that scalar to avoid aliasing) is inserted into the
+ deserialised data structure. If it returns an empty list
+ (NOTE: I<not> C<undef>, which is a valid scalar), the original deserialised
+ hash will be inserted. This setting can slow down decoding considerably.
+
+ When C<$coderef> is omitted or undefined, any existing callback will
+ be removed and C<decode> will not change the deserialised hash in any
+ way.
+
+ Example, convert all JSON objects into the integer 5:
+
+ my $js = JSON::PP->new->filter_json_object (sub { 5 });
+ # returns [5]
+ $js->decode ('[{}]'); # the given subroutine takes a hash reference.
+ # throw an exception because allow_nonref is not enabled
+ # so a lone 5 is not allowed.
+ $js->decode ('{"a":1, "b":2}');
+
+ =head2 filter_json_single_key_object
+
+ $json = $json->filter_json_single_key_object($key [=> $coderef])
+
+ Works remotely similar to C<filter_json_object>, but is only called for
+ JSON objects having a single key named C<$key>.
+
+ This C<$coderef> is called before the one specified via
+ C<filter_json_object>, if any. It gets passed the single value in the JSON
+ object. If it returns a single value, it will be inserted into the data
+ structure. If it returns nothing (not even C<undef> but the empty list),
+ the callback from C<filter_json_object> will be called next, as if no
+ single-key callback were specified.
+
+ If C<$coderef> is omitted or undefined, the corresponding callback will be
+ disabled. There can only ever be one callback for a given key.
+
+ As this callback gets called less often then the C<filter_json_object>
+ one, decoding speed will not usually suffer as much. Therefore, single-key
+ objects make excellent targets to serialise Perl objects into, especially
+ as single-key JSON objects are as close to the type-tagged value concept
+ as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
+ support this in any way, so you need to make sure your data never looks
+ like a serialised Perl hash.
+
+ Typical names for the single object key are C<__class_whatever__>, or
+ C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
+ things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
+ with real hashes.
+
+ Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
+ into the corresponding C<< $WIDGET{<id>} >> object:
+
+ # return whatever is in $WIDGET{5}:
+ JSON::PP
+ ->new
+ ->filter_json_single_key_object (__widget__ => sub {
+ $WIDGET{ $_[0] }
+ })
+ ->decode ('{"__widget__": 5')
+
+ # this can be used with a TO_JSON method in some "widget" class
+ # for serialisation to json:
+ sub WidgetBase::TO_JSON {
+ my ($self) = @_;
+
+ unless ($self->{id}) {
+ $self->{id} = ..get..some..id..;
+ $WIDGET{$self->{id}} = $self;
+ }
+
+ { __widget__ => $self->{id} }
+ }
+
+ =head2 shrink
+
+ $json = $json->shrink([$enable])
+
+ $enabled = $json->get_shrink
+
+ In JSON::XS, this flag resizes strings generated by either
+ C<encode> or C<decode> to their minimum size possible.
+ It will also try to downgrade any strings to octet-form if possible.
+
+ In JSON::PP, it is noop about resizing strings but tries
+ C<utf8::downgrade> to the returned string by C<encode>.
+ See to L<utf8>.
+
+ See to L<JSON::XS/OBJECT-ORIENTED INTERFACE>
+
+ =head2 max_depth
+
+ $json = $json->max_depth([$maximum_nesting_depth])
+
+ $max_depth = $json->get_max_depth
+
+ Sets the maximum nesting level (default C<512>) accepted while encoding
+ or decoding. If a higher nesting level is detected in JSON text or a Perl
+ data structure, then the encoder and decoder will stop and croak at that
+ point.
+
+ Nesting level is defined by number of hash- or arrayrefs that the encoder
+ needs to traverse to reach a given point or the number of C<{> or C<[>
+ characters without their matching closing parenthesis crossed to reach a
+ given character in a string.
+
+ If no argument is given, the highest possible setting will be used, which
+ is rarely useful.
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ When a large value (100 or more) was set and it de/encodes a deep nested object/text,
+ it may raise a warning 'Deep recursion on subroutine' at the perl runtime phase.
+
+ =head2 max_size
+
+ $json = $json->max_size([$maximum_string_size])
+
+ $max_size = $json->get_max_size
+
+ Set the maximum length a JSON text may have (in bytes) where decoding is
+ being attempted. The default is C<0>, meaning no limit. When C<decode>
+ is called on a string that is longer then this many bytes, it will not
+ attempt to decode the string but throw an exception. This setting has no
+ effect on C<encode> (yet).
+
+ If no argument is given, the limit check will be deactivated (same as when
+ C<0> is specified).
+
+ See L<JSON::XS/SECURITY CONSIDERATIONS> for more info on why this is useful.
+
+ =head2 encode
+
+ $json_text = $json->encode($perl_scalar)
+
+ Converts the given Perl data structure (a simple scalar or a reference
+ to a hash or array) to its JSON representation. Simple scalars will be
+ converted into JSON string or number sequences, while references to arrays
+ become JSON arrays and references to hashes become JSON objects. Undefined
+ Perl values (e.g. C<undef>) become JSON C<null> values.
+ References to the integers C<0> and C<1> are converted into C<true> and C<false>.
+
+ =head2 decode
+
+ $perl_scalar = $json->decode($json_text)
+
+ The opposite of C<encode>: expects a JSON text and tries to parse it,
+ returning the resulting simple scalar or reference. Croaks on error.
+
+ JSON numbers and strings become simple Perl scalars. JSON arrays become
+ Perl arrayrefs and JSON objects become Perl hashrefs. C<true> becomes
+ C<1> (C<JSON::true>), C<false> becomes C<0> (C<JSON::false>) and
+ C<null> becomes C<undef>.
+
+ =head2 decode_prefix
+
+ ($perl_scalar, $characters) = $json->decode_prefix($json_text)
+
+ This works like the C<decode> method, but instead of raising an exception
+ when there is trailing garbage after the first JSON object, it will
+ silently stop parsing there and return the number of characters consumed
+ so far.
+
+ JSON->new->decode_prefix ("[1] the tail")
+ => ([], 3)
+
+ =head1 INCREMENTAL PARSING
+
+ Most of this section are copied and modified from L<JSON::XS/INCREMENTAL PARSING>.
+
+ In some cases, there is the need for incremental parsing of JSON texts.
+ This module does allow you to parse a JSON stream incrementally.
+ It does so by accumulating text until it has a full JSON object, which
+ it then can decode. This process is similar to using C<decode_prefix>
+ to see if a full JSON object is available, but is much more efficient
+ (and can be implemented with a minimum of method calls).
+
+ This module will only attempt to parse the JSON text once it is sure it
+ has enough text to get a decisive result, using a very simple but
+ truly incremental parser. This means that it sometimes won't stop as
+ early as the full parser, for example, it doesn't detect parenthesis
+ mismatches. The only thing it guarantees is that it starts decoding as
+ soon as a syntactically valid JSON text has been seen. This means you need
+ to set resource limits (e.g. C<max_size>) to ensure the parser will stop
+ parsing in the presence if syntax errors.
+
+ The following methods implement this incremental parser.
+
+ =head2 incr_parse
+
+ $json->incr_parse( [$string] ) # void context
+
+ $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
+
+ @obj_or_empty = $json->incr_parse( [$string] ) # list context
+
+ This is the central parsing function. It can both append new text and
+ extract objects from the stream accumulated so far (both of these
+ functions are optional).
+
+ If C<$string> is given, then this string is appended to the already
+ existing JSON fragment stored in the C<$json> object.
+
+ After that, if the function is called in void context, it will simply
+ return without doing anything further. This can be used to add more text
+ in as many chunks as you want.
+
+ If the method is called in scalar context, then it will try to extract
+ exactly I<one> JSON object. If that is successful, it will return this
+ object, otherwise it will return C<undef>. If there is a parse error,
+ this method will croak just as C<decode> would do (one can then use
+ C<incr_skip> to skip the erroneous part). This is the most common way of
+ using the method.
+
+ And finally, in list context, it will try to extract as many objects
+ from the stream as it can find and return them, or the empty list
+ otherwise. For this to work, there must be no separators between the JSON
+ objects or arrays, instead they must be concatenated back-to-back. If
+ an error occurs, an exception will be raised as in the scalar context
+ case. Note that in this case, any previously-parsed JSON texts will be
+ lost.
+
+ Example: Parse some JSON arrays/objects in a given string and return them.
+
+ my @objs = JSON->new->incr_parse ("[5][7][1,2]");
+
+ =head2 incr_text
+
+ $lvalue_string = $json->incr_text
+
+ This method returns the currently stored JSON fragment as an lvalue, that
+ is, you can manipulate it. This I<only> works when a preceding call to
+ C<incr_parse> in I<scalar context> successfully returned an object. Under
+ all other circumstances you must not call this function (I mean it.
+ although in simple tests it might actually work, it I<will> fail under
+ real world conditions). As a special exception, you can also call this
+ method before having parsed anything.
+
+ This function is useful in two cases: a) finding the trailing text after a
+ JSON object or b) parsing multiple JSON objects separated by non-JSON text
+ (such as commas).
+
+ $json->incr_text =~ s/\s*,\s*//;
+
+ In Perl 5.005, C<lvalue> attribute is not available.
+ You must write codes like the below:
+
+ $string = $json->incr_text;
+ $string =~ s/\s*,\s*//;
+ $json->incr_text( $string );
+
+ =head2 incr_skip
+
+ $json->incr_skip
+
+ This will reset the state of the incremental parser and will remove the
+ parsed text from the input buffer. This is useful after C<incr_parse>
+ died, in which case the input buffer and incremental parser state is left
+ unchanged, to skip the text parsed so far and to reset the parse state.
+
+ =head2 incr_reset
+
+ $json->incr_reset
+
+ This completely resets the incremental parser, that is, after this call,
+ it will be as if the parser had never parsed anything.
+
+ This is useful if you want to repeatedly parse JSON objects and want to
+ ignore any trailing data, which means you have to reset the parser after
+ each successful decode.
+
+ See to L<JSON::XS/INCREMENTAL PARSING> for examples.
+
+
+ =head1 JSON::PP OWN METHODS
+
+ =head2 allow_singlequote
+
+ $json = $json->allow_singlequote([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ JSON strings quoted by single quotations that are invalid JSON
+ format.
+
+ $json->allow_singlequote->decode({"foo":'bar'});
+ $json->allow_singlequote->decode({'foo':"bar"});
+ $json->allow_singlequote->decode({'foo':'bar'});
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+
+ =head2 allow_barekey
+
+ $json = $json->allow_barekey([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will accept
+ bare keys of JSON object that are invalid JSON format.
+
+ As same as the C<relaxed> option, this option may be used to parse
+ application-specific files written by humans.
+
+ $json->allow_barekey->decode('{foo:"bar"}');
+
+ =head2 allow_bignum
+
+ $json = $json->allow_bignum([$enable])
+
+ If C<$enable> is true (or missing), then C<decode> will convert
+ the big integer Perl cannot handle as integer into a L<Math::BigInt>
+ object and convert a floating number (any) into a L<Math::BigFloat>.
+
+ On the contrary, C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers with C<allow_blessed> enable.
+
+ $json->allow_nonref->allow_blessed->allow_bignum;
+ $bigfloat = $json->decode('2.000000000000000000000000001');
+ print $json->encode($bigfloat);
+ # => 2.000000000000000000000000001
+
+ See to L<JSON::XS/MAPPING> about the normal conversion of JSON number.
+
+ =head2 loose
+
+ $json = $json->loose([$enable])
+
+ The unescaped [\x00-\x1f\x22\x2f\x5c] strings are invalid in JSON strings
+ and the module doesn't allow to C<decode> to these (except for \x2f).
+ If C<$enable> is true (or missing), then C<decode> will accept these
+ unescaped strings.
+
+ $json->loose->decode(qq|["abc
+ def"]|);
+
+ See L<JSON::XS/SSECURITY CONSIDERATIONS>.
+
+ =head2 escape_slash
+
+ $json = $json->escape_slash([$enable])
+
+ According to JSON Grammar, I<slash> (U+002F) is escaped. But default
+ JSON::PP (as same as JSON::XS) encodes strings without escaping slash.
+
+ If C<$enable> is true (or missing), then C<encode> will escape slashes.
+
+ =head2 indent_length
+
+ $json = $json->indent_length($length)
+
+ JSON::XS indent space length is 3 and cannot be changed.
+ JSON::PP set the indent space length with the given $length.
+ The default is 3. The acceptable range is 0 to 15.
+
+ =head2 sort_by
+
+ $json = $json->sort_by($function_name)
+ $json = $json->sort_by($subroutine_ref)
+
+ If $function_name or $subroutine_ref are set, its sort routine are used
+ in encoding JSON objects.
+
+ $js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ $js = $pc->sort_by('own_sort')->encode($obj);
+ # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|);
+
+ sub JSON::PP::own_sort { $JSON::PP::a cmp $JSON::PP::b }
+
+ As the sorting routine runs in the JSON::PP scope, the given
+ subroutine name and the special variables C<$a>, C<$b> will begin
+ 'JSON::PP::'.
+
+ If $integer is set, then the effect is same as C<canonical> on.
+
+ =head1 INTERNAL
+
+ For developers.
+
+ =over
+
+ =item PP_encode_box
+
+ Returns
+
+ {
+ depth => $depth,
+ indent_count => $indent_count,
+ }
+
+
+ =item PP_decode_box
+
+ Returns
+
+ {
+ text => $text,
+ at => $at,
+ ch => $ch,
+ len => $len,
+ depth => $depth,
+ encoding => $encoding,
+ is_valid_utf8 => $is_valid_utf8,
+ };
+
+ =back
+
+ =head1 MAPPING
+
+ This section is copied from JSON::XS and modified to C<JSON::PP>.
+ JSON::XS and JSON::PP mapping mechanisms are almost equivalent.
+
+ See to L<JSON::XS/MAPPING>.
+
+ =head2 JSON -> PERL
+
+ =over 4
+
+ =item object
+
+ A JSON object becomes a reference to a hash in Perl. No ordering of object
+ keys is preserved (JSON does not preserver object key ordering itself).
+
+ =item array
+
+ A JSON array becomes a reference to an array in Perl.
+
+ =item string
+
+ A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
+ are represented by the same codepoints in the Perl string, so no manual
+ decoding is necessary.
+
+ =item number
+
+ A JSON number becomes either an integer, numeric (floating point) or
+ string scalar in perl, depending on its range and any fractional parts. On
+ the Perl level, there is no difference between those as Perl handles all
+ the conversion details, but an integer may take slightly less memory and
+ might represent more values exactly than floating point numbers.
+
+ If the number consists of digits only, C<JSON> will try to represent
+ it as an integer value. If that fails, it will try to represent it as
+ a numeric (floating point) value if that is possible without loss of
+ precision. Otherwise it will preserve the number as a string value (in
+ which case you lose roundtripping ability, as the JSON number will be
+ re-encoded to a JSON string).
+
+ Numbers containing a fractional or exponential part will always be
+ represented as numeric (floating point) values, possibly at a loss of
+ precision (in which case you might lose perfect roundtripping ability, but
+ the JSON number will still be re-encoded as a JSON number).
+
+ Note that precision is not accuracy - binary floating point values cannot
+ represent most decimal fractions exactly, and when converting from and to
+ floating point, C<JSON> only guarantees precision up to but not including
+ the least significant bit.
+
+ When C<allow_bignum> is enable, the big integers
+ and the numeric can be optionally converted into L<Math::BigInt> and
+ L<Math::BigFloat> objects.
+
+ =item true, false
+
+ These JSON atoms become C<JSON::PP::true> and C<JSON::PP::false>,
+ respectively. They are overloaded to act almost exactly like the numbers
+ C<1> and C<0>. You can check whether a scalar is a JSON boolean by using
+ the C<JSON::is_bool> function.
+
+ print JSON::PP::true . "\n";
+ => true
+ print JSON::PP::true + 1;
+ => 1
+
+ ok(JSON::true eq '1');
+ ok(JSON::true == 1);
+
+ C<JSON> will install these missing overloading features to the backend modules.
+
+
+ =item null
+
+ A JSON null atom becomes C<undef> in Perl.
+
+ C<JSON::PP::null> returns C<undef>.
+
+ =back
+
+
+ =head2 PERL -> JSON
+
+ The mapping from Perl to JSON is slightly more difficult, as Perl is a
+ truly typeless language, so we can only guess which JSON type is meant by
+ a Perl value.
+
+ =over 4
+
+ =item hash references
+
+ Perl hash references become JSON objects. As there is no inherent ordering
+ in hash keys (or JSON objects), they will usually be encoded in a
+ pseudo-random order that can change between runs of the same program but
+ stays generally the same within a single run of a program. C<JSON>
+ optionally sort the hash keys (determined by the I<canonical> flag), so
+ the same data structure will serialise to the same JSON text (given same
+ settings and version of JSON::XS), but this incurs a runtime overhead
+ and is only rarely useful, e.g. when you want to compare some JSON text
+ against another for equality.
+
+
+ =item array references
+
+ Perl array references become JSON arrays.
+
+ =item other references
+
+ Other unblessed references are generally not allowed and will cause an
+ exception to be thrown, except for references to the integers C<0> and
+ C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
+ also use C<JSON::false> and C<JSON::true> to improve readability.
+
+ to_json [\0,JSON::PP::true] # yields [false,true]
+
+ =item JSON::PP::true, JSON::PP::false, JSON::PP::null
+
+ These special values become JSON true and JSON false values,
+ respectively. You can also use C<\1> and C<\0> directly if you want.
+
+ JSON::PP::null returns C<undef>.
+
+ =item blessed objects
+
+ Blessed objects are not directly representable in JSON. See the
+ C<allow_blessed> and C<convert_blessed> methods on various options on
+ how to deal with this: basically, you can choose between throwing an
+ exception, encoding the reference as if it weren't blessed, or provide
+ your own serialiser method.
+
+ See to L<convert_blessed>.
+
+ =item simple scalars
+
+ Simple Perl scalars (any scalar that is not a reference) are the most
+ difficult objects to encode: JSON::XS and JSON::PP will encode undefined scalars as
+ JSON C<null> values, scalars that have last been used in a string context
+ before encoding as JSON strings, and anything else as number value:
+
+ # dump as number
+ encode_json [2] # yields [2]
+ encode_json [-3.0e17] # yields [-3e+17]
+ my $value = 5; encode_json [$value] # yields [5]
+
+ # used as string, so dump as string
+ print $value;
+ encode_json [$value] # yields ["5"]
+
+ # undef becomes null
+ encode_json [undef] # yields [null]
+
+ You can force the type to be a string by stringifying it:
+
+ my $x = 3.1; # some variable containing a number
+ "$x"; # stringified
+ $x .= ""; # another, more awkward way to stringify
+ print $x; # perl does it for you, too, quite often
+
+ You can force the type to be a number by numifying it:
+
+ my $x = "3"; # some variable containing a string
+ $x += 0; # numify it, ensuring it will be dumped as a number
+ $x *= 1; # same thing, the choice is yours.
+
+ You can not currently force the type in other, less obscure, ways.
+
+ Note that numerical precision has the same meaning as under Perl (so
+ binary to decimal conversion follows the same rules as in Perl, which
+ can differ to other languages). Also, your perl interpreter might expose
+ extensions to the floating point numbers of your platform, such as
+ infinities or NaN's - these cannot be represented in JSON, and it is an
+ error to pass those in.
+
+ =item Big Number
+
+ When C<allow_bignum> is enable,
+ C<encode> converts C<Math::BigInt> objects and C<Math::BigFloat>
+ objects into JSON numbers.
+
+
+ =back
+
+ =head1 UNICODE HANDLING ON PERLS
+
+ If you do not know about Unicode on Perl well,
+ please check L<JSON::XS/A FEW NOTES ON UNICODE AND PERL>.
+
+ =head2 Perl 5.8 and later
+
+ Perl can handle Unicode and the JSON::PP de/encode methods also work properly.
+
+ $json->allow_nonref->encode(chr hex 3042);
+ $json->allow_nonref->encode(chr hex 12345);
+
+ Returns C<"\u3042"> and C<"\ud808\udf45"> respectively.
+
+ $json->allow_nonref->decode('"\u3042"');
+ $json->allow_nonref->decode('"\ud808\udf45"');
+
+ Returns UTF-8 encoded strings with UTF8 flag, regarded as C<U+3042> and C<U+12345>.
+
+ Note that the versions from Perl 5.8.0 to 5.8.2, Perl built-in C<join> was broken,
+ so JSON::PP wraps the C<join> with a subroutine. Thus JSON::PP works slow in the versions.
+
+
+ =head2 Perl 5.6
+
+ Perl can handle Unicode and the JSON::PP de/encode methods also work.
+
+ =head2 Perl 5.005
+
+ Perl 5.005 is a byte semantics world -- all strings are sequences of bytes.
+ That means the unicode handling is not available.
+
+ In encoding,
+
+ $json->allow_nonref->encode(chr hex 3042); # hex 3042 is 12354.
+ $json->allow_nonref->encode(chr hex 12345); # hex 12345 is 74565.
+
+ Returns C<B> and C<E>, as C<chr> takes a value more than 255, it treats
+ as C<$value % 256>, so the above codes are equivalent to :
+
+ $json->allow_nonref->encode(chr 66);
+ $json->allow_nonref->encode(chr 69);
+
+ In decoding,
+
+ $json->decode('"\u00e3\u0081\u0082"');
+
+ The returned is a byte sequence C<0xE3 0x81 0x82> for UTF-8 encoded
+ japanese character (C<HIRAGANA LETTER A>).
+ And if it is represented in Unicode code point, C<U+3042>.
+
+ Next,
+
+ $json->decode('"\u3042"');
+
+ We ordinary expect the returned value is a Unicode character C<U+3042>.
+ But here is 5.005 world. This is C<0xE3 0x81 0x82>.
+
+ $json->decode('"\ud808\udf45"');
+
+ This is not a character C<U+12345> but bytes - C<0xf0 0x92 0x8d 0x85>.
+
+
+ =head1 TODO
+
+ =over
+
+ =item speed
+
+ =item memory saving
+
+ =back
+
+
+ =head1 SEE ALSO
+
+ Most of the document are copied and modified from JSON::XS doc.
+
+ L<JSON::XS>
+
+ RFC4627 (L<http://www.ietf.org/rfc/rfc4627.txt>)
+
+ =head1 AUTHOR
+
+ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
+
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 2007-2012 by Makamaka Hannyaharamitu
+
+ This library is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+JSON_BACKPORTPP
+
+$fatpacked{"JSON/backportPP/Boolean.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_BACKPORTPP_BOOLEAN';
+ =head1 NAME
+
+ JSON::PP::Boolean - dummy module providing JSON::PP::Boolean
+
+ =head1 SYNOPSIS
+
+ # do not "use" yourself
+
+ =head1 DESCRIPTION
+
+ This module exists only to provide overload resolution for Storable
+ and similar modules. See L<JSON::PP> for more info about this class.
+
+ =cut
+
+ use JSON::backportPP ();
+ use strict;
+
+ 1;
+
+ =head1 AUTHOR
+
+ This idea is from L<JSON::XS::Boolean> written by
+ Marc Lehmann <schmorp[at]schmorp.de>
+
+ =cut
+
+JSON_BACKPORTPP_BOOLEAN
+
+$fatpacked{"JSON/backportPP/Compat5005.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_BACKPORTPP_COMPAT5005';
+ package # This is JSON::backportPP
+ JSON::backportPP5005;
+
+ use 5.005;
+ use strict;
+
+ my @properties;
+
+ $JSON::PP5005::VERSION = '1.10';
+
+ BEGIN {
+
+ sub utf8::is_utf8 {
+ 0; # It is considered that UTF8 flag off for Perl 5.005.
+ }
+
+ sub utf8::upgrade {
+ }
+
+ sub utf8::downgrade {
+ 1; # must always return true.
+ }
+
+ sub utf8::encode {
+ }
+
+ sub utf8::decode {
+ }
+
+ *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii;
+ *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1;
+ *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
+ *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode;
+
+ # missing in B module.
+ sub B::SVp_IOK () { 0x01000000; }
+ sub B::SVp_NOK () { 0x02000000; }
+ sub B::SVp_POK () { 0x04000000; }
+
+ $INC{'bytes.pm'} = 1; # dummy
+ }
+
+
+
+ sub _encode_ascii {
+ join('', map { $_ <= 127 ? chr($_) : sprintf('\u%04x', $_) } unpack('C*', $_[0]) );
+ }
+
+
+ sub _encode_latin1 {
+ join('', map { chr($_) } unpack('C*', $_[0]) );
+ }
+
+
+ sub _decode_surrogates { # from http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
+ my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00); # from perlunicode
+ my $bit = unpack('B32', pack('N', $uni));
+
+ if ( $bit =~ /^00000000000(...)(......)(......)(......)$/ ) {
+ my ($w, $x, $y, $z) = ($1, $2, $3, $4);
+ return pack('B*', sprintf('11110%s10%s10%s10%s', $w, $x, $y, $z));
+ }
+ else {
+ Carp::croak("Invalid surrogate pair");
+ }
+ }
+
+
+ sub _decode_unicode {
+ my ($u) = @_;
+ my ($utf8bit);
+
+ if ( $u =~ /^00([89a-f][0-9a-f])$/i ) { # 0x80-0xff
+ return pack( 'H2', $1 );
+ }
+
+ my $bit = unpack("B*", pack("H*", $u));
+
+ if ( $bit =~ /^00000(.....)(......)$/ ) {
+ $utf8bit = sprintf('110%s10%s', $1, $2);
+ }
+ elsif ( $bit =~ /^(....)(......)(......)$/ ) {
+ $utf8bit = sprintf('1110%s10%s10%s', $1, $2, $3);
+ }
+ else {
+ Carp::croak("Invalid escaped unicode");
+ }
+
+ return pack('B*', $utf8bit);
+ }
+
+
+ sub JSON::PP::incr_text {
+ $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
+
+ if ( $_[0]->{_incr_parser}->{incr_parsing} ) {
+ Carp::croak("incr_text can not be called when the incremental parser already started parsing");
+ }
+
+ $_[0]->{_incr_parser}->{incr_text} = $_[1] if ( @_ > 1 );
+ $_[0]->{_incr_parser}->{incr_text};
+ }
+
+
+ 1;
+ __END__
+
+ =pod
+
+ =head1 NAME
+
+ JSON::PP5005 - Helper module in using JSON::PP in Perl 5.005
+
+ =head1 DESCRIPTION
+
+ JSON::PP calls internally.
+
+ =head1 AUTHOR
+
+ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
+
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 2007-2012 by Makamaka Hannyaharamitu
+
+ This library is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+
+JSON_BACKPORTPP_COMPAT5005
+
+$fatpacked{"JSON/backportPP/Compat5006.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_BACKPORTPP_COMPAT5006';
+ package # This is JSON::backportPP
+ JSON::backportPP56;
+
+ use 5.006;
+ use strict;
+
+ my @properties;
+
+ $JSON::PP56::VERSION = '1.08';
+
+ BEGIN {
+
+ sub utf8::is_utf8 {
+ my $len = length $_[0]; # char length
+ {
+ use bytes; # byte length;
+ return $len != length $_[0]; # if !=, UTF8-flagged on.
+ }
+ }
+
+
+ sub utf8::upgrade {
+ ; # noop;
+ }
+
+
+ sub utf8::downgrade ($;$) {
+ return 1 unless ( utf8::is_utf8( $_[0] ) );
+
+ if ( _is_valid_utf8( $_[0] ) ) {
+ my $downgrade;
+ for my $c ( unpack( "U*", $_[0] ) ) {
+ if ( $c < 256 ) {
+ $downgrade .= pack("C", $c);
+ }
+ else {
+ $downgrade .= pack("U", $c);
+ }
+ }
+ $_[0] = $downgrade;
+ return 1;
+ }
+ else {
+ Carp::croak("Wide character in subroutine entry") unless ( $_[1] );
+ 0;
+ }
+ }
+
+
+ sub utf8::encode ($) { # UTF8 flag off
+ if ( utf8::is_utf8( $_[0] ) ) {
+ $_[0] = pack( "C*", unpack( "C*", $_[0] ) );
+ }
+ else {
+ $_[0] = pack( "U*", unpack( "C*", $_[0] ) );
+ $_[0] = pack( "C*", unpack( "C*", $_[0] ) );
+ }
+ }
+
+
+ sub utf8::decode ($) { # UTF8 flag on
+ if ( _is_valid_utf8( $_[0] ) ) {
+ utf8::downgrade( $_[0] );
+ $_[0] = pack( "U*", unpack( "U*", $_[0] ) );
+ }
+ }
+
+
+ *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii;
+ *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1;
+ *JSON::PP::JSON_PP_decode_surrogates = \&JSON::PP::_decode_surrogates;
+ *JSON::PP::JSON_PP_decode_unicode = \&JSON::PP::_decode_unicode;
+
+ unless ( defined &B::SVp_NOK ) { # missing in B module.
+ eval q{ sub B::SVp_NOK () { 0x02000000; } };
+ }
+
+ }
+
+
+
+ sub _encode_ascii {
+ join('',
+ map {
+ $_ <= 127 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', JSON::PP::_encode_surrogates($_));
+ } _unpack_emu($_[0])
+ );
+ }
+
+
+ sub _encode_latin1 {
+ join('',
+ map {
+ $_ <= 255 ?
+ chr($_) :
+ $_ <= 65535 ?
+ sprintf('\u%04x', $_) : sprintf('\u%x\u%x', JSON::PP::_encode_surrogates($_));
+ } _unpack_emu($_[0])
+ );
+ }
+
+
+ sub _unpack_emu { # for Perl 5.6 unpack warnings
+ return !utf8::is_utf8($_[0]) ? unpack('C*', $_[0])
+ : _is_valid_utf8($_[0]) ? unpack('U*', $_[0])
+ : unpack('C*', $_[0]);
+ }
+
+
+ sub _is_valid_utf8 {
+ my $str = $_[0];
+ my $is_utf8;
+
+ while ($str =~ /(?:
+ (
+ [\x00-\x7F]
+ |[\xC2-\xDF][\x80-\xBF]
+ |[\xE0][\xA0-\xBF][\x80-\xBF]
+ |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
+ |[\xED][\x80-\x9F][\x80-\xBF]
+ |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
+ |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
+ |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
+ )
+ | (.)
+ )/xg)
+ {
+ if (defined $1) {
+ $is_utf8 = 1 if (!defined $is_utf8);
+ }
+ else {
+ $is_utf8 = 0 if (!defined $is_utf8);
+ if ($is_utf8) { # eventually, not utf8
+ return;
+ }
+ }
+ }
+
+ return $is_utf8;
+ }
+
+
+ 1;
+ __END__
+
+ =pod
+
+ =head1 NAME
+
+ JSON::PP56 - Helper module in using JSON::PP in Perl 5.6
+
+ =head1 DESCRIPTION
+
+ JSON::PP calls internally.
+
+ =head1 AUTHOR
+
+ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
+
+
+ =head1 COPYRIGHT AND LICENSE
+
+ Copyright 2007-2012 by Makamaka Hannyaharamitu
+
+ This library is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+
+JSON_BACKPORTPP_COMPAT5006
+
+$fatpacked{"Module/CPANfile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE';
+ package Module::CPANfile;
+ use strict;
+ use warnings;
+ use Cwd;
+ use Carp ();
+ use Module::CPANfile::Environment;
+ use Module::CPANfile::Requirement;
+
+ our $VERSION = '1.1000';
+
+ sub new {
+ my($class, $file) = @_;
+ bless {}, $class;
+ }
+
+ sub load {
+ my($proto, $file) = @_;
+
+ my $self = ref $proto ? $proto : $proto->new;
+ $self->parse($file || Cwd::abs_path('cpanfile'));
+ $self;
+ }
+
+ sub save {
+ my($self, $path) = @_;
+
+ open my $out, ">", $path or die "$path: $!";
+ print {$out} $self->to_string;
+ }
+
+ sub parse {
+ my($self, $file) = @_;
+
+ my $code = do {
+ open my $fh, "<", $file or die "$file: $!";
+ join '', <$fh>;
+ };
+
+ my $env = Module::CPANfile::Environment->new($file);
+ $env->parse($code) or die $@;
+
+ $self->{_mirrors} = $env->mirrors;
+ $self->{_prereqs} = $env->prereqs;
+ }
+
+ sub from_prereqs {
+ my($proto, $prereqs) = @_;
+
+ my $self = $proto->new;
+ $self->{_prereqs} = Module::CPANfile::Prereqs->from_cpan_meta($prereqs);
+
+ $self;
+ }
+
+ sub mirrors {
+ my $self = shift;
+ $self->{_mirrors} || [];
+ }
+
+ sub features {
+ my $self = shift;
+ map $self->feature($_), $self->{_prereqs}->identifiers;
+ }
+
+ sub feature {
+ my($self, $identifier) = @_;
+ $self->{_prereqs}->feature($identifier);
+ }
+
+ sub prereq { shift->prereqs }
+
+ sub prereqs {
+ my $self = shift;
+ $self->{_prereqs}->as_cpan_meta;
+ }
+
+ sub merged_requirements {
+ my $self = shift;
+ $self->{_prereqs}->merged_requirements;
+ }
+
+ sub effective_prereqs {
+ my($self, $features) = @_;
+ $self->prereqs_with(@{$features || []});
+ }
+
+ sub prereqs_with {
+ my($self, @feature_identifiers) = @_;
+
+ my $prereqs = $self->prereqs;
+ my @others = map { $self->feature($_)->prereqs } @feature_identifiers;
+
+ $prereqs->with_merged_prereqs(\@others);
+ }
+
+ sub prereq_specs {
+ my $self = shift;
+ $self->prereqs->as_string_hash;
+ }
+
+ sub prereq_for_module {
+ my($self, $module) = @_;
+ $self->{_prereqs}->find($module);
+ }
+
+ sub options_for_module {
+ my($self, $module) = @_;
+ my $prereq = $self->prereq_for_module($module) or return;
+ $prereq->requirement->options;
+ }
+
+ sub merge_meta {
+ my($self, $file, $version) = @_;
+
+ require CPAN::Meta;
+
+ $version ||= $file =~ /\.yml$/ ? '1.4' : '2';
+
+ my $prereq = $self->prereqs;
+
+ my $meta = CPAN::Meta->load_file($file);
+ my $prereqs_hash = $prereq->with_merged_prereqs($meta->effective_prereqs)->as_string_hash;
+ my $struct = { %{$meta->as_struct}, prereqs => $prereqs_hash };
+
+ CPAN::Meta->new($struct)->save($file, { version => $version });
+ }
+
+ sub _dump {
+ my $str = shift;
+ require Data::Dumper;
+ chomp(my $value = Data::Dumper->new([$str])->Terse(1)->Dump);
+ $value;
+ }
+
+ sub to_string {
+ my($self, $include_empty) = @_;
+
+ my $mirrors = $self->mirrors;
+ my $prereqs = $self->prereq_specs;
+
+ my $code = '';
+ $code .= $self->_dump_mirrors($mirrors);
+ $code .= $self->_dump_prereqs($prereqs, $include_empty);
+
+ for my $feature ($self->features) {
+ $code .= sprintf "feature %s, %s => sub {\n", _dump($feature->{identifier}), _dump($feature->{description});
+ $code .= $self->_dump_prereqs($feature->{spec}, $include_empty, 4);
+ $code .= "}\n\n";
+ }
+
+ $code =~ s/\n+$/\n/s;
+ $code;
+ }
+
+ sub _dump_mirrors {
+ my($self, $mirrors) = @_;
+
+ my $code = "";
+
+ for my $url (@$mirrors) {
+ $code .= "mirror '$url';\n";
+ }
+
+ $code =~ s/\n+$/\n/s;
+ $code;
+ }
+
+ sub _dump_prereqs {
+ my($self, $prereqs, $include_empty, $base_indent) = @_;
+
+ my $code = '';
+ for my $phase (qw(runtime configure build test develop)) {
+ my $indent = $phase eq 'runtime' ? '' : ' ';
+ $indent = (' ' x ($base_indent || 0)) . $indent;
+
+ my($phase_code, $requirements);
+ $phase_code .= "on $phase => sub {\n" unless $phase eq 'runtime';
+
+ for my $type (qw(requires recommends suggests conflicts)) {
+ for my $mod (sort keys %{$prereqs->{$phase}{$type}}) {
+ my $ver = $prereqs->{$phase}{$type}{$mod};
+ $phase_code .= $ver eq '0'
+ ? "${indent}$type '$mod';\n"
+ : "${indent}$type '$mod', '$ver';\n";
+ $requirements++;
+ }
+ }
+
+ $phase_code .= "\n" unless $requirements;
+ $phase_code .= "};\n" unless $phase eq 'runtime';
+
+ $code .= $phase_code . "\n" if $requirements or $include_empty;
+ }
+
+ $code =~ s/\n+$/\n/s;
+ $code;
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ Module::CPANfile - Parse cpanfile
+
+ =head1 SYNOPSIS
+
+ use Module::CPANfile;
+
+ my $file = Module::CPANfile->load("cpanfile");
+ my $prereqs = $file->prereqs; # CPAN::Meta::Prereqs object
+
+ my @features = $file->features; # CPAN::Meta::Feature objects
+ my $merged_prereqs = $file->prereqs_with(@identifiers); # CPAN::Meta::Prereqs
+
+ $file->merge_meta('MYMETA.json');
+
+ =head1 DESCRIPTION
+
+ Module::CPANfile is a tool to handle L<cpanfile> format to load application
+ specific dependencies, not just for CPAN distributions.
+
+ =head1 METHODS
+
+ =over 4
+
+ =item load
+
+ $file = Module::CPANfile->load;
+ $file = Module::CPANfile->load('cpanfile');
+
+ Load and parse a cpanfile. By default it tries to load C<cpanfile> in
+ the current directory, unless you pass the path to its argument.
+
+ =item from_prereqs
+
+ $file = Module::CPANfile->from_prereqs({
+ runtime => { requires => { DBI => '1.000' } },
+ });
+
+ Creates a new Module::CPANfile object from prereqs hash you can get
+ via L<CPAN::Meta>'s C<prereqs>, or L<CPAN::Meta::Prereqs>'
+ C<as_string_hash>.
+
+ # read MYMETA, then feed the prereqs to create Module::CPANfile
+ my $meta = CPAN::Meta->load_file('MYMETA.json');
+ my $file = Module::CPANfile->from_prereqs($meta->prereqs);
+
+ # load cpanfile, then recreate it with round-trip
+ my $file = Module::CPANfile->load('cpanfile');
+ $file = Module::CPANfile->from_prereqs($file->prereq_specs);
+ # or $file->prereqs->as_string_hash
+
+ =item prereqs
+
+ Returns L<CPAN::Meta::Prereqs> object out of the parsed cpanfile.
+
+ =item prereq_specs
+
+ Returns a hash reference that should be passed to C<< CPAN::Meta::Prereqs->new >>.
+
+ =item features
+
+ Returns a list of features available in the cpanfile as L<CPAN::Meta::Feature>.
+
+ =item prereqs_with(@identifiers), effective_prereqs(\@identifiers)
+
+ Returns L<CPAN::Meta::Prereqs> object, with merged prereqs for
+ features identified with the C<@identifiers>.
+
+ =item to_string($include_empty)
+
+ $file->to_string;
+ $file->to_string(1);
+
+ Returns a canonical string (code) representation for cpanfile. Useful
+ if you want to convert L<CPAN::Meta::Prereqs> to a new cpanfile.
+
+ # read MYMETA's prereqs and print cpanfile representation of it
+ my $meta = CPAN::Meta->load_file('MYMETA.json');
+ my $file = Module::CPANfile->from_prereqs($meta->prereqs);
+ print $file->to_string;
+
+ By default, it omits the phase where there're no modules
+ registered. If you pass the argument of a true value, it will print
+ them as well.
+
+ =item save
+
+ $file->save('cpanfile');
+
+ Saves the currently loaded prereqs as a new C<cpanfile> by calling
+ C<to_string>. Beware B<this method will overwrite the existing
+ cpanfile without any warning or backup>. Taking a backup or giving
+ warnings to users is a caller's responsibility.
+
+ # Read MYMETA.json and creates a new cpanfile
+ my $meta = CPAN::Meta->load_file('MYMETA.json');
+ my $file = Module::CPANfile->from_prereqs($meta->prereqs);
+ $file->save('cpanfile');
+
+ =item merge_meta
+
+ $file->merge_meta('META.yml');
+ $file->merge_meta('MYMETA.json', '2.0');
+
+ Merge the effective prereqs with Meta specification loaded from the
+ given META file, using CPAN::Meta. You can specify the META spec
+ version in the second argument, which defaults to 1.4 in case the
+ given file is YAML, and 2 if it is JSON.
+
+ =back
+
+ =head1 AUTHOR
+
+ Tatsuhiko Miyagawa
+
+ =head1 SEE ALSO
+
+ L<cpanfile>, L<CPAN::Meta>, L<CPAN::Meta::Spec>
+
+ =cut
+MODULE_CPANFILE
+
+$fatpacked{"Module/CPANfile/Environment.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_ENVIRONMENT';
+ package Module::CPANfile::Environment;
+ use strict;
+ use warnings;
+ use Module::CPANfile::Prereqs;
+ use Carp ();
+
+ my @bindings = qw(
+ on requires recommends suggests conflicts
+ feature
+ osname
+ mirror
+ configure_requires build_requires test_requires author_requires
+ );
+
+ my $file_id = 1;
+
+ sub new {
+ my($class, $file) = @_;
+ bless {
+ file => $file,
+ phase => 'runtime', # default phase
+ feature => undef,
+ features => {},
+ prereqs => Module::CPANfile::Prereqs->new,
+ mirrors => [],
+ }, $class;
+ }
+
+ sub bind {
+ my $self = shift;
+ my $pkg = caller;
+
+ for my $binding (@bindings) {
+ no strict 'refs';
+ *{"$pkg\::$binding"} = sub { $self->$binding(@_) };
+ }
+ }
+
+ sub parse {
+ my($self, $code) = @_;
+
+ my $err;
+ {
+ local $@;
+ $file_id++;
+ $self->_evaluate(<<EVAL);
+ package Module::CPANfile::Sandbox$file_id;
+ no warnings;
+ BEGIN { \$_environment->bind }
+
+ # line 1 "$self->{file}"
+ $code;
+ EVAL
+ $err = $@;
+ }
+
+ if ($err) { die "Parsing $self->{file} failed: $err" };
+
+ return 1;
+ }
+
+ sub _evaluate {
+ my $_environment = $_[0];
+ eval $_[1];
+ }
+
+ sub prereqs { $_[0]->{prereqs} }
+
+ sub mirrors { $_[0]->{mirrors} }
+
+ # DSL goes from here
+
+ sub on {
+ my($self, $phase, $code) = @_;
+ local $self->{phase} = $phase;
+ $code->();
+ }
+
+ sub feature {
+ my($self, $identifier, $description, $code) = @_;
+
+ # shortcut: feature identifier => sub { ... }
+ if (@_ == 3 && ref($description) eq 'CODE') {
+ $code = $description;
+ $description = $identifier;
+ }
+
+ unless (ref $description eq '' && ref $code eq 'CODE') {
+ Carp::croak("Usage: feature 'identifier', 'Description' => sub { ... }");
+ }
+
+ local $self->{feature} = $identifier;
+ $self->prereqs->add_feature($identifier, $description);
+
+ $code->();
+ }
+
+ sub osname { die "TODO" }
+
+ sub mirror {
+ my($self, $url) = @_;
+ push @{$self->{mirrors}}, $url;
+ }
+
+ sub requirement_for {
+ my($self, $module, @args) = @_;
+
+ my $requirement = 0;
+ $requirement = shift @args if @args % 2;
+
+ return Module::CPANfile::Requirement->new(
+ name => $module,
+ version => $requirement,
+ @args,
+ );
+ }
+
+ sub requires {
+ my $self = shift;
+ $self->add_prereq(requires => @_);
+ }
+
+ sub recommends {
+ my $self = shift;
+ $self->add_prereq(recommends => @_);
+ }
+
+ sub suggests {
+ my $self = shift;
+ $self->add_prereq(suggests => @_);
+ }
+
+ sub conflicts {
+ my $self = shift;
+ $self->add_prereq(conflicts => @_);
+ }
+
+ sub add_prereq {
+ my($self, $type, $module, @args) = @_;
+
+ $self->prereqs->add_prereq(
+ feature => $self->{feature},
+ phase => $self->{phase},
+ type => $type,
+ module => $module,
+ requirement => $self->requirement_for($module, @args),
+ );
+ }
+
+ # Module::Install compatible shortcuts
+
+ sub configure_requires {
+ my($self, @args) = @_;
+ $self->on(configure => sub { $self->requires(@args) });
+ }
+
+ sub build_requires {
+ my($self, @args) = @_;
+ $self->on(build => sub { $self->requires(@args) });
+ }
+
+ sub test_requires {
+ my($self, @args) = @_;
+ $self->on(test => sub { $self->requires(@args) });
+ }
+
+ sub author_requires {
+ my($self, @args) = @_;
+ $self->on(develop => sub { $self->requires(@args) });
+ }
+
+ 1;
+
+MODULE_CPANFILE_ENVIRONMENT
+
+$fatpacked{"Module/CPANfile/Prereq.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_PREREQ';
+ package Module::CPANfile::Prereq;
+ use strict;
+
+ sub new {
+ my($class, %options) = @_;
+ bless \%options, $class;
+ }
+
+ sub feature { $_[0]->{feature} }
+ sub phase { $_[0]->{phase} }
+ sub type { $_[0]->{type} }
+ sub module { $_[0]->{module} }
+ sub requirement { $_[0]->{requirement} }
+
+ sub match_feature {
+ my($self, $identifier) = @_;
+ no warnings 'uninitialized';
+ $self->feature eq $identifier;
+ }
+
+ 1;
+MODULE_CPANFILE_PREREQ
+
+$fatpacked{"Module/CPANfile/Prereqs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_PREREQS';
+ package Module::CPANfile::Prereqs;
+ use strict;
+ use Carp ();
+ use CPAN::Meta::Feature;
+ use Module::CPANfile::Prereq;
+
+ sub from_cpan_meta {
+ my($class, $prereqs) = @_;
+
+ my $self = $class->new;
+
+ for my $phase (keys %$prereqs) {
+ for my $type (keys %{ $prereqs->{$phase} }) {
+ while (my($module, $requirement) = each %{ $prereqs->{$phase}{$type} }) {
+ $self->add_prereq(
+ phase => $phase,
+ type => $type,
+ module => $module,
+ requirement => Module::CPANfile::Requirement->new(name => $module, version => $requirement),
+ );
+ }
+ }
+ }
+
+ $self;
+ }
+
+ sub new {
+ my $class = shift;
+ bless {
+ prereqs => [],
+ features => {},
+ }, $class;
+ }
+
+ sub add_feature {
+ my($self, $identifier, $description) = @_;
+ $self->{features}{$identifier} = { description => $description };
+ }
+
+ sub add_prereq {
+ my($self, %args) = @_;
+ $self->add( Module::CPANfile::Prereq->new(%args) );
+ }
+
+ sub add {
+ my($self, $prereq) = @_;
+ push @{$self->{prereqs}}, $prereq;
+ }
+
+ sub as_cpan_meta {
+ my $self = shift;
+ $self->{cpanmeta} ||= $self->build_cpan_meta;
+ }
+
+ sub build_cpan_meta {
+ my($self, $identifier) = @_;
+
+ my $prereq_spec = {};
+ $self->prereq_each($identifier, sub {
+ my $prereq = shift;
+ $prereq_spec->{$prereq->phase}{$prereq->type}{$prereq->module} = $prereq->requirement->version;
+ });
+
+ CPAN::Meta::Prereqs->new($prereq_spec);
+ }
+
+ sub prereq_each {
+ my($self, $identifier, $code) = @_;
+
+ for my $prereq (@{$self->{prereqs}}) {
+ next unless $prereq->match_feature($identifier);
+ $code->($prereq);
+ }
+ }
+
+ sub merged_requirements {
+ my $self = shift;
+
+ my $reqs = CPAN::Meta::Requirements->new;
+ for my $prereq (@{$self->{prereqs}}) {
+ $reqs->add_string_requirement($prereq->module, $prereq->requirement->version);
+ }
+
+ $reqs;
+ }
+
+ sub find {
+ my($self, $module) = @_;
+
+ for my $prereq (@{$self->{prereqs}}) {
+ return $prereq if $prereq->module eq $module;
+ }
+
+ return;
+ }
+
+ sub identifiers {
+ my $self = shift;
+ keys %{$self->{features}};
+ }
+
+ sub feature {
+ my($self, $identifier) = @_;
+
+ my $data = $self->{features}{$identifier}
+ or Carp::croak("Unknown feature '$identifier'");
+
+ my $prereqs = $self->build_cpan_meta($identifier);
+
+ CPAN::Meta::Feature->new($identifier, {
+ description => $data->{description},
+ prereqs => $prereqs->as_string_hash,
+ });
+ }
+
+ 1;
+MODULE_CPANFILE_PREREQS
+
+$fatpacked{"Module/CPANfile/Requirement.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_CPANFILE_REQUIREMENT';
+ package Module::CPANfile::Requirement;
+ use strict;
+
+ sub new {
+ my ($class, %args) = @_;
+
+ $args{version} ||= 0;
+
+ bless +{
+ name => delete $args{name},
+ version => delete $args{version},
+ options => \%args,
+ }, $class;
+ }
+
+ sub name { $_[0]->{name} }
+ sub version { $_[0]->{version} }
+
+ sub options { $_[0]->{options} }
+
+ sub has_options {
+ keys %{$_[0]->{options}} > 0;
+ }
+
+ 1;
+MODULE_CPANFILE_REQUIREMENT
+
+$fatpacked{"Module/Metadata.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_METADATA';
+ # -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
+ # vim:ts=8:sw=2:et:sta:sts=2
+ package Module::Metadata; # git description: v1.000026-12-g9b12bf1
+
+ # Adapted from Perl-licensed code originally distributed with
+ # Module-Build by Ken Williams
+
+ # This module provides routines to gather information about
+ # perl modules (assuming this may be expanded in the distant
+ # parrot future to look at other types of modules).
+
+ sub __clean_eval { eval $_[0] }
+ use strict;
+ use warnings;
+
+ our $VERSION = '1.000027';
+
+ use Carp qw/croak/;
+ use File::Spec;
+ BEGIN {
+ # Try really hard to not depend ony any DynaLoaded module, such as IO::File or Fcntl
+ eval {
+ require Fcntl; Fcntl->import('SEEK_SET'); 1;
+ } or *SEEK_SET = sub { 0 }
+ }
+ use version 0.87;
+ BEGIN {
+ if ($INC{'Log/Contextual.pm'}) {
+ require "Log/Contextual/WarnLogger.pm"; # Hide from AutoPrereqs
+ Log::Contextual->import('log_info',
+ '-default_logger' => Log::Contextual::WarnLogger->new({ env_prefix => 'MODULE_METADATA', }),
+ );
+ } else {
+ *log_info = sub (&) { warn $_[0]->() };
+ }
+ }
+ use File::Find qw(find);
+
+ my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal
+
+ my $PKG_FIRST_WORD_REGEXP = qr{ # the FIRST word in a package name
+ [a-zA-Z_] # the first word CANNOT start with a digit
+ (?:
+ [\w']? # can contain letters, digits, _, or ticks
+ \w # But, NO multi-ticks or trailing ticks
+ )*
+ }x;
+
+ my $PKG_ADDL_WORD_REGEXP = qr{ # the 2nd+ word in a package name
+ \w # the 2nd+ word CAN start with digits
+ (?:
+ [\w']? # and can contain letters or ticks
+ \w # But, NO multi-ticks or trailing ticks
+ )*
+ }x;
+
+ my $PKG_NAME_REGEXP = qr{ # match a package name
+ (?: :: )? # a pkg name can start with arisdottle
+ $PKG_FIRST_WORD_REGEXP # a package word
+ (?:
+ (?: :: )+ ### arisdottle (allow one or many times)
+ $PKG_ADDL_WORD_REGEXP ### a package word
+ )* # ^ zero, one or many times
+ (?:
+ :: # allow trailing arisdottle
+ )?
+ }x;
+
+ my $PKG_REGEXP = qr{ # match a package declaration
+ ^[\s\{;]* # intro chars on a line
+ package # the word 'package'
+ \s+ # whitespace
+ ($PKG_NAME_REGEXP) # a package name
+ \s* # optional whitespace
+ ($V_NUM_REGEXP)? # optional version number
+ \s* # optional whitesapce
+ [;\{] # semicolon line terminator or block start (since 5.16)
+ }x;
+
+ my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name
+ ([\$*]) # sigil - $ or *
+ (
+ ( # optional leading package name
+ (?:::|\')? # possibly starting like just :: (a la $::VERSION)
+ (?:\w+(?:::|\'))* # Foo::Bar:: ...
+ )?
+ VERSION
+ )\b
+ }x;
+
+ my $VERS_REGEXP = qr{ # match a VERSION definition
+ (?:
+ \(\s*$VARNAME_REGEXP\s*\) # with parens
+ |
+ $VARNAME_REGEXP # without parens
+ )
+ \s*
+ =[^=~>] # = but not ==, nor =~, nor =>
+ }x;
+
+ sub new_from_file {
+ my $class = shift;
+ my $filename = File::Spec->rel2abs( shift );
+
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init(undef, $filename, @_);
+ }
+
+ sub new_from_handle {
+ my $class = shift;
+ my $handle = shift;
+ my $filename = shift;
+ return undef unless defined($handle) && defined($filename);
+ $filename = File::Spec->rel2abs( $filename );
+
+ return $class->_init(undef, $filename, @_, handle => $handle);
+
+ }
+
+
+ sub new_from_module {
+ my $class = shift;
+ my $module = shift;
+ my %props = @_;
+
+ $props{inc} ||= \@INC;
+ my $filename = $class->find_module_by_name( $module, $props{inc} );
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init($module, $filename, %props);
+ }
+
+ {
+
+ my $compare_versions = sub {
+ my ($v1, $op, $v2) = @_;
+ $v1 = version->new($v1)
+ unless UNIVERSAL::isa($v1,'version');
+
+ my $eval_str = "\$v1 $op \$v2";
+ my $result = eval $eval_str;
+ log_info { "error comparing versions: '$eval_str' $@" } if $@;
+
+ return $result;
+ };
+
+ my $normalize_version = sub {
+ my ($version) = @_;
+ if ( $version =~ /[=<>!,]/ ) { # logic, not just version
+ # take as is without modification
+ }
+ elsif ( ref $version eq 'version' ) { # version objects
+ $version = $version->is_qv ? $version->normal : $version->stringify;
+ }
+ elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
+ # normalize string tuples without "v": "1.2.3" -> "v1.2.3"
+ $version = "v$version";
+ }
+ else {
+ # leave alone
+ }
+ return $version;
+ };
+
+ # separate out some of the conflict resolution logic
+
+ my $resolve_module_versions = sub {
+ my $packages = shift;
+
+ my( $file, $version );
+ my $err = '';
+ foreach my $p ( @$packages ) {
+ if ( defined( $p->{version} ) ) {
+ if ( defined( $version ) ) {
+ if ( $compare_versions->( $version, '!=', $p->{version} ) ) {
+ $err .= " $p->{file} ($p->{version})\n";
+ } else {
+ # same version declared multiple times, ignore
+ }
+ } else {
+ $file = $p->{file};
+ $version = $p->{version};
+ }
+ }
+ $file ||= $p->{file} if defined( $p->{file} );
+ }
+
+ if ( $err ) {
+ $err = " $file ($version)\n" . $err;
+ }
+
+ my %result = (
+ file => $file,
+ version => $version,
+ err => $err
+ );
+
+ return \%result;
+ };
+
+ sub provides {
+ my $class = shift;
+
+ croak "provides() requires key/value pairs \n" if @_ % 2;
+ my %args = @_;
+
+ croak "provides() takes only one of 'dir' or 'files'\n"
+ if $args{dir} && $args{files};
+
+ croak "provides() requires a 'version' argument"
+ unless defined $args{version};
+
+ croak "provides() does not support version '$args{version}' metadata"
+ unless grep { $args{version} eq $_ } qw/1.4 2/;
+
+ $args{prefix} = 'lib' unless defined $args{prefix};
+
+ my $p;
+ if ( $args{dir} ) {
+ $p = $class->package_versions_from_directory($args{dir});
+ }
+ else {
+ croak "provides() requires 'files' to be an array reference\n"
+ unless ref $args{files} eq 'ARRAY';
+ $p = $class->package_versions_from_directory($args{files});
+ }
+
+ # Now, fix up files with prefix
+ if ( length $args{prefix} ) { # check in case disabled with q{}
+ $args{prefix} =~ s{/$}{};
+ for my $v ( values %$p ) {
+ $v->{file} = "$args{prefix}/$v->{file}";
+ }
+ }
+
+ return $p
+ }
+
+ sub package_versions_from_directory {
+ my ( $class, $dir, $files ) = @_;
+
+ my @files;
+
+ if ( $files ) {
+ @files = @$files;
+ } else {
+ find( {
+ wanted => sub {
+ push @files, $_ if -f $_ && /\.pm$/;
+ },
+ no_chdir => 1,
+ }, $dir );
+ }
+
+ # First, we enumerate all packages & versions,
+ # separating into primary & alternative candidates
+ my( %prime, %alt );
+ foreach my $file (@files) {
+ my $mapped_filename = File::Spec::Unix->abs2rel( $file, $dir );
+ my @path = split( /\//, $mapped_filename );
+ (my $prime_package = join( '::', @path )) =~ s/\.pm$//;
+
+ my $pm_info = $class->new_from_file( $file );
+
+ foreach my $package ( $pm_info->packages_inside ) {
+ next if $package eq 'main'; # main can appear numerous times, ignore
+ next if $package eq 'DB'; # special debugging package, ignore
+ next if grep /^_/, split( /::/, $package ); # private package, ignore
+
+ my $version = $pm_info->version( $package );
+
+ $prime_package = $package if lc($prime_package) eq lc($package);
+ if ( $package eq $prime_package ) {
+ if ( exists( $prime{$package} ) ) {
+ croak "Unexpected conflict in '$package'; multiple versions found.\n";
+ } else {
+ $mapped_filename = "$package.pm" if lc("$package.pm") eq lc($mapped_filename);
+ $prime{$package}{file} = $mapped_filename;
+ $prime{$package}{version} = $version if defined( $version );
+ }
+ } else {
+ push( @{$alt{$package}}, {
+ file => $mapped_filename,
+ version => $version,
+ } );
+ }
+ }
+ }
+
+ # Then we iterate over all the packages found above, identifying conflicts
+ # and selecting the "best" candidate for recording the file & version
+ # for each package.
+ foreach my $package ( keys( %alt ) ) {
+ my $result = $resolve_module_versions->( $alt{$package} );
+
+ if ( exists( $prime{$package} ) ) { # primary package selected
+
+ if ( $result->{err} ) {
+ # Use the selected primary package, but there are conflicting
+ # errors among multiple alternative packages that need to be
+ # reported
+ log_info {
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ $result->{err}
+ };
+
+ } elsif ( defined( $result->{version} ) ) {
+ # There is a primary package selected, and exactly one
+ # alternative package
+
+ if ( exists( $prime{$package}{version} ) &&
+ defined( $prime{$package}{version} ) ) {
+ # Unless the version of the primary package agrees with the
+ # version of the alternative package, report a conflict
+ if ( $compare_versions->(
+ $prime{$package}{version}, '!=', $result->{version}
+ )
+ ) {
+
+ log_info {
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ " $result->{file} ($result->{version})\n"
+ };
+ }
+
+ } else {
+ # The prime package selected has no version so, we choose to
+ # use any alternative package that does have a version
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version};
+ }
+
+ } else {
+ # no alt package found with a version, but we have a prime
+ # package so we use it whether it has a version or not
+ }
+
+ } else { # No primary package was selected, use the best alternative
+
+ if ( $result->{err} ) {
+ log_info {
+ "Found conflicting versions for package '$package'\n" .
+ $result->{err}
+ };
+ }
+
+ # Despite possible conflicting versions, we choose to record
+ # something rather than nothing
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version}
+ if defined( $result->{version} );
+ }
+ }
+
+ # Normalize versions. Can't use exists() here because of bug in YAML::Node.
+ # XXX "bug in YAML::Node" comment seems irrelevant -- dagolden, 2009-05-18
+ for (grep defined $_->{version}, values %prime) {
+ $_->{version} = $normalize_version->( $_->{version} );
+ }
+
+ return \%prime;
+ }
+ }
+
+
+ sub _init {
+ my $class = shift;
+ my $module = shift;
+ my $filename = shift;
+ my %props = @_;
+
+ my $handle = delete $props{handle};
+ my( %valid_props, @valid_props );
+ @valid_props = qw( collect_pod inc );
+ @valid_props{@valid_props} = delete( @props{@valid_props} );
+ warn "Unknown properties: @{[keys %props]}\n" if scalar( %props );
+
+ my %data = (
+ module => $module,
+ filename => $filename,
+ version => undef,
+ packages => [],
+ versions => {},
+ pod => {},
+ pod_headings => [],
+ collect_pod => 0,
+
+ %valid_props,
+ );
+
+ my $self = bless(\%data, $class);
+
+ if ( not $handle ) {
+ my $filename = $self->{filename};
+ open $handle, '<', $filename
+ or croak( "Can't open '$filename': $!" );
+
+ $self->_handle_bom($handle, $filename);
+ }
+ $self->_parse_fh($handle);
+
+ unless($self->{module} and length($self->{module})) {
+ my ($v, $d, $f) = File::Spec->splitpath($self->{filename});
+ if($f =~ /\.pm$/) {
+ $f =~ s/\..+$//;
+ my @candidates = grep /$f$/, @{$self->{packages}};
+ $self->{module} = shift(@candidates); # punt
+ }
+ else {
+ if(grep /main/, @{$self->{packages}}) {
+ $self->{module} = 'main';
+ }
+ else {
+ $self->{module} = $self->{packages}[0] || '';
+ }
+ }
+ }
+
+ $self->{version} = $self->{versions}{$self->{module}}
+ if defined( $self->{module} );
+
+ return $self;
+ }
+
+ # class method
+ sub _do_find_module {
+ my $class = shift;
+ my $module = shift || croak 'find_module_by_name() requires a package name';
+ my $dirs = shift || \@INC;
+
+ my $file = File::Spec->catfile(split( /::/, $module));
+ foreach my $dir ( @$dirs ) {
+ my $testfile = File::Spec->catfile($dir, $file);
+ return [ File::Spec->rel2abs( $testfile ), $dir ]
+ if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp
+ $testfile .= '.pm';
+ return [ File::Spec->rel2abs( $testfile ), $dir ]
+ if -e $testfile;
+ }
+ return;
+ }
+
+ # class method
+ sub find_module_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[0];
+ }
+
+ # class method
+ sub find_module_dir_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[1];
+ }
+
+
+ # given a line of perl code, attempt to parse it if it looks like a
+ # $VERSION assignment, returning sigil, full name, & package name
+ sub _parse_version_expression {
+ my $self = shift;
+ my $line = shift;
+
+ my( $sigil, $variable_name, $package);
+ if ( $line =~ /$VERS_REGEXP/o ) {
+ ( $sigil, $variable_name, $package) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 );
+ if ( $package ) {
+ $package = ($package eq '::') ? 'main' : $package;
+ $package =~ s/::$//;
+ }
+ }
+
+ return ( $sigil, $variable_name, $package );
+ }
+
+ # Look for a UTF-8/UTF-16BE/UTF-16LE BOM at the beginning of the stream.
+ # If there's one, then skip it and set the :encoding layer appropriately.
+ sub _handle_bom {
+ my ($self, $fh, $filename) = @_;
+
+ my $pos = tell $fh;
+ return unless defined $pos;
+
+ my $buf = ' ' x 2;
+ my $count = read $fh, $buf, length $buf;
+ return unless defined $count and $count >= 2;
+
+ my $encoding;
+ if ( $buf eq "\x{FE}\x{FF}" ) {
+ $encoding = 'UTF-16BE';
+ } elsif ( $buf eq "\x{FF}\x{FE}" ) {
+ $encoding = 'UTF-16LE';
+ } elsif ( $buf eq "\x{EF}\x{BB}" ) {
+ $buf = ' ';
+ $count = read $fh, $buf, length $buf;
+ if ( defined $count and $count >= 1 and $buf eq "\x{BF}" ) {
+ $encoding = 'UTF-8';
+ }
+ }
+
+ if ( defined $encoding ) {
+ if ( "$]" >= 5.008 ) {
+ binmode( $fh, ":encoding($encoding)" );
+ }
+ } else {
+ seek $fh, $pos, SEEK_SET
+ or croak( sprintf "Can't reset position to the top of '$filename'" );
+ }
+
+ return $encoding;
+ }
+
+ sub _parse_fh {
+ my ($self, $fh) = @_;
+
+ my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 );
+ my( @packages, %vers, %pod, @pod );
+ my $package = 'main';
+ my $pod_sect = '';
+ my $pod_data = '';
+ my $in_end = 0;
+
+ while (defined( my $line = <$fh> )) {
+ my $line_num = $.;
+
+ chomp( $line );
+
+ # From toke.c : any line that begins by "=X", where X is an alphabetic
+ # character, introduces a POD segment.
+ my $is_cut;
+ if ( $line =~ /^=([a-zA-Z].*)/ ) {
+ my $cmd = $1;
+ # Then it goes back to Perl code for "=cutX" where X is a non-alphabetic
+ # character (which includes the newline, but here we chomped it away).
+ $is_cut = $cmd =~ /^cut(?:[^a-zA-Z]|$)/;
+ $in_pod = !$is_cut;
+ }
+
+ if ( $in_pod ) {
+
+ if ( $line =~ /^=head[1-4]\s+(.+)\s*$/ ) {
+ push( @pod, $1 );
+ if ( $self->{collect_pod} && length( $pod_data ) ) {
+ $pod{$pod_sect} = $pod_data;
+ $pod_data = '';
+ }
+ $pod_sect = $1;
+
+ } elsif ( $self->{collect_pod} ) {
+ $pod_data .= "$line\n";
+
+ }
+
+ } elsif ( $is_cut ) {
+
+ if ( $self->{collect_pod} && length( $pod_data ) ) {
+ $pod{$pod_sect} = $pod_data;
+ $pod_data = '';
+ }
+ $pod_sect = '';
+
+ } else {
+
+ # Skip after __END__
+ next if $in_end;
+
+ # Skip comments in code
+ next if $line =~ /^\s*#/;
+
+ # Would be nice if we could also check $in_string or something too
+ if ($line eq '__END__') {
+ $in_end++;
+ next;
+ }
+ last if $line eq '__DATA__';
+
+ # parse $line to see if it's a $VERSION declaration
+ my( $version_sigil, $version_fullname, $version_package ) =
+ index($line, 'VERSION') >= 1
+ ? $self->_parse_version_expression( $line )
+ : ();
+
+ if ( $line =~ /$PKG_REGEXP/o ) {
+ $package = $1;
+ my $version = $2;
+ push( @packages, $package ) unless grep( $package eq $_, @packages );
+ $need_vers = defined $version ? 0 : 1;
+
+ if ( not exists $vers{$package} and defined $version ){
+ # Upgrade to a version object.
+ my $dwim_version = eval { _dwim_version($version) };
+ croak "Version '$version' from $self->{filename} does not appear to be valid:\n$line\n\nThe fatal error was: $@\n"
+ unless defined $dwim_version; # "0" is OK!
+ $vers{$package} = $dwim_version;
+ }
+
+ # VERSION defined with full package spec, i.e. $Module::VERSION
+ } elsif ( $version_fullname && $version_package ) {
+ push( @packages, $version_package ) unless grep( $version_package eq $_, @packages );
+ $need_vers = 0 if $version_package eq $package;
+
+ unless ( defined $vers{$version_package} && length $vers{$version_package} ) {
+ $vers{$version_package} = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
+ }
+
+ # first non-comment line in undeclared package main is VERSION
+ } elsif ( $package eq 'main' && $version_fullname && !exists($vers{main}) ) {
+ $need_vers = 0;
+ my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
+ $vers{$package} = $v;
+ push( @packages, 'main' );
+
+ # first non-comment line in undeclared package defines package main
+ } elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w/ ) {
+ $need_vers = 1;
+ $vers{main} = '';
+ push( @packages, 'main' );
+
+ # only keep if this is the first $VERSION seen
+ } elsif ( $version_fullname && $need_vers ) {
+ $need_vers = 0;
+ my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
+
+ unless ( defined $vers{$package} && length $vers{$package} ) {
+ $vers{$package} = $v;
+ }
+ }
+ }
+ }
+
+ if ( $self->{collect_pod} && length($pod_data) ) {
+ $pod{$pod_sect} = $pod_data;
+ }
+
+ $self->{versions} = \%vers;
+ $self->{packages} = \@packages;
+ $self->{pod} = \%pod;
+ $self->{pod_headings} = \@pod;
+ }
+
+ {
+ my $pn = 0;
+ sub _evaluate_version_line {
+ my $self = shift;
+ my( $sigil, $variable_name, $line ) = @_;
+
+ # We compile into a local sub because 'use version' would cause
+ # compiletime/runtime issues with local()
+ $pn++; # everybody gets their own package
+ my $eval = qq{ my \$dummy = q# Hide from _packages_inside()
+ #; package Module::Metadata::_version::p${pn};
+ use version;
+ sub {
+ local $sigil$variable_name;
+ $line;
+ \$$variable_name
+ };
+ };
+
+ $eval = $1 if $eval =~ m{^(.+)}s;
+
+ local $^W;
+ # Try to get the $VERSION
+ my $vsub = __clean_eval($eval);
+ # some modules say $VERSION <equal sign> $Foo::Bar::VERSION, but Foo::Bar isn't
+ # installed, so we need to hunt in ./lib for it
+ if ( $@ =~ /Can't locate/ && -d 'lib' ) {
+ local @INC = ('lib',@INC);
+ $vsub = __clean_eval($eval);
+ }
+ warn "Error evaling version line '$eval' in $self->{filename}: $@\n"
+ if $@;
+
+ (ref($vsub) eq 'CODE') or
+ croak "failed to build version sub for $self->{filename}";
+
+ my $result = eval { $vsub->() };
+ # FIXME: $eval is not the right thing to print here
+ croak "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n"
+ if $@;
+
+ # Upgrade it into a version object
+ my $version = eval { _dwim_version($result) };
+
+ # FIXME: $eval is not the right thing to print here
+ croak "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n"
+ unless defined $version; # "0" is OK!
+
+ return $version;
+ }
+ }
+
+ # Try to DWIM when things fail the lax version test in obvious ways
+ {
+ my @version_prep = (
+ # Best case, it just works
+ sub { return shift },
+
+ # If we still don't have a version, try stripping any
+ # trailing junk that is prohibited by lax rules
+ sub {
+ my $v = shift;
+ $v =~ s{([0-9])[a-z-].*$}{$1}i; # 1.23-alpha or 1.23b
+ return $v;
+ },
+
+ # Activestate apparently creates custom versions like '1.23_45_01', which
+ # cause version.pm to think it's an invalid alpha. So check for that
+ # and strip them
+ sub {
+ my $v = shift;
+ my $num_dots = () = $v =~ m{(\.)}g;
+ my $num_unders = () = $v =~ m{(_)}g;
+ my $leading_v = substr($v,0,1) eq 'v';
+ if ( ! $leading_v && $num_dots < 2 && $num_unders > 1 ) {
+ $v =~ s{_}{}g;
+ $num_unders = () = $v =~ m{(_)}g;
+ }
+ return $v;
+ },
+
+ # Worst case, try numifying it like we would have before version objects
+ sub {
+ my $v = shift;
+ no warnings 'numeric';
+ return 0 + $v;
+ },
+
+ );
+
+ sub _dwim_version {
+ my ($result) = shift;
+
+ return $result if ref($result) eq 'version';
+
+ my ($version, $error);
+ for my $f (@version_prep) {
+ $result = $f->($result);
+ $version = eval { version->new($result) };
+ $error ||= $@ if $@; # capture first failure
+ last if defined $version;
+ }
+
+ croak $error unless defined $version;
+
+ return $version;
+ }
+ }
+
+ ############################################################
+
+ # accessors
+ sub name { $_[0]->{module} }
+
+ sub filename { $_[0]->{filename} }
+ sub packages_inside { @{$_[0]->{packages}} }
+ sub pod_inside { @{$_[0]->{pod_headings}} }
+ sub contains_pod { 0+@{$_[0]->{pod_headings}} }
+
+ sub version {
+ my $self = shift;
+ my $mod = shift || $self->{module};
+ my $vers;
+ if ( defined( $mod ) && length( $mod ) &&
+ exists( $self->{versions}{$mod} ) ) {
+ return $self->{versions}{$mod};
+ } else {
+ return undef;
+ }
+ }
+
+ sub pod {
+ my $self = shift;
+ my $sect = shift;
+ if ( defined( $sect ) && length( $sect ) &&
+ exists( $self->{pod}{$sect} ) ) {
+ return $self->{pod}{$sect};
+ } else {
+ return undef;
+ }
+ }
+
+ sub is_indexable {
+ my ($self, $package) = @_;
+
+ my @indexable_packages = grep { $_ ne 'main' } $self->packages_inside;
+
+ # check for specific package, if provided
+ return !! grep { $_ eq $package } @indexable_packages if $package;
+
+ # otherwise, check for any indexable packages at all
+ return !! @indexable_packages;
+ }
+
+ 1;
+
+ =head1 NAME
+
+ Module::Metadata - Gather package and POD information from perl module files
+
+ =head1 SYNOPSIS
+
+ use Module::Metadata;
+
+ # information about a .pm file
+ my $info = Module::Metadata->new_from_file( $file );
+ my $version = $info->version;
+
+ # CPAN META 'provides' field for .pm files in a directory
+ my $provides = Module::Metadata->provides(
+ dir => 'lib', version => 2
+ );
+
+ =head1 DESCRIPTION
+
+ This module provides a standard way to gather metadata about a .pm file through
+ (mostly) static analysis and (some) code execution. When determining the
+ version of a module, the C<$VERSION> assignment is C<eval>ed, as is traditional
+ in the CPAN toolchain.
+
+ =head1 CLASS METHODS
+
+ =head2 C<< new_from_file($filename, collect_pod => 1) >>
+
+ Constructs a C<Module::Metadata> object given the path to a file. Returns
+ undef if the filename does not exist.
+
+ C<collect_pod> is a optional boolean argument that determines whether POD
+ data is collected and stored for reference. POD data is not collected by
+ default. POD headings are always collected.
+
+ If the file begins by an UTF-8, UTF-16BE or UTF-16LE byte-order mark, then
+ it is skipped before processing, and the content of the file is also decoded
+ appropriately starting from perl 5.8.
+
+ =head2 C<< new_from_handle($handle, $filename, collect_pod => 1) >>
+
+ This works just like C<new_from_file>, except that a handle can be provided
+ as the first argument.
+
+ Note that there is no validation to confirm that the handle is a handle or
+ something that can act like one. Passing something that isn't a handle will
+ cause a exception when trying to read from it. The C<filename> argument is
+ mandatory or undef will be returned.
+
+ You are responsible for setting the decoding layers on C<$handle> if
+ required.
+
+ =head2 C<< new_from_module($module, collect_pod => 1, inc => \@dirs) >>
+
+ Constructs a C<Module::Metadata> object given a module or package name.
+ Returns undef if the module cannot be found.
+
+ In addition to accepting the C<collect_pod> argument as described above,
+ this method accepts a C<inc> argument which is a reference to an array of
+ directories to search for the module. If none are given, the default is
+ @INC.
+
+ If the file that contains the module begins by an UTF-8, UTF-16BE or
+ UTF-16LE byte-order mark, then it is skipped before processing, and the
+ content of the file is also decoded appropriately starting from perl 5.8.
+
+ =head2 C<< find_module_by_name($module, \@dirs) >>
+
+ Returns the path to a module given the module or package name. A list
+ of directories can be passed in as an optional parameter, otherwise
+ @INC is searched.
+
+ Can be called as either an object or a class method.
+
+ =head2 C<< find_module_dir_by_name($module, \@dirs) >>
+
+ Returns the entry in C<@dirs> (or C<@INC> by default) that contains
+ the module C<$module>. A list of directories can be passed in as an
+ optional parameter, otherwise @INC is searched.
+
+ Can be called as either an object or a class method.
+
+ =head2 C<< provides( %options ) >>
+
+ This is a convenience wrapper around C<package_versions_from_directory>
+ to generate a CPAN META C<provides> data structure. It takes key/value
+ pairs. Valid option keys include:
+
+ =over
+
+ =item version B<(required)>
+
+ Specifies which version of the L<CPAN::Meta::Spec> should be used as
+ the format of the C<provides> output. Currently only '1.4' and '2'
+ are supported (and their format is identical). This may change in
+ the future as the definition of C<provides> changes.
+
+ The C<version> option is required. If it is omitted or if
+ an unsupported version is given, then C<provides> will throw an error.
+
+ =item dir
+
+ Directory to search recursively for F<.pm> files. May not be specified with
+ C<files>.
+
+ =item files
+
+ Array reference of files to examine. May not be specified with C<dir>.
+
+ =item prefix
+
+ String to prepend to the C<file> field of the resulting output. This defaults
+ to F<lib>, which is the common case for most CPAN distributions with their
+ F<.pm> files in F<lib>. This option ensures the META information has the
+ correct relative path even when the C<dir> or C<files> arguments are
+ absolute or have relative paths from a location other than the distribution
+ root.
+
+ =back
+
+ For example, given C<dir> of 'lib' and C<prefix> of 'lib', the return value
+ is a hashref of the form:
+
+ {
+ 'Package::Name' => {
+ version => '0.123',
+ file => 'lib/Package/Name.pm'
+ },
+ 'OtherPackage::Name' => ...
+ }
+
+ =head2 C<< package_versions_from_directory($dir, \@files?) >>
+
+ Scans C<$dir> for .pm files (unless C<@files> is given, in which case looks
+ for those files in C<$dir> - and reads each file for packages and versions,
+ returning a hashref of the form:
+
+ {
+ 'Package::Name' => {
+ version => '0.123',
+ file => 'Package/Name.pm'
+ },
+ 'OtherPackage::Name' => ...
+ }
+
+ The C<DB> and C<main> packages are always omitted, as are any "private"
+ packages that have leading underscores in the namespace (e.g.
+ C<Foo::_private>)
+
+ Note that the file path is relative to C<$dir> if that is specified.
+ This B<must not> be used directly for CPAN META C<provides>. See
+ the C<provides> method instead.
+
+ =head2 C<< log_info (internal) >>
+
+ Used internally to perform logging; imported from Log::Contextual if
+ Log::Contextual has already been loaded, otherwise simply calls warn.
+
+ =head1 OBJECT METHODS
+
+ =head2 C<< name() >>
+
+ Returns the name of the package represented by this module. If there
+ is more than one package, it makes a best guess based on the
+ filename. If it's a script (i.e. not a *.pm) the package name is
+ 'main'.
+
+ =head2 C<< version($package) >>
+
+ Returns the version as defined by the $VERSION variable for the
+ package as returned by the C<name> method if no arguments are
+ given. If given the name of a package it will attempt to return the
+ version of that package if it is specified in the file.
+
+ =head2 C<< filename() >>
+
+ Returns the absolute path to the file.
+ Note that this file may not actually exist on disk yet, e.g. if the module was read from an in-memory filehandle.
+
+ =head2 C<< packages_inside() >>
+
+ Returns a list of packages. Note: this is a raw list of packages
+ discovered (or assumed, in the case of C<main>). It is not
+ filtered for C<DB>, C<main> or private packages the way the
+ C<provides> method does. Invalid package names are not returned,
+ for example "Foo:Bar". Strange but valid package names are
+ returned, for example "Foo::Bar::", and are left up to the caller
+ on how to handle.
+
+ =head2 C<< pod_inside() >>
+
+ Returns a list of POD sections.
+
+ =head2 C<< contains_pod() >>
+
+ Returns true if there is any POD in the file.
+
+ =head2 C<< pod($section) >>
+
+ Returns the POD data in the given section.
+
+ =head2 C<< is_indexable($package) >> or C<< is_indexable() >>
+
+ Returns a boolean indicating whether the package (if provided) or any package
+ (otherwise) is eligible for indexing by PAUSE, the Perl Authors Upload Server.
+ Note This only checks for valid C<package> declarations, and does not take any
+ ownership information into account.
+
+ =head1 AUTHOR
+
+ Original code from Module::Build::ModuleInfo by Ken Williams
+ <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org>
+
+ Released as Module::Metadata by Matt S Trout (mst) <mst@shadowcat.co.uk> with
+ assistance from David Golden (xdg) <dagolden@cpan.org>.
+
+ =head1 COPYRIGHT & LICENSE
+
+ Original code Copyright (c) 2001-2011 Ken Williams.
+ Additional code Copyright (c) 2010-2011 Matt Trout and David Golden.
+ All rights reserved.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+ =cut
+MODULE_METADATA
+
+$fatpacked{"Module/Reader.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_READER';
+ package Module::Reader;
+ BEGIN { require 5.006 }
+ use strict;
+ use warnings;
+
+ our $VERSION = '0.002003';
+ $VERSION = eval $VERSION;
+
+ use base 'Exporter';
+ our @EXPORT_OK = qw(module_content module_handle);
+ our %EXPORT_TAGS = (all => [@EXPORT_OK]);
+
+ use File::Spec;
+ use Scalar::Util qw(blessed reftype openhandle);
+ use Carp;
+ use constant _OPEN_STRING => $] >= 5.008;
+ BEGIN {
+ require IO::String
+ if !_OPEN_STRING;
+ }
+
+ sub module_content {
+ my $module = _get_module(@_);
+ if (ref $module) {
+ local $/;
+ return scalar <$module>;
+ }
+ else {
+ return $module;
+ }
+ }
+
+ sub module_handle {
+ my $module = _get_module(@_);
+ if (ref $module) {
+ return $module;
+ }
+ elsif (_OPEN_STRING) {
+ open my $fh, '<', \$module;
+ return $fh;
+ }
+ else {
+ return IO::String->new($module);
+ }
+ }
+
+ sub _get_module {
+ my ($package, @inc) = @_;
+ (my $module = "$package.pm") =~ s{::}{/}g;
+ my $opts = ref $_[-1] && ref $_[-1] eq 'HASH' && pop @inc || {};
+ if (!@inc) {
+ @inc = @INC;
+ }
+ if (my $found = $opts->{found}) {
+ if (my $full_module = $found->{$module}) {
+ if (ref $full_module) {
+ @inc = $full_module;
+ }
+ elsif (-f $full_module) {
+ open my $fh, '<', $full_module
+ or die "Couldn't open ${full_module} for ${module}: $!";
+ return $fh;
+ }
+ }
+ }
+ for my $inc (@inc) {
+ if (!ref $inc) {
+ my $full_module = File::Spec->catfile($inc, $module);
+ next unless -f $full_module;
+ open my $fh, '<', $full_module
+ or die "Couldn't open ${full_module} for ${module}: $!";
+ return $fh;
+ }
+
+ my @cb = ref $inc eq 'ARRAY' ? $inc->[0]->($inc, $module)
+ : blessed $inc ? $inc->INC($module)
+ : $inc->($inc, $module);
+
+ next
+ unless ref $cb[0];
+ my $fh;
+ if (reftype $cb[0] eq 'GLOB' && openhandle $cb[0]) {
+ $fh = shift @cb;
+ }
+
+ if (ref $cb[0] eq 'CODE') {
+ my $cb = shift @cb;
+ # require docs are wrong, perl sends 0 as the first param
+ my @params = (0, @cb ? $cb[0] : ());
+
+ my $module = '';
+ while (1) {
+ local $_ = $fh ? <$fh> : '';
+ $_ = ''
+ if !defined;
+ last if !$cb->(@params);
+ $module .= $_;
+ }
+ return $module;
+ }
+ elsif ($fh) {
+ return $fh;
+ }
+ }
+ croak "Can't find module $module";
+ }
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ Module::Reader - Read the source of a module like perl does
+
+ =head1 SYNOPSIS
+
+ use Module::Reader qw(:all);
+ my $io = module_handle('My::Module');
+ my $content = module_content('My::Module');
+
+ my $io = module_handle('My::Module', @search_dirs);
+
+ my $io = module_handle('My::Module', @search_dirs, { found => \%INC });
+
+ =head1 DESCRIPTION
+
+ Reads the content of perl modules the same way perl does. This
+ includes reading modules available only by L<@INC hooks|perlfunc/require>, or filtered
+ through them.
+
+ =head1 EXPORTS
+
+ =head2 module_handle( $module_name, @search_dirs, \%options )
+
+ Returns an IO handle to the given module. Searches the directories
+ specified, or L<@INC|perlvar/@INC> if none are.
+
+ =head3 Options
+
+ =over 4
+
+ =item found
+
+ A reference to a hash like L<%INC|perlvar/%INC> with module file names (in the
+ style 'F<My/Module.pm>') as keys and full file paths as values.
+ Modules listed in this will be used in preference to searching
+ through directories.
+
+ =back
+
+ =head2 module_content( $module_name, @search_dirs, \%options )
+
+ Returns the content of the given module. Accepts the same options as C<module_handle>.
+
+ =head1 AUTHOR
+
+ haarg - Graham Knop (cpan:HAARG) <haarg@haarg.org>
+
+ =head2 CONTRIBUTORS
+
+ None yet.
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2013 the Module::Reader L</AUTHOR> and L</CONTRIBUTORS>
+ as listed above.
+
+ =head1 LICENSE
+
+ This library is free software and may be distributed under the same terms
+ as perl itself.
+
+ =cut
+MODULE_READER
+
+$fatpacked{"Parse/CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_CPAN_META';
+ use 5.008001;
+ use strict;
+ package Parse::CPAN::Meta;
+ # ABSTRACT: Parse META.yml and META.json CPAN metadata files
+ our $VERSION = '1.4414'; # VERSION
+
+ use Exporter;
+ use Carp 'croak';
+
+ our @ISA = qw/Exporter/;
+ our @EXPORT_OK = qw/Load LoadFile/;
+
+ sub load_file {
+ my ($class, $filename) = @_;
+
+ my $meta = _slurp($filename);
+
+ if ($filename =~ /\.ya?ml$/) {
+ return $class->load_yaml_string($meta);
+ }
+ elsif ($filename =~ /\.json$/) {
+ return $class->load_json_string($meta);
+ }
+ else {
+ $class->load_string($meta); # try to detect yaml/json
+ }
+ }
+
+ sub load_string {
+ my ($class, $string) = @_;
+ if ( $string =~ /^---/ ) { # looks like YAML
+ return $class->load_yaml_string($string);
+ }
+ elsif ( $string =~ /^\s*\{/ ) { # looks like JSON
+ return $class->load_json_string($string);
+ }
+ else { # maybe doc-marker-free YAML
+ return $class->load_yaml_string($string);
+ }
+ }
+
+ sub load_yaml_string {
+ my ($class, $string) = @_;
+ my $backend = $class->yaml_backend();
+ my $data = eval { no strict 'refs'; &{"$backend\::Load"}($string) };
+ croak $@ if $@;
+ return $data || {}; # in case document was valid but empty
+ }
+
+ sub load_json_string {
+ my ($class, $string) = @_;
+ my $data = eval { $class->json_backend()->new->decode($string) };
+ croak $@ if $@;
+ return $data || {};
+ }
+
+ sub yaml_backend {
+ if (! defined $ENV{PERL_YAML_BACKEND} ) {
+ _can_load( 'CPAN::Meta::YAML', 0.011 )
+ or croak "CPAN::Meta::YAML 0.011 is not available\n";
+ return "CPAN::Meta::YAML";
+ }
+ else {
+ my $backend = $ENV{PERL_YAML_BACKEND};
+ _can_load( $backend )
+ or croak "Could not load PERL_YAML_BACKEND '$backend'\n";
+ $backend->can("Load")
+ or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n";
+ return $backend;
+ }
+ }
+
+ sub json_backend {
+ if (! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') {
+ _can_load( 'JSON::PP' => 2.27103 )
+ or croak "JSON::PP 2.27103 is not available\n";
+ return 'JSON::PP';
+ }
+ else {
+ _can_load( 'JSON' => 2.5 )
+ or croak "JSON 2.5 is required for " .
+ "\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n";
+ return "JSON";
+ }
+ }
+
+ sub _slurp {
+ require Encode;
+ open my $fh, "<:raw", "$_[0]" ## no critic
+ or die "can't open $_[0] for reading: $!";
+ my $content = do { local $/; <$fh> };
+ $content = Encode::decode('UTF-8', $content, Encode::PERLQQ());
+ return $content;
+ }
+
+ sub _can_load {
+ my ($module, $version) = @_;
+ (my $file = $module) =~ s{::}{/}g;
+ $file .= ".pm";
+ return 1 if $INC{$file};
+ return 0 if exists $INC{$file}; # prior load failed
+ eval { require $file; 1 }
+ or return 0;
+ if ( defined $version ) {
+ eval { $module->VERSION($version); 1 }
+ or return 0;
+ }
+ return 1;
+ }
+
+ # Kept for backwards compatibility only
+ # Create an object from a file
+ sub LoadFile ($) {
+ return Load(_slurp(shift));
+ }
+
+ # Parse a document from a string.
+ sub Load ($) {
+ require CPAN::Meta::YAML;
+ my $object = eval { CPAN::Meta::YAML::Load(shift) };
+ croak $@ if $@;
+ return $object;
+ }
+
+ 1;
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ Parse::CPAN::Meta - Parse META.yml and META.json CPAN metadata files
+
+ =head1 VERSION
+
+ version 1.4414
+
+ =head1 SYNOPSIS
+
+ #############################################
+ # In your file
+
+ ---
+ name: My-Distribution
+ version: 1.23
+ resources:
+ homepage: "http://example.com/dist/My-Distribution"
+
+
+ #############################################
+ # In your program
+
+ use Parse::CPAN::Meta;
+
+ my $distmeta = Parse::CPAN::Meta->load_file('META.yml');
+
+ # Reading properties
+ my $name = $distmeta->{name};
+ my $version = $distmeta->{version};
+ my $homepage = $distmeta->{resources}{homepage};
+
+ =head1 DESCRIPTION
+
+ B<Parse::CPAN::Meta> is a parser for F<META.json> and F<META.yml> files, using
+ L<JSON::PP> and/or L<CPAN::Meta::YAML>.
+
+ B<Parse::CPAN::Meta> provides three methods: C<load_file>, C<load_json_string>,
+ and C<load_yaml_string>. These will read and deserialize CPAN metafiles, and
+ are described below in detail.
+
+ B<Parse::CPAN::Meta> provides a legacy API of only two functions,
+ based on the YAML functions of the same name. Wherever possible,
+ identical calling semantics are used. These may only be used with YAML sources.
+
+ All error reporting is done with exceptions (die'ing).
+
+ Note that META files are expected to be in UTF-8 encoding, only. When
+ converted string data, it must first be decoded from UTF-8.
+
+ =begin Pod::Coverage
+
+
+
+
+ =end Pod::Coverage
+
+ =head1 METHODS
+
+ =head2 load_file
+
+ my $metadata_structure = Parse::CPAN::Meta->load_file('META.json');
+
+ my $metadata_structure = Parse::CPAN::Meta->load_file('META.yml');
+
+ This method will read the named file and deserialize it to a data structure,
+ determining whether it should be JSON or YAML based on the filename.
+ The file will be read using the ":utf8" IO layer.
+
+ =head2 load_yaml_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_yaml_string($yaml_string);
+
+ This method deserializes the given string of YAML and returns the first
+ document in it. (CPAN metadata files should always have only one document.)
+ If the source was UTF-8 encoded, the string must be decoded before calling
+ C<load_yaml_string>.
+
+ =head2 load_json_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_json_string($json_string);
+
+ This method deserializes the given string of JSON and the result.
+ If the source was UTF-8 encoded, the string must be decoded before calling
+ C<load_json_string>.
+
+ =head2 load_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_string($some_string);
+
+ If you don't know whether a string contains YAML or JSON data, this method
+ will use some heuristics and guess. If it can't tell, it assumes YAML.
+
+ =head2 yaml_backend
+
+ my $backend = Parse::CPAN::Meta->yaml_backend;
+
+ Returns the module name of the YAML serializer. See L</ENVIRONMENT>
+ for details.
+
+ =head2 json_backend
+
+ my $backend = Parse::CPAN::Meta->json_backend;
+
+ Returns the module name of the JSON serializer. This will either
+ be L<JSON::PP> or L<JSON>. Even if C<PERL_JSON_BACKEND> is set,
+ this will return L<JSON> as further delegation is handled by
+ the L<JSON> module. See L</ENVIRONMENT> for details.
+
+ =head1 FUNCTIONS
+
+ For maintenance clarity, no functions are exported by default. These functions
+ are available for backwards compatibility only and are best avoided in favor of
+ C<load_file>.
+
+ =head2 Load
+
+ my @yaml = Parse::CPAN::Meta::Load( $string );
+
+ Parses a string containing a valid YAML stream into a list of Perl data
+ structures.
+
+ =head2 LoadFile
+
+ my @yaml = Parse::CPAN::Meta::LoadFile( 'META.yml' );
+
+ Reads the YAML stream from a file instead of a string.
+
+ =head1 ENVIRONMENT
+
+ =head2 PERL_JSON_BACKEND
+
+ By default, L<JSON::PP> will be used for deserializing JSON data. If the
+ C<PERL_JSON_BACKEND> environment variable exists, is true and is not
+ "JSON::PP", then the L<JSON> module (version 2.5 or greater) will be loaded and
+ used to interpret C<PERL_JSON_BACKEND>. If L<JSON> is not installed or is too
+ old, an exception will be thrown.
+
+ =head2 PERL_YAML_BACKEND
+
+ By default, L<CPAN::Meta::YAML> will be used for deserializing YAML data. If
+ the C<PERL_YAML_BACKEND> environment variable is defined, then it is interpreted
+ as a module to use for deserialization. The given module must be installed,
+ must load correctly and must implement the C<Load()> function or an exception
+ will be thrown.
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<http://rt.cpan.org/Public/Dist/Display.html?Name=Parse-CPAN-Meta>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/Perl-Toolchain-Gang/Parse-CPAN-Meta>
+
+ git clone https://github.com/Perl-Toolchain-Gang/Parse-CPAN-Meta.git
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ Adam Kennedy <adamk@cpan.org>
+
+ =item *
+
+ David Golden <dagolden@cpan.org>
+
+ =back
+
+ =head1 CONTRIBUTORS
+
+ =over 4
+
+ =item *
+
+ Graham Knop <haarg@haarg.org>
+
+ =item *
+
+ Joshua ben Jore <jjore@cpan.org>
+
+ =item *
+
+ Neil Bowers <neil@bowers.com>
+
+ =item *
+
+ Ricardo Signes <rjbs@cpan.org>
+
+ =item *
+
+ Steffen Mueller <smueller@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2014 by Adam Kennedy and Contributors.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
+ =cut
+PARSE_CPAN_META
+
+$fatpacked{"Path/Tiny.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PATH_TINY';
+ use 5.008001;
+ use strict;
+ use warnings;
+
+ package Path::Tiny;
+ # ABSTRACT: File path utility
+
+ our $VERSION = '0.072'; # from Path-Tiny-0.072.tar.gz
+
+ # Dependencies
+ use Config;
+ use Exporter 5.57 (qw/import/);
+ use File::Spec 3.40 ();
+ use Carp ();
+
+ our @EXPORT = qw/path/;
+ our @EXPORT_OK = qw/cwd rootdir tempfile tempdir/;
+
+ use constant {
+ PATH => 0,
+ CANON => 1,
+ VOL => 2,
+ DIR => 3,
+ FILE => 4,
+ TEMP => 5,
+ IS_BSD => ( scalar $^O =~ /bsd$/ ),
+ IS_WIN32 => ( $^O eq 'MSWin32' ),
+ };
+
+ use overload (
+ q{""} => sub { $_[0]->[PATH] },
+ bool => sub () { 1 },
+ fallback => 1,
+ );
+
+ # FREEZE/THAW per Sereal/CBOR/Types::Serialiser protocol
+ sub FREEZE { return $_[0]->[PATH] }
+ sub THAW { return path( $_[2] ) }
+ { no warnings 'once'; *TO_JSON = *FREEZE };
+
+ my $HAS_UU; # has Unicode::UTF8; lazily populated
+
+ sub _check_UU {
+ !!eval { require Unicode::UTF8; Unicode::UTF8->VERSION(0.58); 1 };
+ }
+
+ my $HAS_FLOCK = $Config{d_flock} || $Config{d_fcntl_can_lock} || $Config{d_lockf};
+
+ # notions of "root" directories differ on Win32: \\server\dir\ or C:\ or \
+ my $SLASH = qr{[\\/]};
+ my $NOTSLASH = qr{[^\\/]};
+ my $DRV_VOL = qr{[a-z]:}i;
+ my $UNC_VOL = qr{$SLASH $SLASH $NOTSLASH+ $SLASH $NOTSLASH+}x;
+ my $WIN32_ROOT = qr{(?: $UNC_VOL $SLASH | $DRV_VOL $SLASH | $SLASH )}x;
+
+ sub _win32_vol {
+ my ( $path, $drv ) = @_;
+ require Cwd;
+ my $dcwd = eval { Cwd::getdcwd($drv) }; # C: -> C:\some\cwd
+ # getdcwd on non-existent drive returns empty string
+ # so just use the original drive Z: -> Z:
+ $dcwd = "$drv" unless defined $dcwd && length $dcwd;
+ # normalize dwcd to end with a slash: might be C:\some\cwd or D:\ or Z:
+ $dcwd =~ s{$SLASH?$}{/};
+ # make the path absolute with dcwd
+ $path =~ s{^$DRV_VOL}{$dcwd};
+ return $path;
+ }
+
+ # This is a string test for before we have the object; see is_rootdir for well-formed
+ # object test
+ sub _is_root {
+ return IS_WIN32() ? ( $_[0] =~ /^$WIN32_ROOT$/ ) : ( $_[0] eq '/' );
+ }
+
+ # mode bits encoded for chmod in symbolic mode
+ my %MODEBITS = ( om => 0007, gm => 0070, um => 0700 ); ## no critic
+ { my $m = 0; $MODEBITS{$_} = ( 1 << $m++ ) for qw/ox ow or gx gw gr ux uw ur/ };
+
+ sub _symbolic_chmod {
+ my ( $mode, $symbolic ) = @_;
+ for my $clause ( split /,\s*/, $symbolic ) {
+ if ( $clause =~ m{\A([augo]+)([=+-])([rwx]+)\z} ) {
+ my ( $who, $action, $perms ) = ( $1, $2, $3 );
+ $who =~ s/a/ugo/g;
+ for my $w ( split //, $who ) {
+ my $p = 0;
+ $p |= $MODEBITS{"$w$_"} for split //, $perms;
+ if ( $action eq '=' ) {
+ $mode = ( $mode & ~$MODEBITS{"${w}m"} ) | $p;
+ }
+ else {
+ $mode = $action eq "+" ? ( $mode | $p ) : ( $mode & ~$p );
+ }
+ }
+ }
+ else {
+ Carp::croak("Invalid mode clause '$clause' for chmod()");
+ }
+ }
+ return $mode;
+ }
+
+ # flock doesn't work on NFS on BSD. Since program authors often can't control
+ # or detect that, we warn once instead of being fatal if we can detect it and
+ # people who need it strict can fatalize the 'flock' category
+
+ #<<< No perltidy
+ { package flock; use if Path::Tiny::IS_BSD(), 'warnings::register' }
+ #>>>
+
+ my $WARNED_BSD_NFS = 0;
+
+ sub _throw {
+ my ( $self, $function, $file ) = @_;
+ if ( IS_BSD()
+ && $function =~ /^flock/
+ && $! =~ /operation not supported/i
+ && !warnings::fatal_enabled('flock') )
+ {
+ if ( !$WARNED_BSD_NFS ) {
+ warnings::warn( flock => "No flock for NFS on BSD: continuing in unsafe mode" );
+ $WARNED_BSD_NFS++;
+ }
+ }
+ else {
+ Path::Tiny::Error->throw( $function, ( defined $file ? $file : $self->[PATH] ), $! );
+ }
+ return;
+ }
+
+ # cheapo option validation
+ sub _get_args {
+ my ( $raw, @valid ) = @_;
+ if ( defined($raw) && ref($raw) ne 'HASH' ) {
+ my ( undef, undef, undef, $called_as ) = caller(1);
+ $called_as =~ s{^.*::}{};
+ Carp::croak("Options for $called_as must be a hash reference");
+ }
+ my $cooked = {};
+ for my $k (@valid) {
+ $cooked->{$k} = delete $raw->{$k} if exists $raw->{$k};
+ }
+ if ( keys %$raw ) {
+ my ( undef, undef, undef, $called_as ) = caller(1);
+ $called_as =~ s{^.*::}{};
+ Carp::croak( "Invalid option(s) for $called_as: " . join( ", ", keys %$raw ) );
+ }
+ return $cooked;
+ }
+
+ #--------------------------------------------------------------------------#
+ # Constructors
+ #--------------------------------------------------------------------------#
+
+ #pod =construct path
+ #pod
+ #pod $path = path("foo/bar");
+ #pod $path = path("/tmp", "file.txt"); # list
+ #pod $path = path("."); # cwd
+ #pod $path = path("~user/file.txt"); # tilde processing
+ #pod
+ #pod Constructs a C<Path::Tiny> object. It doesn't matter if you give a file or
+ #pod directory path. It's still up to you to call directory-like methods only on
+ #pod directories and file-like methods only on files. This function is exported
+ #pod automatically by default.
+ #pod
+ #pod The first argument must be defined and have non-zero length or an exception
+ #pod will be thrown. This prevents subtle, dangerous errors with code like
+ #pod C<< path( maybe_undef() )->remove_tree >>.
+ #pod
+ #pod If the first component of the path is a tilde ('~') then the component will be
+ #pod replaced with the output of C<glob('~')>. If the first component of the path
+ #pod is a tilde followed by a user name then the component will be replaced with
+ #pod output of C<glob('~username')>. Behaviour for non-existent users depends on
+ #pod the output of C<glob> on the system.
+ #pod
+ #pod On Windows, if the path consists of a drive identifier without a path component
+ #pod (C<C:> or C<D:>), it will be expanded to the absolute path of the current
+ #pod directory on that volume using C<Cwd::getdcwd()>.
+ #pod
+ #pod If called with a single C<Path::Tiny> argument, the original is returned unless
+ #pod the original is holding a temporary file or directory reference in which case a
+ #pod stringified copy is made.
+ #pod
+ #pod $path = path("foo/bar");
+ #pod $temp = Path::Tiny->tempfile;
+ #pod
+ #pod $p2 = path($path); # like $p2 = $path
+ #pod $t2 = path($temp); # like $t2 = path( "$temp" )
+ #pod
+ #pod This optimizes copies without proliferating references unexpectedly if a copy is
+ #pod made by code outside your control.
+ #pod
+ #pod Current API available since 0.017.
+ #pod
+ #pod =cut
+
+ sub path {
+ my $path = shift;
+ Carp::croak("Path::Tiny paths require defined, positive-length parts")
+ unless 1 + @_ == grep { defined && length } $path, @_;
+
+ # non-temp Path::Tiny objects are effectively immutable and can be reused
+ if ( !@_ && ref($path) eq __PACKAGE__ && !$path->[TEMP] ) {
+ return $path;
+ }
+
+ # stringify objects
+ $path = "$path";
+
+ # expand relative volume paths on windows; put trailing slash on UNC root
+ if ( IS_WIN32() ) {
+ $path = _win32_vol( $path, $1 ) if $path =~ m{^($DRV_VOL)(?:$NOTSLASH|$)};
+ $path .= "/" if $path =~ m{^$UNC_VOL$};
+ }
+
+ # concatenations stringifies objects, too
+ if (@_) {
+ $path .= ( _is_root($path) ? "" : "/" ) . join( "/", @_ );
+ }
+
+ # canonicalize, but with unix slashes and put back trailing volume slash
+ my $cpath = $path = File::Spec->canonpath($path);
+ $path =~ tr[\\][/] if IS_WIN32();
+ $path .= "/" if IS_WIN32() && $path =~ m{^$UNC_VOL$};
+
+ # root paths must always have a trailing slash, but other paths must not
+ if ( _is_root($path) ) {
+ $path =~ s{/?$}{/};
+ }
+ else {
+ $path =~ s{/$}{};
+ }
+
+ # do any tilde expansions
+ if ( $path =~ m{^(~[^/]*).*} ) {
+ require File::Glob;
+ my ($homedir) = File::Glob::bsd_glob($1);
+ $path =~ s{^(~[^/]*)}{$homedir};
+ }
+
+ bless [ $path, $cpath ], __PACKAGE__;
+ }
+
+ #pod =construct new
+ #pod
+ #pod $path = Path::Tiny->new("foo/bar");
+ #pod
+ #pod This is just like C<path>, but with method call overhead. (Why would you
+ #pod do that?)
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub new { shift; path(@_) }
+
+ #pod =construct cwd
+ #pod
+ #pod $path = Path::Tiny->cwd; # path( Cwd::getcwd )
+ #pod $path = cwd; # optional export
+ #pod
+ #pod Gives you the absolute path to the current directory as a C<Path::Tiny> object.
+ #pod This is slightly faster than C<< path(".")->absolute >>.
+ #pod
+ #pod C<cwd> may be exported on request and used as a function instead of as a
+ #pod method.
+ #pod
+ #pod Current API available since 0.018.
+ #pod
+ #pod =cut
+
+ sub cwd {
+ require Cwd;
+ return path( Cwd::getcwd() );
+ }
+
+ #pod =construct rootdir
+ #pod
+ #pod $path = Path::Tiny->rootdir; # /
+ #pod $path = rootdir; # optional export
+ #pod
+ #pod Gives you C<< File::Spec->rootdir >> as a C<Path::Tiny> object if you're too
+ #pod picky for C<path("/")>.
+ #pod
+ #pod C<rootdir> may be exported on request and used as a function instead of as a
+ #pod method.
+ #pod
+ #pod Current API available since 0.018.
+ #pod
+ #pod =cut
+
+ sub rootdir { path( File::Spec->rootdir ) }
+
+ #pod =construct tempfile, tempdir
+ #pod
+ #pod $temp = Path::Tiny->tempfile( @options );
+ #pod $temp = Path::Tiny->tempdir( @options );
+ #pod $temp = tempfile( @options ); # optional export
+ #pod $temp = tempdir( @options ); # optional export
+ #pod
+ #pod C<tempfile> passes the options to C<< File::Temp->new >> and returns a C<Path::Tiny>
+ #pod object with the file name. The C<TMPDIR> option is enabled by default.
+ #pod
+ #pod The resulting C<File::Temp> object is cached. When the C<Path::Tiny> object is
+ #pod destroyed, the C<File::Temp> object will be as well.
+ #pod
+ #pod C<File::Temp> annoyingly requires you to specify a custom template in slightly
+ #pod different ways depending on which function or method you call, but
+ #pod C<Path::Tiny> lets you ignore that and can take either a leading template or a
+ #pod C<TEMPLATE> option and does the right thing.
+ #pod
+ #pod $temp = Path::Tiny->tempfile( "customXXXXXXXX" ); # ok
+ #pod $temp = Path::Tiny->tempfile( TEMPLATE => "customXXXXXXXX" ); # ok
+ #pod
+ #pod The tempfile path object will be normalized to have an absolute path, even if
+ #pod created in a relative directory using C<DIR>.
+ #pod
+ #pod C<tempdir> is just like C<tempfile>, except it calls
+ #pod C<< File::Temp->newdir >> instead.
+ #pod
+ #pod Both C<tempfile> and C<tempdir> may be exported on request and used as
+ #pod functions instead of as methods.
+ #pod
+ #pod B<Note>: for tempfiles, the filehandles from File::Temp are closed and not
+ #pod reused. This is not as secure as using File::Temp handles directly, but is
+ #pod less prone to deadlocks or access problems on some platforms. Think of what
+ #pod C<Path::Tiny> gives you to be just a temporary file B<name> that gets cleaned
+ #pod up.
+ #pod
+ #pod Current API available since 0.018.
+ #pod
+ #pod =cut
+
+ sub tempfile {
+ shift if @_ && $_[0] eq 'Path::Tiny'; # called as method
+ my ( $maybe_template, $args ) = _parse_file_temp_args(@_);
+ # File::Temp->new demands TEMPLATE
+ $args->{TEMPLATE} = $maybe_template->[0] if @$maybe_template;
+
+ require File::Temp;
+ my $temp = File::Temp->new( TMPDIR => 1, %$args );
+ close $temp;
+ my $self = path($temp)->absolute;
+ $self->[TEMP] = $temp; # keep object alive while we are
+ return $self;
+ }
+
+ sub tempdir {
+ shift if @_ && $_[0] eq 'Path::Tiny'; # called as method
+ my ( $maybe_template, $args ) = _parse_file_temp_args(@_);
+
+ # File::Temp->newdir demands leading template
+ require File::Temp;
+ my $temp = File::Temp->newdir( @$maybe_template, TMPDIR => 1, %$args );
+ my $self = path($temp)->absolute;
+ $self->[TEMP] = $temp; # keep object alive while we are
+ # Some ActiveState Perls for Windows break Cwd in ways that lead
+ # File::Temp to get confused about what path to remove; this
+ # monkey-patches the object with our own view of the absolute path
+ $temp->{REALNAME} = $self->[CANON] if IS_WIN32;
+ return $self;
+ }
+
+ # normalize the various ways File::Temp does templates
+ sub _parse_file_temp_args {
+ my $leading_template = ( scalar(@_) % 2 == 1 ? shift(@_) : '' );
+ my %args = @_;
+ %args = map { uc($_), $args{$_} } keys %args;
+ my @template = (
+ exists $args{TEMPLATE} ? delete $args{TEMPLATE}
+ : $leading_template ? $leading_template
+ : ()
+ );
+ return ( \@template, \%args );
+ }
+
+ #--------------------------------------------------------------------------#
+ # Private methods
+ #--------------------------------------------------------------------------#
+
+ sub _splitpath {
+ my ($self) = @_;
+ @{$self}[ VOL, DIR, FILE ] = File::Spec->splitpath( $self->[PATH] );
+ }
+
+ #--------------------------------------------------------------------------#
+ # Public methods
+ #--------------------------------------------------------------------------#
+
+ #pod =method absolute
+ #pod
+ #pod $abs = path("foo/bar")->absolute;
+ #pod $abs = path("foo/bar")->absolute("/tmp");
+ #pod
+ #pod Returns a new C<Path::Tiny> object with an absolute path (or itself if already
+ #pod absolute). Unless an argument is given, the current directory is used as the
+ #pod absolute base path. The argument must be absolute or you won't get an absolute
+ #pod result.
+ #pod
+ #pod This will not resolve upward directories ("foo/../bar") unless C<canonpath>
+ #pod in L<File::Spec> would normally do so on your platform. If you need them
+ #pod resolved, you must call the more expensive C<realpath> method instead.
+ #pod
+ #pod On Windows, an absolute path without a volume component will have it added
+ #pod based on the current drive.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub absolute {
+ my ( $self, $base ) = @_;
+
+ # absolute paths handled differently by OS
+ if (IS_WIN32) {
+ return $self if length $self->volume;
+ # add missing volume
+ if ( $self->is_absolute ) {
+ require Cwd;
+ # use Win32::GetCwd not Cwd::getdcwd because we're sure
+ # to have the former but not necessarily the latter
+ my ($drv) = Win32::GetCwd() =~ /^($DRV_VOL | $UNC_VOL)/x;
+ return path( $drv . $self->[PATH] );
+ }
+ }
+ else {
+ return $self if $self->is_absolute;
+ }
+
+ # relative path on any OS
+ require Cwd;
+ return path( ( defined($base) ? $base : Cwd::getcwd() ), $_[0]->[PATH] );
+ }
+
+ #pod =method append, append_raw, append_utf8
+ #pod
+ #pod path("foo.txt")->append(@data);
+ #pod path("foo.txt")->append(\@data);
+ #pod path("foo.txt")->append({binmode => ":raw"}, @data);
+ #pod path("foo.txt")->append_raw(@data);
+ #pod path("foo.txt")->append_utf8(@data);
+ #pod
+ #pod Appends data to a file. The file is locked with C<flock> prior to writing. An
+ #pod optional hash reference may be used to pass options. Valid options are:
+ #pod
+ #pod =for :list
+ #pod * C<binmode>: passed to C<binmode()> on the handle used for writing.
+ #pod * C<truncate>: truncates the file after locking and before appending
+ #pod
+ #pod The C<truncate> option is a way to replace the contents of a file
+ #pod B<in place>, unlike L</spew> which writes to a temporary file and then
+ #pod replaces the original (if it exists).
+ #pod
+ #pod C<append_raw> is like C<append> with a C<binmode> of C<:unix> for fast,
+ #pod unbuffered, raw write.
+ #pod
+ #pod C<append_utf8> is like C<append> with a C<binmode> of
+ #pod C<:unix:encoding(UTF-8)>. If L<Unicode::UTF8> 0.58+ is installed, a raw
+ #pod append will be done instead on the data encoded with C<Unicode::UTF8>.
+ #pod
+ #pod Current API available since 0.060.
+ #pod
+ #pod =cut
+
+ sub append {
+ my ( $self, @data ) = @_;
+ my $args = ( @data && ref $data[0] eq 'HASH' ) ? shift @data : {};
+ $args = _get_args( $args, qw/binmode truncate/ );
+ my $binmode = $args->{binmode};
+ $binmode = ( ( caller(0) )[10] || {} )->{'open>'} unless defined $binmode;
+ my $mode = $args->{truncate} ? ">" : ">>";
+ my $fh = $self->filehandle( { locked => 1 }, $mode, $binmode );
+ print {$fh} map { ref eq 'ARRAY' ? @$_ : $_ } @data;
+ close $fh or $self->_throw('close');
+ }
+
+ sub append_raw {
+ my ( $self, @data ) = @_;
+ my $args = ( @data && ref $data[0] eq 'HASH' ) ? shift @data : {};
+ $args = _get_args( $args, qw/binmode truncate/ );
+ $args->{binmode} = ':unix';
+ append( $self, $args, @data );
+ }
+
+ sub append_utf8 {
+ my ( $self, @data ) = @_;
+ my $args = ( @data && ref $data[0] eq 'HASH' ) ? shift @data : {};
+ $args = _get_args( $args, qw/binmode truncate/ );
+ if ( defined($HAS_UU) ? $HAS_UU : ( $HAS_UU = _check_UU() ) ) {
+ $args->{binmode} = ":unix";
+ append( $self, $args, map { Unicode::UTF8::encode_utf8($_) } @data );
+ }
+ else {
+ $args->{binmode} = ":unix:encoding(UTF-8)";
+ append( $self, $args, @data );
+ }
+ }
+
+ #pod =method assert
+ #pod
+ #pod $path = path("foo.txt")->assert( sub { $_->exists } );
+ #pod
+ #pod Returns the invocant after asserting that a code reference argument returns
+ #pod true. When the assertion code reference runs, it will have the invocant
+ #pod object in the C<$_> variable. If it returns false, an exception will be
+ #pod thrown. The assertion code reference may also throw its own exception.
+ #pod
+ #pod If no assertion is provided, the invocant is returned without error.
+ #pod
+ #pod Current API available since 0.062.
+ #pod
+ #pod =cut
+
+ sub assert {
+ my ( $self, $assertion ) = @_;
+ return $self unless $assertion;
+ if ( ref $assertion eq 'CODE' ) {
+ local $_ = $self;
+ $assertion->()
+ or Path::Tiny::Error->throw( "assert", $self->[PATH], "failed assertion" );
+ }
+ else {
+ Carp::croak("argument to assert must be a code reference argument");
+ }
+ return $self;
+ }
+
+ #pod =method basename
+ #pod
+ #pod $name = path("foo/bar.txt")->basename; # bar.txt
+ #pod $name = path("foo.txt")->basename('.txt'); # foo
+ #pod $name = path("foo.txt")->basename(qr/.txt/); # foo
+ #pod $name = path("foo.txt")->basename(@suffixes);
+ #pod
+ #pod Returns the file portion or last directory portion of a path.
+ #pod
+ #pod Given a list of suffixes as strings or regular expressions, any that match at
+ #pod the end of the file portion or last directory portion will be removed before
+ #pod the result is returned.
+ #pod
+ #pod Current API available since 0.054.
+ #pod
+ #pod =cut
+
+ sub basename {
+ my ( $self, @suffixes ) = @_;
+ $self->_splitpath unless defined $self->[FILE];
+ my $file = $self->[FILE];
+ for my $s (@suffixes) {
+ my $re = ref($s) eq 'Regexp' ? qr/$s$/ : qr/\Q$s\E$/;
+ last if $file =~ s/$re//;
+ }
+ return $file;
+ }
+
+ #pod =method canonpath
+ #pod
+ #pod $canonical = path("foo/bar")->canonpath; # foo\bar on Windows
+ #pod
+ #pod Returns a string with the canonical format of the path name for
+ #pod the platform. In particular, this means directory separators
+ #pod will be C<\> on Windows.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub canonpath { $_[0]->[CANON] }
+
+ #pod =method child
+ #pod
+ #pod $file = path("/tmp")->child("foo.txt"); # "/tmp/foo.txt"
+ #pod $file = path("/tmp")->child(@parts);
+ #pod
+ #pod Returns a new C<Path::Tiny> object relative to the original. Works
+ #pod like C<catfile> or C<catdir> from File::Spec, but without caring about
+ #pod file or directories.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub child {
+ my ( $self, @parts ) = @_;
+ return path( $self->[PATH], @parts );
+ }
+
+ #pod =method children
+ #pod
+ #pod @paths = path("/tmp")->children;
+ #pod @paths = path("/tmp")->children( qr/\.txt$/ );
+ #pod
+ #pod Returns a list of C<Path::Tiny> objects for all files and directories
+ #pod within a directory. Excludes "." and ".." automatically.
+ #pod
+ #pod If an optional C<qr//> argument is provided, it only returns objects for child
+ #pod names that match the given regular expression. Only the base name is used
+ #pod for matching:
+ #pod
+ #pod @paths = path("/tmp")->children( qr/^foo/ );
+ #pod # matches children like the glob foo*
+ #pod
+ #pod Current API available since 0.028.
+ #pod
+ #pod =cut
+
+ sub children {
+ my ( $self, $filter ) = @_;
+ my $dh;
+ opendir $dh, $self->[PATH] or $self->_throw('opendir');
+ my @children = readdir $dh;
+ closedir $dh or $self->_throw('closedir');
+
+ if ( not defined $filter ) {
+ @children = grep { $_ ne '.' && $_ ne '..' } @children;
+ }
+ elsif ( $filter && ref($filter) eq 'Regexp' ) {
+ @children = grep { $_ ne '.' && $_ ne '..' && $_ =~ $filter } @children;
+ }
+ else {
+ Carp::croak("Invalid argument '$filter' for children()");
+ }
+
+ return map { path( $self->[PATH], $_ ) } @children;
+ }
+
+ #pod =method chmod
+ #pod
+ #pod path("foo.txt")->chmod(0777);
+ #pod path("foo.txt")->chmod("0755");
+ #pod path("foo.txt")->chmod("go-w");
+ #pod path("foo.txt")->chmod("a=r,u+wx");
+ #pod
+ #pod Sets file or directory permissions. The argument can be a numeric mode, a
+ #pod octal string beginning with a "0" or a limited subset of the symbolic mode use
+ #pod by F</bin/chmod>.
+ #pod
+ #pod The symbolic mode must be a comma-delimited list of mode clauses. Clauses must
+ #pod match C<< qr/\A([augo]+)([=+-])([rwx]+)\z/ >>, which defines "who", "op" and
+ #pod "perms" parameters for each clause. Unlike F</bin/chmod>, all three parameters
+ #pod are required for each clause, multiple ops are not allowed and permissions
+ #pod C<stugoX> are not supported. (See L<File::chmod> for more complex needs.)
+ #pod
+ #pod Current API available since 0.053.
+ #pod
+ #pod =cut
+
+ sub chmod {
+ my ( $self, $new_mode ) = @_;
+
+ my $mode;
+ if ( $new_mode =~ /\d/ ) {
+ $mode = ( $new_mode =~ /^0/ ? oct($new_mode) : $new_mode );
+ }
+ elsif ( $new_mode =~ /[=+-]/ ) {
+ $mode = _symbolic_chmod( $self->stat->mode & 07777, $new_mode ); ## no critic
+ }
+ else {
+ Carp::croak("Invalid mode argument '$new_mode' for chmod()");
+ }
+
+ CORE::chmod( $mode, $self->[PATH] ) or $self->_throw("chmod");
+
+ return 1;
+ }
+
+ #pod =method copy
+ #pod
+ #pod path("/tmp/foo.txt")->copy("/tmp/bar.txt");
+ #pod
+ #pod Copies a file using L<File::Copy>'s C<copy> function. Upon
+ #pod success, returns the C<Path::Tiny> object for the newly copied
+ #pod file.
+ #pod
+ #pod Current API available since 0.070.
+ #pod
+ #pod =cut
+
+ # XXX do recursively for directories?
+ sub copy {
+ my ( $self, $dest ) = @_;
+ require File::Copy;
+ File::Copy::copy( $self->[PATH], $dest )
+ or Carp::croak("copy failed for $self to $dest: $!");
+
+ return -d $dest ? path( $dest, $self->basename ) : path($dest);
+ }
+
+ #pod =method digest
+ #pod
+ #pod $obj = path("/tmp/foo.txt")->digest; # SHA-256
+ #pod $obj = path("/tmp/foo.txt")->digest("MD5"); # user-selected
+ #pod $obj = path("/tmp/foo.txt")->digest( { chunk_size => 1e6 }, "MD5" );
+ #pod
+ #pod Returns a hexadecimal digest for a file. An optional hash reference of options may
+ #pod be given. The only option is C<chunk_size>. If C<chunk_size> is given, that many
+ #pod bytes will be read at a time. If not provided, the entire file will be slurped
+ #pod into memory to compute the digest.
+ #pod
+ #pod Any subsequent arguments are passed to the constructor for L<Digest> to select
+ #pod an algorithm. If no arguments are given, the default is SHA-256.
+ #pod
+ #pod Current API available since 0.056.
+ #pod
+ #pod =cut
+
+ sub digest {
+ my ( $self, @opts ) = @_;
+ my $args = ( @opts && ref $opts[0] eq 'HASH' ) ? shift @opts : {};
+ $args = _get_args( $args, qw/chunk_size/ );
+ unshift @opts, 'SHA-256' unless @opts;
+ require Digest;
+ my $digest = Digest->new(@opts);
+ if ( $args->{chunk_size} ) {
+ my $fh = $self->filehandle( { locked => 1 }, "<", ":unix" );
+ my $buf;
+ $digest->add($buf) while read $fh, $buf, $args->{chunk_size};
+ }
+ else {
+ $digest->add( $self->slurp_raw );
+ }
+ return $digest->hexdigest;
+ }
+
+ #pod =method dirname (deprecated)
+ #pod
+ #pod $name = path("/tmp/foo.txt")->dirname; # "/tmp/"
+ #pod
+ #pod Returns the directory portion you would get from calling
+ #pod C<< File::Spec->splitpath( $path->stringify ) >> or C<"."> for a path without a
+ #pod parent directory portion. Because L<File::Spec> is inconsistent, the result
+ #pod might or might not have a trailing slash. Because of this, this method is
+ #pod B<deprecated>.
+ #pod
+ #pod A better, more consistently approach is likely C<< $path->parent->stringify >>,
+ #pod which will not have a trailing slash except for a root directory.
+ #pod
+ #pod Deprecated in 0.056.
+ #pod
+ #pod =cut
+
+ sub dirname {
+ my ($self) = @_;
+ $self->_splitpath unless defined $self->[DIR];
+ return length $self->[DIR] ? $self->[DIR] : ".";
+ }
+
+ #pod =method exists, is_file, is_dir
+ #pod
+ #pod if ( path("/tmp")->exists ) { ... } # -e
+ #pod if ( path("/tmp")->is_dir ) { ... } # -d
+ #pod if ( path("/tmp")->is_file ) { ... } # -e && ! -d
+ #pod
+ #pod Implements file test operations, this means the file or directory actually has
+ #pod to exist on the filesystem. Until then, it's just a path.
+ #pod
+ #pod B<Note>: C<is_file> is not C<-f> because C<-f> is not the opposite of C<-d>.
+ #pod C<-f> means "plain file", excluding symlinks, devices, etc. that often can be
+ #pod read just like files.
+ #pod
+ #pod Use C<-f> instead if you really mean to check for a plain file.
+ #pod
+ #pod Current API available since 0.053.
+ #pod
+ #pod =cut
+
+ sub exists { -e $_[0]->[PATH] }
+
+ sub is_file { -e $_[0]->[PATH] && !-d _ }
+
+ sub is_dir { -d $_[0]->[PATH] }
+
+ #pod =method filehandle
+ #pod
+ #pod $fh = path("/tmp/foo.txt")->filehandle($mode, $binmode);
+ #pod $fh = path("/tmp/foo.txt")->filehandle({ locked => 1 }, $mode, $binmode);
+ #pod $fh = path("/tmp/foo.txt")->filehandle({ exclusive => 1 }, $mode, $binmode);
+ #pod
+ #pod Returns an open file handle. The C<$mode> argument must be a Perl-style
+ #pod read/write mode string ("<" ,">", "<<", etc.). If a C<$binmode>
+ #pod is given, it is set during the C<open> call.
+ #pod
+ #pod An optional hash reference may be used to pass options.
+ #pod
+ #pod The C<locked> option governs file locking; if true, handles opened for writing,
+ #pod appending or read-write are locked with C<LOCK_EX>; otherwise, they are
+ #pod locked with C<LOCK_SH>. When using C<locked>, ">" or "+>" modes will delay
+ #pod truncation until after the lock is acquired.
+ #pod
+ #pod The C<exclusive> option causes the open() call to fail if the file already
+ #pod exists. This corresponds to the O_EXCL flag to sysopen / open(2).
+ #pod C<exclusive> implies C<locked> and will set it for you if you forget it.
+ #pod
+ #pod See C<openr>, C<openw>, C<openrw>, and C<opena> for sugar.
+ #pod
+ #pod Current API available since 0.066.
+ #pod
+ #pod =cut
+
+ # Note: must put binmode on open line, not subsequent binmode() call, so things
+ # like ":unix" actually stop perlio/crlf from being added
+
+ sub filehandle {
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked exclusive/ );
+ $args->{locked} = 1 if $args->{exclusive};
+ my ( $opentype, $binmode ) = @args;
+
+ $opentype = "<" unless defined $opentype;
+ Carp::croak("Invalid file mode '$opentype'")
+ unless grep { $opentype eq $_ } qw/< +< > +> >> +>>/;
+
+ $binmode = ( ( caller(0) )[10] || {} )->{ 'open' . substr( $opentype, -1, 1 ) }
+ unless defined $binmode;
+ $binmode = "" unless defined $binmode;
+
+ my ( $fh, $lock, $trunc );
+ if ( $HAS_FLOCK && $args->{locked} ) {
+ require Fcntl;
+ # truncating file modes shouldn't truncate until lock acquired
+ if ( grep { $opentype eq $_ } qw( > +> ) ) {
+ # sysopen in write mode without truncation
+ my $flags = $opentype eq ">" ? Fcntl::O_WRONLY() : Fcntl::O_RDWR();
+ $flags |= Fcntl::O_CREAT();
+ $flags |= Fcntl::O_EXCL() if $args->{exclusive};
+ sysopen( $fh, $self->[PATH], $flags ) or $self->_throw("sysopen");
+
+ # fix up the binmode since sysopen() can't specify layers like
+ # open() and binmode() can't start with just :unix like open()
+ if ( $binmode =~ s/^:unix// ) {
+ # eliminate pseudo-layers
+ binmode( $fh, ":raw" ) or $self->_throw("binmode (:raw)");
+ # strip off real layers until only :unix is left
+ while ( 1 < ( my $layers =()= PerlIO::get_layers( $fh, output => 1 ) ) ) {
+ binmode( $fh, ":pop" ) or $self->_throw("binmode (:pop)");
+ }
+ }
+
+ # apply any remaining binmode layers
+ if ( length $binmode ) {
+ binmode( $fh, $binmode ) or $self->_throw("binmode ($binmode)");
+ }
+
+ # ask for lock and truncation
+ $lock = Fcntl::LOCK_EX();
+ $trunc = 1;
+ }
+ elsif ( $^O eq 'aix' && $opentype eq "<" ) {
+ # AIX can only lock write handles, so upgrade to RW and LOCK_EX if
+ # the file is writable; otherwise give up on locking. N.B.
+ # checking -w before open to determine the open mode is an
+ # unavoidable race condition
+ if ( -w $self->[PATH] ) {
+ $opentype = "+<";
+ $lock = Fcntl::LOCK_EX();
+ }
+ }
+ else {
+ $lock = $opentype eq "<" ? Fcntl::LOCK_SH() : Fcntl::LOCK_EX();
+ }
+ }
+
+ unless ($fh) {
+ my $mode = $opentype . $binmode;
+ open $fh, $mode, $self->[PATH] or $self->_throw("open ($mode)");
+ }
+
+ do { flock( $fh, $lock ) or $self->_throw("flock ($lock)") } if $lock;
+ do { truncate( $fh, 0 ) or $self->_throw("truncate") } if $trunc;
+
+ return $fh;
+ }
+
+ #pod =method is_absolute, is_relative
+ #pod
+ #pod if ( path("/tmp")->is_absolute ) { ... }
+ #pod if ( path("/tmp")->is_relative ) { ... }
+ #pod
+ #pod Booleans for whether the path appears absolute or relative.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub is_absolute { substr( $_[0]->dirname, 0, 1 ) eq '/' }
+
+ sub is_relative { substr( $_[0]->dirname, 0, 1 ) ne '/' }
+
+ #pod =method is_rootdir
+ #pod
+ #pod while ( ! $path->is_rootdir ) {
+ #pod $path = $path->parent;
+ #pod ...
+ #pod }
+ #pod
+ #pod Boolean for whether the path is the root directory of the volume. I.e. the
+ #pod C<dirname> is C<q[/]> and the C<basename> is C<q[]>.
+ #pod
+ #pod This works even on C<MSWin32> with drives and UNC volumes:
+ #pod
+ #pod path("C:/")->is_rootdir; # true
+ #pod path("//server/share/")->is_rootdir; #true
+ #pod
+ #pod Current API available since 0.038.
+ #pod
+ #pod =cut
+
+ sub is_rootdir {
+ my ($self) = @_;
+ $self->_splitpath unless defined $self->[DIR];
+ return $self->[DIR] eq '/' && $self->[FILE] eq '';
+ }
+
+ #pod =method iterator
+ #pod
+ #pod $iter = path("/tmp")->iterator( \%options );
+ #pod
+ #pod Returns a code reference that walks a directory lazily. Each invocation
+ #pod returns a C<Path::Tiny> object or undef when the iterator is exhausted.
+ #pod
+ #pod $iter = path("/tmp")->iterator;
+ #pod while ( $path = $iter->() ) {
+ #pod ...
+ #pod }
+ #pod
+ #pod The current and parent directory entries ("." and "..") will not
+ #pod be included.
+ #pod
+ #pod If the C<recurse> option is true, the iterator will walk the directory
+ #pod recursively, breadth-first. If the C<follow_symlinks> option is also true,
+ #pod directory links will be followed recursively. There is no protection against
+ #pod loops when following links. If a directory is not readable, it will not be
+ #pod followed.
+ #pod
+ #pod The default is the same as:
+ #pod
+ #pod $iter = path("/tmp")->iterator( {
+ #pod recurse => 0,
+ #pod follow_symlinks => 0,
+ #pod } );
+ #pod
+ #pod For a more powerful, recursive iterator with built-in loop avoidance, see
+ #pod L<Path::Iterator::Rule>.
+ #pod
+ #pod See also L</visit>.
+ #pod
+ #pod Current API available since 0.016.
+ #pod
+ #pod =cut
+
+ sub iterator {
+ my $self = shift;
+ my $args = _get_args( shift, qw/recurse follow_symlinks/ );
+ my @dirs = $self;
+ my $current;
+ return sub {
+ my $next;
+ while (@dirs) {
+ if ( ref $dirs[0] eq 'Path::Tiny' ) {
+ if ( !-r $dirs[0] ) {
+ # Directory is missing or not readable, so skip it. There
+ # is still a race condition possible between the check and
+ # the opendir, but we can't easily differentiate between
+ # error cases that are OK to skip and those that we want
+ # to be exceptions, so we live with the race and let opendir
+ # be fatal.
+ shift @dirs and next;
+ }
+ $current = $dirs[0];
+ my $dh;
+ opendir( $dh, $current->[PATH] )
+ or $self->_throw( 'opendir', $current->[PATH] );
+ $dirs[0] = $dh;
+ if ( -l $current->[PATH] && !$args->{follow_symlinks} ) {
+ # Symlink attack! It was a real dir, but is now a symlink!
+ # N.B. we check *after* opendir so the attacker has to win
+ # two races: replace dir with symlink before opendir and
+ # replace symlink with dir before -l check above
+ shift @dirs and next;
+ }
+ }
+ while ( defined( $next = readdir $dirs[0] ) ) {
+ next if $next eq '.' || $next eq '..';
+ my $path = $current->child($next);
+ push @dirs, $path
+ if $args->{recurse} && -d $path && !( !$args->{follow_symlinks} && -l $path );
+ return $path;
+ }
+ shift @dirs;
+ }
+ return;
+ };
+ }
+
+ #pod =method lines, lines_raw, lines_utf8
+ #pod
+ #pod @contents = path("/tmp/foo.txt")->lines;
+ #pod @contents = path("/tmp/foo.txt")->lines(\%options);
+ #pod @contents = path("/tmp/foo.txt")->lines_raw;
+ #pod @contents = path("/tmp/foo.txt")->lines_utf8;
+ #pod
+ #pod @contents = path("/tmp/foo.txt")->lines( { chomp => 1, count => 4 } );
+ #pod
+ #pod Returns a list of lines from a file. Optionally takes a hash-reference of
+ #pod options. Valid options are C<binmode>, C<count> and C<chomp>.
+ #pod
+ #pod If C<binmode> is provided, it will be set on the handle prior to reading.
+ #pod
+ #pod If a positive C<count> is provided, that many lines will be returned from the
+ #pod start of the file. If a negative C<count> is provided, the entire file will be
+ #pod read, but only C<abs(count)> will be kept and returned. If C<abs(count)>
+ #pod exceeds the number of lines in the file, all lines will be returned.
+ #pod
+ #pod If C<chomp> is set, any end-of-line character sequences (C<CR>, C<CRLF>, or
+ #pod C<LF>) will be removed from the lines returned.
+ #pod
+ #pod Because the return is a list, C<lines> in scalar context will return the number
+ #pod of lines (and throw away the data).
+ #pod
+ #pod $number_of_lines = path("/tmp/foo.txt")->lines;
+ #pod
+ #pod C<lines_raw> is like C<lines> with a C<binmode> of C<:raw>. We use C<:raw>
+ #pod instead of C<:unix> so PerlIO buffering can manage reading by line.
+ #pod
+ #pod C<lines_utf8> is like C<lines> with a C<binmode> of
+ #pod C<:raw:encoding(UTF-8)>. If L<Unicode::UTF8> 0.58+ is installed, a raw
+ #pod UTF-8 slurp will be done and then the lines will be split. This is
+ #pod actually faster than relying on C<:encoding(UTF-8)>, though a bit memory
+ #pod intensive. If memory use is a concern, consider C<openr_utf8> and
+ #pod iterating directly on the handle.
+ #pod
+ #pod Current API available since 0.065.
+ #pod
+ #pod =cut
+
+ sub lines {
+ my $self = shift;
+ my $args = _get_args( shift, qw/binmode chomp count/ );
+ my $binmode = $args->{binmode};
+ $binmode = ( ( caller(0) )[10] || {} )->{'open<'} unless defined $binmode;
+ my $fh = $self->filehandle( { locked => 1 }, "<", $binmode );
+ my $chomp = $args->{chomp};
+ # XXX more efficient to read @lines then chomp(@lines) vs map?
+ if ( $args->{count} ) {
+ my ( $counter, $mod, @result ) = ( 0, abs( $args->{count} ) );
+ while ( my $line = <$fh> ) {
+ $line =~ s/(?:\x{0d}?\x{0a}|\x{0d})$// if $chomp;
+ $result[ $counter++ ] = $line;
+ # for positive count, terminate after right number of lines
+ last if $counter == $args->{count};
+ # for negative count, eventually wrap around in the result array
+ $counter %= $mod;
+ }
+ # reorder results if full and wrapped somewhere in the middle
+ splice( @result, 0, 0, splice( @result, $counter ) )
+ if @result == $mod && $counter % $mod;
+ return @result;
+ }
+ elsif ($chomp) {
+ return map { s/(?:\x{0d}?\x{0a}|\x{0d})$//; $_ } <$fh>; ## no critic
+ }
+ else {
+ return wantarray ? <$fh> : ( my $count =()= <$fh> );
+ }
+ }
+
+ sub lines_raw {
+ my $self = shift;
+ my $args = _get_args( shift, qw/binmode chomp count/ );
+ if ( $args->{chomp} && !$args->{count} ) {
+ return split /\n/, slurp_raw($self); ## no critic
+ }
+ else {
+ $args->{binmode} = ":raw";
+ return lines( $self, $args );
+ }
+ }
+
+ sub lines_utf8 {
+ my $self = shift;
+ my $args = _get_args( shift, qw/binmode chomp count/ );
+ if ( ( defined($HAS_UU) ? $HAS_UU : ( $HAS_UU = _check_UU() ) )
+ && $args->{chomp}
+ && !$args->{count} )
+ {
+ return split /(?:\x{0d}?\x{0a}|\x{0d})/, slurp_utf8($self); ## no critic
+ }
+ else {
+ $args->{binmode} = ":raw:encoding(UTF-8)";
+ return lines( $self, $args );
+ }
+ }
+
+ #pod =method mkpath
+ #pod
+ #pod path("foo/bar/baz")->mkpath;
+ #pod path("foo/bar/baz")->mkpath( \%options );
+ #pod
+ #pod Like calling C<make_path> from L<File::Path>. An optional hash reference
+ #pod is passed through to C<make_path>. Errors will be trapped and an exception
+ #pod thrown. Returns the list of directories created or an empty list if
+ #pod the directories already exist, just like C<make_path>.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub mkpath {
+ my ( $self, $args ) = @_;
+ $args = {} unless ref $args eq 'HASH';
+ my $err;
+ $args->{error} = \$err unless defined $args->{error};
+ require File::Path;
+ my @dirs = File::Path::make_path( $self->[PATH], $args );
+ if ( $err && @$err ) {
+ my ( $file, $message ) = %{ $err->[0] };
+ Carp::croak("mkpath failed for $file: $message");
+ }
+ return @dirs;
+ }
+
+ #pod =method move
+ #pod
+ #pod path("foo.txt")->move("bar.txt");
+ #pod
+ #pod Just like C<rename>.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub move {
+ my ( $self, $dst ) = @_;
+
+ return rename( $self->[PATH], $dst )
+ || $self->_throw( 'rename', $self->[PATH] . "' -> '$dst" );
+ }
+
+ #pod =method openr, openw, openrw, opena
+ #pod
+ #pod $fh = path("foo.txt")->openr($binmode); # read
+ #pod $fh = path("foo.txt")->openr_raw;
+ #pod $fh = path("foo.txt")->openr_utf8;
+ #pod
+ #pod $fh = path("foo.txt")->openw($binmode); # write
+ #pod $fh = path("foo.txt")->openw_raw;
+ #pod $fh = path("foo.txt")->openw_utf8;
+ #pod
+ #pod $fh = path("foo.txt")->opena($binmode); # append
+ #pod $fh = path("foo.txt")->opena_raw;
+ #pod $fh = path("foo.txt")->opena_utf8;
+ #pod
+ #pod $fh = path("foo.txt")->openrw($binmode); # read/write
+ #pod $fh = path("foo.txt")->openrw_raw;
+ #pod $fh = path("foo.txt")->openrw_utf8;
+ #pod
+ #pod Returns a file handle opened in the specified mode. The C<openr> style methods
+ #pod take a single C<binmode> argument. All of the C<open*> methods have
+ #pod C<open*_raw> and C<open*_utf8> equivalents that use C<:raw> and
+ #pod C<:raw:encoding(UTF-8)>, respectively.
+ #pod
+ #pod An optional hash reference may be used to pass options. The only option is
+ #pod C<locked>. If true, handles opened for writing, appending or read-write are
+ #pod locked with C<LOCK_EX>; otherwise, they are locked for C<LOCK_SH>.
+ #pod
+ #pod $fh = path("foo.txt")->openrw_utf8( { locked => 1 } );
+ #pod
+ #pod See L</filehandle> for more on locking.
+ #pod
+ #pod Current API available since 0.011.
+ #pod
+ #pod =cut
+
+ # map method names to corresponding open mode
+ my %opens = (
+ opena => ">>",
+ openr => "<",
+ openw => ">",
+ openrw => "+<"
+ );
+
+ while ( my ( $k, $v ) = each %opens ) {
+ no strict 'refs';
+ # must check for lexical IO mode hint
+ *{$k} = sub {
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ my ($binmode) = @args;
+ $binmode = ( ( caller(0) )[10] || {} )->{ 'open' . substr( $v, -1, 1 ) }
+ unless defined $binmode;
+ $self->filehandle( $args, $v, $binmode );
+ };
+ *{ $k . "_raw" } = sub {
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ $self->filehandle( $args, $v, ":raw" );
+ };
+ *{ $k . "_utf8" } = sub {
+ my ( $self, @args ) = @_;
+ my $args = ( @args && ref $args[0] eq 'HASH' ) ? shift @args : {};
+ $args = _get_args( $args, qw/locked/ );
+ $self->filehandle( $args, $v, ":raw:encoding(UTF-8)" );
+ };
+ }
+
+ #pod =method parent
+ #pod
+ #pod $parent = path("foo/bar/baz")->parent; # foo/bar
+ #pod $parent = path("foo/wibble.txt")->parent; # foo
+ #pod
+ #pod $parent = path("foo/bar/baz")->parent(2); # foo
+ #pod
+ #pod Returns a C<Path::Tiny> object corresponding to the parent directory of the
+ #pod original directory or file. An optional positive integer argument is the number
+ #pod of parent directories upwards to return. C<parent> by itself is equivalent to
+ #pod C<parent(1)>.
+ #pod
+ #pod Current API available since 0.014.
+ #pod
+ #pod =cut
+
+ # XXX this is ugly and coverage is incomplete. I think it's there for windows
+ # so need to check coverage there and compare
+ sub parent {
+ my ( $self, $level ) = @_;
+ $level = 1 unless defined $level && $level > 0;
+ $self->_splitpath unless defined $self->[FILE];
+ my $parent;
+ if ( length $self->[FILE] ) {
+ if ( $self->[FILE] eq '.' || $self->[FILE] eq ".." ) {
+ $parent = path( $self->[PATH] . "/.." );
+ }
+ else {
+ $parent = path( _non_empty( $self->[VOL] . $self->[DIR] ) );
+ }
+ }
+ elsif ( length $self->[DIR] ) {
+ # because of symlinks, any internal updir requires us to
+ # just add more updirs at the end
+ if ( $self->[DIR] =~ m{(?:^\.\./|/\.\./|/\.\.$)} ) {
+ $parent = path( $self->[VOL] . $self->[DIR] . "/.." );
+ }
+ else {
+ ( my $dir = $self->[DIR] ) =~ s{/[^\/]+/$}{/};
+ $parent = path( $self->[VOL] . $dir );
+ }
+ }
+ else {
+ $parent = path( _non_empty( $self->[VOL] ) );
+ }
+ return $level == 1 ? $parent : $parent->parent( $level - 1 );
+ }
+
+ sub _non_empty {
+ my ($string) = shift;
+ return ( ( defined($string) && length($string) ) ? $string : "." );
+ }
+
+ #pod =method realpath
+ #pod
+ #pod $real = path("/baz/foo/../bar")->realpath;
+ #pod $real = path("foo/../bar")->realpath;
+ #pod
+ #pod Returns a new C<Path::Tiny> object with all symbolic links and upward directory
+ #pod parts resolved using L<Cwd>'s C<realpath>. Compared to C<absolute>, this is
+ #pod more expensive as it must actually consult the filesystem.
+ #pod
+ #pod If the parent path can't be resolved (e.g. if it includes directories that
+ #pod don't exist), an exception will be thrown:
+ #pod
+ #pod $real = path("doesnt_exist/foo")->realpath; # dies
+ #pod
+ #pod However, if the parent path exists and only the last component (e.g. filename)
+ #pod doesn't exist, the realpath will be the realpath of the parent plus the
+ #pod non-existent last component:
+ #pod
+ #pod $real = path("./aasdlfasdlf")->realpath; # works
+ #pod
+ #pod The underlying L<Cwd> module usually worked this way on Unix, but died on
+ #pod Windows (and some Unixes) if the full path didn't exist. As of version 0.064,
+ #pod it's safe to use anywhere.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ # Win32 and some Unixes need parent path resolved separately so realpath
+ # doesn't throw an error resolving non-existent basename
+ sub realpath {
+ my $self = shift;
+ require Cwd;
+ $self->_splitpath if !defined $self->[FILE];
+ my $check_parent =
+ length $self->[FILE] && $self->[FILE] ne '.' && $self->[FILE] ne '..';
+ my $realpath = eval {
+ # pure-perl Cwd can carp
+ local $SIG{__WARN__} = sub { };
+ Cwd::realpath( $check_parent ? $self->parent->[PATH] : $self->[PATH] );
+ };
+ # parent realpath must exist; not all Cwd::realpath will error if it doesn't
+ $self->_throw("resolving realpath")
+ unless defined $realpath && length $realpath && -e $realpath;
+ return ( $check_parent ? path( $realpath, $self->[FILE] ) : path($realpath) );
+ }
+
+ #pod =method relative
+ #pod
+ #pod $rel = path("/tmp/foo/bar")->relative("/tmp"); # foo/bar
+ #pod
+ #pod Returns a C<Path::Tiny> object with a relative path name.
+ #pod Given the trickiness of this, it's a thin wrapper around
+ #pod C<< File::Spec->abs2rel() >>.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ # Easy to get wrong, so wash it through File::Spec (sigh)
+ sub relative { path( File::Spec->abs2rel( $_[0]->[PATH], $_[1] ) ) }
+
+ #pod =method remove
+ #pod
+ #pod path("foo.txt")->remove;
+ #pod
+ #pod This is just like C<unlink>, except for its error handling: if the path does
+ #pod not exist, it returns false; if deleting the file fails, it throws an
+ #pod exception.
+ #pod
+ #pod Current API available since 0.012.
+ #pod
+ #pod =cut
+
+ sub remove {
+ my $self = shift;
+
+ return 0 if !-e $self->[PATH] && !-l $self->[PATH];
+
+ return unlink( $self->[PATH] ) || $self->_throw('unlink');
+ }
+
+ #pod =method remove_tree
+ #pod
+ #pod # directory
+ #pod path("foo/bar/baz")->remove_tree;
+ #pod path("foo/bar/baz")->remove_tree( \%options );
+ #pod path("foo/bar/baz")->remove_tree( { safe => 0 } ); # force remove
+ #pod
+ #pod Like calling C<remove_tree> from L<File::Path>, but defaults to C<safe> mode.
+ #pod An optional hash reference is passed through to C<remove_tree>. Errors will be
+ #pod trapped and an exception thrown. Returns the number of directories deleted,
+ #pod just like C<remove_tree>.
+ #pod
+ #pod If you want to remove a directory only if it is empty, use the built-in
+ #pod C<rmdir> function instead.
+ #pod
+ #pod rmdir path("foo/bar/baz/");
+ #pod
+ #pod Current API available since 0.013.
+ #pod
+ #pod =cut
+
+ sub remove_tree {
+ my ( $self, $args ) = @_;
+ return 0 if !-e $self->[PATH] && !-l $self->[PATH];
+ $args = {} unless ref $args eq 'HASH';
+ my $err;
+ $args->{error} = \$err unless defined $args->{error};
+ $args->{safe} = 1 unless defined $args->{safe};
+ require File::Path;
+ my $count = File::Path::remove_tree( $self->[PATH], $args );
+
+ if ( $err && @$err ) {
+ my ( $file, $message ) = %{ $err->[0] };
+ Carp::croak("remove_tree failed for $file: $message");
+ }
+ return $count;
+ }
+
+ #pod =method sibling
+ #pod
+ #pod $foo = path("/tmp/foo.txt");
+ #pod $sib = $foo->sibling("bar.txt"); # /tmp/bar.txt
+ #pod $sib = $foo->sibling("baz", "bam.txt"); # /tmp/baz/bam.txt
+ #pod
+ #pod Returns a new C<Path::Tiny> object relative to the parent of the original.
+ #pod This is slightly more efficient than C<< $path->parent->child(...) >>.
+ #pod
+ #pod Current API available since 0.058.
+ #pod
+ #pod =cut
+
+ sub sibling {
+ my $self = shift;
+ return path( $self->parent->[PATH], @_ );
+ }
+
+ #pod =method slurp, slurp_raw, slurp_utf8
+ #pod
+ #pod $data = path("foo.txt")->slurp;
+ #pod $data = path("foo.txt")->slurp( {binmode => ":raw"} );
+ #pod $data = path("foo.txt")->slurp_raw;
+ #pod $data = path("foo.txt")->slurp_utf8;
+ #pod
+ #pod Reads file contents into a scalar. Takes an optional hash reference may be
+ #pod used to pass options. The only option is C<binmode>, which is passed to
+ #pod C<binmode()> on the handle used for reading.
+ #pod
+ #pod C<slurp_raw> is like C<slurp> with a C<binmode> of C<:unix> for
+ #pod a fast, unbuffered, raw read.
+ #pod
+ #pod C<slurp_utf8> is like C<slurp> with a C<binmode> of
+ #pod C<:unix:encoding(UTF-8)>. If L<Unicode::UTF8> 0.58+ is installed, a raw
+ #pod slurp will be done instead and the result decoded with C<Unicode::UTF8>.
+ #pod This is just as strict and is roughly an order of magnitude faster than
+ #pod using C<:encoding(UTF-8)>.
+ #pod
+ #pod B<Note>: C<slurp> and friends lock the filehandle before slurping. If
+ #pod you plan to slurp from a file created with L<File::Temp>, be sure to
+ #pod close other handles or open without locking to avoid a deadlock:
+ #pod
+ #pod my $tempfile = File::Temp->new(EXLOCK => 0);
+ #pod my $guts = path($tempfile)->slurp;
+ #pod
+ #pod Current API available since 0.004.
+ #pod
+ #pod =cut
+
+ sub slurp {
+ my $self = shift;
+ my $args = _get_args( shift, qw/binmode/ );
+ my $binmode = $args->{binmode};
+ $binmode = ( ( caller(0) )[10] || {} )->{'open<'} unless defined $binmode;
+ my $fh = $self->filehandle( { locked => 1 }, "<", $binmode );
+ if ( ( defined($binmode) ? $binmode : "" ) eq ":unix"
+ and my $size = -s $fh )
+ {
+ my $buf;
+ read $fh, $buf, $size; # File::Slurp in a nutshell
+ return $buf;
+ }
+ else {
+ local $/;
+ return scalar <$fh>;
+ }
+ }
+
+ sub slurp_raw { $_[1] = { binmode => ":unix" }; goto &slurp }
+
+ sub slurp_utf8 {
+ if ( defined($HAS_UU) ? $HAS_UU : ( $HAS_UU = _check_UU() ) ) {
+ return Unicode::UTF8::decode_utf8( slurp( $_[0], { binmode => ":unix" } ) );
+ }
+ else {
+ $_[1] = { binmode => ":raw:encoding(UTF-8)" };
+ goto &slurp;
+ }
+ }
+
+ #pod =method spew, spew_raw, spew_utf8
+ #pod
+ #pod path("foo.txt")->spew(@data);
+ #pod path("foo.txt")->spew(\@data);
+ #pod path("foo.txt")->spew({binmode => ":raw"}, @data);
+ #pod path("foo.txt")->spew_raw(@data);
+ #pod path("foo.txt")->spew_utf8(@data);
+ #pod
+ #pod Writes data to a file atomically. The file is written to a temporary file in
+ #pod the same directory, then renamed over the original. An optional hash reference
+ #pod may be used to pass options. The only option is C<binmode>, which is passed to
+ #pod C<binmode()> on the handle used for writing.
+ #pod
+ #pod C<spew_raw> is like C<spew> with a C<binmode> of C<:unix> for a fast,
+ #pod unbuffered, raw write.
+ #pod
+ #pod C<spew_utf8> is like C<spew> with a C<binmode> of C<:unix:encoding(UTF-8)>.
+ #pod If L<Unicode::UTF8> 0.58+ is installed, a raw spew will be done instead on
+ #pod the data encoded with C<Unicode::UTF8>.
+ #pod
+ #pod B<NOTE>: because the file is written to a temporary file and then renamed, the
+ #pod new file will wind up with permissions based on your current umask. This is a
+ #pod feature to protect you from a race condition that would otherwise give
+ #pod different permissions than you might expect. If you really want to keep the
+ #pod original mode flags, use L</append> with the C<truncate> option.
+ #pod
+ #pod Current API available since 0.011.
+ #pod
+ #pod =cut
+
+ # XXX add "unsafe" option to disable flocking and atomic? Check benchmarks on append() first.
+ sub spew {
+ my ( $self, @data ) = @_;
+ my $args = ( @data && ref $data[0] eq 'HASH' ) ? shift @data : {};
+ $args = _get_args( $args, qw/binmode/ );
+ my $binmode = $args->{binmode};
+ # get default binmode from caller's lexical scope (see "perldoc open")
+ $binmode = ( ( caller(0) )[10] || {} )->{'open>'} unless defined $binmode;
+ my $temp = path( $self->[PATH] . $$ . int( rand( 2**31 ) ) );
+ my $fh = $temp->filehandle( { exclusive => 1, locked => 1 }, ">", $binmode );
+ print {$fh} map { ref eq 'ARRAY' ? @$_ : $_ } @data;
+ close $fh or $self->_throw( 'close', $temp->[PATH] );
+
+ # spewing need to follow the link
+ # and replace the destination instead
+ my $resolved_path = $self->[PATH];
+ $resolved_path = readlink $resolved_path while -l $resolved_path;
+ return $temp->move($resolved_path);
+ }
+
+ sub spew_raw { splice @_, 1, 0, { binmode => ":unix" }; goto &spew }
+
+ sub spew_utf8 {
+ if ( defined($HAS_UU) ? $HAS_UU : ( $HAS_UU = _check_UU() ) ) {
+ my $self = shift;
+ spew( $self, { binmode => ":unix" }, map { Unicode::UTF8::encode_utf8($_) } @_ );
+ }
+ else {
+ splice @_, 1, 0, { binmode => ":unix:encoding(UTF-8)" };
+ goto &spew;
+ }
+ }
+
+ #pod =method stat, lstat
+ #pod
+ #pod $stat = path("foo.txt")->stat;
+ #pod $stat = path("/some/symlink")->lstat;
+ #pod
+ #pod Like calling C<stat> or C<lstat> from L<File::stat>.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ # XXX break out individual stat() components as subs?
+ sub stat {
+ my $self = shift;
+ require File::stat;
+ return File::stat::stat( $self->[PATH] ) || $self->_throw('stat');
+ }
+
+ sub lstat {
+ my $self = shift;
+ require File::stat;
+ return File::stat::lstat( $self->[PATH] ) || $self->_throw('lstat');
+ }
+
+ #pod =method stringify
+ #pod
+ #pod $path = path("foo.txt");
+ #pod say $path->stringify; # same as "$path"
+ #pod
+ #pod Returns a string representation of the path. Unlike C<canonpath>, this method
+ #pod returns the path standardized with Unix-style C</> directory separators.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub stringify { $_[0]->[PATH] }
+
+ #pod =method subsumes
+ #pod
+ #pod path("foo/bar")->subsumes("foo/bar/baz"); # true
+ #pod path("/foo/bar")->subsumes("/foo/baz"); # false
+ #pod
+ #pod Returns true if the first path is a prefix of the second path at a directory
+ #pod boundary.
+ #pod
+ #pod This B<does not> resolve parent directory entries (C<..>) or symlinks:
+ #pod
+ #pod path("foo/bar")->subsumes("foo/bar/../baz"); # true
+ #pod
+ #pod If such things are important to you, ensure that both paths are resolved to
+ #pod the filesystem with C<realpath>:
+ #pod
+ #pod my $p1 = path("foo/bar")->realpath;
+ #pod my $p2 = path("foo/bar/../baz")->realpath;
+ #pod if ( $p1->subsumes($p2) ) { ... }
+ #pod
+ #pod Current API available since 0.048.
+ #pod
+ #pod =cut
+
+ sub subsumes {
+ my $self = shift;
+ Carp::croak("subsumes() requires a defined, positive-length argument")
+ unless defined $_[0];
+ my $other = path(shift);
+
+ # normalize absolute vs relative
+ if ( $self->is_absolute && !$other->is_absolute ) {
+ $other = $other->absolute;
+ }
+ elsif ( $other->is_absolute && !$self->is_absolute ) {
+ $self = $self->absolute;
+ }
+
+ # normalize volume vs non-volume; do this after absolute path
+ # adjustments above since that might add volumes already
+ if ( length $self->volume && !length $other->volume ) {
+ $other = $other->absolute;
+ }
+ elsif ( length $other->volume && !length $self->volume ) {
+ $self = $self->absolute;
+ }
+
+ if ( $self->[PATH] eq '.' ) {
+ return !!1; # cwd subsumes everything relative
+ }
+ elsif ( $self->is_rootdir ) {
+ # a root directory ("/", "c:/") already ends with a separator
+ return $other->[PATH] =~ m{^\Q$self->[PATH]\E};
+ }
+ else {
+ # exact match or prefix breaking at a separator
+ return $other->[PATH] =~ m{^\Q$self->[PATH]\E(?:/|$)};
+ }
+ }
+
+ #pod =method touch
+ #pod
+ #pod path("foo.txt")->touch;
+ #pod path("foo.txt")->touch($epoch_secs);
+ #pod
+ #pod Like the Unix C<touch> utility. Creates the file if it doesn't exist, or else
+ #pod changes the modification and access times to the current time. If the first
+ #pod argument is the epoch seconds then it will be used.
+ #pod
+ #pod Returns the path object so it can be easily chained with other methods:
+ #pod
+ #pod # won't die if foo.txt doesn't exist
+ #pod $content = path("foo.txt")->touch->slurp;
+ #pod
+ #pod Current API available since 0.015.
+ #pod
+ #pod =cut
+
+ sub touch {
+ my ( $self, $epoch ) = @_;
+ if ( !-e $self->[PATH] ) {
+ my $fh = $self->openw;
+ close $fh or $self->_throw('close');
+ }
+ $epoch = defined($epoch) ? $epoch : time();
+ utime $epoch, $epoch, $self->[PATH]
+ or $self->_throw("utime ($epoch)");
+ return $self;
+ }
+
+ #pod =method touchpath
+ #pod
+ #pod path("bar/baz/foo.txt")->touchpath;
+ #pod
+ #pod Combines C<mkpath> and C<touch>. Creates the parent directory if it doesn't exist,
+ #pod before touching the file. Returns the path object like C<touch> does.
+ #pod
+ #pod Current API available since 0.022.
+ #pod
+ #pod =cut
+
+ sub touchpath {
+ my ($self) = @_;
+ my $parent = $self->parent;
+ $parent->mkpath unless $parent->exists;
+ $self->touch;
+ }
+
+ #pod =method visit
+ #pod
+ #pod path("/tmp")->visit( \&callback, \%options );
+ #pod
+ #pod Wraps the L</iterator> method to execute a callback for each directory entry.
+ #pod It returns a hash reference with any state accumulated during
+ #pod iteration.
+ #pod
+ #pod The options are the same as for L</iterator>: C<recurse> and
+ #pod C<follow_symlinks>. Both default to false.
+ #pod
+ #pod The callback function will receive a C<Path::Tiny> object as the first argument
+ #pod and a hash reference to accumulate state as the second argument. For example:
+ #pod
+ #pod # collect files sizes
+ #pod my $sizes = path("/tmp")->visit(
+ #pod sub {
+ #pod my ($path, $state) = @_;
+ #pod return if $path->is_dir;
+ #pod $state->{$path} = -s $path;
+ #pod },
+ #pod { recurse => 1 }
+ #pod );
+ #pod
+ #pod For convenience, the C<Path::Tiny> object will also be locally aliased as the
+ #pod C<$_> global variable:
+ #pod
+ #pod # print paths matching /foo/
+ #pod path("/tmp")->visit( sub { say if /foo/ }, { recurse => 1} );
+ #pod
+ #pod If the callback returns a B<reference> to a false scalar value, iteration will
+ #pod terminate. This is not the same as "pruning" a directory search; this just
+ #pod stops all iteration and returns the state hash reference.
+ #pod
+ #pod # find up to 10 files larger than 100K
+ #pod my $files = path("/tmp")->visit(
+ #pod sub {
+ #pod my ($path, $state) = @_;
+ #pod $state->{$path}++ if -s $path > 102400
+ #pod return \0 if keys %$state == 10;
+ #pod },
+ #pod { recurse => 1 }
+ #pod );
+ #pod
+ #pod If you want more flexible iteration, use a module like L<Path::Iterator::Rule>.
+ #pod
+ #pod Current API available since 0.062.
+ #pod
+ #pod =cut
+
+ sub visit {
+ my $self = shift;
+ my $cb = shift;
+ my $args = _get_args( shift, qw/recurse follow_symlinks/ );
+ Carp::croak("Callback for visit() must be a code reference")
+ unless defined($cb) && ref($cb) eq 'CODE';
+ my $next = $self->iterator($args);
+ my $state = {};
+ while ( my $file = $next->() ) {
+ local $_ = $file;
+ my $r = $cb->( $file, $state );
+ last if ref($r) eq 'SCALAR' && !$$r;
+ }
+ return $state;
+ }
+
+ #pod =method volume
+ #pod
+ #pod $vol = path("/tmp/foo.txt")->volume; # ""
+ #pod $vol = path("C:/tmp/foo.txt")->volume; # "C:"
+ #pod
+ #pod Returns the volume portion of the path. This is equivalent
+ #pod equivalent to what L<File::Spec> would give from C<splitpath> and thus
+ #pod usually is the empty string on Unix-like operating systems or the
+ #pod drive letter for an absolute path on C<MSWin32>.
+ #pod
+ #pod Current API available since 0.001.
+ #pod
+ #pod =cut
+
+ sub volume {
+ my ($self) = @_;
+ $self->_splitpath unless defined $self->[VOL];
+ return $self->[VOL];
+ }
+
+ package Path::Tiny::Error;
+
+ our @CARP_NOT = qw/Path::Tiny/;
+
+ use overload ( q{""} => sub { (shift)->{msg} }, fallback => 1 );
+
+ sub throw {
+ my ( $class, $op, $file, $err ) = @_;
+ chomp( my $trace = Carp::shortmess );
+ my $msg = "Error $op on '$file': $err$trace\n";
+ die bless { op => $op, file => $file, err => $err, msg => $msg }, $class;
+ }
+
+ 1;
+
+
+ # vim: ts=4 sts=4 sw=4 et:
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ Path::Tiny - File path utility
+
+ =head1 VERSION
+
+ version 0.072
+
+ =head1 SYNOPSIS
+
+ use Path::Tiny;
+
+ # creating Path::Tiny objects
+
+ $dir = path("/tmp");
+ $foo = path("foo.txt");
+
+ $subdir = $dir->child("foo");
+ $bar = $subdir->child("bar.txt");
+
+ # stringifies as cleaned up path
+
+ $file = path("./foo.txt");
+ print $file; # "foo.txt"
+
+ # reading files
+
+ $guts = $file->slurp;
+ $guts = $file->slurp_utf8;
+
+ @lines = $file->lines;
+ @lines = $file->lines_utf8;
+
+ ($head) = $file->lines( {count => 1} );
+ ($tail) = $file->lines( {count => -1} );
+
+ # writing files
+
+ $bar->spew( @data );
+ $bar->spew_utf8( @data );
+
+ # reading directories
+
+ for ( $dir->children ) { ... }
+
+ $iter = $dir->iterator;
+ while ( my $next = $iter->() ) { ... }
+
+ =head1 DESCRIPTION
+
+ This module provide a small, fast utility for working with file paths. It is
+ friendlier to use than L<File::Spec> and provides easy access to functions from
+ several other core file handling modules. It aims to be smaller and faster
+ than many alternatives on CPAN while helping people do many common things in
+ consistent and less error-prone ways.
+
+ Path::Tiny does not try to work for anything except Unix-like and Win32
+ platforms. Even then, it might break if you try something particularly obscure
+ or tortuous. (Quick! What does this mean:
+ C<< ///../../..//./././a//b/.././c/././ >>? And how does it differ on Win32?)
+
+ All paths are forced to have Unix-style forward slashes. Stringifying
+ the object gives you back the path (after some clean up).
+
+ File input/output methods C<flock> handles before reading or writing,
+ as appropriate (if supported by the platform).
+
+ The C<*_utf8> methods (C<slurp_utf8>, C<lines_utf8>, etc.) operate in raw mode.
+ On Windows, that means they will not have CRLF translation from the C<:crlf> IO
+ layer. Installing L<Unicode::UTF8> 0.58 or later will speed up C<*_utf8>
+ situations in many cases and is highly recommended.
+
+ =head1 CONSTRUCTORS
+
+ =head2 path
+
+ $path = path("foo/bar");
+ $path = path("/tmp", "file.txt"); # list
+ $path = path("."); # cwd
+ $path = path("~user/file.txt"); # tilde processing
+
+ Constructs a C<Path::Tiny> object. It doesn't matter if you give a file or
+ directory path. It's still up to you to call directory-like methods only on
+ directories and file-like methods only on files. This function is exported
+ automatically by default.
+
+ The first argument must be defined and have non-zero length or an exception
+ will be thrown. This prevents subtle, dangerous errors with code like
+ C<< path( maybe_undef() )->remove_tree >>.
+
+ If the first component of the path is a tilde ('~') then the component will be
+ replaced with the output of C<glob('~')>. If the first component of the path
+ is a tilde followed by a user name then the component will be replaced with
+ output of C<glob('~username')>. Behaviour for non-existent users depends on
+ the output of C<glob> on the system.
+
+ On Windows, if the path consists of a drive identifier without a path component
+ (C<C:> or C<D:>), it will be expanded to the absolute path of the current
+ directory on that volume using C<Cwd::getdcwd()>.
+
+ If called with a single C<Path::Tiny> argument, the original is returned unless
+ the original is holding a temporary file or directory reference in which case a
+ stringified copy is made.
+
+ $path = path("foo/bar");
+ $temp = Path::Tiny->tempfile;
+
+ $p2 = path($path); # like $p2 = $path
+ $t2 = path($temp); # like $t2 = path( "$temp" )
+
+ This optimizes copies without proliferating references unexpectedly if a copy is
+ made by code outside your control.
+
+ Current API available since 0.017.
+
+ =head2 new
+
+ $path = Path::Tiny->new("foo/bar");
+
+ This is just like C<path>, but with method call overhead. (Why would you
+ do that?)
+
+ Current API available since 0.001.
+
+ =head2 cwd
+
+ $path = Path::Tiny->cwd; # path( Cwd::getcwd )
+ $path = cwd; # optional export
+
+ Gives you the absolute path to the current directory as a C<Path::Tiny> object.
+ This is slightly faster than C<< path(".")->absolute >>.
+
+ C<cwd> may be exported on request and used as a function instead of as a
+ method.
+
+ Current API available since 0.018.
+
+ =head2 rootdir
+
+ $path = Path::Tiny->rootdir; # /
+ $path = rootdir; # optional export
+
+ Gives you C<< File::Spec->rootdir >> as a C<Path::Tiny> object if you're too
+ picky for C<path("/")>.
+
+ C<rootdir> may be exported on request and used as a function instead of as a
+ method.
+
+ Current API available since 0.018.
+
+ =head2 tempfile, tempdir
+
+ $temp = Path::Tiny->tempfile( @options );
+ $temp = Path::Tiny->tempdir( @options );
+ $temp = tempfile( @options ); # optional export
+ $temp = tempdir( @options ); # optional export
+
+ C<tempfile> passes the options to C<< File::Temp->new >> and returns a C<Path::Tiny>
+ object with the file name. The C<TMPDIR> option is enabled by default.
+
+ The resulting C<File::Temp> object is cached. When the C<Path::Tiny> object is
+ destroyed, the C<File::Temp> object will be as well.
+
+ C<File::Temp> annoyingly requires you to specify a custom template in slightly
+ different ways depending on which function or method you call, but
+ C<Path::Tiny> lets you ignore that and can take either a leading template or a
+ C<TEMPLATE> option and does the right thing.
+
+ $temp = Path::Tiny->tempfile( "customXXXXXXXX" ); # ok
+ $temp = Path::Tiny->tempfile( TEMPLATE => "customXXXXXXXX" ); # ok
+
+ The tempfile path object will be normalized to have an absolute path, even if
+ created in a relative directory using C<DIR>.
+
+ C<tempdir> is just like C<tempfile>, except it calls
+ C<< File::Temp->newdir >> instead.
+
+ Both C<tempfile> and C<tempdir> may be exported on request and used as
+ functions instead of as methods.
+
+ B<Note>: for tempfiles, the filehandles from File::Temp are closed and not
+ reused. This is not as secure as using File::Temp handles directly, but is
+ less prone to deadlocks or access problems on some platforms. Think of what
+ C<Path::Tiny> gives you to be just a temporary file B<name> that gets cleaned
+ up.
+
+ Current API available since 0.018.
+
+ =head1 METHODS
+
+ =head2 absolute
+
+ $abs = path("foo/bar")->absolute;
+ $abs = path("foo/bar")->absolute("/tmp");
+
+ Returns a new C<Path::Tiny> object with an absolute path (or itself if already
+ absolute). Unless an argument is given, the current directory is used as the
+ absolute base path. The argument must be absolute or you won't get an absolute
+ result.
+
+ This will not resolve upward directories ("foo/../bar") unless C<canonpath>
+ in L<File::Spec> would normally do so on your platform. If you need them
+ resolved, you must call the more expensive C<realpath> method instead.
+
+ On Windows, an absolute path without a volume component will have it added
+ based on the current drive.
+
+ Current API available since 0.001.
+
+ =head2 append, append_raw, append_utf8
+
+ path("foo.txt")->append(@data);
+ path("foo.txt")->append(\@data);
+ path("foo.txt")->append({binmode => ":raw"}, @data);
+ path("foo.txt")->append_raw(@data);
+ path("foo.txt")->append_utf8(@data);
+
+ Appends data to a file. The file is locked with C<flock> prior to writing. An
+ optional hash reference may be used to pass options. Valid options are:
+
+ =over 4
+
+ =item *
+
+ C<binmode>: passed to C<binmode()> on the handle used for writing.
+
+ =item *
+
+ C<truncate>: truncates the file after locking and before appending
+
+ =back
+
+ The C<truncate> option is a way to replace the contents of a file
+ B<in place>, unlike L</spew> which writes to a temporary file and then
+ replaces the original (if it exists).
+
+ C<append_raw> is like C<append> with a C<binmode> of C<:unix> for fast,
+ unbuffered, raw write.
+
+ C<append_utf8> is like C<append> with a C<binmode> of
+ C<:unix:encoding(UTF-8)>. If L<Unicode::UTF8> 0.58+ is installed, a raw
+ append will be done instead on the data encoded with C<Unicode::UTF8>.
+
+ Current API available since 0.060.
+
+ =head2 assert
+
+ $path = path("foo.txt")->assert( sub { $_->exists } );
+
+ Returns the invocant after asserting that a code reference argument returns
+ true. When the assertion code reference runs, it will have the invocant
+ object in the C<$_> variable. If it returns false, an exception will be
+ thrown. The assertion code reference may also throw its own exception.
+
+ If no assertion is provided, the invocant is returned without error.
+
+ Current API available since 0.062.
+
+ =head2 basename
+
+ $name = path("foo/bar.txt")->basename; # bar.txt
+ $name = path("foo.txt")->basename('.txt'); # foo
+ $name = path("foo.txt")->basename(qr/.txt/); # foo
+ $name = path("foo.txt")->basename(@suffixes);
+
+ Returns the file portion or last directory portion of a path.
+
+ Given a list of suffixes as strings or regular expressions, any that match at
+ the end of the file portion or last directory portion will be removed before
+ the result is returned.
+
+ Current API available since 0.054.
+
+ =head2 canonpath
+
+ $canonical = path("foo/bar")->canonpath; # foo\bar on Windows
+
+ Returns a string with the canonical format of the path name for
+ the platform. In particular, this means directory separators
+ will be C<\> on Windows.
+
+ Current API available since 0.001.
+
+ =head2 child
+
+ $file = path("/tmp")->child("foo.txt"); # "/tmp/foo.txt"
+ $file = path("/tmp")->child(@parts);
+
+ Returns a new C<Path::Tiny> object relative to the original. Works
+ like C<catfile> or C<catdir> from File::Spec, but without caring about
+ file or directories.
+
+ Current API available since 0.001.
+
+ =head2 children
+
+ @paths = path("/tmp")->children;
+ @paths = path("/tmp")->children( qr/\.txt$/ );
+
+ Returns a list of C<Path::Tiny> objects for all files and directories
+ within a directory. Excludes "." and ".." automatically.
+
+ If an optional C<qr//> argument is provided, it only returns objects for child
+ names that match the given regular expression. Only the base name is used
+ for matching:
+
+ @paths = path("/tmp")->children( qr/^foo/ );
+ # matches children like the glob foo*
+
+ Current API available since 0.028.
+
+ =head2 chmod
+
+ path("foo.txt")->chmod(0777);
+ path("foo.txt")->chmod("0755");
+ path("foo.txt")->chmod("go-w");
+ path("foo.txt")->chmod("a=r,u+wx");
+
+ Sets file or directory permissions. The argument can be a numeric mode, a
+ octal string beginning with a "0" or a limited subset of the symbolic mode use
+ by F</bin/chmod>.
+
+ The symbolic mode must be a comma-delimited list of mode clauses. Clauses must
+ match C<< qr/\A([augo]+)([=+-])([rwx]+)\z/ >>, which defines "who", "op" and
+ "perms" parameters for each clause. Unlike F</bin/chmod>, all three parameters
+ are required for each clause, multiple ops are not allowed and permissions
+ C<stugoX> are not supported. (See L<File::chmod> for more complex needs.)
+
+ Current API available since 0.053.
+
+ =head2 copy
+
+ path("/tmp/foo.txt")->copy("/tmp/bar.txt");
+
+ Copies a file using L<File::Copy>'s C<copy> function. Upon
+ success, returns the C<Path::Tiny> object for the newly copied
+ file.
+
+ Current API available since 0.070.
+
+ =head2 digest
+
+ $obj = path("/tmp/foo.txt")->digest; # SHA-256
+ $obj = path("/tmp/foo.txt")->digest("MD5"); # user-selected
+ $obj = path("/tmp/foo.txt")->digest( { chunk_size => 1e6 }, "MD5" );
+
+ Returns a hexadecimal digest for a file. An optional hash reference of options may
+ be given. The only option is C<chunk_size>. If C<chunk_size> is given, that many
+ bytes will be read at a time. If not provided, the entire file will be slurped
+ into memory to compute the digest.
+
+ Any subsequent arguments are passed to the constructor for L<Digest> to select
+ an algorithm. If no arguments are given, the default is SHA-256.
+
+ Current API available since 0.056.
+
+ =head2 dirname (deprecated)
+
+ $name = path("/tmp/foo.txt")->dirname; # "/tmp/"
+
+ Returns the directory portion you would get from calling
+ C<< File::Spec->splitpath( $path->stringify ) >> or C<"."> for a path without a
+ parent directory portion. Because L<File::Spec> is inconsistent, the result
+ might or might not have a trailing slash. Because of this, this method is
+ B<deprecated>.
+
+ A better, more consistently approach is likely C<< $path->parent->stringify >>,
+ which will not have a trailing slash except for a root directory.
+
+ Deprecated in 0.056.
+
+ =head2 exists, is_file, is_dir
+
+ if ( path("/tmp")->exists ) { ... } # -e
+ if ( path("/tmp")->is_dir ) { ... } # -d
+ if ( path("/tmp")->is_file ) { ... } # -e && ! -d
+
+ Implements file test operations, this means the file or directory actually has
+ to exist on the filesystem. Until then, it's just a path.
+
+ B<Note>: C<is_file> is not C<-f> because C<-f> is not the opposite of C<-d>.
+ C<-f> means "plain file", excluding symlinks, devices, etc. that often can be
+ read just like files.
+
+ Use C<-f> instead if you really mean to check for a plain file.
+
+ Current API available since 0.053.
+
+ =head2 filehandle
+
+ $fh = path("/tmp/foo.txt")->filehandle($mode, $binmode);
+ $fh = path("/tmp/foo.txt")->filehandle({ locked => 1 }, $mode, $binmode);
+ $fh = path("/tmp/foo.txt")->filehandle({ exclusive => 1 }, $mode, $binmode);
+
+ Returns an open file handle. The C<$mode> argument must be a Perl-style
+ read/write mode string ("<" ,">", "<<", etc.). If a C<$binmode>
+ is given, it is set during the C<open> call.
+
+ An optional hash reference may be used to pass options.
+
+ The C<locked> option governs file locking; if true, handles opened for writing,
+ appending or read-write are locked with C<LOCK_EX>; otherwise, they are
+ locked with C<LOCK_SH>. When using C<locked>, ">" or "+>" modes will delay
+ truncation until after the lock is acquired.
+
+ The C<exclusive> option causes the open() call to fail if the file already
+ exists. This corresponds to the O_EXCL flag to sysopen / open(2).
+ C<exclusive> implies C<locked> and will set it for you if you forget it.
+
+ See C<openr>, C<openw>, C<openrw>, and C<opena> for sugar.
+
+ Current API available since 0.066.
+
+ =head2 is_absolute, is_relative
+
+ if ( path("/tmp")->is_absolute ) { ... }
+ if ( path("/tmp")->is_relative ) { ... }
+
+ Booleans for whether the path appears absolute or relative.
+
+ Current API available since 0.001.
+
+ =head2 is_rootdir
+
+ while ( ! $path->is_rootdir ) {
+ $path = $path->parent;
+ ...
+ }
+
+ Boolean for whether the path is the root directory of the volume. I.e. the
+ C<dirname> is C<q[/]> and the C<basename> is C<q[]>.
+
+ This works even on C<MSWin32> with drives and UNC volumes:
+
+ path("C:/")->is_rootdir; # true
+ path("//server/share/")->is_rootdir; #true
+
+ Current API available since 0.038.
+
+ =head2 iterator
+
+ $iter = path("/tmp")->iterator( \%options );
+
+ Returns a code reference that walks a directory lazily. Each invocation
+ returns a C<Path::Tiny> object or undef when the iterator is exhausted.
+
+ $iter = path("/tmp")->iterator;
+ while ( $path = $iter->() ) {
+ ...
+ }
+
+ The current and parent directory entries ("." and "..") will not
+ be included.
+
+ If the C<recurse> option is true, the iterator will walk the directory
+ recursively, breadth-first. If the C<follow_symlinks> option is also true,
+ directory links will be followed recursively. There is no protection against
+ loops when following links. If a directory is not readable, it will not be
+ followed.
+
+ The default is the same as:
+
+ $iter = path("/tmp")->iterator( {
+ recurse => 0,
+ follow_symlinks => 0,
+ } );
+
+ For a more powerful, recursive iterator with built-in loop avoidance, see
+ L<Path::Iterator::Rule>.
+
+ See also L</visit>.
+
+ Current API available since 0.016.
+
+ =head2 lines, lines_raw, lines_utf8
+
+ @contents = path("/tmp/foo.txt")->lines;
+ @contents = path("/tmp/foo.txt")->lines(\%options);
+ @contents = path("/tmp/foo.txt")->lines_raw;
+ @contents = path("/tmp/foo.txt")->lines_utf8;
+
+ @contents = path("/tmp/foo.txt")->lines( { chomp => 1, count => 4 } );
+
+ Returns a list of lines from a file. Optionally takes a hash-reference of
+ options. Valid options are C<binmode>, C<count> and C<chomp>.
+
+ If C<binmode> is provided, it will be set on the handle prior to reading.
+
+ If a positive C<count> is provided, that many lines will be returned from the
+ start of the file. If a negative C<count> is provided, the entire file will be
+ read, but only C<abs(count)> will be kept and returned. If C<abs(count)>
+ exceeds the number of lines in the file, all lines will be returned.
+
+ If C<chomp> is set, any end-of-line character sequences (C<CR>, C<CRLF>, or
+ C<LF>) will be removed from the lines returned.
+
+ Because the return is a list, C<lines> in scalar context will return the number
+ of lines (and throw away the data).
+
+ $number_of_lines = path("/tmp/foo.txt")->lines;
+
+ C<lines_raw> is like C<lines> with a C<binmode> of C<:raw>. We use C<:raw>
+ instead of C<:unix> so PerlIO buffering can manage reading by line.
+
+ C<lines_utf8> is like C<lines> with a C<binmode> of
+ C<:raw:encoding(UTF-8)>. If L<Unicode::UTF8> 0.58+ is installed, a raw
+ UTF-8 slurp will be done and then the lines will be split. This is
+ actually faster than relying on C<:encoding(UTF-8)>, though a bit memory
+ intensive. If memory use is a concern, consider C<openr_utf8> and
+ iterating directly on the handle.
+
+ Current API available since 0.065.
+
+ =head2 mkpath
+
+ path("foo/bar/baz")->mkpath;
+ path("foo/bar/baz")->mkpath( \%options );
+
+ Like calling C<make_path> from L<File::Path>. An optional hash reference
+ is passed through to C<make_path>. Errors will be trapped and an exception
+ thrown. Returns the list of directories created or an empty list if
+ the directories already exist, just like C<make_path>.
+
+ Current API available since 0.001.
+
+ =head2 move
+
+ path("foo.txt")->move("bar.txt");
+
+ Just like C<rename>.
+
+ Current API available since 0.001.
+
+ =head2 openr, openw, openrw, opena
+
+ $fh = path("foo.txt")->openr($binmode); # read
+ $fh = path("foo.txt")->openr_raw;
+ $fh = path("foo.txt")->openr_utf8;
+
+ $fh = path("foo.txt")->openw($binmode); # write
+ $fh = path("foo.txt")->openw_raw;
+ $fh = path("foo.txt")->openw_utf8;
+
+ $fh = path("foo.txt")->opena($binmode); # append
+ $fh = path("foo.txt")->opena_raw;
+ $fh = path("foo.txt")->opena_utf8;
+
+ $fh = path("foo.txt")->openrw($binmode); # read/write
+ $fh = path("foo.txt")->openrw_raw;
+ $fh = path("foo.txt")->openrw_utf8;
+
+ Returns a file handle opened in the specified mode. The C<openr> style methods
+ take a single C<binmode> argument. All of the C<open*> methods have
+ C<open*_raw> and C<open*_utf8> equivalents that use C<:raw> and
+ C<:raw:encoding(UTF-8)>, respectively.
+
+ An optional hash reference may be used to pass options. The only option is
+ C<locked>. If true, handles opened for writing, appending or read-write are
+ locked with C<LOCK_EX>; otherwise, they are locked for C<LOCK_SH>.
+
+ $fh = path("foo.txt")->openrw_utf8( { locked => 1 } );
+
+ See L</filehandle> for more on locking.
+
+ Current API available since 0.011.
+
+ =head2 parent
+
+ $parent = path("foo/bar/baz")->parent; # foo/bar
+ $parent = path("foo/wibble.txt")->parent; # foo
+
+ $parent = path("foo/bar/baz")->parent(2); # foo
+
+ Returns a C<Path::Tiny> object corresponding to the parent directory of the
+ original directory or file. An optional positive integer argument is the number
+ of parent directories upwards to return. C<parent> by itself is equivalent to
+ C<parent(1)>.
+
+ Current API available since 0.014.
+
+ =head2 realpath
+
+ $real = path("/baz/foo/../bar")->realpath;
+ $real = path("foo/../bar")->realpath;
+
+ Returns a new C<Path::Tiny> object with all symbolic links and upward directory
+ parts resolved using L<Cwd>'s C<realpath>. Compared to C<absolute>, this is
+ more expensive as it must actually consult the filesystem.
+
+ If the parent path can't be resolved (e.g. if it includes directories that
+ don't exist), an exception will be thrown:
+
+ $real = path("doesnt_exist/foo")->realpath; # dies
+
+ However, if the parent path exists and only the last component (e.g. filename)
+ doesn't exist, the realpath will be the realpath of the parent plus the
+ non-existent last component:
+
+ $real = path("./aasdlfasdlf")->realpath; # works
+
+ The underlying L<Cwd> module usually worked this way on Unix, but died on
+ Windows (and some Unixes) if the full path didn't exist. As of version 0.064,
+ it's safe to use anywhere.
+
+ Current API available since 0.001.
+
+ =head2 relative
+
+ $rel = path("/tmp/foo/bar")->relative("/tmp"); # foo/bar
+
+ Returns a C<Path::Tiny> object with a relative path name.
+ Given the trickiness of this, it's a thin wrapper around
+ C<< File::Spec->abs2rel() >>.
+
+ Current API available since 0.001.
+
+ =head2 remove
+
+ path("foo.txt")->remove;
+
+ This is just like C<unlink>, except for its error handling: if the path does
+ not exist, it returns false; if deleting the file fails, it throws an
+ exception.
+
+ Current API available since 0.012.
+
+ =head2 remove_tree
+
+ # directory
+ path("foo/bar/baz")->remove_tree;
+ path("foo/bar/baz")->remove_tree( \%options );
+ path("foo/bar/baz")->remove_tree( { safe => 0 } ); # force remove
+
+ Like calling C<remove_tree> from L<File::Path>, but defaults to C<safe> mode.
+ An optional hash reference is passed through to C<remove_tree>. Errors will be
+ trapped and an exception thrown. Returns the number of directories deleted,
+ just like C<remove_tree>.
+
+ If you want to remove a directory only if it is empty, use the built-in
+ C<rmdir> function instead.
+
+ rmdir path("foo/bar/baz/");
+
+ Current API available since 0.013.
+
+ =head2 sibling
+
+ $foo = path("/tmp/foo.txt");
+ $sib = $foo->sibling("bar.txt"); # /tmp/bar.txt
+ $sib = $foo->sibling("baz", "bam.txt"); # /tmp/baz/bam.txt
+
+ Returns a new C<Path::Tiny> object relative to the parent of the original.
+ This is slightly more efficient than C<< $path->parent->child(...) >>.
+
+ Current API available since 0.058.
+
+ =head2 slurp, slurp_raw, slurp_utf8
+
+ $data = path("foo.txt")->slurp;
+ $data = path("foo.txt")->slurp( {binmode => ":raw"} );
+ $data = path("foo.txt")->slurp_raw;
+ $data = path("foo.txt")->slurp_utf8;
+
+ Reads file contents into a scalar. Takes an optional hash reference may be
+ used to pass options. The only option is C<binmode>, which is passed to
+ C<binmode()> on the handle used for reading.
+
+ C<slurp_raw> is like C<slurp> with a C<binmode> of C<:unix> for
+ a fast, unbuffered, raw read.
+
+ C<slurp_utf8> is like C<slurp> with a C<binmode> of
+ C<:unix:encoding(UTF-8)>. If L<Unicode::UTF8> 0.58+ is installed, a raw
+ slurp will be done instead and the result decoded with C<Unicode::UTF8>.
+ This is just as strict and is roughly an order of magnitude faster than
+ using C<:encoding(UTF-8)>.
+
+ B<Note>: C<slurp> and friends lock the filehandle before slurping. If
+ you plan to slurp from a file created with L<File::Temp>, be sure to
+ close other handles or open without locking to avoid a deadlock:
+
+ my $tempfile = File::Temp->new(EXLOCK => 0);
+ my $guts = path($tempfile)->slurp;
+
+ Current API available since 0.004.
+
+ =head2 spew, spew_raw, spew_utf8
+
+ path("foo.txt")->spew(@data);
+ path("foo.txt")->spew(\@data);
+ path("foo.txt")->spew({binmode => ":raw"}, @data);
+ path("foo.txt")->spew_raw(@data);
+ path("foo.txt")->spew_utf8(@data);
+
+ Writes data to a file atomically. The file is written to a temporary file in
+ the same directory, then renamed over the original. An optional hash reference
+ may be used to pass options. The only option is C<binmode>, which is passed to
+ C<binmode()> on the handle used for writing.
+
+ C<spew_raw> is like C<spew> with a C<binmode> of C<:unix> for a fast,
+ unbuffered, raw write.
+
+ C<spew_utf8> is like C<spew> with a C<binmode> of C<:unix:encoding(UTF-8)>.
+ If L<Unicode::UTF8> 0.58+ is installed, a raw spew will be done instead on
+ the data encoded with C<Unicode::UTF8>.
+
+ B<NOTE>: because the file is written to a temporary file and then renamed, the
+ new file will wind up with permissions based on your current umask. This is a
+ feature to protect you from a race condition that would otherwise give
+ different permissions than you might expect. If you really want to keep the
+ original mode flags, use L</append> with the C<truncate> option.
+
+ Current API available since 0.011.
+
+ =head2 stat, lstat
+
+ $stat = path("foo.txt")->stat;
+ $stat = path("/some/symlink")->lstat;
+
+ Like calling C<stat> or C<lstat> from L<File::stat>.
+
+ Current API available since 0.001.
+
+ =head2 stringify
+
+ $path = path("foo.txt");
+ say $path->stringify; # same as "$path"
+
+ Returns a string representation of the path. Unlike C<canonpath>, this method
+ returns the path standardized with Unix-style C</> directory separators.
+
+ Current API available since 0.001.
+
+ =head2 subsumes
+
+ path("foo/bar")->subsumes("foo/bar/baz"); # true
+ path("/foo/bar")->subsumes("/foo/baz"); # false
+
+ Returns true if the first path is a prefix of the second path at a directory
+ boundary.
+
+ This B<does not> resolve parent directory entries (C<..>) or symlinks:
+
+ path("foo/bar")->subsumes("foo/bar/../baz"); # true
+
+ If such things are important to you, ensure that both paths are resolved to
+ the filesystem with C<realpath>:
+
+ my $p1 = path("foo/bar")->realpath;
+ my $p2 = path("foo/bar/../baz")->realpath;
+ if ( $p1->subsumes($p2) ) { ... }
+
+ Current API available since 0.048.
+
+ =head2 touch
+
+ path("foo.txt")->touch;
+ path("foo.txt")->touch($epoch_secs);
+
+ Like the Unix C<touch> utility. Creates the file if it doesn't exist, or else
+ changes the modification and access times to the current time. If the first
+ argument is the epoch seconds then it will be used.
+
+ Returns the path object so it can be easily chained with other methods:
+
+ # won't die if foo.txt doesn't exist
+ $content = path("foo.txt")->touch->slurp;
+
+ Current API available since 0.015.
+
+ =head2 touchpath
+
+ path("bar/baz/foo.txt")->touchpath;
+
+ Combines C<mkpath> and C<touch>. Creates the parent directory if it doesn't exist,
+ before touching the file. Returns the path object like C<touch> does.
+
+ Current API available since 0.022.
+
+ =head2 visit
+
+ path("/tmp")->visit( \&callback, \%options );
+
+ Wraps the L</iterator> method to execute a callback for each directory entry.
+ It returns a hash reference with any state accumulated during
+ iteration.
+
+ The options are the same as for L</iterator>: C<recurse> and
+ C<follow_symlinks>. Both default to false.
+
+ The callback function will receive a C<Path::Tiny> object as the first argument
+ and a hash reference to accumulate state as the second argument. For example:
+
+ # collect files sizes
+ my $sizes = path("/tmp")->visit(
+ sub {
+ my ($path, $state) = @_;
+ return if $path->is_dir;
+ $state->{$path} = -s $path;
+ },
+ { recurse => 1 }
+ );
+
+ For convenience, the C<Path::Tiny> object will also be locally aliased as the
+ C<$_> global variable:
+
+ # print paths matching /foo/
+ path("/tmp")->visit( sub { say if /foo/ }, { recurse => 1} );
+
+ If the callback returns a B<reference> to a false scalar value, iteration will
+ terminate. This is not the same as "pruning" a directory search; this just
+ stops all iteration and returns the state hash reference.
+
+ # find up to 10 files larger than 100K
+ my $files = path("/tmp")->visit(
+ sub {
+ my ($path, $state) = @_;
+ $state->{$path}++ if -s $path > 102400
+ return \0 if keys %$state == 10;
+ },
+ { recurse => 1 }
+ );
+
+ If you want more flexible iteration, use a module like L<Path::Iterator::Rule>.
+
+ Current API available since 0.062.
+
+ =head2 volume
+
+ $vol = path("/tmp/foo.txt")->volume; # ""
+ $vol = path("C:/tmp/foo.txt")->volume; # "C:"
+
+ Returns the volume portion of the path. This is equivalent
+ equivalent to what L<File::Spec> would give from C<splitpath> and thus
+ usually is the empty string on Unix-like operating systems or the
+ drive letter for an absolute path on C<MSWin32>.
+
+ Current API available since 0.001.
+
+ =for Pod::Coverage openr_utf8 opena_utf8 openw_utf8 openrw_utf8
+ openr_raw opena_raw openw_raw openrw_raw
+ IS_BSD IS_WIN32 FREEZE THAW TO_JSON
+
+ =head1 EXCEPTION HANDLING
+
+ Simple usage errors will generally croak. Failures of underlying Perl
+ functions will be thrown as exceptions in the class
+ C<Path::Tiny::Error>.
+
+ A C<Path::Tiny::Error> object will be a hash reference with the following fields:
+
+ =over 4
+
+ =item *
+
+ C<op> — a description of the operation, usually function call and any extra info
+
+ =item *
+
+ C<file> — the file or directory relating to the error
+
+ =item *
+
+ C<err> — hold C<$!> at the time the error was thrown
+
+ =item *
+
+ C<msg> — a string combining the above data and a Carp-like short stack trace
+
+ =back
+
+ Exception objects will stringify as the C<msg> field.
+
+ =head1 CAVEATS
+
+ =head2 File locking
+
+ If flock is not supported on a platform, it will not be used, even if
+ locking is requested.
+
+ See additional caveats below.
+
+ =head3 NFS and BSD
+
+ On BSD, Perl's flock implementation may not work to lock files on an
+ NFS filesystem. Path::Tiny has some heuristics to detect this
+ and will warn once and let you continue in an unsafe mode. If you
+ want this failure to be fatal, you can fatalize the 'flock' warnings
+ category:
+
+ use warnings FATAL => 'flock';
+
+ =head3 AIX and locking
+
+ AIX requires a write handle for locking. Therefore, calls that normally
+ open a read handle and take a shared lock instead will open a read-write
+ handle and take an exclusive lock. If the user does not have write
+ permission, no lock will be used.
+
+ =head2 utf8 vs UTF-8
+
+ All the C<*_utf8> methods use C<:encoding(UTF-8)> -- either as
+ C<:unix:encoding(UTF-8)> (unbuffered) or C<:raw:encoding(UTF-8)> (buffered) --
+ which is strict against the Unicode spec and disallows illegal Unicode
+ codepoints or UTF-8 sequences.
+
+ Unfortunately, C<:encoding(UTF-8)> is very, very slow. If you install
+ L<Unicode::UTF8> 0.58 or later, that module will be used by some C<*_utf8>
+ methods to encode or decode data after a raw, binary input/output operation,
+ which is much faster.
+
+ If you need the performance and can accept the security risk,
+ C<< slurp({binmode => ":unix:utf8"}) >> will be faster than C<:unix:encoding(UTF-8)>
+ (but not as fast as C<Unicode::UTF8>).
+
+ Note that the C<*_utf8> methods read in B<raw> mode. There is no CRLF
+ translation on Windows. If you must have CRLF translation, use the regular
+ input/output methods with an appropriate binmode:
+
+ $path->spew_utf8($data); # raw
+ $path->spew({binmode => ":encoding(UTF-8)"}, $data; # LF -> CRLF
+
+ Consider L<PerlIO::utf8_strict> for a faster L<PerlIO> layer alternative to
+ C<:encoding(UTF-8)>, though it does not appear to be as fast as the
+ C<Unicode::UTF8> approach.
+
+ =head2 Default IO layers and the open pragma
+
+ If you have Perl 5.10 or later, file input/output methods (C<slurp>, C<spew>,
+ etc.) and high-level handle opening methods ( C<filehandle>, C<openr>,
+ C<openw>, etc. ) respect default encodings set by the C<-C> switch or lexical
+ L<open> settings of the caller. For UTF-8, this is almost certainly slower
+ than using the dedicated C<_utf8> methods if you have L<Unicode::UTF8>.
+
+ =head1 TYPE CONSTRAINTS AND COERCION
+
+ A standard L<MooseX::Types> library is available at
+ L<MooseX::Types::Path::Tiny>. A L<Type::Tiny> equivalent is available as
+ L<Types::Path::Tiny>.
+
+ =head1 SEE ALSO
+
+ These are other file/path utilities, which may offer a different feature
+ set than C<Path::Tiny>.
+
+ =over 4
+
+ =item *
+
+ L<File::chmod>
+
+ =item *
+
+ L<File::Fu>
+
+ =item *
+
+ L<IO::All>
+
+ =item *
+
+ L<Path::Class>
+
+ =back
+
+ These iterators may be slightly faster than the recursive iterator in
+ C<Path::Tiny>:
+
+ =over 4
+
+ =item *
+
+ L<Path::Iterator::Rule>
+
+ =item *
+
+ L<File::Next>
+
+ =back
+
+ There are probably comparable, non-Tiny tools. Let me know if you want me to
+ add a module to the list.
+
+ This module was featured in the L<2013 Perl Advent Calendar|http://www.perladvent.org/2013/2013-12-18.html>.
+
+ =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
+
+ =head1 SUPPORT
+
+ =head2 Bugs / Feature Requests
+
+ Please report any bugs or feature requests through the issue tracker
+ at L<https://github.com/dagolden/Path-Tiny/issues>.
+ You will be notified automatically of any progress on your issue.
+
+ =head2 Source Code
+
+ This is open source software. The code repository is available for
+ public review and contribution under the terms of the license.
+
+ L<https://github.com/dagolden/Path-Tiny>
+
+ git clone https://github.com/dagolden/Path-Tiny.git
+
+ =head1 AUTHOR
+
+ David Golden <dagolden@cpan.org>
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Alex Efros Chris Williams David Steinbrunner Doug Bell Gabor Szabo Gabriel Andrade George Hartzell Geraud Continsouzas Goro Fuji Graham Knop James Hunt Karen Etheridge Martin Kjeldsen Michael G. Schwern Philippe Bruhat (BooK) Regina Verbae regina-verbae Smylers Tatsuhiko Miyagawa Toby Inkster Yanick Champoux ê¹€ë„형 - Keedi Kim
+
+ =over 4
+
+ =item *
+
+ Alex Efros <powerman@powerman.name>
+
+ =item *
+
+ Chris Williams <bingos@cpan.org>
+
+ =item *
+
+ David Steinbrunner <dsteinbrunner@pobox.com>
+
+ =item *
+
+ Doug Bell <madcityzen@gmail.com>
+
+ =item *
+
+ Gabor Szabo <szabgab@cpan.org>
+
+ =item *
+
+ Gabriel Andrade <gabiruh@gmail.com>
+
+ =item *
+
+ George Hartzell <hartzell@cpan.org>
+
+ =item *
+
+ Geraud Continsouzas <geraud@scsi.nc>
+
+ =item *
+
+ Goro Fuji <gfuji@cpan.org>
+
+ =item *
+
+ Graham Knop <haarg@haarg.org>
+
+ =item *
+
+ James Hunt <james@niftylogic.com>
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Martin Kjeldsen <mk@bluepipe.dk>
+
+ =item *
+
+ Michael G. Schwern <mschwern@cpan.org>
+
+ =item *
+
+ Philippe Bruhat (BooK) <book@cpan.org>
+
+ =item *
+
+ Regina Verbae <regina-verbae@users.noreply.github.com>
+
+ =item *
+
+ regina-verbae <regina-verbae@users.noreply.github.com>
+
+ =item *
+
+ Smylers <Smylers@stripey.com>
+
+ =item *
+
+ Tatsuhiko Miyagawa <miyagawa@bulknews.net>
+
+ =item *
+
+ Toby Inkster <tobyink@cpan.org>
+
+ =item *
+
+ Yanick Champoux <yanick@babyl.dyndns.org>
+
+ =item *
+
+ ê¹€ë„형 - Keedi Kim <keedi@cpan.org>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is Copyright (c) 2014 by David Golden.
+
+ This is free software, licensed under:
+
+ The Apache License, Version 2.0, January 2004
+
+ =cut
+PATH_TINY
+
+$fatpacked{"Sub/Exporter/Progressive.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUB_EXPORTER_PROGRESSIVE';
+ package Sub::Exporter::Progressive;
+
+ use strict;
+ use warnings;
+
+ our $VERSION = '0.001011';
+
+ use Carp ();
+ use List::Util ();
+
+ sub import {
+ my ($self, @args) = @_;
+
+ my $inner_target = caller;
+ my $export_data = sub_export_options($inner_target, @args);
+
+ my $full_exporter;
+ no strict 'refs';
+ @{"${inner_target}::EXPORT_OK"} = @{$export_data->{exports}};
+ @{"${inner_target}::EXPORT"} = @{$export_data->{defaults}};
+ %{"${inner_target}::EXPORT_TAGS"} = %{$export_data->{tags}};
+ *{"${inner_target}::import"} = sub {
+ use strict;
+ my ($self, @args) = @_;
+
+ if (List::Util::first { ref || !m/ \A [:-]? \w+ \z /xm } @args) {
+ Carp::croak 'your usage of Sub::Exporter::Progressive requires Sub::Exporter to be installed'
+ unless eval { require Sub::Exporter };
+ $full_exporter ||= Sub::Exporter::build_exporter($export_data->{original});
+
+ goto $full_exporter;
+ } elsif (defined(my $num = List::Util::first { !ref and m/^\d/ } @args)) {
+ die "cannot export symbols with a leading digit: '$num'";
+ } else {
+ require Exporter;
+ s/ \A - /:/xm for @args;
+ @_ = ($self, @args);
+ goto \&Exporter::import;
+ }
+ };
+ return;
+ }
+
+ my $too_complicated = <<'DEATH';
+ You are using Sub::Exporter::Progressive, but the features your program uses from
+ Sub::Exporter cannot be implemented without Sub::Exporter, so you might as well
+ just use vanilla Sub::Exporter
+ DEATH
+
+ sub sub_export_options {
+ my ($inner_target, $setup, $options) = @_;
+
+ my @exports;
+ my @defaults;
+ my %tags;
+
+ if ($setup eq '-setup') {
+ my %options = %$options;
+
+ OPTIONS:
+ for my $opt (keys %options) {
+ if ($opt eq 'exports') {
+
+ Carp::croak $too_complicated if ref $options{exports} ne 'ARRAY';
+ @exports = @{$options{exports}};
+ Carp::croak $too_complicated if List::Util::first { ref } @exports;
+
+ } elsif ($opt eq 'groups') {
+ %tags = %{$options{groups}};
+ for my $tagset (values %tags) {
+ Carp::croak $too_complicated if List::Util::first { / \A - (?! all \b ) /x || ref } @{$tagset};
+ }
+ @defaults = @{$tags{default} || [] };
+ } else {
+ Carp::croak $too_complicated;
+ }
+ }
+ @{$_} = map { / \A [:-] all \z /x ? @exports : $_ } @{$_} for \@defaults, values %tags;
+ $tags{all} ||= [ @exports ];
+ my %exports = map { $_ => 1 } @exports;
+ my @errors = grep { not $exports{$_} } @defaults;
+ Carp::croak join(', ', @errors) . " is not exported by the $inner_target module\n" if @errors;
+ }
+
+ return {
+ exports => \@exports,
+ defaults => \@defaults,
+ original => $options,
+ tags => \%tags,
+ };
+ }
+
+ 1;
+
+ =encoding utf8
+
+ =head1 NAME
+
+ Sub::Exporter::Progressive - Only use Sub::Exporter if you need it
+
+ =head1 SYNOPSIS
+
+ package Syntax::Keyword::Gather;
+
+ use Sub::Exporter::Progressive -setup => {
+ exports => [qw( break gather gathered take )],
+ groups => {
+ default => [qw( break gather gathered take )],
+ },
+ };
+
+ # elsewhere
+
+ # uses Exporter for speed
+ use Syntax::Keyword::Gather;
+
+ # somewhere else
+
+ # uses Sub::Exporter for features
+ use Syntax::Keyword::Gather 'gather', take => { -as => 'grab' };
+
+ =head1 DESCRIPTION
+
+ L<Sub::Exporter> is an incredibly powerful module, but with that power comes
+ great responsibility, er- as well as some runtime penalties. This module
+ is a C<Sub::Exporter> wrapper that will let your users just use L<Exporter>
+ if all they are doing is picking exports, but use C<Sub::Exporter> if your
+ users try to use C<Sub::Exporter>'s more advanced features, like
+ renaming exports, if they try to use them.
+
+ Note that this module will export C<@EXPORT>, C<@EXPORT_OK> and
+ C<%EXPORT_TAGS> package variables for C<Exporter> to work. Additionally, if
+ your package uses advanced C<Sub::Exporter> features like currying, this module
+ will only ever use C<Sub::Exporter>, so you might as well use it directly.
+
+ =head1 AUTHOR
+
+ frew - Arthur Axel Schmidt (cpan:FREW) <frioux+cpan@gmail.com>
+
+ =head1 CONTRIBUTORS
+
+ ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
+
+ mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
+
+ leont - Leon Timmermans (cpan:LEONT) <leont@cpan.org>
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2012 the Sub::Exporter::Progressive L</AUTHOR> and
+ L</CONTRIBUTORS> as listed above.
+
+ =head1 LICENSE
+
+ This library is free software and may be distributed under the same terms
+ as perl itself.
+
+ =cut
+SUB_EXPORTER_PROGRESSIVE
+
+$fatpacked{"Try/Tiny.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TRY_TINY';
+ package Try::Tiny;
+ BEGIN {
+ $Try::Tiny::AUTHORITY = 'cpan:NUFFIN';
+ }
+ $Try::Tiny::VERSION = '0.22';
+ use 5.006;
+ # ABSTRACT: minimal try/catch with proper preservation of $@
+
+ use strict;
+ use warnings;
+
+ use Exporter 5.57 'import';
+ our @EXPORT = our @EXPORT_OK = qw(try catch finally);
+
+ use Carp;
+ $Carp::Internal{+__PACKAGE__}++;
+
+ BEGIN { eval "use Sub::Name; 1" or *{subname} = sub {1} }
+
+ # Need to prototype as @ not $$ because of the way Perl evaluates the prototype.
+ # Keeping it at $$ means you only ever get 1 sub because we need to eval in a list
+ # context & not a scalar one
+
+ sub try (&;@) {
+ my ( $try, @code_refs ) = @_;
+
+ # we need to save this here, the eval block will be in scalar context due
+ # to $failed
+ my $wantarray = wantarray;
+
+ # work around perl bug by explicitly initializing these, due to the likelyhood
+ # this will be used in global destruction (perl rt#119311)
+ my ( $catch, @finally ) = ();
+
+ # find labeled blocks in the argument list.
+ # catch and finally tag the blocks by blessing a scalar reference to them.
+ foreach my $code_ref (@code_refs) {
+
+ if ( ref($code_ref) eq 'Try::Tiny::Catch' ) {
+ croak 'A try() may not be followed by multiple catch() blocks'
+ if $catch;
+ $catch = ${$code_ref};
+ } elsif ( ref($code_ref) eq 'Try::Tiny::Finally' ) {
+ push @finally, ${$code_ref};
+ } else {
+ croak(
+ 'try() encountered an unexpected argument ('
+ . ( defined $code_ref ? $code_ref : 'undef' )
+ . ') - perhaps a missing semi-colon before or'
+ );
+ }
+ }
+
+ # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's
+ # not perfect, but we could provide a list of additional errors for
+ # $catch->();
+
+ # name the blocks if we have Sub::Name installed
+ my $caller = caller;
+ subname("${caller}::try {...} " => $try);
+ subname("${caller}::catch {...} " => $catch) if $catch;
+ subname("${caller}::finally {...} " => $_) foreach @finally;
+
+ # save the value of $@ so we can set $@ back to it in the beginning of the eval
+ # and restore $@ after the eval finishes
+ my $prev_error = $@;
+
+ my ( @ret, $error );
+
+ # failed will be true if the eval dies, because 1 will not be returned
+ # from the eval body
+ my $failed = not eval {
+ $@ = $prev_error;
+
+ # evaluate the try block in the correct context
+ if ( $wantarray ) {
+ @ret = $try->();
+ } elsif ( defined $wantarray ) {
+ $ret[0] = $try->();
+ } else {
+ $try->();
+ };
+
+ return 1; # properly set $fail to false
+ };
+
+ # preserve the current error and reset the original value of $@
+ $error = $@;
+ $@ = $prev_error;
+
+ # set up a scope guard to invoke the finally block at the end
+ my @guards =
+ map { Try::Tiny::ScopeGuard->_new($_, $failed ? $error : ()) }
+ @finally;
+
+ # at this point $failed contains a true value if the eval died, even if some
+ # destructor overwrote $@ as the eval was unwinding.
+ if ( $failed ) {
+ # if we got an error, invoke the catch block.
+ if ( $catch ) {
+ # This works like given($error), but is backwards compatible and
+ # sets $_ in the dynamic scope for the body of C<$catch>
+ for ($error) {
+ return $catch->($error);
+ }
+
+ # in case when() was used without an explicit return, the C<for>
+ # loop will be aborted and there's no useful return value
+ }
+
+ return;
+ } else {
+ # no failure, $@ is back to what it was, everything is fine
+ return $wantarray ? @ret : $ret[0];
+ }
+ }
+
+ sub catch (&;@) {
+ my ( $block, @rest ) = @_;
+
+ croak 'Useless bare catch()' unless wantarray;
+
+ return (
+ bless(\$block, 'Try::Tiny::Catch'),
+ @rest,
+ );
+ }
+
+ sub finally (&;@) {
+ my ( $block, @rest ) = @_;
+
+ croak 'Useless bare finally()' unless wantarray;
+
+ return (
+ bless(\$block, 'Try::Tiny::Finally'),
+ @rest,
+ );
+ }
+
+ {
+ package # hide from PAUSE
+ Try::Tiny::ScopeGuard;
+
+ use constant UNSTABLE_DOLLARAT => ($] < '5.013002') ? 1 : 0;
+
+ sub _new {
+ shift;
+ bless [ @_ ];
+ }
+
+ sub DESTROY {
+ my ($code, @args) = @{ $_[0] };
+
+ local $@ if UNSTABLE_DOLLARAT;
+ eval {
+ $code->(@args);
+ 1;
+ } or do {
+ warn
+ "Execution of finally() block $code resulted in an exception, which "
+ . '*CAN NOT BE PROPAGATED* due to fundamental limitations of Perl. '
+ . 'Your program will continue as if this event never took place. '
+ . "Original exception text follows:\n\n"
+ . (defined $@ ? $@ : '$@ left undefined...')
+ . "\n"
+ ;
+ }
+ }
+ }
+
+ __PACKAGE__
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ Try::Tiny - minimal try/catch with proper preservation of $@
+
+ =head1 VERSION
+
+ version 0.22
+
+ =head1 SYNOPSIS
+
+ You can use Try::Tiny's C<try> and C<catch> to expect and handle exceptional
+ conditions, avoiding quirks in Perl and common mistakes:
+
+ # handle errors with a catch handler
+ try {
+ die "foo";
+ } catch {
+ warn "caught error: $_"; # not $@
+ };
+
+ You can also use it like a standalone C<eval> to catch and ignore any error
+ conditions. Obviously, this is an extreme measure not to be undertaken
+ lightly:
+
+ # just silence errors
+ try {
+ die "foo";
+ };
+
+ =head1 DESCRIPTION
+
+ This module provides bare bones C<try>/C<catch>/C<finally> statements that are designed to
+ minimize common mistakes with eval blocks, and NOTHING else.
+
+ This is unlike L<TryCatch> which provides a nice syntax and avoids adding
+ another call stack layer, and supports calling C<return> from the C<try> block to
+ return from the parent subroutine. These extra features come at a cost of a few
+ dependencies, namely L<Devel::Declare> and L<Scope::Upper> which are
+ occasionally problematic, and the additional catch filtering uses L<Moose>
+ type constraints which may not be desirable either.
+
+ The main focus of this module is to provide simple and reliable error handling
+ for those having a hard time installing L<TryCatch>, but who still want to
+ write correct C<eval> blocks without 5 lines of boilerplate each time.
+
+ It's designed to work as correctly as possible in light of the various
+ pathological edge cases (see L</BACKGROUND>) and to be compatible with any style
+ of error values (simple strings, references, objects, overloaded objects, etc).
+
+ If the C<try> block dies, it returns the value of the last statement executed in
+ the C<catch> block, if there is one. Otherwise, it returns C<undef> in scalar
+ context or the empty list in list context. The following examples all
+ assign C<"bar"> to C<$x>:
+
+ my $x = try { die "foo" } catch { "bar" };
+ my $x = try { die "foo" } || { "bar" };
+ my $x = (try { die "foo" }) // { "bar" };
+
+ my $x = eval { die "foo" } || "bar";
+
+ You can add C<finally> blocks, yielding the following:
+
+ my $x;
+ try { die 'foo' } finally { $x = 'bar' };
+ try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' };
+
+ C<finally> blocks are always executed making them suitable for cleanup code
+ which cannot be handled using local. You can add as many C<finally> blocks to a
+ given C<try> block as you like.
+
+ Note that adding a C<finally> block without a preceding C<catch> block
+ suppresses any errors. This behaviour is consistent with using a standalone
+ C<eval>, but it is not consistent with C<try>/C<finally> patterns found in
+ other programming languages, such as Java, Python, Javascript or C#. If you
+ learnt the C<try>/C<finally> pattern from one of these languages, watch out for
+ this.
+
+ =head1 EXPORTS
+
+ All functions are exported by default using L<Exporter>.
+
+ If you need to rename the C<try>, C<catch> or C<finally> keyword consider using
+ L<Sub::Import> to get L<Sub::Exporter>'s flexibility.
+
+ =over 4
+
+ =item try (&;@)
+
+ Takes one mandatory C<try> subroutine, an optional C<catch> subroutine and C<finally>
+ subroutine.
+
+ The mandatory subroutine is evaluated in the context of an C<eval> block.
+
+ If no error occurred the value from the first block is returned, preserving
+ list/scalar context.
+
+ If there was an error and the second subroutine was given it will be invoked
+ with the error in C<$_> (localized) and as that block's first and only
+ argument.
+
+ C<$@> does B<not> contain the error. Inside the C<catch> block it has the same
+ value it had before the C<try> block was executed.
+
+ Note that the error may be false, but if that happens the C<catch> block will
+ still be invoked.
+
+ Once all execution is finished then the C<finally> block, if given, will execute.
+
+ =item catch (&;@)
+
+ Intended to be used in the second argument position of C<try>.
+
+ Returns a reference to the subroutine it was given but blessed as
+ C<Try::Tiny::Catch> which allows try to decode correctly what to do
+ with this code reference.
+
+ catch { ... }
+
+ Inside the C<catch> block the caught error is stored in C<$_>, while previous
+ value of C<$@> is still available for use. This value may or may not be
+ meaningful depending on what happened before the C<try>, but it might be a good
+ idea to preserve it in an error stack.
+
+ For code that captures C<$@> when throwing new errors (i.e.
+ L<Class::Throwable>), you'll need to do:
+
+ local $@ = $_;
+
+ =item finally (&;@)
+
+ try { ... }
+ catch { ... }
+ finally { ... };
+
+ Or
+
+ try { ... }
+ finally { ... };
+
+ Or even
+
+ try { ... }
+ finally { ... }
+ catch { ... };
+
+ Intended to be the second or third element of C<try>. C<finally> blocks are always
+ executed in the event of a successful C<try> or if C<catch> is run. This allows
+ you to locate cleanup code which cannot be done via C<local()> e.g. closing a file
+ handle.
+
+ When invoked, the C<finally> block is passed the error that was caught. If no
+ error was caught, it is passed nothing. (Note that the C<finally> block does not
+ localize C<$_> with the error, since unlike in a C<catch> block, there is no way
+ to know if C<$_ == undef> implies that there were no errors.) In other words,
+ the following code does just what you would expect:
+
+ try {
+ die_sometimes();
+ } catch {
+ # ...code run in case of error
+ } finally {
+ if (@_) {
+ print "The try block died with: @_\n";
+ } else {
+ print "The try block ran without error.\n";
+ }
+ };
+
+ B<You must always do your own error handling in the C<finally> block>. C<Try::Tiny> will
+ not do anything about handling possible errors coming from code located in these
+ blocks.
+
+ Furthermore B<exceptions in C<finally> blocks are not trappable and are unable
+ to influence the execution of your program>. This is due to limitation of
+ C<DESTROY>-based scope guards, which C<finally> is implemented on top of. This
+ may change in a future version of Try::Tiny.
+
+ In the same way C<catch()> blesses the code reference this subroutine does the same
+ except it bless them as C<Try::Tiny::Finally>.
+
+ =back
+
+ =head1 BACKGROUND
+
+ There are a number of issues with C<eval>.
+
+ =head2 Clobbering $@
+
+ When you run an C<eval> block and it succeeds, C<$@> will be cleared, potentially
+ clobbering an error that is currently being caught.
+
+ This causes action at a distance, clearing previous errors your caller may have
+ not yet handled.
+
+ C<$@> must be properly localized before invoking C<eval> in order to avoid this
+ issue.
+
+ More specifically, C<$@> is clobbered at the beginning of the C<eval>, which
+ also makes it impossible to capture the previous error before you die (for
+ instance when making exception objects with error stacks).
+
+ For this reason C<try> will actually set C<$@> to its previous value (the one
+ available before entering the C<try> block) in the beginning of the C<eval>
+ block.
+
+ =head2 Localizing $@ silently masks errors
+
+ Inside an C<eval> block, C<die> behaves sort of like:
+
+ sub die {
+ $@ = $_[0];
+ return_undef_from_eval();
+ }
+
+ This means that if you were polite and localized C<$@> you can't die in that
+ scope, or your error will be discarded (printing "Something's wrong" instead).
+
+ The workaround is very ugly:
+
+ my $error = do {
+ local $@;
+ eval { ... };
+ $@;
+ };
+
+ ...
+ die $error;
+
+ =head2 $@ might not be a true value
+
+ This code is wrong:
+
+ if ( $@ ) {
+ ...
+ }
+
+ because due to the previous caveats it may have been unset.
+
+ C<$@> could also be an overloaded error object that evaluates to false, but
+ that's asking for trouble anyway.
+
+ The classic failure mode is:
+
+ sub Object::DESTROY {
+ eval { ... }
+ }
+
+ eval {
+ my $obj = Object->new;
+
+ die "foo";
+ };
+
+ if ( $@ ) {
+
+ }
+
+ In this case since C<Object::DESTROY> is not localizing C<$@> but still uses
+ C<eval>, it will set C<$@> to C<"">.
+
+ The destructor is called when the stack is unwound, after C<die> sets C<$@> to
+ C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has
+ been cleared by C<eval> in the destructor.
+
+ The workaround for this is even uglier than the previous ones. Even though we
+ can't save the value of C<$@> from code that doesn't localize, we can at least
+ be sure the C<eval> was aborted due to an error:
+
+ my $failed = not eval {
+ ...
+
+ return 1;
+ };
+
+ This is because an C<eval> that caught a C<die> will always return a false
+ value.
+
+ =head1 SHINY SYNTAX
+
+ Using Perl 5.10 you can use L<perlsyn/"Switch statements">.
+
+ The C<catch> block is invoked in a topicalizer context (like a C<given> block),
+ but note that you can't return a useful value from C<catch> using the C<when>
+ blocks without an explicit C<return>.
+
+ This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to
+ concisely match errors:
+
+ try {
+ require Foo;
+ } catch {
+ when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
+ default { die $_ }
+ };
+
+ =head1 CAVEATS
+
+ =over 4
+
+ =item *
+
+ C<@_> is not available within the C<try> block, so you need to copy your
+ arglist. In case you want to work with argument values directly via C<@_>
+ aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference:
+
+ sub foo {
+ my ( $self, @args ) = @_;
+ try { $self->bar(@args) }
+ }
+
+ or
+
+ sub bar_in_place {
+ my $self = shift;
+ my $args = \@_;
+ try { $_ = $self->bar($_) for @$args }
+ }
+
+ =item *
+
+ C<return> returns from the C<try> block, not from the parent sub (note that
+ this is also how C<eval> works, but not how L<TryCatch> works):
+
+ sub parent_sub {
+ try {
+ die;
+ }
+ catch {
+ return;
+ };
+
+ say "this text WILL be displayed, even though an exception is thrown";
+ }
+
+ Instead, you should capture the return value:
+
+ sub parent_sub {
+ my $success = try {
+ die;
+ 1;
+ };
+ return unless $success;
+
+ say "This text WILL NEVER appear!";
+ }
+ # OR
+ sub parent_sub_with_catch {
+ my $success = try {
+ die;
+ 1;
+ }
+ catch {
+ # do something with $_
+ return undef; #see note
+ };
+ return unless $success;
+
+ say "This text WILL NEVER appear!";
+ }
+
+ Note that if you have a C<catch> block, it must return C<undef> for this to work,
+ since if a C<catch> block exists, its return value is returned in place of C<undef>
+ when an exception is thrown.
+
+ =item *
+
+ C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp>
+ will not report this when using full stack traces, though, because
+ C<%Carp::Internal> is used. This lack of magic is considered a feature.
+
+ =item *
+
+ The value of C<$_> in the C<catch> block is not guaranteed to be the value of
+ the exception thrown (C<$@>) in the C<try> block. There is no safe way to
+ ensure this, since C<eval> may be used unhygenically in destructors. The only
+ guarantee is that the C<catch> will be called if an exception is thrown.
+
+ =item *
+
+ The return value of the C<catch> block is not ignored, so if testing the result
+ of the expression for truth on success, be sure to return a false value from
+ the C<catch> block:
+
+ my $obj = try {
+ MightFail->new;
+ } catch {
+ ...
+
+ return; # avoid returning a true value;
+ };
+
+ return unless $obj;
+
+ =item *
+
+ C<$SIG{__DIE__}> is still in effect.
+
+ Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of
+ C<eval> blocks, since it isn't people have grown to rely on it. Therefore in
+ the interests of compatibility, C<try> does not disable C<$SIG{__DIE__}> for
+ the scope of the error throwing code.
+
+ =item *
+
+ Lexical C<$_> may override the one set by C<catch>.
+
+ For example Perl 5.10's C<given> form uses a lexical C<$_>, creating some
+ confusing behavior:
+
+ given ($foo) {
+ when (...) {
+ try {
+ ...
+ } catch {
+ warn $_; # will print $foo, not the error
+ warn $_[0]; # instead, get the error like this
+ }
+ }
+ }
+
+ Note that this behavior was changed once again in L<Perl5 version 18
+ |https://metacpan.org/module/perldelta#given-now-aliases-the-global-_>.
+ However, since the entirety of lexical C<$_> is now L<considired experimental
+ |https://metacpan.org/module/perldelta#Lexical-_-is-now-experimental>, it
+ is unclear whether the new version 18 behavior is final.
+
+ =back
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item L<TryCatch>
+
+ Much more feature complete, more convenient semantics, but at the cost of
+ implementation complexity.
+
+ =item L<autodie>
+
+ Automatic error throwing for builtin functions and more. Also designed to
+ work well with C<given>/C<when>.
+
+ =item L<Throwable>
+
+ A lightweight role for rolling your own exception classes.
+
+ =item L<Error>
+
+ Exception object implementation with a C<try> statement. Does not localize
+ C<$@>.
+
+ =item L<Exception::Class::TryCatch>
+
+ Provides a C<catch> statement, but properly calling C<eval> is your
+ responsibility.
+
+ The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the
+ issues with C<$@>, but you still need to localize to prevent clobbering.
+
+ =back
+
+ =head1 LIGHTNING TALK
+
+ I gave a lightning talk about this module, you can see the slides (Firefox
+ only):
+
+ L<http://web.archive.org/web/20100628040134/http://nothingmuch.woobling.org/talks/takahashi.xul>
+
+ Or read the source:
+
+ L<http://web.archive.org/web/20100305133605/http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml>
+
+ =head1 VERSION CONTROL
+
+ L<http://github.com/doy/try-tiny/>
+
+ =head1 AUTHORS
+
+ =over 4
+
+ =item *
+
+ Yuval Kogman <nothingmuch@woobling.org>
+
+ =item *
+
+ Jesse Luehrs <doy@tozt.net>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is Copyright (c) 2014 by Yuval Kogman.
+
+ This is free software, licensed under:
+
+ The MIT (X11) License
+
+ =cut
+TRY_TINY
+
+$fatpacked{"Types/Serialiser.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TYPES_SERIALISER';
+ =head1 NAME
+
+ Types::Serialiser - simple data types for common serialisation formats
+
+ =encoding utf-8
+
+ =head1 SYNOPSIS
+
+ =head1 DESCRIPTION
+
+ This module provides some extra datatypes that are used by common
+ serialisation formats such as JSON or CBOR. The idea is to have a
+ repository of simple/small constants and containers that can be shared by
+ different implementations so they become interoperable between each other.
+
+ =cut
+
+ package Types::Serialiser;
+
+ use common::sense; # required to suppress annoying warnings
+
+ our $VERSION = '1.0';
+
+ =head1 SIMPLE SCALAR CONSTANTS
+
+ Simple scalar constants are values that are overloaded to act like simple
+ Perl values, but have (class) type to differentiate them from normal Perl
+ scalars. This is necessary because these have different representations in
+ the serialisation formats.
+
+ =head2 BOOLEANS (Types::Serialiser::Boolean class)
+
+ This type has only two instances, true and false. A natural representation
+ for these in Perl is C<1> and C<0>, but serialisation formats need to be
+ able to differentiate between them and mere numbers.
+
+ =over 4
+
+ =item $Types::Serialiser::true, Types::Serialiser::true
+
+ This value represents the "true" value. In most contexts is acts like
+ the number C<1>. It is up to you whether you use the variable form
+ (C<$Types::Serialiser::true>) or the constant form (C<Types::Serialiser::true>).
+
+ The constant is represented as a reference to a scalar containing C<1> -
+ implementations are allowed to directly test for this.
+
+ =item $Types::Serialiser::false, Types::Serialiser::false
+
+ This value represents the "false" value. In most contexts is acts like
+ the number C<0>. It is up to you whether you use the variable form
+ (C<$Types::Serialiser::false>) or the constant form (C<Types::Serialiser::false>).
+
+ The constant is represented as a reference to a scalar containing C<0> -
+ implementations are allowed to directly test for this.
+
+ =item $is_bool = Types::Serialiser::is_bool $value
+
+ Returns true iff the C<$value> is either C<$Types::Serialiser::true> or
+ C<$Types::Serialiser::false>.
+
+ For example, you could differentiate between a perl true value and a
+ C<Types::Serialiser::true> by using this:
+
+ $value && Types::Serialiser::is_bool $value
+
+ =item $is_true = Types::Serialiser::is_true $value
+
+ Returns true iff C<$value> is C<$Types::Serialiser::true>.
+
+ =item $is_false = Types::Serialiser::is_false $value
+
+ Returns false iff C<$value> is C<$Types::Serialiser::false>.
+
+ =back
+
+ =head2 ERROR (Types::Serialiser::Error class)
+
+ This class has only a single instance, C<error>. It is used to signal
+ an encoding or decoding error. In CBOR for example, and object that
+ couldn't be encoded will be represented by a CBOR undefined value, which
+ is represented by the error value in Perl.
+
+ =over 4
+
+ =item $Types::Serialiser::error, Types::Serialiser::error
+
+ This value represents the "error" value. Accessing values of this type
+ will throw an exception.
+
+ The constant is represented as a reference to a scalar containing C<undef>
+ - implementations are allowed to directly test for this.
+
+ =item $is_error = Types::Serialiser::is_error $value
+
+ Returns false iff C<$value> is C<$Types::Serialiser::error>.
+
+ =back
+
+ =cut
+
+ BEGIN {
+ # for historical reasons, and to avoid extra dependencies in JSON::PP,
+ # we alias *Types::Serialiser::Boolean with JSON::PP::Boolean.
+ package JSON::PP::Boolean;
+
+ *Types::Serialiser::Boolean:: = *JSON::PP::Boolean::;
+ }
+
+ {
+ # this must done before blessing to work around bugs
+ # in perl < 5.18 (it seems to be fixed in 5.18).
+ package Types::Serialiser::BooleanBase;
+
+ use overload
+ "0+" => sub { ${$_[0]} },
+ "++" => sub { $_[0] = ${$_[0]} + 1 },
+ "--" => sub { $_[0] = ${$_[0]} - 1 },
+ fallback => 1;
+
+ @Types::Serialiser::Boolean::ISA = Types::Serialiser::BooleanBase::;
+ }
+
+ our $true = do { bless \(my $dummy = 1), Types::Serialiser::Boolean:: };
+ our $false = do { bless \(my $dummy = 0), Types::Serialiser::Boolean:: };
+ our $error = do { bless \(my $dummy ), Types::Serialiser::Error:: };
+
+ sub true () { $true }
+ sub false () { $false }
+ sub error () { $error }
+
+ sub is_bool ($) { UNIVERSAL::isa $_[0], Types::Serialiser::Boolean:: }
+ sub is_true ($) { $_[0] && UNIVERSAL::isa $_[0], Types::Serialiser::Boolean:: }
+ sub is_false ($) { !$_[0] && UNIVERSAL::isa $_[0], Types::Serialiser::Boolean:: }
+ sub is_error ($) { UNIVERSAL::isa $_[0], Types::Serialiser::Error:: }
+
+ package Types::Serialiser::Error;
+
+ sub error {
+ require Carp;
+ Carp::croak ("caught attempt to use the Types::Serialiser::error value");
+ };
+
+ use overload
+ "0+" => \&error,
+ "++" => \&error,
+ "--" => \&error,
+ fallback => 1;
+
+ =head1 NOTES FOR XS USERS
+
+ The recommended way to detect whether a scalar is one of these objects
+ is to check whether the stash is the C<Types::Serialiser::Boolean> or
+ C<Types::Serialiser::Error> stash, and then follow the scalar reference to
+ see if it's C<1> (true), C<0> (false) or C<undef> (error).
+
+ While it is possible to use an isa test, directly comparing stash pointers
+ is faster and guaranteed to work.
+
+ For historical reasons, the C<Types::Serialiser::Boolean> stash is
+ just an alias for C<JSON::PP::Boolean>. When printed, the classname
+ with usually be C<JSON::PP::Boolean>, but isa tests and stash pointer
+ comparison will normally work correctly (i.e. Types::Serialiser::true ISA
+ JSON::PP::Boolean, but also ISA Types::Serialiser::Boolean).
+
+ =head1 A GENERIC OBJECT SERIALIATION PROTOCOL
+
+ This section explains the object serialisation protocol used by
+ L<CBOR::XS>. It is meant to be generic enough to support any kind of
+ generic object serialiser.
+
+ This protocol is called "the Types::Serialiser object serialisation
+ protocol".
+
+ =head2 ENCODING
+
+ When the encoder encounters an object that it cannot otherwise encode (for
+ example, L<CBOR::XS> can encode a few special types itself, and will first
+ attempt to use the special C<TO_CBOR> serialisation protocol), it will
+ look up the C<FREEZE> method on the object.
+
+ Note that the C<FREEZE> method will normally be called I<during> encoding,
+ and I<MUST NOT> change the data structure that is being encoded in any
+ way, or it might cause memory corruption or worse.
+
+ If it exists, it will call it with two arguments: the object to serialise,
+ and a constant string that indicates the name of the data model. For
+ example L<CBOR::XS> uses C<CBOR>, and the L<JSON> and L<JSON::XS> modules
+ (or any other JSON serialiser), would use C<JSON> as second argument.
+
+ The C<FREEZE> method can then return zero or more values to identify the
+ object instance. The serialiser is then supposed to encode the class name
+ and all of these return values (which must be encodable in the format)
+ using the relevant form for Perl objects. In CBOR for example, there is a
+ registered tag number for encoded perl objects.
+
+ The values that C<FREEZE> returns must be serialisable with the serialiser
+ that calls it. Therefore, it is recommended to use simple types such as
+ strings and numbers, and maybe array references and hashes (basically, the
+ JSON data model). You can always use a more complex format for a specific
+ data model by checking the second argument, the data model.
+
+ The "data model" is not the same as the "data format" - the data model
+ indicates what types and kinds of return values can be returned from
+ C<FREEZE>. For example, in C<CBOR> it is permissible to return tagged CBOR
+ values, while JSON does not support these at all, so C<JSON> would be a
+ valid (but too limited) data model name for C<CBOR::XS>. similarly, a
+ serialising format that supports more or less the same data model as JSON
+ could use C<JSON> as data model without losing anything.
+
+ =head2 DECODING
+
+ When the decoder then encounters such an encoded perl object, it should
+ look up the C<THAW> method on the stored classname, and invoke it with the
+ classname, the constant string to identify the data model/data format, and
+ all the return values returned by C<FREEZE>.
+
+ =head2 EXAMPLES
+
+ See the C<OBJECT SERIALISATION> section in the L<CBOR::XS> manpage for
+ more details, an example implementation, and code examples.
+
+ Here is an example C<FREEZE>/C<THAW> method pair:
+
+ sub My::Object::FREEZE {
+ my ($self, $model) = @_;
+
+ ($self->{type}, $self->{id}, $self->{variant})
+ }
+
+ sub My::Object::THAW {
+ my ($class, $model, $type, $id, $variant) = @_;
+
+ $class->new (type => $type, id => $id, variant => $variant)
+ }
+
+ =head1 BUGS
+
+ The use of L<overload> makes this module much heavier than it should be
+ (on my system, this module: 4kB RSS, overload: 260kB RSS).
+
+ =head1 SEE ALSO
+
+ Currently, L<JSON::XS> and L<CBOR::XS> use these types.
+
+ =head1 AUTHOR
+
+ Marc Lehmann <schmorp@schmorp.de>
+ http://home.schmorp.de/
+
+ =cut
+
+ 1
+
+TYPES_SERIALISER
+
+$fatpacked{"Types/Serialiser/Error.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TYPES_SERIALISER_ERROR';
+ =head1 NAME
+
+ Types::Serialiser::Error - dummy module for Types::Serialiser
+
+ =head1 SYNOPSIS
+
+ # do not "use" yourself
+
+ =head1 DESCRIPTION
+
+ This module exists only to provide overload resolution for Storable and
+ similar modules that assume that class name equals module name. See
+ L<Types::Serialiser> for more info about this class.
+
+ =cut
+
+ use Types::Serialiser ();
+
+ =head1 AUTHOR
+
+ Marc Lehmann <schmorp@schmorp.de>
+ http://home.schmorp.de/
+
+ =cut
+
+ 1
+
+TYPES_SERIALISER_ERROR
+
+$fatpacked{"parent.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARENT';
+ package parent;
+ use strict;
+ use vars qw($VERSION);
+ $VERSION = '0.234';
+
+ sub import {
+ my $class = shift;
+
+ my $inheritor = caller(0);
+
+ if ( @_ and $_[0] eq '-norequire' ) {
+ shift @_;
+ } else {
+ for ( my @filename = @_ ) {
+ s{::|'}{/}g;
+ require "$_.pm"; # dies if the file is not found
+ }
+ }
+
+ {
+ no strict 'refs';
+ push @{"$inheritor\::ISA"}, @_;
+ };
+ };
+
+ "All your base are belong to us"
+
+ __END__
+
+ =encoding utf8
+
+ =head1 NAME
+
+ parent - Establish an ISA relationship with base classes at compile time
+
+ =head1 SYNOPSIS
+
+ package Baz;
+ use parent qw(Foo Bar);
+
+ =head1 DESCRIPTION
+
+ Allows you to both load one or more modules, while setting up inheritance from
+ those modules at the same time. Mostly similar in effect to
+
+ package Baz;
+ BEGIN {
+ require Foo;
+ require Bar;
+ push @ISA, qw(Foo Bar);
+ }
+
+ By default, every base class needs to live in a file of its own.
+ If you want to have a subclass and its parent class in the same file, you
+ can tell C<parent> not to load any modules by using the C<-norequire> switch:
+
+ package Foo;
+ sub exclaim { "I CAN HAS PERL" }
+
+ package DoesNotLoadFooBar;
+ use parent -norequire, 'Foo', 'Bar';
+ # will not go looking for Foo.pm or Bar.pm
+
+ This is equivalent to the following code:
+
+ package Foo;
+ sub exclaim { "I CAN HAS PERL" }
+
+ package DoesNotLoadFooBar;
+ push @DoesNotLoadFooBar::ISA, 'Foo', 'Bar';
+
+ This is also helpful for the case where a package lives within
+ a differently named file:
+
+ package MyHash;
+ use Tie::Hash;
+ use parent -norequire, 'Tie::StdHash';
+
+ This is equivalent to the following code:
+
+ package MyHash;
+ require Tie::Hash;
+ push @ISA, 'Tie::StdHash';
+
+ If you want to load a subclass from a file that C<require> would
+ not consider an eligible filename (that is, it does not end in
+ either C<.pm> or C<.pmc>), use the following code:
+
+ package MySecondPlugin;
+ require './plugins/custom.plugin'; # contains Plugin::Custom
+ use parent -norequire, 'Plugin::Custom';
+
+ =head1 HISTORY
+
+ This module was forked from L<base> to remove the cruft
+ that had accumulated in it.
+
+ =head1 CAVEATS
+
+ =head1 SEE ALSO
+
+ L<base>
+
+ =head1 AUTHORS AND CONTRIBUTORS
+
+ Rafaël Garcia-Suarez, Bart Lateur, Max Maischein, Anno Siegel, Michael Schwern
+
+ =head1 MAINTAINER
+
+ Max Maischein C< corion@cpan.org >
+
+ Copyright (c) 2007-10 Max Maischein C<< <corion@cpan.org> >>
+ Based on the idea of C<base.pm>, which was introduced with Perl 5.004_04.
+
+ =head1 LICENSE
+
+ This module is released under the same terms as Perl itself.
+
+ =cut
+PARENT
+
+$fatpacked{"Cwd.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_CWD';
+ package Cwd;
+
+ =head1 NAME
+
+ Cwd - get pathname of current working directory
+
+ =head1 SYNOPSIS
+
+ use Cwd;
+ my $dir = getcwd;
+
+ use Cwd 'abs_path';
+ my $abs_path = abs_path($file);
+
+ =head1 DESCRIPTION
+
+ This module provides functions for determining the pathname of the
+ current working directory. It is recommended that getcwd (or another
+ *cwd() function) be used in I<all> code to ensure portability.
+
+ By default, it exports the functions cwd(), getcwd(), fastcwd(), and
+ fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.
+
+
+ =head2 getcwd and friends
+
+ Each of these functions are called without arguments and return the
+ absolute path of the current working directory.
+
+ =over 4
+
+ =item getcwd
+
+ my $cwd = getcwd();
+
+ Returns the current working directory.
+
+ Exposes the POSIX function getcwd(3) or re-implements it if it's not
+ available.
+
+ =item cwd
+
+ my $cwd = cwd();
+
+ The cwd() is the most natural form for the current architecture. For
+ most systems it is identical to `pwd` (but without the trailing line
+ terminator).
+
+ =item fastcwd
+
+ my $cwd = fastcwd();
+
+ A more dangerous version of getcwd(), but potentially faster.
+
+ It might conceivably chdir() you out of a directory that it can't
+ chdir() you back into. If fastcwd encounters a problem it will return
+ undef but will probably leave you in a different directory. For a
+ measure of extra security, if everything appears to have worked, the
+ fastcwd() function will check that it leaves you in the same directory
+ that it started in. If it has changed it will C<die> with the message
+ "Unstable directory path, current directory changed
+ unexpectedly". That should never happen.
+
+ =item fastgetcwd
+
+ my $cwd = fastgetcwd();
+
+ The fastgetcwd() function is provided as a synonym for cwd().
+
+ =item getdcwd
+
+ my $cwd = getdcwd();
+ my $cwd = getdcwd('C:');
+
+ The getdcwd() function is also provided on Win32 to get the current working
+ directory on the specified drive, since Windows maintains a separate current
+ working directory for each drive. If no drive is specified then the current
+ drive is assumed.
+
+ This function simply calls the Microsoft C library _getdcwd() function.
+
+ =back
+
+
+ =head2 abs_path and friends
+
+ These functions are exported only on request. They each take a single
+ argument and return the absolute pathname for it. If no argument is
+ given they'll use the current working directory.
+
+ =over 4
+
+ =item abs_path
+
+ my $abs_path = abs_path($file);
+
+ Uses the same algorithm as getcwd(). Symbolic links and relative-path
+ components ("." and "..") are resolved to return the canonical
+ pathname, just like realpath(3).
+
+ =item realpath
+
+ my $abs_path = realpath($file);
+
+ A synonym for abs_path().
+
+ =item fast_abs_path
+
+ my $abs_path = fast_abs_path($file);
+
+ A more dangerous, but potentially faster version of abs_path.
+
+ =back
+
+ =head2 $ENV{PWD}
+
+ If you ask to override your chdir() built-in function,
+
+ use Cwd qw(chdir);
+
+ then your PWD environment variable will be kept up to date. Note that
+ it will only be kept up to date if all packages which use chdir import
+ it from Cwd.
+
+
+ =head1 NOTES
+
+ =over 4
+
+ =item *
+
+ Since the path separators are different on some operating systems ('/'
+ on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
+ modules wherever portability is a concern.
+
+ =item *
+
+ Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
+ functions are all aliases for the C<cwd()> function, which, on Mac OS,
+ calls `pwd`. Likewise, the C<abs_path()> function is an alias for
+ C<fast_abs_path()>.
+
+ =back
+
+ =head1 AUTHOR
+
+ Originally by the perl5-porters.
+
+ Maintained by Ken Williams <KWILLIAMS@cpan.org>
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ Portions of the C code in this library are copyright (c) 1994 by the
+ Regents of the University of California. All rights reserved. The
+ license on this code is compatible with the licensing of the rest of
+ the distribution - please see the source code in F<Cwd.xs> for the
+ details.
+
+ =head1 SEE ALSO
+
+ L<File::chdir>
+
+ =cut
+
+ use strict;
+ use Exporter;
+ use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+
+ $VERSION = '3.47';
+ my $xs_version = $VERSION;
+ $VERSION =~ tr/_//;
+
+ @ISA = qw/ Exporter /;
+ @EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
+ push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32';
+ @EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
+
+ # sys_cwd may keep the builtin command
+
+ # All the functionality of this module may provided by builtins,
+ # there is no sense to process the rest of the file.
+ # The best choice may be to have this in BEGIN, but how to return from BEGIN?
+
+ if ($^O eq 'os2') {
+ local $^W = 0;
+
+ *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
+ *getcwd = \&cwd;
+ *fastgetcwd = \&cwd;
+ *fastcwd = \&cwd;
+
+ *fast_abs_path = \&sys_abspath if defined &sys_abspath;
+ *abs_path = \&fast_abs_path;
+ *realpath = \&fast_abs_path;
+ *fast_realpath = \&fast_abs_path;
+
+ return 1;
+ }
+
+ # Need to look up the feature settings on VMS. The preferred way is to use the
+ # VMS::Feature module, but that may not be available to dual life modules.
+
+ my $use_vms_feature;
+ BEGIN {
+ if ($^O eq 'VMS') {
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $use_vms_feature = 1;
+ }
+ }
+ }
+
+ # Need to look up the UNIX report mode. This may become a dynamic mode
+ # in the future.
+ sub _vms_unix_rpt {
+ my $unix_rpt;
+ if ($use_vms_feature) {
+ $unix_rpt = VMS::Feature::current("filename_unix_report");
+ } else {
+ my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
+ }
+ return $unix_rpt;
+ }
+
+ # Need to look up the EFS character set mode. This may become a dynamic
+ # mode in the future.
+ sub _vms_efs {
+ my $efs;
+ if ($use_vms_feature) {
+ $efs = VMS::Feature::current("efs_charset");
+ } else {
+ my $env_efs = $ENV{'DECC$EFS_CHARSET'} || '';
+ $efs = $env_efs =~ /^[ET1]/i;
+ }
+ return $efs;
+ }
+
+
+ # If loading the XS stuff doesn't work, we can fall back to pure perl
+ unless (defined &getcwd) {
+ eval {
+ if ( $] >= 5.006 ) {
+ require XSLoader;
+ XSLoader::load( __PACKAGE__, $xs_version);
+ } else {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ __PACKAGE__->bootstrap( $xs_version );
+ }
+ };
+ }
+
+ # Big nasty table of function aliases
+ my %METHOD_MAP =
+ (
+ VMS =>
+ {
+ cwd => '_vms_cwd',
+ getcwd => '_vms_cwd',
+ fastcwd => '_vms_cwd',
+ fastgetcwd => '_vms_cwd',
+ abs_path => '_vms_abs_path',
+ fast_abs_path => '_vms_abs_path',
+ },
+
+ MSWin32 =>
+ {
+ # We assume that &_NT_cwd is defined as an XSUB or in the core.
+ cwd => '_NT_cwd',
+ getcwd => '_NT_cwd',
+ fastcwd => '_NT_cwd',
+ fastgetcwd => '_NT_cwd',
+ abs_path => 'fast_abs_path',
+ realpath => 'fast_abs_path',
+ },
+
+ dos =>
+ {
+ cwd => '_dos_cwd',
+ getcwd => '_dos_cwd',
+ fastgetcwd => '_dos_cwd',
+ fastcwd => '_dos_cwd',
+ abs_path => 'fast_abs_path',
+ },
+
+ # QNX4. QNX6 has a $os of 'nto'.
+ qnx =>
+ {
+ cwd => '_qnx_cwd',
+ getcwd => '_qnx_cwd',
+ fastgetcwd => '_qnx_cwd',
+ fastcwd => '_qnx_cwd',
+ abs_path => '_qnx_abs_path',
+ fast_abs_path => '_qnx_abs_path',
+ },
+
+ cygwin =>
+ {
+ getcwd => 'cwd',
+ fastgetcwd => 'cwd',
+ fastcwd => 'cwd',
+ abs_path => 'fast_abs_path',
+ realpath => 'fast_abs_path',
+ },
+
+ epoc =>
+ {
+ cwd => '_epoc_cwd',
+ getcwd => '_epoc_cwd',
+ fastgetcwd => '_epoc_cwd',
+ fastcwd => '_epoc_cwd',
+ abs_path => 'fast_abs_path',
+ },
+
+ MacOS =>
+ {
+ getcwd => 'cwd',
+ fastgetcwd => 'cwd',
+ fastcwd => 'cwd',
+ abs_path => 'fast_abs_path',
+ },
+ );
+
+ $METHOD_MAP{NT} = $METHOD_MAP{MSWin32};
+
+
+ # Find the pwd command in the expected locations. We assume these
+ # are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
+ # so everything works under taint mode.
+ my $pwd_cmd;
+ foreach my $try ('/bin/pwd',
+ '/usr/bin/pwd',
+ '/QOpenSys/bin/pwd', # OS/400 PASE.
+ ) {
+
+ if( -x $try ) {
+ $pwd_cmd = $try;
+ last;
+ }
+ }
+
+ # Android has a built-in pwd. Using $pwd_cmd will DTRT if
+ # this perl was compiled with -Dd_useshellcmds, which is the
+ # default for Android, but the block below is needed for the
+ # miniperl running on the host when cross-compiling, and
+ # potentially for native builds with -Ud_useshellcmds.
+ if ($^O =~ /android/) {
+ # If targetsh is executable, then we're either a full
+ # perl, or a miniperl for a native build.
+ if (-x $Config::Config{targetsh}) {
+ $pwd_cmd = "$Config::Config{targetsh} -c pwd"
+ }
+ else {
+ $pwd_cmd = "$Config::Config{sh} -c pwd"
+ }
+ }
+
+ my $found_pwd_cmd = defined($pwd_cmd);
+ unless ($pwd_cmd) {
+ # Isn't this wrong? _backtick_pwd() will fail if someone has
+ # pwd in their path but it is not /bin/pwd or /usr/bin/pwd?
+ # See [perl #16774]. --jhi
+ $pwd_cmd = 'pwd';
+ }
+
+ # Lazy-load Carp
+ sub _carp { require Carp; Carp::carp(@_) }
+ sub _croak { require Carp; Carp::croak(@_) }
+
+ # The 'natural and safe form' for UNIX (pwd may be setuid root)
+ sub _backtick_pwd {
+ # Localize %ENV entries in a way that won't create new hash keys
+ my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV);
+ local @ENV{@localize};
+
+ my $cwd = `$pwd_cmd`;
+ # Belt-and-suspenders in case someone said "undef $/".
+ local $/ = "\n";
+ # `pwd` may fail e.g. if the disk is full
+ chomp($cwd) if defined $cwd;
+ $cwd;
+ }
+
+ # Since some ports may predefine cwd internally (e.g., NT)
+ # we take care not to override an existing definition for cwd().
+
+ unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) {
+ # The pwd command is not available in some chroot(2)'ed environments
+ my $sep = $Config::Config{path_sep} || ':';
+ my $os = $^O; # Protect $^O from tainting
+
+
+ # Try again to find a pwd, this time searching the whole PATH.
+ if (defined $ENV{PATH} and $os ne 'MSWin32') { # no pwd on Windows
+ my @candidates = split($sep, $ENV{PATH});
+ while (!$found_pwd_cmd and @candidates) {
+ my $candidate = shift @candidates;
+ $found_pwd_cmd = 1 if -x "$candidate/pwd";
+ }
+ }
+
+ # MacOS has some special magic to make `pwd` work.
+ if( $os eq 'MacOS' || $found_pwd_cmd )
+ {
+ *cwd = \&_backtick_pwd;
+ }
+ else {
+ *cwd = \&getcwd;
+ }
+ }
+
+ if ($^O eq 'cygwin') {
+ # We need to make sure cwd() is called with no args, because it's
+ # got an arg-less prototype and will die if args are present.
+ local $^W = 0;
+ my $orig_cwd = \&cwd;
+ *cwd = sub { &$orig_cwd() }
+ }
+
+
+ # set a reasonable (and very safe) default for fastgetcwd, in case it
+ # isn't redefined later (20001212 rspier)
+ *fastgetcwd = \&cwd;
+
+ # A non-XS version of getcwd() - also used to bootstrap the perl build
+ # process, when miniperl is running and no XS loading happens.
+ sub _perl_getcwd
+ {
+ abs_path('.');
+ }
+
+ # By John Bazik
+ #
+ # Usage: $cwd = &fastcwd;
+ #
+ # This is a faster version of getcwd. It's also more dangerous because
+ # you might chdir out of a directory that you can't chdir back into.
+
+ sub fastcwd_ {
+ my($odev, $oino, $cdev, $cino, $tdev, $tino);
+ my(@path, $path);
+ local(*DIR);
+
+ my($orig_cdev, $orig_cino) = stat('.');
+ ($cdev, $cino) = ($orig_cdev, $orig_cino);
+ for (;;) {
+ my $direntry;
+ ($odev, $oino) = ($cdev, $cino);
+ CORE::chdir('..') || return undef;
+ ($cdev, $cino) = stat('.');
+ last if $odev == $cdev && $oino == $cino;
+ opendir(DIR, '.') || return undef;
+ for (;;) {
+ $direntry = readdir(DIR);
+ last unless defined $direntry;
+ next if $direntry eq '.';
+ next if $direntry eq '..';
+
+ ($tdev, $tino) = lstat($direntry);
+ last unless $tdev != $odev || $tino != $oino;
+ }
+ closedir(DIR);
+ return undef unless defined $direntry; # should never happen
+ unshift(@path, $direntry);
+ }
+ $path = '/' . join('/', @path);
+ if ($^O eq 'apollo') { $path = "/".$path; }
+ # At this point $path may be tainted (if tainting) and chdir would fail.
+ # Untaint it then check that we landed where we started.
+ $path =~ /^(.*)\z/s # untaint
+ && CORE::chdir($1) or return undef;
+ ($cdev, $cino) = stat('.');
+ die "Unstable directory path, current directory changed unexpectedly"
+ if $cdev != $orig_cdev || $cino != $orig_cino;
+ $path;
+ }
+ if (not defined &fastcwd) { *fastcwd = \&fastcwd_ }
+
+
+ # Keeps track of current working directory in PWD environment var
+ # Usage:
+ # use Cwd 'chdir';
+ # chdir $newdir;
+
+ my $chdir_init = 0;
+
+ sub chdir_init {
+ if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
+ my($dd,$di) = stat('.');
+ my($pd,$pi) = stat($ENV{'PWD'});
+ if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
+ $ENV{'PWD'} = cwd();
+ }
+ }
+ else {
+ my $wd = cwd();
+ $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
+ $ENV{'PWD'} = $wd;
+ }
+ # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
+ if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
+ my($pd,$pi) = stat($2);
+ my($dd,$di) = stat($1);
+ if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
+ $ENV{'PWD'}="$2$3";
+ }
+ }
+ $chdir_init = 1;
+ }
+
+ sub chdir {
+ my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir)
+ $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';
+ chdir_init() unless $chdir_init;
+ my $newpwd;
+ if ($^O eq 'MSWin32') {
+ # get the full path name *before* the chdir()
+ $newpwd = Win32::GetFullPathName($newdir);
+ }
+
+ return 0 unless CORE::chdir $newdir;
+
+ if ($^O eq 'VMS') {
+ return $ENV{'PWD'} = $ENV{'DEFAULT'}
+ }
+ elsif ($^O eq 'MacOS') {
+ return $ENV{'PWD'} = cwd();
+ }
+ elsif ($^O eq 'MSWin32') {
+ $ENV{'PWD'} = $newpwd;
+ return 1;
+ }
+
+ if (ref $newdir eq 'GLOB') { # in case a file/dir handle is passed in
+ $ENV{'PWD'} = cwd();
+ } elsif ($newdir =~ m#^/#s) {
+ $ENV{'PWD'} = $newdir;
+ } else {
+ my @curdir = split(m#/#,$ENV{'PWD'});
+ @curdir = ('') unless @curdir;
+ my $component;
+ foreach $component (split(m#/#, $newdir)) {
+ next if $component eq '.';
+ pop(@curdir),next if $component eq '..';
+ push(@curdir,$component);
+ }
+ $ENV{'PWD'} = join('/',@curdir) || '/';
+ }
+ 1;
+ }
+
+
+ sub _perl_abs_path
+ {
+ my $start = @_ ? shift : '.';
+ my($dotdots, $cwd, @pst, @cst, $dir, @tst);
+
+ unless (@cst = stat( $start ))
+ {
+ _carp("stat($start): $!");
+ return '';
+ }
+
+ unless (-d _) {
+ # Make sure we can be invoked on plain files, not just directories.
+ # NOTE that this routine assumes that '/' is the only directory separator.
+
+ my ($dir, $file) = $start =~ m{^(.*)/(.+)$}
+ or return cwd() . '/' . $start;
+
+ # Can't use "-l _" here, because the previous stat was a stat(), not an lstat().
+ if (-l $start) {
+ my $link_target = readlink($start);
+ die "Can't resolve link $start: $!" unless defined $link_target;
+
+ require File::Spec;
+ $link_target = $dir . '/' . $link_target
+ unless File::Spec->file_name_is_absolute($link_target);
+
+ return abs_path($link_target);
+ }
+
+ return $dir ? abs_path($dir) . "/$file" : "/$file";
+ }
+
+ $cwd = '';
+ $dotdots = $start;
+ do
+ {
+ $dotdots .= '/..';
+ @pst = @cst;
+ local *PARENT;
+ unless (opendir(PARENT, $dotdots))
+ {
+ # probably a permissions issue. Try the native command.
+ require File::Spec;
+ return File::Spec->rel2abs( $start, _backtick_pwd() );
+ }
+ unless (@cst = stat($dotdots))
+ {
+ _carp("stat($dotdots): $!");
+ closedir(PARENT);
+ return '';
+ }
+ if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
+ {
+ $dir = undef;
+ }
+ else
+ {
+ do
+ {
+ unless (defined ($dir = readdir(PARENT)))
+ {
+ _carp("readdir($dotdots): $!");
+ closedir(PARENT);
+ return '';
+ }
+ $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
+ }
+ while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
+ $tst[1] != $pst[1]);
+ }
+ $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
+ closedir(PARENT);
+ } while (defined $dir);
+ chop($cwd) unless $cwd eq '/'; # drop the trailing /
+ $cwd;
+ }
+
+
+ my $Curdir;
+ sub fast_abs_path {
+ local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
+ my $cwd = getcwd();
+ require File::Spec;
+ my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);
+
+ # Detaint else we'll explode in taint mode. This is safe because
+ # we're not doing anything dangerous with it.
+ ($path) = $path =~ /(.*)/s;
+ ($cwd) = $cwd =~ /(.*)/s;
+
+ unless (-e $path) {
+ _croak("$path: No such file or directory");
+ }
+
+ unless (-d _) {
+ # Make sure we can be invoked on plain files, not just directories.
+
+ my ($vol, $dir, $file) = File::Spec->splitpath($path);
+ return File::Spec->catfile($cwd, $path) unless length $dir;
+
+ if (-l $path) {
+ my $link_target = readlink($path);
+ die "Can't resolve link $path: $!" unless defined $link_target;
+
+ $link_target = File::Spec->catpath($vol, $dir, $link_target)
+ unless File::Spec->file_name_is_absolute($link_target);
+
+ return fast_abs_path($link_target);
+ }
+
+ return $dir eq File::Spec->rootdir
+ ? File::Spec->catpath($vol, $dir, $file)
+ : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file;
+ }
+
+ if (!CORE::chdir($path)) {
+ _croak("Cannot chdir to $path: $!");
+ }
+ my $realpath = getcwd();
+ if (! ((-d $cwd) && (CORE::chdir($cwd)))) {
+ _croak("Cannot chdir back to $cwd: $!");
+ }
+ $realpath;
+ }
+
+ # added function alias to follow principle of least surprise
+ # based on previous aliasing. --tchrist 27-Jan-00
+ *fast_realpath = \&fast_abs_path;
+
+
+ # --- PORTING SECTION ---
+
+ # VMS: $ENV{'DEFAULT'} points to default directory at all times
+ # 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu
+ # Note: Use of Cwd::chdir() causes the logical name PWD to be defined
+ # in the process logical name table as the default device and directory
+ # seen by Perl. This may not be the same as the default device
+ # and directory seen by DCL after Perl exits, since the effects
+ # the CRTL chdir() function persist only until Perl exits.
+
+ sub _vms_cwd {
+ return $ENV{'DEFAULT'};
+ }
+
+ sub _vms_abs_path {
+ return $ENV{'DEFAULT'} unless @_;
+ my $path = shift;
+
+ my $efs = _vms_efs;
+ my $unix_rpt = _vms_unix_rpt;
+
+ if (defined &VMS::Filespec::vmsrealpath) {
+ my $path_unix = 0;
+ my $path_vms = 0;
+
+ $path_unix = 1 if ($path =~ m#(?<=\^)/#);
+ $path_unix = 1 if ($path =~ /^\.\.?$/);
+ $path_vms = 1 if ($path =~ m#[\[<\]]#);
+ $path_vms = 1 if ($path =~ /^--?$/);
+
+ my $unix_mode = $path_unix;
+ if ($efs) {
+ # In case of a tie, the Unix report mode decides.
+ if ($path_vms == $path_unix) {
+ $unix_mode = $unix_rpt;
+ } else {
+ $unix_mode = 0 if $path_vms;
+ }
+ }
+
+ if ($unix_mode) {
+ # Unix format
+ return VMS::Filespec::unixrealpath($path);
+ }
+
+ # VMS format
+
+ my $new_path = VMS::Filespec::vmsrealpath($path);
+
+ # Perl expects directories to be in directory format
+ $new_path = VMS::Filespec::pathify($new_path) if -d $path;
+ return $new_path;
+ }
+
+ # Fallback to older algorithm if correct ones are not
+ # available.
+
+ if (-l $path) {
+ my $link_target = readlink($path);
+ die "Can't resolve link $path: $!" unless defined $link_target;
+
+ return _vms_abs_path($link_target);
+ }
+
+ # may need to turn foo.dir into [.foo]
+ my $pathified = VMS::Filespec::pathify($path);
+ $path = $pathified if defined $pathified;
+
+ return VMS::Filespec::rmsexpand($path);
+ }
+
+ sub _os2_cwd {
+ $ENV{'PWD'} = `cmd /c cd`;
+ chomp $ENV{'PWD'};
+ $ENV{'PWD'} =~ s:\\:/:g ;
+ return $ENV{'PWD'};
+ }
+
+ sub _win32_cwd_simple {
+ $ENV{'PWD'} = `cd`;
+ chomp $ENV{'PWD'};
+ $ENV{'PWD'} =~ s:\\:/:g ;
+ return $ENV{'PWD'};
+ }
+
+ sub _win32_cwd {
+ # Need to avoid taking any sort of reference to the typeglob or the code in
+ # the optree, so that this tests the runtime state of things, as the
+ # ExtUtils::MakeMaker tests for "miniperl" need to be able to fake things at
+ # runtime by deleting the subroutine. *foo{THING} syntax on a symbol table
+ # lookup avoids needing a string eval, which has been reported to cause
+ # problems (for reasons that we haven't been able to get to the bottom of -
+ # rt.cpan.org #56225)
+ if (*{$DynaLoader::{boot_DynaLoader}}{CODE}) {
+ $ENV{'PWD'} = Win32::GetCwd();
+ }
+ else { # miniperl
+ chomp($ENV{'PWD'} = `cd`);
+ }
+ $ENV{'PWD'} =~ s:\\:/:g ;
+ return $ENV{'PWD'};
+ }
+
+ *_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_win32_cwd_simple;
+
+ sub _dos_cwd {
+ if (!defined &Dos::GetCwd) {
+ $ENV{'PWD'} = `command /c cd`;
+ chomp $ENV{'PWD'};
+ $ENV{'PWD'} =~ s:\\:/:g ;
+ } else {
+ $ENV{'PWD'} = Dos::GetCwd();
+ }
+ return $ENV{'PWD'};
+ }
+
+ sub _qnx_cwd {
+ local $ENV{PATH} = '';
+ local $ENV{CDPATH} = '';
+ local $ENV{ENV} = '';
+ $ENV{'PWD'} = `/usr/bin/fullpath -t`;
+ chomp $ENV{'PWD'};
+ return $ENV{'PWD'};
+ }
+
+ sub _qnx_abs_path {
+ local $ENV{PATH} = '';
+ local $ENV{CDPATH} = '';
+ local $ENV{ENV} = '';
+ my $path = @_ ? shift : '.';
+ local *REALPATH;
+
+ defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or
+ die "Can't open /usr/bin/fullpath: $!";
+ my $realpath = <REALPATH>;
+ close REALPATH;
+ chomp $realpath;
+ return $realpath;
+ }
+
+ sub _epoc_cwd {
+ $ENV{'PWD'} = EPOC::getcwd();
+ return $ENV{'PWD'};
+ }
+
+
+ # Now that all the base-level functions are set up, alias the
+ # user-level functions to the right places
+
+ if (exists $METHOD_MAP{$^O}) {
+ my $map = $METHOD_MAP{$^O};
+ foreach my $name (keys %$map) {
+ local $^W = 0; # assignments trigger 'subroutine redefined' warning
+ no strict 'refs';
+ *{$name} = \&{$map->{$name}};
+ }
+ }
+
+ # In case the XS version doesn't load.
+ *abs_path = \&_perl_abs_path unless defined &abs_path;
+ *getcwd = \&_perl_getcwd unless defined &getcwd;
+
+ # added function alias for those of us more
+ # used to the libc function. --tchrist 27-Jan-00
+ *realpath = \&abs_path;
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_CWD
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/Devel/GlobalDestruction/XS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_DEVEL_GLOBALDESTRUCTION_XS';
+ package Devel::GlobalDestruction::XS;
+ use strict;
+ use warnings;
+
+ our $VERSION = '0.01';
+
+ require XSLoader;
+ XSLoader::load(__PACKAGE__, $VERSION);
+
+ 1; # keep require happy
+
+ __END__
+
+ =head1 NAME
+
+ Devel::GlobalDestruction::XS - Faster implementation of the Devel::GlobalDestruction API
+
+ =head1 SYNOPSIS
+
+ use Devel::GlobalDestruction;
+
+ =head1 DESCRIPTION
+
+ This is an XS backend for L<Devel::GlobalDestruction> and should be used through that module.
+
+ =head1 AUTHORS
+
+ Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
+
+ Florian Ragwitz E<lt>rafl@debian.orgE<gt>
+
+ Jesse Luehrs E<lt>doy@tozt.netE<gt>
+
+ Peter Rabbitson E<lt>ribasushi@cpan.orgE<gt>
+
+ Arthur Axel 'fREW' Schmidt E<lt>frioux@gmail.comE<gt>
+
+ Elizabeth Mattijsen E<lt>liz@dijkmat.nlE<gt>
+
+ Graham Knop E<lt>haarg@haarg.orgE<gt>
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2008 - 2013 the Devel::GlobalDestruction::XS L</AUTHORS> as listed
+ above.
+
+ =head1 LICENSE
+
+ This library is free software and may be distributed under the same terms
+ as perl itself.
+
+ =cut
+X86_64-LINUX-GNU-THREAD-MULTI_DEVEL_GLOBALDESTRUCTION_XS
+
+$fatpacked{"File/Spec.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC';
+ package File::Spec;
+
+ use strict;
+ use vars qw(@ISA $VERSION);
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ my %module = (MacOS => 'Mac',
+ MSWin32 => 'Win32',
+ os2 => 'OS2',
+ VMS => 'VMS',
+ epoc => 'Epoc',
+ NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare.
+ symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian.
+ dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP.
+ cygwin => 'Cygwin');
+
+
+ my $module = $module{$^O} || 'Unix';
+
+ require "File/Spec/$module.pm";
+ @ISA = ("File::Spec::$module");
+
+ 1;
+
+ __END__
+
+ =head1 NAME
+
+ File::Spec - portably perform operations on file names
+
+ =head1 SYNOPSIS
+
+ use File::Spec;
+
+ $x=File::Spec->catfile('a', 'b', 'c');
+
+ which returns 'a/b/c' under Unix. Or:
+
+ use File::Spec::Functions;
+
+ $x = catfile('a', 'b', 'c');
+
+ =head1 DESCRIPTION
+
+ This module is designed to support operations commonly performed on file
+ specifications (usually called "file names", but not to be confused with the
+ contents of a file, or Perl's file handles), such as concatenating several
+ directory and file names into a single path, or determining whether a path
+ is rooted. It is based on code directly taken from MakeMaker 5.17, code
+ written by Andreas KE<ouml>nig, Andy Dougherty, Charles Bailey, Ilya
+ Zakharevich, Paul Schinder, and others.
+
+ Since these functions are different for most operating systems, each set of
+ OS specific routines is available in a separate module, including:
+
+ File::Spec::Unix
+ File::Spec::Mac
+ File::Spec::OS2
+ File::Spec::Win32
+ File::Spec::VMS
+
+ The module appropriate for the current OS is automatically loaded by
+ File::Spec. Since some modules (like VMS) make use of facilities available
+ only under that OS, it may not be possible to load all modules under all
+ operating systems.
+
+ Since File::Spec is object oriented, subroutines should not be called directly,
+ as in:
+
+ File::Spec::catfile('a','b');
+
+ but rather as class methods:
+
+ File::Spec->catfile('a','b');
+
+ For simple uses, L<File::Spec::Functions> provides convenient functional
+ forms of these methods.
+
+ =head1 METHODS
+
+ =over 2
+
+ =item canonpath
+ X<canonpath>
+
+ No physical check on the filesystem, but a logical cleanup of a
+ path.
+
+ $cpath = File::Spec->canonpath( $path ) ;
+
+ Note that this does *not* collapse F<x/../y> sections into F<y>. This
+ is by design. If F</foo> on your system is a symlink to F</bar/baz>,
+ then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive
+ F<../>-removal would give you. If you want to do this kind of
+ processing, you probably want C<Cwd>'s C<realpath()> function to
+ actually traverse the filesystem cleaning up paths like this.
+
+ =item catdir
+ X<catdir>
+
+ Concatenate two or more directory names to form a complete path ending
+ with a directory. But remove the trailing slash from the resulting
+ string, because it doesn't look good, isn't necessary and confuses
+ OS/2. Of course, if this is the root directory, don't cut off the
+ trailing slash :-)
+
+ $path = File::Spec->catdir( @directories );
+
+ =item catfile
+ X<catfile>
+
+ Concatenate one or more directory names and a filename to form a
+ complete path ending with a filename
+
+ $path = File::Spec->catfile( @directories, $filename );
+
+ =item curdir
+ X<curdir>
+
+ Returns a string representation of the current directory.
+
+ $curdir = File::Spec->curdir();
+
+ =item devnull
+ X<devnull>
+
+ Returns a string representation of the null device.
+
+ $devnull = File::Spec->devnull();
+
+ =item rootdir
+ X<rootdir>
+
+ Returns a string representation of the root directory.
+
+ $rootdir = File::Spec->rootdir();
+
+ =item tmpdir
+ X<tmpdir>
+
+ Returns a string representation of the first writable directory from a
+ list of possible temporary directories. Returns the current directory
+ if no writable temporary directories are found. The list of directories
+ checked depends on the platform; e.g. File::Spec::Unix checks C<$ENV{TMPDIR}>
+ (unless taint is on) and F</tmp>.
+
+ $tmpdir = File::Spec->tmpdir();
+
+ =item updir
+ X<updir>
+
+ Returns a string representation of the parent directory.
+
+ $updir = File::Spec->updir();
+
+ =item no_upwards
+
+ Given a list of file names, strip out those that refer to a parent
+ directory. (Does not strip symlinks, only '.', '..', and equivalents.)
+
+ @paths = File::Spec->no_upwards( @paths );
+
+ =item case_tolerant
+
+ Returns a true or false value indicating, respectively, that alphabetic
+ case is not or is significant when comparing file specifications.
+ Cygwin and Win32 accept an optional drive argument.
+
+ $is_case_tolerant = File::Spec->case_tolerant();
+
+ =item file_name_is_absolute
+
+ Takes as its argument a path, and returns true if it is an absolute path.
+
+ $is_absolute = File::Spec->file_name_is_absolute( $path );
+
+ This does not consult the local filesystem on Unix, Win32, OS/2, or
+ Mac OS (Classic). It does consult the working environment for VMS
+ (see L<File::Spec::VMS/file_name_is_absolute>).
+
+ =item path
+ X<path>
+
+ Takes no argument. Returns the environment variable C<PATH> (or the local
+ platform's equivalent) as a list.
+
+ @PATH = File::Spec->path();
+
+ =item join
+ X<join, path>
+
+ join is the same as catfile.
+
+ =item splitpath
+ X<splitpath> X<split, path>
+
+ Splits a path in to volume, directory, and filename portions. On systems
+ with no concept of volume, returns '' for volume.
+
+ ($volume,$directories,$file) =
+ File::Spec->splitpath( $path );
+ ($volume,$directories,$file) =
+ File::Spec->splitpath( $path, $no_file );
+
+ For systems with no syntax differentiating filenames from directories,
+ assumes that the last file is a path unless C<$no_file> is true or a
+ trailing separator or F</.> or F</..> is present. On Unix, this means that C<$no_file>
+ true makes this return ( '', $path, '' ).
+
+ The directory portion may or may not be returned with a trailing '/'.
+
+ The results can be passed to L</catpath()> to get back a path equivalent to
+ (usually identical to) the original path.
+
+ =item splitdir
+ X<splitdir> X<split, dir>
+
+ The opposite of L</catdir>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+ C<$directories> must be only the directory portion of the path on systems
+ that have the concept of a volume or that have path syntax that differentiates
+ files from directories.
+
+ Unlike just splitting the directories on the separator, empty
+ directory names (C<''>) can be returned, because these are significant
+ on some OSes.
+
+ =item catpath()
+
+ Takes volume, directory and file portions and returns an entire path. Under
+ Unix, C<$volume> is ignored, and directory and file are concatenated. A '/' is
+ inserted if need be. On other OSes, C<$volume> is significant.
+
+ $full_path = File::Spec->catpath( $volume, $directory, $file );
+
+ =item abs2rel
+ X<abs2rel> X<absolute, path> X<relative, path>
+
+ Takes a destination path and an optional base path returns a relative path
+ from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+ If C<$base> is not present or '', then L<Cwd::cwd()|Cwd> is used. If C<$base> is
+ relative, then it is converted to absolute form using
+ L</rel2abs()>. This means that it is taken to be relative to
+ L<Cwd::cwd()|Cwd>.
+
+ On systems with the concept of volume, if C<$path> and C<$base> appear to be
+ on two different volumes, we will not attempt to resolve the two
+ paths, and we will instead simply return C<$path>. Note that previous
+ versions of this module ignored the volume of C<$base>, which resulted in
+ garbage results part of the time.
+
+ On systems that have a grammar that indicates filenames, this ignores the
+ C<$base> filename as well. Otherwise all path components are assumed to be
+ directories.
+
+ If C<$path> is relative, it is converted to absolute form using L</rel2abs()>.
+ This means that it is taken to be relative to L<Cwd::cwd()|Cwd>.
+
+ No checks against the filesystem are made. On VMS, there is
+ interaction with the working environment, as logicals and
+ macros are expanded.
+
+ Based on code written by Shigio Yamaguchi.
+
+ =item rel2abs()
+ X<rel2abs> X<absolute, path> X<relative, path>
+
+ Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+ If C<$base> is not present or '', then L<Cwd::cwd()|Cwd> is used. If C<$base> is relative,
+ then it is converted to absolute form using L</rel2abs()>. This means that it
+ is taken to be relative to L<Cwd::cwd()|Cwd>.
+
+ On systems with the concept of volume, if C<$path> and C<$base> appear to be
+ on two different volumes, we will not attempt to resolve the two
+ paths, and we will instead simply return C<$path>. Note that previous
+ versions of this module ignored the volume of C<$base>, which resulted in
+ garbage results part of the time.
+
+ On systems that have a grammar that indicates filenames, this ignores the
+ C<$base> filename as well. Otherwise all path components are assumed to be
+ directories.
+
+ If C<$path> is absolute, it is cleaned up and returned using L</canonpath>.
+
+ No checks against the filesystem are made. On VMS, there is
+ interaction with the working environment, as logicals and
+ macros are expanded.
+
+ Based on code written by Shigio Yamaguchi.
+
+ =back
+
+ For further information, please see L<File::Spec::Unix>,
+ L<File::Spec::Mac>, L<File::Spec::OS2>, L<File::Spec::Win32>, or
+ L<File::Spec::VMS>.
+
+ =head1 SEE ALSO
+
+ L<File::Spec::Unix>, L<File::Spec::Mac>, L<File::Spec::OS2>,
+ L<File::Spec::Win32>, L<File::Spec::VMS>, L<File::Spec::Functions>,
+ L<ExtUtils::MakeMaker>
+
+ =head1 AUTHOR
+
+ Currently maintained by Ken Williams C<< <KWILLIAMS@cpan.org> >>.
+
+ The vast majority of the code was written by
+ Kenneth Albanowski C<< <kjahds@kjahds.com> >>,
+ Andy Dougherty C<< <doughera@lafayette.edu> >>,
+ Andreas KE<ouml>nig C<< <A.Koenig@franz.ww.TU-Berlin.DE> >>,
+ Tim Bunce C<< <Tim.Bunce@ig.co.uk> >>.
+ VMS support by Charles Bailey C<< <bailey@newman.upenn.edu> >>.
+ OS/2 support by Ilya Zakharevich C<< <ilya@math.ohio-state.edu> >>.
+ Mac support by Paul Schinder C<< <schinder@pobox.com> >>, and
+ Thomas Wegner C<< <wegner_thomas@yahoo.com> >>.
+ abs2rel() and rel2abs() written by Shigio Yamaguchi C<< <shigio@tamacom.com> >>,
+ modified by Barrie Slaymaker C<< <barries@slaysys.com> >>.
+ splitpath(), splitdir(), catpath() and catdir() by Barrie Slaymaker.
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004-2013 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC
+
+$fatpacked{"File/Spec/Cygwin.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_CYGWIN';
+ package File::Spec::Cygwin;
+
+ use strict;
+ use vars qw(@ISA $VERSION);
+ require File::Spec::Unix;
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ @ISA = qw(File::Spec::Unix);
+
+ =head1 NAME
+
+ File::Spec::Cygwin - methods for Cygwin file specs
+
+ =head1 SYNOPSIS
+
+ require File::Spec::Cygwin; # Done internally by File::Spec if needed
+
+ =head1 DESCRIPTION
+
+ See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+ implementation of these methods, not the semantics.
+
+ This module is still in beta. Cygwin-knowledgeable folks are invited
+ to offer patches and suggestions.
+
+ =cut
+
+ =pod
+
+ =over 4
+
+ =item canonpath
+
+ Any C<\> (backslashes) are converted to C</> (forward slashes),
+ and then File::Spec::Unix canonpath() is called on the result.
+
+ =cut
+
+ sub canonpath {
+ my($self,$path) = @_;
+ return unless defined $path;
+
+ $path =~ s|\\|/|g;
+
+ # Handle network path names beginning with double slash
+ my $node = '';
+ if ( $path =~ s@^(//[^/]+)(?:/|\z)@/@s ) {
+ $node = $1;
+ }
+ return $node . $self->SUPER::canonpath($path);
+ }
+
+ sub catdir {
+ my $self = shift;
+ return unless @_;
+
+ # Don't create something that looks like a //network/path
+ if ($_[0] and ($_[0] eq '/' or $_[0] eq '\\')) {
+ shift;
+ return $self->SUPER::catdir('', @_);
+ }
+
+ $self->SUPER::catdir(@_);
+ }
+
+ =pod
+
+ =item file_name_is_absolute
+
+ True is returned if the file name begins with C<drive_letter:>,
+ and if not, File::Spec::Unix file_name_is_absolute() is called.
+
+ =cut
+
+
+ sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test
+ return $self->SUPER::file_name_is_absolute($file);
+ }
+
+ =item tmpdir (override)
+
+ Returns a string representation of the first existing directory
+ from the following list:
+
+ $ENV{TMPDIR}
+ /tmp
+ $ENV{'TMP'}
+ $ENV{'TEMP'}
+ C:/temp
+
+ If running under taint mode, and if the environment
+ variables are tainted, they are not used.
+
+ =cut
+
+ sub tmpdir {
+ my $cached = $_[0]->_cached_tmpdir(qw 'TMPDIR TMP TEMP');
+ return $cached if defined $cached;
+ $_[0]->_cache_tmpdir(
+ $_[0]->_tmpdir(
+ $ENV{TMPDIR}, "/tmp", $ENV{'TMP'}, $ENV{'TEMP'}, 'C:/temp'
+ ),
+ qw 'TMPDIR TMP TEMP'
+ );
+ }
+
+ =item case_tolerant
+
+ Override Unix. Cygwin case-tolerance depends on managed mount settings and
+ as with MsWin32 on GetVolumeInformation() $ouFsFlags == FS_CASE_SENSITIVE,
+ indicating the case significance when comparing file specifications.
+ Default: 1
+
+ =cut
+
+ sub case_tolerant {
+ return 1 unless $^O eq 'cygwin'
+ and defined &Cygwin::mount_flags;
+
+ my $drive = shift;
+ if (! $drive) {
+ my @flags = split(/,/, Cygwin::mount_flags('/cygwin'));
+ my $prefix = pop(@flags);
+ if (! $prefix || $prefix eq 'cygdrive') {
+ $drive = '/cygdrive/c';
+ } elsif ($prefix eq '/') {
+ $drive = '/c';
+ } else {
+ $drive = "$prefix/c";
+ }
+ }
+ my $mntopts = Cygwin::mount_flags($drive);
+ if ($mntopts and ($mntopts =~ /,managed/)) {
+ return 0;
+ }
+ eval { require Win32API::File; } or return 1;
+ my $osFsType = "\0"x256;
+ my $osVolName = "\0"x256;
+ my $ouFsFlags = 0;
+ Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 );
+ if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; }
+ else { return 1; }
+ }
+
+ =back
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004,2007 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_CYGWIN
+
+$fatpacked{"File/Spec/Epoc.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_EPOC';
+ package File::Spec::Epoc;
+
+ use strict;
+ use vars qw($VERSION @ISA);
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ require File::Spec::Unix;
+ @ISA = qw(File::Spec::Unix);
+
+ =head1 NAME
+
+ File::Spec::Epoc - methods for Epoc file specs
+
+ =head1 SYNOPSIS
+
+ require File::Spec::Epoc; # Done internally by File::Spec if needed
+
+ =head1 DESCRIPTION
+
+ See File::Spec::Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ This package is still a work in progress. ;-)
+
+ =cut
+
+ sub case_tolerant {
+ return 1;
+ }
+
+ =pod
+
+ =over 4
+
+ =item canonpath()
+
+ No physical check on the filesystem, but a logical cleanup of a
+ path. On UNIX eliminated successive slashes and successive "/.".
+
+ =back
+
+ =cut
+
+ sub canonpath {
+ my ($self,$path) = @_;
+ return unless defined $path;
+
+ $path =~ s|/+|/|g; # xx////xx -> xx/xx
+ $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx
+ $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx
+ $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx
+ $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx
+ return $path;
+ }
+
+ =pod
+
+ =head1 AUTHOR
+
+ o.flebbe@gmx.de
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =head1 SEE ALSO
+
+ See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+ implementation of these methods, not the semantics.
+
+ =cut
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_EPOC
+
+$fatpacked{"File/Spec/Functions.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_FUNCTIONS';
+ package File::Spec::Functions;
+
+ use File::Spec;
+ use strict;
+
+ use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ require Exporter;
+
+ @ISA = qw(Exporter);
+
+ @EXPORT = qw(
+ canonpath
+ catdir
+ catfile
+ curdir
+ rootdir
+ updir
+ no_upwards
+ file_name_is_absolute
+ path
+ );
+
+ @EXPORT_OK = qw(
+ devnull
+ tmpdir
+ splitpath
+ splitdir
+ catpath
+ abs2rel
+ rel2abs
+ case_tolerant
+ );
+
+ %EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
+
+ require File::Spec::Unix;
+ my %udeps = (
+ canonpath => [],
+ catdir => [qw(canonpath)],
+ catfile => [qw(canonpath catdir)],
+ case_tolerant => [],
+ curdir => [],
+ devnull => [],
+ rootdir => [],
+ updir => [],
+ );
+
+ foreach my $meth (@EXPORT, @EXPORT_OK) {
+ my $sub = File::Spec->can($meth);
+ no strict 'refs';
+ if (exists($udeps{$meth}) && $sub == File::Spec::Unix->can($meth) &&
+ !(grep {
+ File::Spec->can($_) != File::Spec::Unix->can($_)
+ } @{$udeps{$meth}}) &&
+ defined(&{"File::Spec::Unix::_fn_$meth"})) {
+ *{$meth} = \&{"File::Spec::Unix::_fn_$meth"};
+ } else {
+ *{$meth} = sub {&$sub('File::Spec', @_)};
+ }
+ }
+
+
+ 1;
+ __END__
+
+ =head1 NAME
+
+ File::Spec::Functions - portably perform operations on file names
+
+ =head1 SYNOPSIS
+
+ use File::Spec::Functions;
+ $x = catfile('a','b');
+
+ =head1 DESCRIPTION
+
+ This module exports convenience functions for all of the class methods
+ provided by File::Spec.
+
+ For a reference of available functions, please consult L<File::Spec::Unix>,
+ which contains the entire set, and which is inherited by the modules for
+ other platforms. For further information, please see L<File::Spec::Mac>,
+ L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>.
+
+ =head2 Exports
+
+ The following functions are exported by default.
+
+ canonpath
+ catdir
+ catfile
+ curdir
+ rootdir
+ updir
+ no_upwards
+ file_name_is_absolute
+ path
+
+
+ The following functions are exported only by request.
+
+ devnull
+ tmpdir
+ splitpath
+ splitdir
+ catpath
+ abs2rel
+ rel2abs
+ case_tolerant
+
+ All the functions may be imported using the C<:ALL> tag.
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =head1 SEE ALSO
+
+ File::Spec, File::Spec::Unix, File::Spec::Mac, File::Spec::OS2,
+ File::Spec::Win32, File::Spec::VMS, ExtUtils::MakeMaker
+
+ =cut
+
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_FUNCTIONS
+
+$fatpacked{"File/Spec/Mac.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_MAC';
+ package File::Spec::Mac;
+
+ use strict;
+ use vars qw(@ISA $VERSION);
+ require File::Spec::Unix;
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ @ISA = qw(File::Spec::Unix);
+
+ my $macfiles;
+ if ($^O eq 'MacOS') {
+ $macfiles = eval { require Mac::Files };
+ }
+
+ sub case_tolerant { 1 }
+
+
+ =head1 NAME
+
+ File::Spec::Mac - File::Spec for Mac OS (Classic)
+
+ =head1 SYNOPSIS
+
+ require File::Spec::Mac; # Done internally by File::Spec if needed
+
+ =head1 DESCRIPTION
+
+ Methods for manipulating file specifications.
+
+ =head1 METHODS
+
+ =over 2
+
+ =item canonpath
+
+ On Mac OS, there's nothing to be done. Returns what it's given.
+
+ =cut
+
+ sub canonpath {
+ my ($self,$path) = @_;
+ return $path;
+ }
+
+ =item catdir()
+
+ Concatenate two or more directory names to form a path separated by colons
+ (":") ending with a directory. Resulting paths are B<relative> by default,
+ but can be forced to be absolute (but avoid this, see below). Automatically
+ puts a trailing ":" on the end of the complete path, because that's what's
+ done in MacPerl's environment and helps to distinguish a file path from a
+ directory path.
+
+ B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the resulting
+ path is relative by default and I<not> absolute. This decision was made due
+ to portability reasons. Since C<File::Spec-E<gt>catdir()> returns relative paths
+ on all other operating systems, it will now also follow this convention on Mac
+ OS. Note that this may break some existing scripts.
+
+ The intended purpose of this routine is to concatenate I<directory names>.
+ But because of the nature of Macintosh paths, some additional possibilities
+ are allowed to make using this routine give reasonable results for some
+ common situations. In other words, you are also allowed to concatenate
+ I<paths> instead of directory names (strictly speaking, a string like ":a"
+ is a path, but not a name, since it contains a punctuation character ":").
+
+ So, beside calls like
+
+ catdir("a") = ":a:"
+ catdir("a","b") = ":a:b:"
+ catdir() = "" (special case)
+
+ calls like the following
+
+ catdir(":a:") = ":a:"
+ catdir(":a","b") = ":a:b:"
+ catdir(":a:","b") = ":a:b:"
+ catdir(":a:",":b:") = ":a:b:"
+ catdir(":") = ":"
+
+ are allowed.
+
+ Here are the rules that are used in C<catdir()>; note that we try to be as
+ compatible as possible to Unix:
+
+ =over 2
+
+ =item 1.
+
+ The resulting path is relative by default, i.e. the resulting path will have a
+ leading colon.
+
+ =item 2.
+
+ A trailing colon is added automatically to the resulting path, to denote a
+ directory.
+
+ =item 3.
+
+ Generally, each argument has one leading ":" and one trailing ":"
+ removed (if any). They are then joined together by a ":". Special
+ treatment applies for arguments denoting updir paths like "::lib:",
+ see (4), or arguments consisting solely of colons ("colon paths"),
+ see (5).
+
+ =item 4.
+
+ When an updir path like ":::lib::" is passed as argument, the number
+ of directories to climb up is handled correctly, not removing leading
+ or trailing colons when necessary. E.g.
+
+ catdir(":::a","::b","c") = ":::a::b:c:"
+ catdir(":::a::","::b","c") = ":::a:::b:c:"
+
+ =item 5.
+
+ Adding a colon ":" or empty string "" to a path at I<any> position
+ doesn't alter the path, i.e. these arguments are ignored. (When a ""
+ is passed as the first argument, it has a special meaning, see
+ (6)). This way, a colon ":" is handled like a "." (curdir) on Unix,
+ while an empty string "" is generally ignored (see
+ C<Unix-E<gt>canonpath()> ). Likewise, a "::" is handled like a ".."
+ (updir), and a ":::" is handled like a "../.." etc. E.g.
+
+ catdir("a",":",":","b") = ":a:b:"
+ catdir("a",":","::",":b") = ":a::b:"
+
+ =item 6.
+
+ If the first argument is an empty string "" or is a volume name, i.e. matches
+ the pattern /^[^:]+:/, the resulting path is B<absolute>.
+
+ =item 7.
+
+ Passing an empty string "" as the first argument to C<catdir()> is
+ like passingC<File::Spec-E<gt>rootdir()> as the first argument, i.e.
+
+ catdir("","a","b") is the same as
+
+ catdir(rootdir(),"a","b").
+
+ This is true on Unix, where C<catdir("","a","b")> yields "/a/b" and
+ C<rootdir()> is "/". Note that C<rootdir()> on Mac OS is the startup
+ volume, which is the closest in concept to Unix' "/". This should help
+ to run existing scripts originally written for Unix.
+
+ =item 8.
+
+ For absolute paths, some cleanup is done, to ensure that the volume
+ name isn't immediately followed by updirs. This is invalid, because
+ this would go beyond "root". Generally, these cases are handled like
+ their Unix counterparts:
+
+ Unix:
+ Unix->catdir("","") = "/"
+ Unix->catdir("",".") = "/"
+ Unix->catdir("","..") = "/" # can't go
+ # beyond root
+ Unix->catdir("",".","..","..","a") = "/a"
+ Mac:
+ Mac->catdir("","") = rootdir() # (e.g. "HD:")
+ Mac->catdir("",":") = rootdir()
+ Mac->catdir("","::") = rootdir() # can't go
+ # beyond root
+ Mac->catdir("",":","::","::","a") = rootdir() . "a:"
+ # (e.g. "HD:a:")
+
+ However, this approach is limited to the first arguments following
+ "root" (again, see C<Unix-E<gt>canonpath()> ). If there are more
+ arguments that move up the directory tree, an invalid path going
+ beyond root can be created.
+
+ =back
+
+ As you've seen, you can force C<catdir()> to create an absolute path
+ by passing either an empty string or a path that begins with a volume
+ name as the first argument. However, you are strongly encouraged not
+ to do so, since this is done only for backward compatibility. Newer
+ versions of File::Spec come with a method called C<catpath()> (see
+ below), that is designed to offer a portable solution for the creation
+ of absolute paths. It takes volume, directory and file portions and
+ returns an entire path. While C<catdir()> is still suitable for the
+ concatenation of I<directory names>, you are encouraged to use
+ C<catpath()> to concatenate I<volume names> and I<directory
+ paths>. E.g.
+
+ $dir = File::Spec->catdir("tmp","sources");
+ $abs_path = File::Spec->catpath("MacintoshHD:", $dir,"");
+
+ yields
+
+ "MacintoshHD:tmp:sources:" .
+
+ =cut
+
+ sub catdir {
+ my $self = shift;
+ return '' unless @_;
+ my @args = @_;
+ my $first_arg;
+ my $relative;
+
+ # take care of the first argument
+
+ if ($args[0] eq '') { # absolute path, rootdir
+ shift @args;
+ $relative = 0;
+ $first_arg = $self->rootdir;
+
+ } elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name
+ $relative = 0;
+ $first_arg = shift @args;
+ # add a trailing ':' if need be (may be it's a path like HD:dir)
+ $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+
+ } else { # relative path
+ $relative = 1;
+ if ( $args[0] =~ /^::+\Z(?!\n)/ ) {
+ # updir colon path ('::', ':::' etc.), don't shift
+ $first_arg = ':';
+ } elsif ($args[0] eq ':') {
+ $first_arg = shift @args;
+ } else {
+ # add a trailing ':' if need be
+ $first_arg = shift @args;
+ $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+ }
+ }
+
+ # For all other arguments,
+ # (a) ignore arguments that equal ':' or '',
+ # (b) handle updir paths specially:
+ # '::' -> concatenate '::'
+ # '::' . '::' -> concatenate ':::' etc.
+ # (c) add a trailing ':' if need be
+
+ my $result = $first_arg;
+ while (@args) {
+ my $arg = shift @args;
+ unless (($arg eq '') || ($arg eq ':')) {
+ if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::'
+ my $updir_count = length($arg) - 1;
+ while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path
+ $arg = shift @args;
+ $updir_count += (length($arg) - 1);
+ }
+ $arg = (':' x $updir_count);
+ } else {
+ $arg =~ s/^://s; # remove a leading ':' if any
+ $arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':'
+ }
+ $result .= $arg;
+ }#unless
+ }
+
+ if ( ($relative) && ($result !~ /^:/) ) {
+ # add a leading colon if need be
+ $result = ":$result";
+ }
+
+ unless ($relative) {
+ # remove updirs immediately following the volume name
+ $result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/;
+ }
+
+ return $result;
+ }
+
+ =item catfile
+
+ Concatenate one or more directory names and a filename to form a
+ complete path ending with a filename. Resulting paths are B<relative>
+ by default, but can be forced to be absolute (but avoid this).
+
+ B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the
+ resulting path is relative by default and I<not> absolute. This
+ decision was made due to portability reasons. Since
+ C<File::Spec-E<gt>catfile()> returns relative paths on all other
+ operating systems, it will now also follow this convention on Mac OS.
+ Note that this may break some existing scripts.
+
+ The last argument is always considered to be the file portion. Since
+ C<catfile()> uses C<catdir()> (see above) for the concatenation of the
+ directory portions (if any), the following with regard to relative and
+ absolute paths is true:
+
+ catfile("") = ""
+ catfile("file") = "file"
+
+ but
+
+ catfile("","") = rootdir() # (e.g. "HD:")
+ catfile("","file") = rootdir() . file # (e.g. "HD:file")
+ catfile("HD:","file") = "HD:file"
+
+ This means that C<catdir()> is called only when there are two or more
+ arguments, as one might expect.
+
+ Note that the leading ":" is removed from the filename, so that
+
+ catfile("a","b","file") = ":a:b:file" and
+
+ catfile("a","b",":file") = ":a:b:file"
+
+ give the same answer.
+
+ To concatenate I<volume names>, I<directory paths> and I<filenames>,
+ you are encouraged to use C<catpath()> (see below).
+
+ =cut
+
+ sub catfile {
+ my $self = shift;
+ return '' unless @_;
+ my $file = pop @_;
+ return $file unless @_;
+ my $dir = $self->catdir(@_);
+ $file =~ s/^://s;
+ return $dir.$file;
+ }
+
+ =item curdir
+
+ Returns a string representing the current directory. On Mac OS, this is ":".
+
+ =cut
+
+ sub curdir {
+ return ":";
+ }
+
+ =item devnull
+
+ Returns a string representing the null device. On Mac OS, this is "Dev:Null".
+
+ =cut
+
+ sub devnull {
+ return "Dev:Null";
+ }
+
+ =item rootdir
+
+ Returns a string representing the root directory. Under MacPerl,
+ returns the name of the startup volume, since that's the closest in
+ concept, although other volumes aren't rooted there. The name has a
+ trailing ":", because that's the correct specification for a volume
+ name on Mac OS.
+
+ If Mac::Files could not be loaded, the empty string is returned.
+
+ =cut
+
+ sub rootdir {
+ #
+ # There's no real root directory on Mac OS. The name of the startup
+ # volume is returned, since that's the closest in concept.
+ #
+ return '' unless $macfiles;
+ my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk,
+ &Mac::Files::kSystemFolderType);
+ $system =~ s/:.*\Z(?!\n)/:/s;
+ return $system;
+ }
+
+ =item tmpdir
+
+ Returns the contents of $ENV{TMPDIR}, if that directory exits or the
+ current working directory otherwise. Under MacPerl, $ENV{TMPDIR} will
+ contain a path like "MacintoshHD:Temporary Items:", which is a hidden
+ directory on your startup volume.
+
+ =cut
+
+ sub tmpdir {
+ my $cached = $_[0]->_cached_tmpdir('TMPDIR');
+ return $cached if defined $cached;
+ $_[0]->_cache_tmpdir($_[0]->_tmpdir( $ENV{TMPDIR} ), 'TMPDIR');
+ }
+
+ =item updir
+
+ Returns a string representing the parent directory. On Mac OS, this is "::".
+
+ =cut
+
+ sub updir {
+ return "::";
+ }
+
+ =item file_name_is_absolute
+
+ Takes as argument a path and returns true, if it is an absolute path.
+ If the path has a leading ":", it's a relative path. Otherwise, it's an
+ absolute path, unless the path doesn't contain any colons, i.e. it's a name
+ like "a". In this particular case, the path is considered to be relative
+ (i.e. it is considered to be a filename). Use ":" in the appropriate place
+ in the path if you want to distinguish unambiguously. As a special case,
+ the filename '' is always considered to be absolute. Note that with version
+ 1.2 of File::Spec::Mac, this does no longer consult the local filesystem.
+
+ E.g.
+
+ File::Spec->file_name_is_absolute("a"); # false (relative)
+ File::Spec->file_name_is_absolute(":a:b:"); # false (relative)
+ File::Spec->file_name_is_absolute("MacintoshHD:");
+ # true (absolute)
+ File::Spec->file_name_is_absolute(""); # true (absolute)
+
+
+ =cut
+
+ sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ if ($file =~ /:/) {
+ return (! ($file =~ m/^:/s) );
+ } elsif ( $file eq '' ) {
+ return 1 ;
+ } else {
+ return 0; # i.e. a file like "a"
+ }
+ }
+
+ =item path
+
+ Returns the null list for the MacPerl application, since the concept is
+ usually meaningless under Mac OS. But if you're using the MacPerl tool under
+ MPW, it gives back $ENV{Commands} suitably split, as is done in
+ :lib:ExtUtils:MM_Mac.pm.
+
+ =cut
+
+ sub path {
+ #
+ # The concept is meaningless under the MacPerl application.
+ # Under MPW, it has a meaning.
+ #
+ return unless exists $ENV{Commands};
+ return split(/,/, $ENV{Commands});
+ }
+
+ =item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path,
+ $no_file );
+
+ Splits a path into volume, directory, and filename portions.
+
+ On Mac OS, assumes that the last part of the path is a filename unless
+ $no_file is true or a trailing separator ":" is present.
+
+ The volume portion is always returned with a trailing ":". The directory portion
+ is always returned with a leading (to denote a relative path) and a trailing ":"
+ (to denote a directory). The file portion is always returned I<without> a leading ":".
+ Empty portions are returned as empty string ''.
+
+ The results can be passed to C<catpath()> to get back a path equivalent to
+ (usually identical to) the original path.
+
+
+ =cut
+
+ sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file);
+
+ if ( $nofile ) {
+ ( $volume, $directory ) = $path =~ m|^((?:[^:]+:)?)(.*)|s;
+ }
+ else {
+ $path =~
+ m|^( (?: [^:]+: )? )
+ ( (?: .*: )? )
+ ( .* )
+ |xs;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ $volume = '' unless defined($volume);
+ $directory = ":$directory" if ( $volume && $directory ); # take care of "HD::dir"
+ if ($directory) {
+ # Make sure non-empty directories begin and end in ':'
+ $directory .= ':' unless (substr($directory,-1) eq ':');
+ $directory = ":$directory" unless (substr($directory,0,1) eq ':');
+ } else {
+ $directory = '';
+ }
+ $file = '' unless defined($file);
+
+ return ($volume,$directory,$file);
+ }
+
+
+ =item splitdir
+
+ The opposite of C<catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+ $directories should be only the directory portion of the path on systems
+ that have the concept of a volume or that have path syntax that differentiates
+ files from directories. Consider using C<splitpath()> otherwise.
+
+ Unlike just splitting the directories on the separator, empty directory names
+ (C<"">) can be returned. Since C<catdir()> on Mac OS always appends a trailing
+ colon to distinguish a directory path from a file path, a single trailing colon
+ will be ignored, i.e. there's no empty directory name after it.
+
+ Hence, on Mac OS, both
+
+ File::Spec->splitdir( ":a:b::c:" ); and
+ File::Spec->splitdir( ":a:b::c" );
+
+ yield:
+
+ ( "a", "b", "::", "c")
+
+ while
+
+ File::Spec->splitdir( ":a:b::c::" );
+
+ yields:
+
+ ( "a", "b", "::", "c", "::")
+
+
+ =cut
+
+ sub splitdir {
+ my ($self, $path) = @_;
+ my @result = ();
+ my ($head, $sep, $tail, $volume, $directories);
+
+ return @result if ( (!defined($path)) || ($path eq '') );
+ return (':') if ($path eq ':');
+
+ ( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s;
+
+ # deprecated, but handle it correctly
+ if ($volume) {
+ push (@result, $volume);
+ $sep .= ':';
+ }
+
+ while ($sep || $directories) {
+ if (length($sep) > 1) {
+ my $updir_count = length($sep) - 1;
+ for (my $i=0; $i<$updir_count; $i++) {
+ # push '::' updir_count times;
+ # simulate Unix '..' updirs
+ push (@result, '::');
+ }
+ }
+ $sep = '';
+ if ($directories) {
+ ( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s;
+ push (@result, $head);
+ $directories = $tail;
+ }
+ }
+ return @result;
+ }
+
+
+ =item catpath
+
+ $path = File::Spec->catpath($volume,$directory,$file);
+
+ Takes volume, directory and file portions and returns an entire path. On Mac OS,
+ $volume, $directory and $file are concatenated. A ':' is inserted if need be. You
+ may pass an empty string for each portion. If all portions are empty, the empty
+ string is returned. If $volume is empty, the result will be a relative path,
+ beginning with a ':'. If $volume and $directory are empty, a leading ":" (if any)
+ is removed form $file and the remainder is returned. If $file is empty, the
+ resulting path will have a trailing ':'.
+
+
+ =cut
+
+ sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ if ( (! $volume) && (! $directory) ) {
+ $file =~ s/^:// if $file;
+ return $file ;
+ }
+
+ # We look for a volume in $volume, then in $directory, but not both
+
+ my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1);
+
+ $volume = $dir_volume unless length $volume;
+ my $path = $volume; # may be ''
+ $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
+
+ if ($directory) {
+ $directory = $dir_dirs if $volume;
+ $directory =~ s/^://; # remove leading ':' if any
+ $path .= $directory;
+ $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
+ }
+
+ if ($file) {
+ $file =~ s/^://; # remove leading ':' if any
+ $path .= $file;
+ }
+
+ return $path;
+ }
+
+ =item abs2rel
+
+ Takes a destination path and an optional base path and returns a relative path
+ from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+ Note that both paths are assumed to have a notation that distinguishes a
+ directory path (with trailing ':') from a file path (without trailing ':').
+
+ If $base is not present or '', then the current working directory is used.
+ If $base is relative, then it is converted to absolute form using C<rel2abs()>.
+ This means that it is taken to be relative to the current working directory.
+
+ If $path and $base appear to be on two different volumes, we will not
+ attempt to resolve the two paths, and we will instead simply return
+ $path. Note that previous versions of this module ignored the volume
+ of $base, which resulted in garbage results part of the time.
+
+ If $base doesn't have a trailing colon, the last element of $base is
+ assumed to be a filename. This filename is ignored. Otherwise all path
+ components are assumed to be directories.
+
+ If $path is relative, it is converted to absolute form using C<rel2abs()>.
+ This means that it is taken to be relative to the current working directory.
+
+ Based on code written by Shigio Yamaguchi.
+
+
+ =cut
+
+ # maybe this should be done in canonpath() ?
+ sub _resolve_updirs {
+ my $path = shift @_;
+ my $proceed;
+
+ # resolve any updirs, e.g. "HD:tmp::file" -> "HD:file"
+ do {
+ $proceed = ($path =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/);
+ } while ($proceed);
+
+ return $path;
+ }
+
+
+ sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ $base = _resolve_updirs( $base ); # resolve updirs in $base
+ }
+ else {
+ $base = _resolve_updirs( $base );
+ }
+
+ # Split up paths - ignore $base's file
+ my ( $path_vol, $path_dirs, $path_file ) = $self->splitpath( $path );
+ my ( $base_vol, $base_dirs ) = $self->splitpath( $base );
+
+ return $path unless lc( $path_vol ) eq lc( $base_vol );
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_dirs );
+ my @basechunks = $self->splitdir( $base_dirs );
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] ) ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # @pathchunks now has the directories to descend in to.
+ # ensure relative path, even if @pathchunks is empty
+ $path_dirs = $self->catdir( ':', @pathchunks );
+
+ # @basechunks now contains the number of directories to climb out of.
+ $base_dirs = (':' x @basechunks) . ':' ;
+
+ return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ;
+ }
+
+ =item rel2abs
+
+ Converts a relative path to an absolute path:
+
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+ Note that both paths are assumed to have a notation that distinguishes a
+ directory path (with trailing ':') from a file path (without trailing ':').
+
+ If $base is not present or '', then $base is set to the current working
+ directory. If $base is relative, then it is converted to absolute form
+ using C<rel2abs()>. This means that it is taken to be relative to the
+ current working directory.
+
+ If $base doesn't have a trailing colon, the last element of $base is
+ assumed to be a filename. This filename is ignored. Otherwise all path
+ components are assumed to be directories.
+
+ If $path is already absolute, it is returned and $base is ignored.
+
+ Based on code written by Shigio Yamaguchi.
+
+ =cut
+
+ sub rel2abs {
+ my ($self,$path,$base) = @_;
+
+ if ( ! $self->file_name_is_absolute($path) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute($base) ) {
+ $base = $self->rel2abs($base) ;
+ }
+
+ # Split up paths
+
+ # ignore $path's volume
+ my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ;
+
+ # ignore $base's file part
+ my ( $base_vol, $base_dirs ) = $self->splitpath($base) ;
+
+ # Glom them together
+ $path_dirs = ':' if ($path_dirs eq '');
+ $base_dirs =~ s/:$//; # remove trailing ':', if any
+ $base_dirs = $base_dirs . $path_dirs;
+
+ $path = $self->catpath( $base_vol, $base_dirs, $path_file );
+ }
+ return $path;
+ }
+
+
+ =back
+
+ =head1 AUTHORS
+
+ See the authors list in I<File::Spec>. Mac OS support by Paul Schinder
+ <schinder@pobox.com> and Thomas Wegner <wegner_thomas@yahoo.com>.
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =head1 SEE ALSO
+
+ See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+ implementation of these methods, not the semantics.
+
+ =cut
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_MAC
+
+$fatpacked{"File/Spec/OS2.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_OS2';
+ package File::Spec::OS2;
+
+ use strict;
+ use vars qw(@ISA $VERSION);
+ require File::Spec::Unix;
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ @ISA = qw(File::Spec::Unix);
+
+ sub devnull {
+ return "/dev/nul";
+ }
+
+ sub case_tolerant {
+ return 1;
+ }
+
+ sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return scalar($file =~ m{^([a-z]:)?[\\/]}is);
+ }
+
+ sub path {
+ my $path = $ENV{PATH};
+ $path =~ s:\\:/:g;
+ my @path = split(';',$path);
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
+ }
+
+ sub _cwd {
+ # In OS/2 the "require Cwd" is unnecessary bloat.
+ return Cwd::sys_cwd();
+ }
+
+ sub tmpdir {
+ my $cached = $_[0]->_cached_tmpdir(qw 'TMPDIR TEMP TMP');
+ return $cached if defined $cached;
+ my @d = @ENV{qw(TMPDIR TEMP TMP)}; # function call could autovivivy
+ $_[0]->_cache_tmpdir(
+ $_[0]->_tmpdir( @d, '/tmp', '/' ), qw 'TMPDIR TEMP TMP'
+ );
+ }
+
+ sub catdir {
+ my $self = shift;
+ my @args = @_;
+ foreach (@args) {
+ tr[\\][/];
+ # append a backslash to each argument unless it has one there
+ $_ .= "/" unless m{/$};
+ }
+ return $self->canonpath(join('', @args));
+ }
+
+ sub canonpath {
+ my ($self,$path) = @_;
+ return unless defined $path;
+
+ $path =~ s/^([a-z]:)/\l$1/s;
+ $path =~ s|\\|/|g;
+ $path =~ s|([^/])/+|$1/|g; # xx////xx -> xx/xx
+ $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx
+ $path =~ s|^(\./)+(?=[^/])||s; # ./xx -> xx
+ $path =~ s|/\Z(?!\n)||
+ unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/ -> xx
+ $path =~ s{^/\.\.$}{/}; # /.. -> /
+ 1 while $path =~ s{^/\.\.}{}; # /../xx -> /xx
+ return $path;
+ }
+
+
+ sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file) = ('','','');
+ if ( $nofile ) {
+ $path =~
+ m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? )
+ (.*)
+ }xs;
+ $volume = $1;
+ $directory = $2;
+ }
+ else {
+ $path =~
+ m{^ ( (?: [a-zA-Z]: |
+ (?:\\\\|//)[^\\/]+[\\/][^\\/]+
+ )?
+ )
+ ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? )
+ (.*)
+ }xs;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ return ($volume,$directory,$file);
+ }
+
+
+ sub splitdir {
+ my ($self,$directories) = @_ ;
+ split m|[\\/]|, $directories, -1;
+ }
+
+
+ sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ # If it's UNC, make sure the glue separator is there, reusing
+ # whatever separator is first in the $volume
+ $volume .= $1
+ if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s &&
+ $directory =~ m@^[^\\/]@s
+ ) ;
+
+ $volume .= $directory ;
+
+ # If the volume is not just A:, make sure the glue separator is
+ # there, reusing whatever separator is first in the $volume if possible.
+ if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+ $volume =~ m@[^\\/]\Z(?!\n)@ &&
+ $file =~ m@[^\\/]@
+ ) {
+ $volume =~ m@([\\/])@ ;
+ my $sep = $1 ? $1 : '/' ;
+ $volume .= $sep ;
+ }
+
+ $volume .= $file ;
+
+ return $volume ;
+ }
+
+
+ sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ } else {
+ $path = $self->canonpath( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ } elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ } else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Split up paths
+ my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ;
+ my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ;
+ return $path unless $path_volume eq $base_volume;
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my @basechunks = $self->splitdir( $base_directories );
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] )
+ ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # No need to catdir, we know these are well formed.
+ $path_directories = CORE::join( '/', @pathchunks );
+ $base_directories = CORE::join( '/', @basechunks );
+
+ # $base_directories now contains the directories the resulting relative
+ # path must ascend out of before it can descend to $path_directory. So,
+ # replace all names with $parentDir
+
+ #FA Need to replace between backslashes...
+ $base_directories =~ s|[^\\/]+|..|g ;
+
+ # Glue the two together, using a separator if necessary, and preventing an
+ # empty result.
+
+ #FA Must check that new directories are not empty.
+ if ( $path_directories ne '' && $base_directories ne '' ) {
+ $path_directories = "$base_directories/$path_directories" ;
+ } else {
+ $path_directories = "$base_directories$path_directories" ;
+ }
+
+ return $self->canonpath(
+ $self->catpath( "", $path_directories, $path_file )
+ ) ;
+ }
+
+
+ sub rel2abs {
+ my ($self,$path,$base ) = @_;
+
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path, 1 ))[1,2] ;
+
+ my ( $base_volume, $base_directories ) =
+ $self->splitpath( $base, 1 ) ;
+
+ $path = $self->catpath(
+ $base_volume,
+ $self->catdir( $base_directories, $path_directories ),
+ $path_file
+ ) ;
+ }
+
+ return $self->canonpath( $path ) ;
+ }
+
+ 1;
+ __END__
+
+ =head1 NAME
+
+ File::Spec::OS2 - methods for OS/2 file specs
+
+ =head1 SYNOPSIS
+
+ require File::Spec::OS2; # Done internally by File::Spec if needed
+
+ =head1 DESCRIPTION
+
+ See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+ implementation of these methods, not the semantics.
+
+ Amongst the changes made for OS/2 are...
+
+ =over 4
+
+ =item tmpdir
+
+ Modifies the list of places temp directory information is looked for.
+
+ $ENV{TMPDIR}
+ $ENV{TEMP}
+ $ENV{TMP}
+ /tmp
+ /
+
+ =item splitpath
+
+ Volumes can be drive letters or UNC sharenames (\\server\share).
+
+ =back
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_OS2
+
+$fatpacked{"File/Spec/Unix.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_UNIX';
+ package File::Spec::Unix;
+
+ use strict;
+ use vars qw($VERSION);
+
+ $VERSION = '3.47';
+ my $xs_version = $VERSION;
+ $VERSION =~ tr/_//;
+
+ unless (defined &canonpath) {
+ eval {
+ if ( $] >= 5.006 ) {
+ require XSLoader;
+ XSLoader::load("Cwd", $xs_version);
+ } else {
+ require Cwd;
+ }
+ };
+ }
+
+ =head1 NAME
+
+ File::Spec::Unix - File::Spec for Unix, base for other File::Spec modules
+
+ =head1 SYNOPSIS
+
+ require File::Spec::Unix; # Done automatically by File::Spec
+
+ =head1 DESCRIPTION
+
+ Methods for manipulating file specifications. Other File::Spec
+ modules, such as File::Spec::Mac, inherit from File::Spec::Unix and
+ override specific methods.
+
+ =head1 METHODS
+
+ =over 2
+
+ =item canonpath()
+
+ No physical check on the filesystem, but a logical cleanup of a
+ path. On UNIX eliminates successive slashes and successive "/.".
+
+ $cpath = File::Spec->canonpath( $path ) ;
+
+ Note that this does *not* collapse F<x/../y> sections into F<y>. This
+ is by design. If F</foo> on your system is a symlink to F</bar/baz>,
+ then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive
+ F<../>-removal would give you. If you want to do this kind of
+ processing, you probably want C<Cwd>'s C<realpath()> function to
+ actually traverse the filesystem cleaning up paths like this.
+
+ =cut
+
+ sub _pp_canonpath {
+ my ($self,$path) = @_;
+ return unless defined $path;
+
+ # Handle POSIX-style node names beginning with double slash (qnx, nto)
+ # (POSIX says: "a pathname that begins with two successive slashes
+ # may be interpreted in an implementation-defined manner, although
+ # more than two leading slashes shall be treated as a single slash.")
+ my $node = '';
+ my $double_slashes_special = $^O eq 'qnx' || $^O eq 'nto';
+
+
+ if ( $double_slashes_special
+ && ( $path =~ s{^(//[^/]+)/?\z}{}s || $path =~ s{^(//[^/]+)/}{/}s ) ) {
+ $node = $1;
+ }
+ # This used to be
+ # $path =~ s|/+|/|g unless ($^O eq 'cygwin');
+ # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail
+ # (Mainly because trailing "" directories didn't get stripped).
+ # Why would cygwin avoid collapsing multiple slashes into one? --jhi
+ $path =~ s|/{2,}|/|g; # xx////xx -> xx/xx
+ $path =~ s{(?:/\.)+(?:/|\z)}{/}g; # xx/././xx -> xx/xx
+ $path =~ s|^(?:\./)+||s unless $path eq "./"; # ./xx -> xx
+ $path =~ s|^/(?:\.\./)+|/|; # /../../xx -> xx
+ $path =~ s|^/\.\.$|/|; # /.. -> /
+ $path =~ s|/\z|| unless $path eq "/"; # xx/ -> xx
+ return "$node$path";
+ }
+ *canonpath = \&_pp_canonpath unless defined &canonpath;
+
+ =item catdir()
+
+ Concatenate two or more directory names to form a complete path ending
+ with a directory. But remove the trailing slash from the resulting
+ string, because it doesn't look good, isn't necessary and confuses
+ OS2. Of course, if this is the root directory, don't cut off the
+ trailing slash :-)
+
+ =cut
+
+ sub _pp_catdir {
+ my $self = shift;
+
+ $self->canonpath(join('/', @_, '')); # '' because need a trailing '/'
+ }
+ *catdir = \&_pp_catdir unless defined &catdir;
+
+ =item catfile
+
+ Concatenate one or more directory names and a filename to form a
+ complete path ending with a filename
+
+ =cut
+
+ sub _pp_catfile {
+ my $self = shift;
+ my $file = $self->canonpath(pop @_);
+ return $file unless @_;
+ my $dir = $self->catdir(@_);
+ $dir .= "/" unless substr($dir,-1) eq "/";
+ return $dir.$file;
+ }
+ *catfile = \&_pp_catfile unless defined &catfile;
+
+ =item curdir
+
+ Returns a string representation of the current directory. "." on UNIX.
+
+ =cut
+
+ sub curdir { '.' }
+ use constant _fn_curdir => ".";
+
+ =item devnull
+
+ Returns a string representation of the null device. "/dev/null" on UNIX.
+
+ =cut
+
+ sub devnull { '/dev/null' }
+ use constant _fn_devnull => "/dev/null";
+
+ =item rootdir
+
+ Returns a string representation of the root directory. "/" on UNIX.
+
+ =cut
+
+ sub rootdir { '/' }
+ use constant _fn_rootdir => "/";
+
+ =item tmpdir
+
+ Returns a string representation of the first writable directory from
+ the following list or the current directory if none from the list are
+ writable:
+
+ $ENV{TMPDIR}
+ /tmp
+
+ If running under taint mode, and if $ENV{TMPDIR}
+ is tainted, it is not used.
+
+ =cut
+
+ my ($tmpdir, %tmpenv);
+ # Cache and return the calculated tmpdir, recording which env vars
+ # determined it.
+ sub _cache_tmpdir {
+ @tmpenv{@_[2..$#_]} = @ENV{@_[2..$#_]};
+ return $tmpdir = $_[1];
+ }
+ # Retrieve the cached tmpdir, checking first whether relevant env vars have
+ # changed and invalidated the cache.
+ sub _cached_tmpdir {
+ shift;
+ local $^W;
+ return if grep $ENV{$_} ne $tmpenv{$_}, @_;
+ return $tmpdir;
+ }
+ sub _tmpdir {
+ my $self = shift;
+ my @dirlist = @_;
+ my $taint = do { no strict 'refs'; ${"\cTAINT"} };
+ if ($taint) { # Check for taint mode on perl >= 5.8.0
+ require Scalar::Util;
+ @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist;
+ }
+ elsif ($] < 5.007) { # No ${^TAINT} before 5.8
+ @dirlist = grep { eval { eval('1'.substr $_,0,0) } } @dirlist;
+ }
+
+ foreach (@dirlist) {
+ next unless defined && -d && -w _;
+ $tmpdir = $_;
+ last;
+ }
+ $tmpdir = $self->curdir unless defined $tmpdir;
+ $tmpdir = defined $tmpdir && $self->canonpath($tmpdir);
+ if ( !$self->file_name_is_absolute($tmpdir) ) {
+ # See [perl #120593] for the full details
+ # If possible, return a full path, rather than '.' or 'lib', but
+ # jump through some hoops to avoid returning a tainted value.
+ ($tmpdir) = grep {
+ $taint ? ! Scalar::Util::tainted($_) :
+ $] < 5.007 ? eval { eval('1'.substr $_,0,0) } : 1
+ } $self->rel2abs($tmpdir), $tmpdir;
+ }
+ return $tmpdir;
+ }
+
+ sub tmpdir {
+ my $cached = $_[0]->_cached_tmpdir('TMPDIR');
+ return $cached if defined $cached;
+ $_[0]->_cache_tmpdir($_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp" ), 'TMPDIR');
+ }
+
+ =item updir
+
+ Returns a string representation of the parent directory. ".." on UNIX.
+
+ =cut
+
+ sub updir { '..' }
+ use constant _fn_updir => "..";
+
+ =item no_upwards
+
+ Given a list of file names, strip out those that refer to a parent
+ directory. (Does not strip symlinks, only '.', '..', and equivalents.)
+
+ =cut
+
+ sub no_upwards {
+ my $self = shift;
+ return grep(!/^\.{1,2}\z/s, @_);
+ }
+
+ =item case_tolerant
+
+ Returns a true or false value indicating, respectively, that alphabetic
+ is not or is significant when comparing file specifications.
+
+ =cut
+
+ sub case_tolerant { 0 }
+ use constant _fn_case_tolerant => 0;
+
+ =item file_name_is_absolute
+
+ Takes as argument a path and returns true if it is an absolute path.
+
+ This does not consult the local filesystem on Unix, Win32, OS/2 or Mac
+ OS (Classic). It does consult the working environment for VMS (see
+ L<File::Spec::VMS/file_name_is_absolute>).
+
+ =cut
+
+ sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return scalar($file =~ m:^/:s);
+ }
+
+ =item path
+
+ Takes no argument, returns the environment variable PATH as an array.
+
+ =cut
+
+ sub path {
+ return () unless exists $ENV{PATH};
+ my @path = split(':', $ENV{PATH});
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
+ }
+
+ =item join
+
+ join is the same as catfile.
+
+ =cut
+
+ sub join {
+ my $self = shift;
+ return $self->catfile(@_);
+ }
+
+ =item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path,
+ $no_file );
+
+ Splits a path into volume, directory, and filename portions. On systems
+ with no concept of volume, returns '' for volume.
+
+ For systems with no syntax differentiating filenames from directories,
+ assumes that the last file is a path unless $no_file is true or a
+ trailing separator or /. or /.. is present. On Unix this means that $no_file
+ true makes this return ( '', $path, '' ).
+
+ The directory portion may or may not be returned with a trailing '/'.
+
+ The results can be passed to L</catpath()> to get back a path equivalent to
+ (usually identical to) the original path.
+
+ =cut
+
+ sub splitpath {
+ my ($self,$path, $nofile) = @_;
+
+ my ($volume,$directory,$file) = ('','','');
+
+ if ( $nofile ) {
+ $directory = $path;
+ }
+ else {
+ $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs;
+ $directory = $1;
+ $file = $2;
+ }
+
+ return ($volume,$directory,$file);
+ }
+
+
+ =item splitdir
+
+ The opposite of L</catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+ $directories must be only the directory portion of the path on systems
+ that have the concept of a volume or that have path syntax that differentiates
+ files from directories.
+
+ Unlike just splitting the directories on the separator, empty
+ directory names (C<''>) can be returned, because these are significant
+ on some OSs.
+
+ On Unix,
+
+ File::Spec->splitdir( "/a/b//c/" );
+
+ Yields:
+
+ ( '', 'a', 'b', '', 'c', '' )
+
+ =cut
+
+ sub splitdir {
+ return split m|/|, $_[1], -1; # Preserve trailing fields
+ }
+
+
+ =item catpath()
+
+ Takes volume, directory and file portions and returns an entire path. Under
+ Unix, $volume is ignored, and directory and file are concatenated. A '/' is
+ inserted if needed (though if the directory portion doesn't start with
+ '/' it is not added). On other OSs, $volume is significant.
+
+ =cut
+
+ sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ if ( $directory ne '' &&
+ $file ne '' &&
+ substr( $directory, -1 ) ne '/' &&
+ substr( $file, 0, 1 ) ne '/'
+ ) {
+ $directory .= "/$file" ;
+ }
+ else {
+ $directory .= $file ;
+ }
+
+ return $directory ;
+ }
+
+ =item abs2rel
+
+ Takes a destination path and an optional base path returns a relative path
+ from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+ If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+ relative, then it is converted to absolute form using
+ L</rel2abs()>. This means that it is taken to be relative to
+ L<cwd()|Cwd>.
+
+ On systems that have a grammar that indicates filenames, this ignores the
+ $base filename. Otherwise all path components are assumed to be
+ directories.
+
+ If $path is relative, it is converted to absolute form using L</rel2abs()>.
+ This means that it is taken to be relative to L<cwd()|Cwd>.
+
+ No checks against the filesystem are made, so the result may not be correct if
+ C<$base> contains symbolic links. (Apply
+ L<Cwd::abs_path()|Cwd/abs_path> beforehand if that
+ is a concern.) On VMS, there is interaction with the working environment, as
+ logicals and macros are expanded.
+
+ Based on code written by Shigio Yamaguchi.
+
+ =cut
+
+ sub abs2rel {
+ my($self,$path,$base) = @_;
+ $base = $self->_cwd() unless defined $base and length $base;
+
+ ($path, $base) = map $self->canonpath($_), $path, $base;
+
+ my $path_directories;
+ my $base_directories;
+
+ if (grep $self->file_name_is_absolute($_), $path, $base) {
+ ($path, $base) = map $self->rel2abs($_), $path, $base;
+
+ my ($path_volume) = $self->splitpath($path, 1);
+ my ($base_volume) = $self->splitpath($base, 1);
+
+ # Can't relativize across volumes
+ return $path unless $path_volume eq $base_volume;
+
+ $path_directories = ($self->splitpath($path, 1))[1];
+ $base_directories = ($self->splitpath($base, 1))[1];
+
+ # For UNC paths, the user might give a volume like //foo/bar that
+ # strictly speaking has no directory portion. Treat it as if it
+ # had the root directory for that volume.
+ if (!length($base_directories) and $self->file_name_is_absolute($base)) {
+ $base_directories = $self->rootdir;
+ }
+ }
+ else {
+ my $wd= ($self->splitpath($self->_cwd(), 1))[1];
+ $path_directories = $self->catdir($wd, $path);
+ $base_directories = $self->catdir($wd, $base);
+ }
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my @basechunks = $self->splitdir( $base_directories );
+
+ if ($base_directories eq $self->rootdir) {
+ return $self->curdir if $path_directories eq $self->rootdir;
+ shift @pathchunks;
+ return $self->canonpath( $self->catpath('', $self->catdir( @pathchunks ), '') );
+ }
+
+ my @common;
+ while (@pathchunks && @basechunks && $self->_same($pathchunks[0], $basechunks[0])) {
+ push @common, shift @pathchunks ;
+ shift @basechunks ;
+ }
+ return $self->curdir unless @pathchunks || @basechunks;
+
+ # @basechunks now contains the directories the resulting relative path
+ # must ascend out of before it can descend to $path_directory. If there
+ # are updir components, we must descend into the corresponding directories
+ # (this only works if they are no symlinks).
+ my @reverse_base;
+ while( defined(my $dir= shift @basechunks) ) {
+ if( $dir ne $self->updir ) {
+ unshift @reverse_base, $self->updir;
+ push @common, $dir;
+ }
+ elsif( @common ) {
+ if( @reverse_base && $reverse_base[0] eq $self->updir ) {
+ shift @reverse_base;
+ pop @common;
+ }
+ else {
+ unshift @reverse_base, pop @common;
+ }
+ }
+ }
+ my $result_dirs = $self->catdir( @reverse_base, @pathchunks );
+ return $self->canonpath( $self->catpath('', $result_dirs, '') );
+ }
+
+ sub _same {
+ $_[1] eq $_[2];
+ }
+
+ =item rel2abs()
+
+ Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+ If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+ relative, then it is converted to absolute form using
+ L</rel2abs()>. This means that it is taken to be relative to
+ L<cwd()|Cwd>.
+
+ On systems that have a grammar that indicates filenames, this ignores
+ the $base filename. Otherwise all path components are assumed to be
+ directories.
+
+ If $path is absolute, it is cleaned up and returned using L</canonpath()>.
+
+ No checks against the filesystem are made. On VMS, there is
+ interaction with the working environment, as logicals and
+ macros are expanded.
+
+ Based on code written by Shigio Yamaguchi.
+
+ =cut
+
+ sub rel2abs {
+ my ($self,$path,$base ) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd();
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Glom them together
+ $path = $self->catdir( $base, $path ) ;
+ }
+
+ return $self->canonpath( $path ) ;
+ }
+
+ =back
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ Please submit bug reports and patches to perlbug@perl.org.
+
+ =head1 SEE ALSO
+
+ L<File::Spec>
+
+ =cut
+
+ # Internal routine to File::Spec, no point in making this public since
+ # it is the standard Cwd interface. Most of the platform-specific
+ # File::Spec subclasses use this.
+ sub _cwd {
+ require Cwd;
+ Cwd::getcwd();
+ }
+
+
+ # Internal method to reduce xx\..\yy -> yy
+ sub _collapse {
+ my($fs, $path) = @_;
+
+ my $updir = $fs->updir;
+ my $curdir = $fs->curdir;
+
+ my($vol, $dirs, $file) = $fs->splitpath($path);
+ my @dirs = $fs->splitdir($dirs);
+ pop @dirs if @dirs && $dirs[-1] eq '';
+
+ my @collapsed;
+ foreach my $dir (@dirs) {
+ if( $dir eq $updir and # if we have an updir
+ @collapsed and # and something to collapse
+ length $collapsed[-1] and # and its not the rootdir
+ $collapsed[-1] ne $updir and # nor another updir
+ $collapsed[-1] ne $curdir # nor the curdir
+ )
+ { # then
+ pop @collapsed; # collapse
+ }
+ else { # else
+ push @collapsed, $dir; # just hang onto it
+ }
+ }
+
+ return $fs->catpath($vol,
+ $fs->catdir(@collapsed),
+ $file
+ );
+ }
+
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_UNIX
+
+$fatpacked{"File/Spec/VMS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_VMS';
+ package File::Spec::VMS;
+
+ use strict;
+ use vars qw(@ISA $VERSION);
+ require File::Spec::Unix;
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ @ISA = qw(File::Spec::Unix);
+
+ use File::Basename;
+ use VMS::Filespec;
+
+ =head1 NAME
+
+ File::Spec::VMS - methods for VMS file specs
+
+ =head1 SYNOPSIS
+
+ require File::Spec::VMS; # Done internally by File::Spec if needed
+
+ =head1 DESCRIPTION
+
+ See File::Spec::Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ The default behavior is to allow either VMS or Unix syntax on input and to
+ return VMS syntax on output unless Unix syntax has been explicitly requested
+ via the C<DECC$FILENAME_UNIX_REPORT> CRTL feature.
+
+ =over 4
+
+ =cut
+
+ # Need to look up the feature settings. The preferred way is to use the
+ # VMS::Feature module, but that may not be available to dual life modules.
+
+ my $use_feature;
+ BEGIN {
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $use_feature = 1;
+ }
+ }
+
+ # Need to look up the UNIX report mode. This may become a dynamic mode
+ # in the future.
+ sub _unix_rpt {
+ my $unix_rpt;
+ if ($use_feature) {
+ $unix_rpt = VMS::Feature::current("filename_unix_report");
+ } else {
+ my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
+ }
+ return $unix_rpt;
+ }
+
+ =item canonpath (override)
+
+ Removes redundant portions of file specifications and returns results
+ in native syntax unless Unix filename reporting has been enabled.
+
+ =cut
+
+
+ sub canonpath {
+ my($self,$path) = @_;
+
+ return undef unless defined $path;
+
+ my $unix_rpt = $self->_unix_rpt;
+
+ if ($path =~ m|/|) {
+ my $pathify = $path =~ m|/\Z(?!\n)|;
+ $path = $self->SUPER::canonpath($path);
+
+ return $path if $unix_rpt;
+ $path = $pathify ? vmspath($path) : vmsify($path);
+ }
+
+ $path =~ s/(?<!\^)</[/; # < and > ==> [ and ]
+ $path =~ s/(?<!\^)>/]/;
+ $path =~ s/(?<!\^)\]\[\./\.\]\[/g; # ][. ==> .][
+ $path =~ s/(?<!\^)\[000000\.\]\[/\[/g; # [000000.][ ==> [
+ $path =~ s/(?<!\^)\[000000\./\[/g; # [000000. ==> [
+ $path =~ s/(?<!\^)\.\]\[000000\]/\]/g; # .][000000] ==> ]
+ $path =~ s/(?<!\^)\.\]\[/\./g; # foo.][bar ==> foo.bar
+ 1 while ($path =~ s/(?<!\^)([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/);
+ # That loop does the following
+ # with any amount of dashes:
+ # .-.-. ==> .--.
+ # [-.-. ==> [--.
+ # .-.-] ==> .--]
+ # [-.-] ==> [--]
+ 1 while ($path =~ s/(?<!\^)([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/);
+ # That loop does the following
+ # with any amount (minimum 2)
+ # of dashes:
+ # .foo.--. ==> .-.
+ # .foo.--] ==> .-]
+ # [foo.--. ==> [-.
+ # [foo.--] ==> [-]
+ #
+ # And then, the remaining cases
+ $path =~ s/(?<!\^)\[\.-/[-/; # [.- ==> [-
+ $path =~ s/(?<!\^)\.[^\]\.]+\.-\./\./g; # .foo.-. ==> .
+ $path =~ s/(?<!\^)\[[^\]\.]+\.-\./\[/g; # [foo.-. ==> [
+ $path =~ s/(?<!\^)\.[^\]\.]+\.-\]/\]/g; # .foo.-] ==> ]
+ # [foo.-] ==> [000000]
+ $path =~ s/(?<!\^)\[[^\]\.]+\.-\]/\[000000\]/g;
+ # [] ==>
+ $path =~ s/(?<!\^)\[\]// unless $path eq '[]';
+ return $unix_rpt ? unixify($path) : $path;
+ }
+
+ =item catdir (override)
+
+ Concatenates a list of file specifications, and returns the result as a
+ native directory specification unless the Unix filename reporting feature
+ has been enabled. No check is made for "impossible" cases (e.g. elements
+ other than the first being absolute filespecs).
+
+ =cut
+
+ sub catdir {
+ my $self = shift;
+ my $dir = pop;
+
+ my $unix_rpt = $self->_unix_rpt;
+
+ my @dirs = grep {defined() && length()} @_;
+
+ my $rslt;
+ if (@dirs) {
+ my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
+ my ($spath,$sdir) = ($path,$dir);
+ $spath =~ s/\.dir\Z(?!\n)//i; $sdir =~ s/\.dir\Z(?!\n)//i;
+
+ if ($unix_rpt) {
+ $spath = unixify($spath) unless $spath =~ m#/#;
+ $sdir= unixify($sdir) unless $sdir =~ m#/#;
+ return $self->SUPER::catdir($spath, $sdir)
+ }
+
+ $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+\Z(?!\n)/s;
+ $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
+
+ # Special case for VMS absolute directory specs: these will have
+ # had device prepended during trip through Unix syntax in
+ # eliminate_macros(), since Unix syntax has no way to express
+ # "absolute from the top of this device's directory tree".
+ if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; }
+
+ } else {
+ # Single directory. Return an empty string on null input; otherwise
+ # just return a canonical path.
+
+ if (not defined $dir or not length $dir) {
+ $rslt = '';
+ } else {
+ $rslt = $unix_rpt ? $dir : vmspath($dir);
+ }
+ }
+ return $self->canonpath($rslt);
+ }
+
+ =item catfile (override)
+
+ Concatenates a list of directory specifications with a filename specification
+ to build a path.
+
+ =cut
+
+ sub catfile {
+ my $self = shift;
+ my $tfile = pop();
+ my $file = $self->canonpath($tfile);
+ my @files = grep {defined() && length()} @_;
+
+ my $unix_rpt = $self->_unix_rpt;
+
+ my $rslt;
+ if (@files) {
+ my $path = (@files == 1 ? $files[0] : $self->catdir(@files));
+ my $spath = $path;
+
+ # Something building a VMS path in pieces may try to pass a
+ # directory name in filename format, so normalize it.
+ $spath =~ s/\.dir\Z(?!\n)//i;
+
+ # If the spath ends with a directory delimiter and the file is bare,
+ # then just concatenate them.
+ if ($spath =~ /^(?<!\^)[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) {
+ $rslt = "$spath$file";
+ } else {
+ $rslt = $self->eliminate_macros($spath);
+ $rslt .= (defined($rslt) && length($rslt) ? '/' : '') . unixify($file);
+ $rslt = vmsify($rslt) unless $unix_rpt;
+ }
+ }
+ else {
+ # Only passed a single file?
+ my $xfile = (defined($file) && length($file)) ? $file : '';
+
+ $rslt = $unix_rpt ? $file : vmsify($file);
+ }
+ return $self->canonpath($rslt) unless $unix_rpt;
+
+ # In Unix report mode, do not strip off redundant path information.
+ return $rslt;
+ }
+
+
+ =item curdir (override)
+
+ Returns a string representation of the current directory: '[]' or '.'
+
+ =cut
+
+ sub curdir {
+ my $self = shift @_;
+ return '.' if ($self->_unix_rpt);
+ return '[]';
+ }
+
+ =item devnull (override)
+
+ Returns a string representation of the null device: '_NLA0:' or '/dev/null'
+
+ =cut
+
+ sub devnull {
+ my $self = shift @_;
+ return '/dev/null' if ($self->_unix_rpt);
+ return "_NLA0:";
+ }
+
+ =item rootdir (override)
+
+ Returns a string representation of the root directory: 'SYS$DISK:[000000]'
+ or '/'
+
+ =cut
+
+ sub rootdir {
+ my $self = shift @_;
+ if ($self->_unix_rpt) {
+ # Root may exist, try it first.
+ my $try = '/';
+ my ($dev1, $ino1) = stat('/');
+ my ($dev2, $ino2) = stat('.');
+
+ # Perl falls back to '.' if it can not determine '/'
+ if (($dev1 != $dev2) || ($ino1 != $ino2)) {
+ return $try;
+ }
+ # Fall back to UNIX format sys$disk.
+ return '/sys$disk/';
+ }
+ return 'SYS$DISK:[000000]';
+ }
+
+ =item tmpdir (override)
+
+ Returns a string representation of the first writable directory
+ from the following list or '' if none are writable:
+
+ /tmp if C<DECC$FILENAME_UNIX_REPORT> is enabled.
+ sys$scratch:
+ $ENV{TMPDIR}
+
+ If running under taint mode, and if $ENV{TMPDIR}
+ is tainted, it is not used.
+
+ =cut
+
+ sub tmpdir {
+ my $self = shift @_;
+ my $tmpdir = $self->_cached_tmpdir('TMPDIR');
+ return $tmpdir if defined $tmpdir;
+ if ($self->_unix_rpt) {
+ $tmpdir = $self->_tmpdir('/tmp', '/sys$scratch', $ENV{TMPDIR});
+ }
+ else {
+ $tmpdir = $self->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} );
+ }
+ $self->_cache_tmpdir($tmpdir, 'TMPDIR');
+ }
+
+ =item updir (override)
+
+ Returns a string representation of the parent directory: '[-]' or '..'
+
+ =cut
+
+ sub updir {
+ my $self = shift @_;
+ return '..' if ($self->_unix_rpt);
+ return '[-]';
+ }
+
+ =item case_tolerant (override)
+
+ VMS file specification syntax is case-tolerant.
+
+ =cut
+
+ sub case_tolerant {
+ return 1;
+ }
+
+ =item path (override)
+
+ Translate logical name DCL$PATH as a searchlist, rather than trying
+ to C<split> string value of C<$ENV{'PATH'}>.
+
+ =cut
+
+ sub path {
+ my (@dirs,$dir,$i);
+ while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
+ return @dirs;
+ }
+
+ =item file_name_is_absolute (override)
+
+ Checks for VMS directory spec as well as Unix separators.
+
+ =cut
+
+ sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ # If it's a logical name, expand it.
+ $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file};
+ return scalar($file =~ m!^/!s ||
+ $file =~ m![<\[][^.\-\]>]! ||
+ $file =~ /^[A-Za-z0-9_\$\-\~]+(?<!\^):/);
+ }
+
+ =item splitpath (override)
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path,
+ $no_file );
+
+ Passing a true value for C<$no_file> indicates that the path being
+ split only contains directory components, even on systems where you
+ can usually (when not supporting a foreign syntax) tell the difference
+ between directories and files at a glance.
+
+ =cut
+
+ sub splitpath {
+ my($self,$path, $nofile) = @_;
+ my($dev,$dir,$file) = ('','','');
+ my $vmsify_path = vmsify($path);
+
+ if ( $nofile ) {
+ #vmsify('d1/d2/d3') returns '[.d1.d2]d3'
+ #vmsify('/d1/d2/d3') returns 'd1:[d2]d3'
+ if( $vmsify_path =~ /(.*)\](.+)/ ){
+ $vmsify_path = $1.'.'.$2.']';
+ }
+ $vmsify_path =~ /(.+:)?(.*)/s;
+ $dir = defined $2 ? $2 : ''; # dir can be '0'
+ return ($1 || '',$dir,$file);
+ }
+ else {
+ $vmsify_path =~ /(.+:)?([\[<].*[\]>])?(.*)/s;
+ return ($1 || '',$2 || '',$3);
+ }
+ }
+
+ =item splitdir (override)
+
+ Split a directory specification into the components.
+
+ =cut
+
+ sub splitdir {
+ my($self,$dirspec) = @_;
+ my @dirs = ();
+ return @dirs if ( (!defined $dirspec) || ('' eq $dirspec) );
+
+ $dirspec =~ s/(?<!\^)</[/; # < and > ==> [ and ]
+ $dirspec =~ s/(?<!\^)>/]/;
+ $dirspec =~ s/(?<!\^)\]\[\./\.\]\[/g; # ][. ==> .][
+ $dirspec =~ s/(?<!\^)\[000000\.\]\[/\[/g; # [000000.][ ==> [
+ $dirspec =~ s/(?<!\^)\[000000\./\[/g; # [000000. ==> [
+ $dirspec =~ s/(?<!\^)\.\]\[000000\]/\]/g; # .][000000] ==> ]
+ $dirspec =~ s/(?<!\^)\.\]\[/\./g; # foo.][bar ==> foo.bar
+ while ($dirspec =~ s/(^|[\[\<\.])\-(\-+)($|[\]\>\.])/$1-.$2$3/g) {}
+ # That loop does the following
+ # with any amount of dashes:
+ # .--. ==> .-.-.
+ # [--. ==> [-.-.
+ # .--] ==> .-.-]
+ # [--] ==> [-.-]
+ $dirspec = "[$dirspec]" unless $dirspec =~ /(?<!\^)[\[<]/; # make legal
+ $dirspec =~ s/^(\[|<)\./$1/;
+ @dirs = split /(?<!\^)\./, vmspath($dirspec);
+ $dirs[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\Z(?!\n)//s;
+ @dirs;
+ }
+
+
+ =item catpath (override)
+
+ Construct a complete filespec.
+
+ =cut
+
+ sub catpath {
+ my($self,$dev,$dir,$file) = @_;
+
+ # We look for a volume in $dev, then in $dir, but not both
+ my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir);
+ $dev = $dir_volume unless length $dev;
+ $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) : $dir_dir;
+
+ if ($dev =~ m|^(?<!\^)/+([^/]+)|) { $dev = "$1:"; }
+ else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; }
+ if (length($dev) or length($dir)) {
+ $dir = "[$dir]" unless $dir =~ /(?<!\^)[\[<\/]/;
+ $dir = vmspath($dir);
+ }
+ $dir = '' if length($dev) && ($dir eq '[]' || $dir eq '<>');
+ "$dev$dir$file";
+ }
+
+ =item abs2rel (override)
+
+ Attempt to convert an absolute file specification to a relative specification.
+
+ =cut
+
+ sub abs2rel {
+ my $self = shift;
+ return vmspath(File::Spec::Unix::abs2rel( $self, @_ ))
+ if grep m{/}, @_;
+
+ my($path,$base) = @_;
+ $base = $self->_cwd() unless defined $base and length $base;
+
+ for ($path, $base) { $_ = $self->canonpath($_) }
+
+ # Are we even starting $path on the same (node::)device as $base? Note that
+ # logical paths or nodename differences may be on the "same device"
+ # but the comparison that ignores device differences so as to concatenate
+ # [---] up directory specs is not even a good idea in cases where there is
+ # a logical path difference between $path and $base nodename and/or device.
+ # Hence we fall back to returning the absolute $path spec
+ # if there is a case blind device (or node) difference of any sort
+ # and we do not even try to call $parse() or consult %ENV for $trnlnm()
+ # (this module needs to run on non VMS platforms after all).
+
+ my ($path_volume, $path_directories, $path_file) = $self->splitpath($path);
+ my ($base_volume, $base_directories, $base_file) = $self->splitpath($base);
+ return $path unless lc($path_volume) eq lc($base_volume);
+
+ for ($path, $base) { $_ = $self->rel2abs($_) }
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my $pathchunks = @pathchunks;
+ unshift(@pathchunks,'000000') unless $pathchunks[0] eq '000000';
+ my @basechunks = $self->splitdir( $base_directories );
+ my $basechunks = @basechunks;
+ unshift(@basechunks,'000000') unless $basechunks[0] eq '000000';
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] )
+ ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # @basechunks now contains the directories to climb out of,
+ # @pathchunks now has the directories to descend in to.
+ if ((@basechunks > 0) || ($basechunks != $pathchunks)) {
+ $path_directories = join '.', ('-' x @basechunks, @pathchunks) ;
+ }
+ else {
+ $path_directories = join '.', @pathchunks;
+ }
+ $path_directories = '['.$path_directories.']';
+ return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ;
+ }
+
+
+ =item rel2abs (override)
+
+ Return an absolute file specification from a relative one.
+
+ =cut
+
+ sub rel2abs {
+ my $self = shift ;
+ my ($path,$base ) = @_;
+ return undef unless defined $path;
+ if ($path =~ m/\//) {
+ $path = ( -d $path || $path =~ m/\/\z/ # educated guessing about
+ ? vmspath($path) # whether it's a directory
+ : vmsify($path) );
+ }
+ $base = vmspath($base) if defined $base && $base =~ m/\//;
+
+ # Clean up and split up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = $self->_cwd;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Split up paths
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path ))[1,2] ;
+
+ my ( $base_volume, $base_directories ) =
+ $self->splitpath( $base ) ;
+
+ $path_directories = '' if $path_directories eq '[]' ||
+ $path_directories eq '<>';
+ my $sep = '' ;
+ $sep = '.'
+ if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} &&
+ $path_directories =~ m{^[^.\[<]}s
+ ) ;
+ $base_directories = "$base_directories$sep$path_directories";
+ $base_directories =~ s{\.?[\]>][\[<]\.?}{.};
+
+ $path = $self->catpath( $base_volume, $base_directories, $path_file );
+ }
+
+ return $self->canonpath( $path ) ;
+ }
+
+
+ # eliminate_macros() and fixpath() are MakeMaker-specific methods
+ # which are used inside catfile() and catdir(). MakeMaker has its own
+ # copies as of 6.06_03 which are the canonical ones. We leave these
+ # here, in peace, so that File::Spec continues to work with MakeMakers
+ # prior to 6.06_03.
+ #
+ # Please consider these two methods deprecated. Do not patch them,
+ # patch the ones in ExtUtils::MM_VMS instead.
+ #
+ # Update: MakeMaker 6.48 is still using these routines on VMS.
+ # so they need to be kept up to date with ExtUtils::MM_VMS.
+
+ sub eliminate_macros {
+ my($self,$path) = @_;
+ return '' unless (defined $path) && ($path ne '');
+ $self = {} unless ref $self;
+
+ if ($path =~ /\s/) {
+ return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
+ }
+
+ my $npath = unixify($path);
+ # sometimes unixify will return a string with an off-by-one trailing null
+ $npath =~ s{\0$}{};
+
+ my($complex) = 0;
+ my($head,$macro,$tail);
+
+ # perform m##g in scalar context so it acts as an iterator
+ while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
+ if (defined $self->{$2}) {
+ ($head,$macro,$tail) = ($1,$2,$3);
+ if (ref $self->{$macro}) {
+ if (ref $self->{$macro} eq 'ARRAY') {
+ $macro = join ' ', @{$self->{$macro}};
+ }
+ else {
+ print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+ "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+ $macro = "\cB$macro\cB";
+ $complex = 1;
+ }
+ }
+ else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
+ $npath = "$head$macro$tail";
+ }
+ }
+ if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+ $npath;
+ }
+
+ # Deprecated. See the note above for eliminate_macros().
+
+ # Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
+ # in any directory specification, in order to avoid juxtaposing two
+ # VMS-syntax directories when MM[SK] is run. Also expands expressions which
+ # are all macro, so that we can tell how long the expansion is, and avoid
+ # overrunning DCL's command buffer when MM[KS] is running.
+
+ # fixpath() checks to see whether the result matches the name of a
+ # directory in the current default directory and returns a directory or
+ # file specification accordingly. C<$is_dir> can be set to true to
+ # force fixpath() to consider the path to be a directory or false to force
+ # it to be a file.
+
+ sub fixpath {
+ my($self,$path,$force_path) = @_;
+ return '' unless $path;
+ $self = bless {}, $self unless ref $self;
+ my($fixedpath,$prefix,$name);
+
+ if ($path =~ /\s/) {
+ return join ' ',
+ map { $self->fixpath($_,$force_path) }
+ split /\s+/, $path;
+ }
+
+ if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
+ if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
+ $fixedpath = vmspath($self->eliminate_macros($path));
+ }
+ else {
+ $fixedpath = vmsify($self->eliminate_macros($path));
+ }
+ }
+ elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+ my($vmspre) = $self->eliminate_macros("\$($prefix)");
+ # is it a dir or just a name?
+ $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
+ $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ else {
+ $fixedpath = $path;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ # No hints, so we try to guess
+ if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+ $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+ }
+
+ # Trim off root dirname if it's had other dirs inserted in front of it.
+ $fixedpath =~ s/\.000000([\]>])/$1/;
+ # Special case for VMS absolute directory specs: these will have had device
+ # prepended during trip through Unix syntax in eliminate_macros(), since
+ # Unix syntax has no way to express "absolute from the top of this device's
+ # directory tree".
+ if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+ $fixedpath;
+ }
+
+
+ =back
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =head1 SEE ALSO
+
+ See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+ implementation of these methods, not the semantics.
+
+ An explanation of VMS file specs can be found at
+ L<http://h71000.www7.hp.com/doc/731FINAL/4506/4506pro_014.html#apps_locating_naming_files>.
+
+ =cut
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_VMS
+
+$fatpacked{"File/Spec/Win32.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_WIN32';
+ package File::Spec::Win32;
+
+ use strict;
+
+ use vars qw(@ISA $VERSION);
+ require File::Spec::Unix;
+
+ $VERSION = '3.47';
+ $VERSION =~ tr/_//;
+
+ @ISA = qw(File::Spec::Unix);
+
+ # Some regexes we use for path splitting
+ my $DRIVE_RX = '[a-zA-Z]:';
+ my $UNC_RX = '(?:\\\\\\\\|//)[^\\\\/]+[\\\\/][^\\\\/]+';
+ my $VOL_RX = "(?:$DRIVE_RX|$UNC_RX)";
+
+
+ =head1 NAME
+
+ File::Spec::Win32 - methods for Win32 file specs
+
+ =head1 SYNOPSIS
+
+ require File::Spec::Win32; # Done internally by File::Spec if needed
+
+ =head1 DESCRIPTION
+
+ See File::Spec::Unix for a documentation of the methods provided
+ there. This package overrides the implementation of these methods, not
+ the semantics.
+
+ =over 4
+
+ =item devnull
+
+ Returns a string representation of the null device.
+
+ =cut
+
+ sub devnull {
+ return "nul";
+ }
+
+ sub rootdir { '\\' }
+
+
+ =item tmpdir
+
+ Returns a string representation of the first existing directory
+ from the following list:
+
+ $ENV{TMPDIR}
+ $ENV{TEMP}
+ $ENV{TMP}
+ SYS:/temp
+ C:\system\temp
+ C:/temp
+ /tmp
+ /
+
+ The SYS:/temp is preferred in Novell NetWare and the C:\system\temp
+ for Symbian (the File::Spec::Win32 is used also for those platforms).
+
+ If running under taint mode, and if the environment
+ variables are tainted, they are not used.
+
+ =cut
+
+ sub tmpdir {
+ my $tmpdir = $_[0]->_cached_tmpdir(qw(TMPDIR TEMP TMP));
+ return $tmpdir if defined $tmpdir;
+ $tmpdir = $_[0]->_tmpdir( map( $ENV{$_}, qw(TMPDIR TEMP TMP) ),
+ 'SYS:/temp',
+ 'C:\system\temp',
+ 'C:/temp',
+ '/tmp',
+ '/' );
+ $_[0]->_cache_tmpdir($tmpdir, qw(TMPDIR TEMP TMP));
+ }
+
+ =item case_tolerant
+
+ MSWin32 case-tolerance depends on GetVolumeInformation() $ouFsFlags == FS_CASE_SENSITIVE,
+ indicating the case significance when comparing file specifications.
+ Since XP FS_CASE_SENSITIVE is effectively disabled for the NT subsubsystem.
+ See http://cygwin.com/ml/cygwin/2007-07/msg00891.html
+ Default: 1
+
+ =cut
+
+ sub case_tolerant {
+ eval { require Win32API::File; } or return 1;
+ my $drive = shift || "C:";
+ my $osFsType = "\0"x256;
+ my $osVolName = "\0"x256;
+ my $ouFsFlags = 0;
+ Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 );
+ if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; }
+ else { return 1; }
+ }
+
+ =item file_name_is_absolute
+
+ As of right now, this returns 2 if the path is absolute with a
+ volume, 1 if it's absolute with no volume, 0 otherwise.
+
+ =cut
+
+ sub file_name_is_absolute {
+
+ my ($self,$file) = @_;
+
+ if ($file =~ m{^($VOL_RX)}o) {
+ my $vol = $1;
+ return ($vol =~ m{^$UNC_RX}o ? 2
+ : $file =~ m{^$DRIVE_RX[\\/]}o ? 2
+ : 0);
+ }
+ return $file =~ m{^[\\/]} ? 1 : 0;
+ }
+
+ =item catfile
+
+ Concatenate one or more directory names and a filename to form a
+ complete path ending with a filename
+
+ =cut
+
+ sub catfile {
+ shift;
+
+ # Legacy / compatibility support
+ #
+ shift, return _canon_cat( "/", @_ )
+ if $_[0] eq "";
+
+ # Compatibility with File::Spec <= 3.26:
+ # catfile('A:', 'foo') should return 'A:\foo'.
+ return _canon_cat( ($_[0].'\\'), @_[1..$#_] )
+ if $_[0] =~ m{^$DRIVE_RX\z}o;
+
+ return _canon_cat( @_ );
+ }
+
+ sub catdir {
+ shift;
+
+ # Legacy / compatibility support
+ #
+ return ""
+ unless @_;
+ shift, return _canon_cat( "/", @_ )
+ if $_[0] eq "";
+
+ # Compatibility with File::Spec <= 3.26:
+ # catdir('A:', 'foo') should return 'A:\foo'.
+ return _canon_cat( ($_[0].'\\'), @_[1..$#_] )
+ if $_[0] =~ m{^$DRIVE_RX\z}o;
+
+ return _canon_cat( @_ );
+ }
+
+ sub path {
+ my @path = split(';', $ENV{PATH});
+ s/"//g for @path;
+ @path = grep length, @path;
+ unshift(@path, ".");
+ return @path;
+ }
+
+ =item canonpath
+
+ No physical check on the filesystem, but a logical cleanup of a
+ path. On UNIX eliminated successive slashes and successive "/.".
+ On Win32 makes
+
+ dir1\dir2\dir3\..\..\dir4 -> \dir\dir4 and even
+ dir1\dir2\dir3\...\dir4 -> \dir\dir4
+
+ =cut
+
+ sub canonpath {
+ # Legacy / compatibility support
+ #
+ return $_[1] if !defined($_[1]) or $_[1] eq '';
+ return _canon_cat( $_[1] );
+ }
+
+ =item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path,
+ $no_file );
+
+ Splits a path into volume, directory, and filename portions. Assumes that
+ the last file is a path unless the path ends in '\\', '\\.', '\\..'
+ or $no_file is true. On Win32 this means that $no_file true makes this return
+ ( $volume, $path, '' ).
+
+ Separators accepted are \ and /.
+
+ Volumes can be drive letters or UNC sharenames (\\server\share).
+
+ The results can be passed to L</catpath> to get back a path equivalent to
+ (usually identical to) the original path.
+
+ =cut
+
+ sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file) = ('','','');
+ if ( $nofile ) {
+ $path =~
+ m{^ ( $VOL_RX ? ) (.*) }sox;
+ $volume = $1;
+ $directory = $2;
+ }
+ else {
+ $path =~
+ m{^ ( $VOL_RX ? )
+ ( (?:.*[\\/](?:\.\.?\Z(?!\n))?)? )
+ (.*)
+ }sox;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ return ($volume,$directory,$file);
+ }
+
+
+ =item splitdir
+
+ The opposite of L<catdir()|File::Spec/catdir>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+ $directories must be only the directory portion of the path on systems
+ that have the concept of a volume or that have path syntax that differentiates
+ files from directories.
+
+ Unlike just splitting the directories on the separator, leading empty and
+ trailing directory entries can be returned, because these are significant
+ on some OSs. So,
+
+ File::Spec->splitdir( "/a/b/c" );
+
+ Yields:
+
+ ( '', 'a', 'b', '', 'c', '' )
+
+ =cut
+
+ sub splitdir {
+ my ($self,$directories) = @_ ;
+ #
+ # split() likes to forget about trailing null fields, so here we
+ # check to be sure that there will not be any before handling the
+ # simple case.
+ #
+ if ( $directories !~ m|[\\/]\Z(?!\n)| ) {
+ return split( m|[\\/]|, $directories );
+ }
+ else {
+ #
+ # since there was a trailing separator, add a file name to the end,
+ # then do the split, then replace it with ''.
+ #
+ my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ;
+ $directories[ $#directories ]= '' ;
+ return @directories ;
+ }
+ }
+
+
+ =item catpath
+
+ Takes volume, directory and file portions and returns an entire path. Under
+ Unix, $volume is ignored, and this is just like catfile(). On other OSs,
+ the $volume become significant.
+
+ =cut
+
+ sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ # If it's UNC, make sure the glue separator is there, reusing
+ # whatever separator is first in the $volume
+ my $v;
+ $volume .= $v
+ if ( (($v) = $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s) &&
+ $directory =~ m@^[^\\/]@s
+ ) ;
+
+ $volume .= $directory ;
+
+ # If the volume is not just A:, make sure the glue separator is
+ # there, reusing whatever separator is first in the $volume if possible.
+ if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+ $volume =~ m@[^\\/]\Z(?!\n)@ &&
+ $file =~ m@[^\\/]@
+ ) {
+ $volume =~ m@([\\/])@ ;
+ my $sep = $1 ? $1 : '\\' ;
+ $volume .= $sep ;
+ }
+
+ $volume .= $file ;
+
+ return $volume ;
+ }
+
+ sub _same {
+ lc($_[1]) eq lc($_[2]);
+ }
+
+ sub rel2abs {
+ my ($self,$path,$base ) = @_;
+
+ my $is_abs = $self->file_name_is_absolute($path);
+
+ # Check for volume (should probably document the '2' thing...)
+ return $self->canonpath( $path ) if $is_abs == 2;
+
+ if ($is_abs) {
+ # It's missing a volume, add one
+ my $vol = ($self->splitpath( $self->_cwd() ))[0];
+ return $self->canonpath( $vol . $path );
+ }
+
+ if ( !defined( $base ) || $base eq '' ) {
+ require Cwd ;
+ $base = Cwd::getdcwd( ($self->splitpath( $path ))[0] ) if defined &Cwd::getdcwd ;
+ $base = $self->_cwd() unless defined $base ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path, 1 ))[1,2] ;
+
+ my ( $base_volume, $base_directories ) =
+ $self->splitpath( $base, 1 ) ;
+
+ $path = $self->catpath(
+ $base_volume,
+ $self->catdir( $base_directories, $path_directories ),
+ $path_file
+ ) ;
+
+ return $self->canonpath( $path ) ;
+ }
+
+ =back
+
+ =head2 Note For File::Spec::Win32 Maintainers
+
+ Novell NetWare inherits its File::Spec behaviour from File::Spec::Win32.
+
+ =head1 COPYRIGHT
+
+ Copyright (c) 2004,2007 by the Perl 5 Porters. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =head1 SEE ALSO
+
+ See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+ implementation of these methods, not the semantics.
+
+ =cut
+
+
+ sub _canon_cat # @path -> path
+ {
+ my ($first, @rest) = @_;
+
+ my $volume = $first =~ s{ \A ([A-Za-z]:) ([\\/]?) }{}x # drive letter
+ ? ucfirst( $1 ).( $2 ? "\\" : "" )
+ : $first =~ s{ \A (?:\\\\|//) ([^\\/]+)
+ (?: [\\/] ([^\\/]+) )?
+ [\\/]? }{}xs # UNC volume
+ ? "\\\\$1".( defined $2 ? "\\$2" : "" )."\\"
+ : $first =~ s{ \A [\\/] }{}x # root dir
+ ? "\\"
+ : "";
+ my $path = join "\\", $first, @rest;
+
+ $path =~ tr#\\/#\\\\#s; # xx/yy --> xx\yy & xx\\yy --> xx\yy
+
+ # xx/././yy --> xx/yy
+ $path =~ s{(?:
+ (?:\A|\\) # at begin or after a slash
+ \.
+ (?:\\\.)* # and more
+ (?:\\|\z) # at end or followed by slash
+ )+ # performance boost -- I do not know why
+ }{\\}gx;
+
+ # XXX I do not know whether more dots are supported by the OS supporting
+ # this ... annotation (NetWare or symbian but not MSWin32).
+ # Then .... could easily become ../../.. etc:
+ # Replace \.\.\. by (\.\.\.+) and substitute with
+ # { $1 . ".." . "\\.." x (length($2)-2) }gex
+ # ... --> ../..
+ $path =~ s{ (\A|\\) # at begin or after a slash
+ \.\.\.
+ (?=\\|\z) # at end or followed by slash
+ }{$1..\\..}gx;
+ # xx\yy\..\zz --> xx\zz
+ while ( $path =~ s{(?:
+ (?:\A|\\) # at begin or after a slash
+ [^\\]+ # rip this 'yy' off
+ \\\.\.
+ (?<!\A\.\.\\\.\.) # do *not* replace ^..\..
+ (?<!\\\.\.\\\.\.) # do *not* replace \..\..
+ (?:\\|\z) # at end or followed by slash
+ )+ # performance boost -- I do not know why
+ }{\\}sx ) {}
+
+ $path =~ s#\A\\##; # \xx --> xx NOTE: this is *not* root
+ $path =~ s#\\\z##; # xx\ --> xx
+
+ if ( $volume =~ m#\\\z# )
+ { # <vol>\.. --> <vol>\
+ $path =~ s{ \A # at begin
+ \.\.
+ (?:\\\.\.)* # and more
+ (?:\\|\z) # at end or followed by slash
+ }{}x;
+
+ return $1 # \\HOST\SHARE\ --> \\HOST\SHARE
+ if $path eq ""
+ and $volume =~ m#\A(\\\\.*)\\\z#s;
+ }
+ return $path ne "" || $volume ? $volume.$path : ".";
+ }
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_FILE_SPEC_WIN32
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/JSON/XS.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_JSON_XS';
+ =head1 NAME
+
+ JSON::XS - JSON serialising/deserialising, done correctly and fast
+
+ =encoding utf-8
+
+ JSON::XS - æ­£ã—ãã¦é«˜é€Ÿãª JSON シリアライザ/デシリアライザ
+ (http://fleur.hio.jp/perldoc/mix/lib/JSON/XS.html)
+
+ =head1 SYNOPSIS
+
+ use JSON::XS;
+
+ # exported functions, they croak on error
+ # and expect/generate UTF-8
+
+ $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
+ $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text;
+
+ # OO-interface
+
+ $coder = JSON::XS->new->ascii->pretty->allow_nonref;
+ $pretty_printed_unencoded = $coder->encode ($perl_scalar);
+ $perl_scalar = $coder->decode ($unicode_json_text);
+
+ # Note that JSON version 2.0 and above will automatically use JSON::XS
+ # if available, at virtually no speed overhead either, so you should
+ # be able to just:
+
+ use JSON;
+
+ # and do the same things, except that you have a pure-perl fallback now.
+
+ =head1 DESCRIPTION
+
+ This module converts Perl data structures to JSON and vice versa. Its
+ primary goal is to be I<correct> and its secondary goal is to be
+ I<fast>. To reach the latter goal it was written in C.
+
+ Beginning with version 2.0 of the JSON module, when both JSON and
+ JSON::XS are installed, then JSON will fall back on JSON::XS (this can be
+ overridden) with no overhead due to emulation (by inheriting constructor
+ and methods). If JSON::XS is not available, it will fall back to the
+ compatible JSON::PP module as backend, so using JSON instead of JSON::XS
+ gives you a portable JSON API that can be fast when you need and doesn't
+ require a C compiler when that is a problem.
+
+ As this is the n-th-something JSON module on CPAN, what was the reason
+ to write yet another JSON module? While it seems there are many JSON
+ modules, none of them correctly handle all corner cases, and in most cases
+ their maintainers are unresponsive, gone missing, or not listening to bug
+ reports for other reasons.
+
+ See MAPPING, below, on how JSON::XS maps perl values to JSON values and
+ vice versa.
+
+ =head2 FEATURES
+
+ =over 4
+
+ =item * correct Unicode handling
+
+ This module knows how to handle Unicode, documents how and when it does
+ so, and even documents what "correct" means.
+
+ =item * round-trip integrity
+
+ When you serialise a perl data structure using only data types supported
+ by JSON and Perl, the deserialised data structure is identical on the Perl
+ level. (e.g. the string "2.0" doesn't suddenly become "2" just because
+ it looks like a number). There I<are> minor exceptions to this, read the
+ MAPPING section below to learn about those.
+
+ =item * strict checking of JSON correctness
+
+ There is no guessing, no generating of illegal JSON texts by default,
+ and only JSON is accepted as input by default (the latter is a security
+ feature).
+
+ =item * fast
+
+ Compared to other JSON modules and other serialisers such as Storable,
+ this module usually compares favourably in terms of speed, too.
+
+ =item * simple to use
+
+ This module has both a simple functional interface as well as an object
+ oriented interface.
+
+ =item * reasonably versatile output formats
+
+ You can choose between the most compact guaranteed-single-line format
+ possible (nice for simple line-based protocols), a pure-ASCII format
+ (for when your transport is not 8-bit clean, still supports the whole
+ Unicode range), or a pretty-printed format (for when you want to read that
+ stuff). Or you can combine those features in whatever way you like.
+
+ =back
+
+ =cut
+
+ package JSON::XS;
+
+ use common::sense;
+
+ our $VERSION = 3.01;
+ our @ISA = qw(Exporter);
+
+ our @EXPORT = qw(encode_json decode_json);
+
+ use Exporter;
+ use XSLoader;
+
+ use Types::Serialiser ();
+
+ =head1 FUNCTIONAL INTERFACE
+
+ The following convenience methods are provided by this module. They are
+ exported by default:
+
+ =over 4
+
+ =item $json_text = encode_json $perl_scalar
+
+ Converts the given Perl data structure to a UTF-8 encoded, binary string
+ (that is, the string contains octets only). Croaks on error.
+
+ This function call is functionally identical to:
+
+ $json_text = JSON::XS->new->utf8->encode ($perl_scalar)
+
+ Except being faster.
+
+ =item $perl_scalar = decode_json $json_text
+
+ The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
+ to parse that as an UTF-8 encoded JSON text, returning the resulting
+ reference. Croaks on error.
+
+ This function call is functionally identical to:
+
+ $perl_scalar = JSON::XS->new->utf8->decode ($json_text)
+
+ Except being faster.
+
+ =back
+
+
+ =head1 A FEW NOTES ON UNICODE AND PERL
+
+ Since this often leads to confusion, here are a few very clear words on
+ how Unicode works in Perl, modulo bugs.
+
+ =over 4
+
+ =item 1. Perl strings can store characters with ordinal values > 255.
+
+ This enables you to store Unicode characters as single characters in a
+ Perl string - very natural.
+
+ =item 2. Perl does I<not> associate an encoding with your strings.
+
+ ... until you force it to, e.g. when matching it against a regex, or
+ printing the scalar to a file, in which case Perl either interprets your
+ string as locale-encoded text, octets/binary, or as Unicode, depending
+ on various settings. In no case is an encoding stored together with your
+ data, it is I<use> that decides encoding, not any magical meta data.
+
+ =item 3. The internal utf-8 flag has no meaning with regards to the
+ encoding of your string.
+
+ Just ignore that flag unless you debug a Perl bug, a module written in
+ XS or want to dive into the internals of perl. Otherwise it will only
+ confuse you, as, despite the name, it says nothing about how your string
+ is encoded. You can have Unicode strings with that flag set, with that
+ flag clear, and you can have binary data with that flag set and that flag
+ clear. Other possibilities exist, too.
+
+ If you didn't know about that flag, just the better, pretend it doesn't
+ exist.
+
+ =item 4. A "Unicode String" is simply a string where each character can be
+ validly interpreted as a Unicode code point.
+
+ If you have UTF-8 encoded data, it is no longer a Unicode string, but a
+ Unicode string encoded in UTF-8, giving you a binary string.
+
+ =item 5. A string containing "high" (> 255) character values is I<not> a UTF-8 string.
+
+ It's a fact. Learn to live with it.
+
+ =back
+
+ I hope this helps :)
+
+
+ =head1 OBJECT-ORIENTED INTERFACE
+
+ The object oriented interface lets you configure your own encoding or
+ decoding style, within the limits of supported formats.
+
+ =over 4
+
+ =item $json = new JSON::XS
+
+ Creates a new JSON::XS object that can be used to de/encode JSON
+ strings. All boolean flags described below are by default I<disabled>.
+
+ The mutators for flags all return the JSON object again and thus calls can
+ be chained:
+
+ my $json = JSON::XS->new->utf8->space_after->encode ({a => [1,2]})
+ => {"a": [1, 2]}
+
+ =item $json = $json->ascii ([$enable])
+
+ =item $enabled = $json->get_ascii
+
+ If C<$enable> is true (or missing), then the C<encode> method will not
+ generate characters outside the code range C<0..127> (which is ASCII). Any
+ Unicode characters outside that range will be escaped using either a
+ single \uXXXX (BMP characters) or a double \uHHHH\uLLLLL escape sequence,
+ as per RFC4627. The resulting encoded JSON text can be treated as a native
+ Unicode string, an ascii-encoded, latin1-encoded or UTF-8 encoded string,
+ or any other superset of ASCII.
+
+ If C<$enable> is false, then the C<encode> method will not escape Unicode
+ characters unless required by the JSON syntax or other flags. This results
+ in a faster and more compact format.
+
+ See also the section I<ENCODING/CODESET FLAG NOTES> later in this
+ document.
+
+ The main use for this flag is to produce JSON texts that can be
+ transmitted over a 7-bit channel, as the encoded JSON texts will not
+ contain any 8 bit characters.
+
+ JSON::XS->new->ascii (1)->encode ([chr 0x10401])
+ => ["\ud801\udc01"]
+
+ =item $json = $json->latin1 ([$enable])
+
+ =item $enabled = $json->get_latin1
+
+ If C<$enable> is true (or missing), then the C<encode> method will encode
+ the resulting JSON text as latin1 (or iso-8859-1), escaping any characters
+ outside the code range C<0..255>. The resulting string can be treated as a
+ latin1-encoded JSON text or a native Unicode string. The C<decode> method
+ will not be affected in any way by this flag, as C<decode> by default
+ expects Unicode, which is a strict superset of latin1.
+
+ If C<$enable> is false, then the C<encode> method will not escape Unicode
+ characters unless required by the JSON syntax or other flags.
+
+ See also the section I<ENCODING/CODESET FLAG NOTES> later in this
+ document.
+
+ The main use for this flag is efficiently encoding binary data as JSON
+ text, as most octets will not be escaped, resulting in a smaller encoded
+ size. The disadvantage is that the resulting JSON text is encoded
+ in latin1 (and must correctly be treated as such when storing and
+ transferring), a rare encoding for JSON. It is therefore most useful when
+ you want to store data structures known to contain binary data efficiently
+ in files or databases, not when talking to other JSON encoders/decoders.
+
+ JSON::XS->new->latin1->encode (["\x{89}\x{abc}"]
+ => ["\x{89}\\u0abc"] # (perl syntax, U+abc escaped, U+89 not)
+
+ =item $json = $json->utf8 ([$enable])
+
+ =item $enabled = $json->get_utf8
+
+ If C<$enable> is true (or missing), then the C<encode> method will encode
+ the JSON result into UTF-8, as required by many protocols, while the
+ C<decode> method expects to be handled an UTF-8-encoded string. Please
+ note that UTF-8-encoded strings do not contain any characters outside the
+ range C<0..255>, they are thus useful for bytewise/binary I/O. In future
+ versions, enabling this option might enable autodetection of the UTF-16
+ and UTF-32 encoding families, as described in RFC4627.
+
+ If C<$enable> is false, then the C<encode> method will return the JSON
+ string as a (non-encoded) Unicode string, while C<decode> expects thus a
+ Unicode string. Any decoding or encoding (e.g. to UTF-8 or UTF-16) needs
+ to be done yourself, e.g. using the Encode module.
+
+ See also the section I<ENCODING/CODESET FLAG NOTES> later in this
+ document.
+
+ Example, output UTF-16BE-encoded JSON:
+
+ use Encode;
+ $jsontext = encode "UTF-16BE", JSON::XS->new->encode ($object);
+
+ Example, decode UTF-32LE-encoded JSON:
+
+ use Encode;
+ $object = JSON::XS->new->decode (decode "UTF-32LE", $jsontext);
+
+ =item $json = $json->pretty ([$enable])
+
+ This enables (or disables) all of the C<indent>, C<space_before> and
+ C<space_after> (and in the future possibly more) flags in one call to
+ generate the most readable (or most compact) form possible.
+
+ Example, pretty-print some simple structure:
+
+ my $json = JSON::XS->new->pretty(1)->encode ({a => [1,2]})
+ =>
+ {
+ "a" : [
+ 1,
+ 2
+ ]
+ }
+
+ =item $json = $json->indent ([$enable])
+
+ =item $enabled = $json->get_indent
+
+ If C<$enable> is true (or missing), then the C<encode> method will use a multiline
+ format as output, putting every array member or object/hash key-value pair
+ into its own line, indenting them properly.
+
+ If C<$enable> is false, no newlines or indenting will be produced, and the
+ resulting JSON text is guaranteed not to contain any C<newlines>.
+
+ This setting has no effect when decoding JSON texts.
+
+ =item $json = $json->space_before ([$enable])
+
+ =item $enabled = $json->get_space_before
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space before the C<:> separating keys from values in JSON objects.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts. You will also
+ most likely combine this setting with C<space_after>.
+
+ Example, space_before enabled, space_after and indent disabled:
+
+ {"key" :"value"}
+
+ =item $json = $json->space_after ([$enable])
+
+ =item $enabled = $json->get_space_after
+
+ If C<$enable> is true (or missing), then the C<encode> method will add an extra
+ optional space after the C<:> separating keys from values in JSON objects
+ and extra whitespace after the C<,> separating key-value pairs and array
+ members.
+
+ If C<$enable> is false, then the C<encode> method will not add any extra
+ space at those places.
+
+ This setting has no effect when decoding JSON texts.
+
+ Example, space_before and indent disabled, space_after enabled:
+
+ {"key": "value"}
+
+ =item $json = $json->relaxed ([$enable])
+
+ =item $enabled = $json->get_relaxed
+
+ If C<$enable> is true (or missing), then C<decode> will accept some
+ extensions to normal JSON syntax (see below). C<encode> will not be
+ affected in anyway. I<Be aware that this option makes you accept invalid
+ JSON texts as if they were valid!>. I suggest only to use this option to
+ parse application-specific files written by humans (configuration files,
+ resource files etc.)
+
+ If C<$enable> is false (the default), then C<decode> will only accept
+ valid JSON texts.
+
+ Currently accepted extensions are:
+
+ =over 4
+
+ =item * list items can have an end-comma
+
+ JSON I<separates> array elements and key-value pairs with commas. This
+ can be annoying if you write JSON texts manually and want to be able to
+ quickly append elements, so this extension accepts comma at the end of
+ such items not just between them:
+
+ [
+ 1,
+ 2, <- this comma not normally allowed
+ ]
+ {
+ "k1": "v1",
+ "k2": "v2", <- this comma not normally allowed
+ }
+
+ =item * shell-style '#'-comments
+
+ Whenever JSON allows whitespace, shell-style comments are additionally
+ allowed. They are terminated by the first carriage-return or line-feed
+ character, after which more white-space and comments are allowed.
+
+ [
+ 1, # this comment not allowed in JSON
+ # neither this one...
+ ]
+
+ =back
+
+ =item $json = $json->canonical ([$enable])
+
+ =item $enabled = $json->get_canonical
+
+ If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
+ by sorting their keys. This is adding a comparatively high overhead.
+
+ If C<$enable> is false, then the C<encode> method will output key-value
+ pairs in the order Perl stores them (which will likely change between runs
+ of the same script, and can change even within the same run from 5.18
+ onwards).
+
+ This option is useful if you want the same data structure to be encoded as
+ the same JSON text (given the same overall settings). If it is disabled,
+ the same hash might be encoded differently even if contains the same data,
+ as key-value pairs have no inherent ordering in Perl.
+
+ This setting has no effect when decoding JSON texts.
+
+ This setting has currently no effect on tied hashes.
+
+ =item $json = $json->allow_nonref ([$enable])
+
+ =item $enabled = $json->get_allow_nonref
+
+ If C<$enable> is true (or missing), then the C<encode> method can convert a
+ non-reference into its corresponding string, number or null JSON value,
+ which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
+ values instead of croaking.
+
+ If C<$enable> is false, then the C<encode> method will croak if it isn't
+ passed an arrayref or hashref, as JSON texts must either be an object
+ or array. Likewise, C<decode> will croak if given something that is not a
+ JSON object or array.
+
+ Example, encode a Perl scalar as JSON value with enabled C<allow_nonref>,
+ resulting in an invalid JSON text:
+
+ JSON::XS->new->allow_nonref->encode ("Hello, World!")
+ => "Hello, World!"
+
+ =item $json = $json->allow_unknown ([$enable])
+
+ =item $enabled = $json->get_allow_unknown
+
+ If C<$enable> is true (or missing), then C<encode> will I<not> throw an
+ exception when it encounters values it cannot represent in JSON (for
+ example, filehandles) but instead will encode a JSON C<null> value. Note
+ that blessed objects are not included here and are handled separately by
+ c<allow_nonref>.
+
+ If C<$enable> is false (the default), then C<encode> will throw an
+ exception when it encounters anything it cannot encode as JSON.
+
+ This option does not affect C<decode> in any way, and it is recommended to
+ leave it off unless you know your communications partner.
+
+ =item $json = $json->allow_blessed ([$enable])
+
+ =item $enabled = $json->get_allow_blessed
+
+ See L<OBJECT SERIALISATION> for details.
+
+ If C<$enable> is true (or missing), then the C<encode> method will not
+ barf when it encounters a blessed reference that it cannot convert
+ otherwise. Instead, a JSON C<null> value is encoded instead of the object.
+
+ If C<$enable> is false (the default), then C<encode> will throw an
+ exception when it encounters a blessed object that it cannot convert
+ otherwise.
+
+ This setting has no effect on C<decode>.
+
+ =item $json = $json->convert_blessed ([$enable])
+
+ =item $enabled = $json->get_convert_blessed
+
+ See L<OBJECT SERIALISATION> for details.
+
+ If C<$enable> is true (or missing), then C<encode>, upon encountering a
+ blessed object, will check for the availability of the C<TO_JSON> method
+ on the object's class. If found, it will be called in scalar context and
+ the resulting scalar will be encoded instead of the object.
+
+ The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
+ returns other blessed objects, those will be handled in the same
+ way. C<TO_JSON> must take care of not causing an endless recursion cycle
+ (== crash) in this case. The name of C<TO_JSON> was chosen because other
+ methods called by the Perl core (== not by the user of the object) are
+ usually in upper case letters and to avoid collisions with any C<to_json>
+ function or method.
+
+ If C<$enable> is false (the default), then C<encode> will not consider
+ this type of conversion.
+
+ This setting has no effect on C<decode>.
+
+ =item $json = $json->allow_tags ([$enable])
+
+ =item $enabled = $json->allow_tags
+
+ See L<OBJECT SERIALISATION> for details.
+
+ If C<$enable> is true (or missing), then C<encode>, upon encountering a
+ blessed object, will check for the availability of the C<FREEZE> method on
+ the object's class. If found, it will be used to serialise the object into
+ a nonstandard tagged JSON value (that JSON decoders cannot decode).
+
+ It also causes C<decode> to parse such tagged JSON values and deserialise
+ them via a call to the C<THAW> method.
+
+ If C<$enable> is false (the default), then C<encode> will not consider
+ this type of conversion, and tagged JSON values will cause a parse error
+ in C<decode>, as if tags were not part of the grammar.
+
+ =item $json = $json->filter_json_object ([$coderef->($hashref)])
+
+ When C<$coderef> is specified, it will be called from C<decode> each
+ time it decodes a JSON object. The only argument is a reference to the
+ newly-created hash. If the code references returns a single scalar (which
+ need not be a reference), this value (i.e. a copy of that scalar to avoid
+ aliasing) is inserted into the deserialised data structure. If it returns
+ an empty list (NOTE: I<not> C<undef>, which is a valid scalar), the
+ original deserialised hash will be inserted. This setting can slow down
+ decoding considerably.
+
+ When C<$coderef> is omitted or undefined, any existing callback will
+ be removed and C<decode> will not change the deserialised hash in any
+ way.
+
+ Example, convert all JSON objects into the integer 5:
+
+ my $js = JSON::XS->new->filter_json_object (sub { 5 });
+ # returns [5]
+ $js->decode ('[{}]')
+ # throw an exception because allow_nonref is not enabled
+ # so a lone 5 is not allowed.
+ $js->decode ('{"a":1, "b":2}');
+
+ =item $json = $json->filter_json_single_key_object ($key [=> $coderef->($value)])
+
+ Works remotely similar to C<filter_json_object>, but is only called for
+ JSON objects having a single key named C<$key>.
+
+ This C<$coderef> is called before the one specified via
+ C<filter_json_object>, if any. It gets passed the single value in the JSON
+ object. If it returns a single value, it will be inserted into the data
+ structure. If it returns nothing (not even C<undef> but the empty list),
+ the callback from C<filter_json_object> will be called next, as if no
+ single-key callback were specified.
+
+ If C<$coderef> is omitted or undefined, the corresponding callback will be
+ disabled. There can only ever be one callback for a given key.
+
+ As this callback gets called less often then the C<filter_json_object>
+ one, decoding speed will not usually suffer as much. Therefore, single-key
+ objects make excellent targets to serialise Perl objects into, especially
+ as single-key JSON objects are as close to the type-tagged value concept
+ as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
+ support this in any way, so you need to make sure your data never looks
+ like a serialised Perl hash.
+
+ Typical names for the single object key are C<__class_whatever__>, or
+ C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
+ things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
+ with real hashes.
+
+ Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
+ into the corresponding C<< $WIDGET{<id>} >> object:
+
+ # return whatever is in $WIDGET{5}:
+ JSON::XS
+ ->new
+ ->filter_json_single_key_object (__widget__ => sub {
+ $WIDGET{ $_[0] }
+ })
+ ->decode ('{"__widget__": 5')
+
+ # this can be used with a TO_JSON method in some "widget" class
+ # for serialisation to json:
+ sub WidgetBase::TO_JSON {
+ my ($self) = @_;
+
+ unless ($self->{id}) {
+ $self->{id} = ..get..some..id..;
+ $WIDGET{$self->{id}} = $self;
+ }
+
+ { __widget__ => $self->{id} }
+ }
+
+ =item $json = $json->shrink ([$enable])
+
+ =item $enabled = $json->get_shrink
+
+ Perl usually over-allocates memory a bit when allocating space for
+ strings. This flag optionally resizes strings generated by either
+ C<encode> or C<decode> to their minimum size possible. This can save
+ memory when your JSON texts are either very very long or you have many
+ short strings. It will also try to downgrade any strings to octet-form
+ if possible: perl stores strings internally either in an encoding called
+ UTF-X or in octet-form. The latter cannot store everything but uses less
+ space in general (and some buggy Perl or C code might even rely on that
+ internal representation being used).
+
+ The actual definition of what shrink does might change in future versions,
+ but it will always try to save space at the expense of time.
+
+ If C<$enable> is true (or missing), the string returned by C<encode> will
+ be shrunk-to-fit, while all strings generated by C<decode> will also be
+ shrunk-to-fit.
+
+ If C<$enable> is false, then the normal perl allocation algorithms are used.
+ If you work with your data, then this is likely to be faster.
+
+ In the future, this setting might control other things, such as converting
+ strings that look like integers or floats into integers or floats
+ internally (there is no difference on the Perl level), saving space.
+
+ =item $json = $json->max_depth ([$maximum_nesting_depth])
+
+ =item $max_depth = $json->get_max_depth
+
+ Sets the maximum nesting level (default C<512>) accepted while encoding
+ or decoding. If a higher nesting level is detected in JSON text or a Perl
+ data structure, then the encoder and decoder will stop and croak at that
+ point.
+
+ Nesting level is defined by number of hash- or arrayrefs that the encoder
+ needs to traverse to reach a given point or the number of C<{> or C<[>
+ characters without their matching closing parenthesis crossed to reach a
+ given character in a string.
+
+ Setting the maximum depth to one disallows any nesting, so that ensures
+ that the object is only a single hash/object or array.
+
+ If no argument is given, the highest possible setting will be used, which
+ is rarely useful.
+
+ Note that nesting is implemented by recursion in C. The default value has
+ been chosen to be as large as typical operating systems allow without
+ crashing.
+
+ See SECURITY CONSIDERATIONS, below, for more info on why this is useful.
+
+ =item $json = $json->max_size ([$maximum_string_size])
+
+ =item $max_size = $json->get_max_size
+
+ Set the maximum length a JSON text may have (in bytes) where decoding is
+ being attempted. The default is C<0>, meaning no limit. When C<decode>
+ is called on a string that is longer then this many bytes, it will not
+ attempt to decode the string but throw an exception. This setting has no
+ effect on C<encode> (yet).
+
+ If no argument is given, the limit check will be deactivated (same as when
+ C<0> is specified).
+
+ See SECURITY CONSIDERATIONS, below, for more info on why this is useful.
+
+ =item $json_text = $json->encode ($perl_scalar)
+
+ Converts the given Perl value or data structure to its JSON
+ representation. Croaks on error.
+
+ =item $perl_scalar = $json->decode ($json_text)
+
+ The opposite of C<encode>: expects a JSON text and tries to parse it,
+ returning the resulting simple scalar or reference. Croaks on error.
+
+ =item ($perl_scalar, $characters) = $json->decode_prefix ($json_text)
+
+ This works like the C<decode> method, but instead of raising an exception
+ when there is trailing garbage after the first JSON object, it will
+ silently stop parsing there and return the number of characters consumed
+ so far.
+
+ This is useful if your JSON texts are not delimited by an outer protocol
+ and you need to know where the JSON text ends.
+
+ JSON::XS->new->decode_prefix ("[1] the tail")
+ => ([], 3)
+
+ =back
+
+
+ =head1 INCREMENTAL PARSING
+
+ In some cases, there is the need for incremental parsing of JSON
+ texts. While this module always has to keep both JSON text and resulting
+ Perl data structure in memory at one time, it does allow you to parse a
+ JSON stream incrementally. It does so by accumulating text until it has
+ a full JSON object, which it then can decode. This process is similar to
+ using C<decode_prefix> to see if a full JSON object is available, but
+ is much more efficient (and can be implemented with a minimum of method
+ calls).
+
+ JSON::XS will only attempt to parse the JSON text once it is sure it
+ has enough text to get a decisive result, using a very simple but
+ truly incremental parser. This means that it sometimes won't stop as
+ early as the full parser, for example, it doesn't detect mismatched
+ parentheses. The only thing it guarantees is that it starts decoding as
+ soon as a syntactically valid JSON text has been seen. This means you need
+ to set resource limits (e.g. C<max_size>) to ensure the parser will stop
+ parsing in the presence if syntax errors.
+
+ The following methods implement this incremental parser.
+
+ =over 4
+
+ =item [void, scalar or list context] = $json->incr_parse ([$string])
+
+ This is the central parsing function. It can both append new text and
+ extract objects from the stream accumulated so far (both of these
+ functions are optional).
+
+ If C<$string> is given, then this string is appended to the already
+ existing JSON fragment stored in the C<$json> object.
+
+ After that, if the function is called in void context, it will simply
+ return without doing anything further. This can be used to add more text
+ in as many chunks as you want.
+
+ If the method is called in scalar context, then it will try to extract
+ exactly I<one> JSON object. If that is successful, it will return this
+ object, otherwise it will return C<undef>. If there is a parse error,
+ this method will croak just as C<decode> would do (one can then use
+ C<incr_skip> to skip the erroneous part). This is the most common way of
+ using the method.
+
+ And finally, in list context, it will try to extract as many objects
+ from the stream as it can find and return them, or the empty list
+ otherwise. For this to work, there must be no separators between the JSON
+ objects or arrays, instead they must be concatenated back-to-back. If
+ an error occurs, an exception will be raised as in the scalar context
+ case. Note that in this case, any previously-parsed JSON texts will be
+ lost.
+
+ Example: Parse some JSON arrays/objects in a given string and return
+ them.
+
+ my @objs = JSON::XS->new->incr_parse ("[5][7][1,2]");
+
+ =item $lvalue_string = $json->incr_text
+
+ This method returns the currently stored JSON fragment as an lvalue, that
+ is, you can manipulate it. This I<only> works when a preceding call to
+ C<incr_parse> in I<scalar context> successfully returned an object. Under
+ all other circumstances you must not call this function (I mean it.
+ although in simple tests it might actually work, it I<will> fail under
+ real world conditions). As a special exception, you can also call this
+ method before having parsed anything.
+
+ This function is useful in two cases: a) finding the trailing text after a
+ JSON object or b) parsing multiple JSON objects separated by non-JSON text
+ (such as commas).
+
+ =item $json->incr_skip
+
+ This will reset the state of the incremental parser and will remove
+ the parsed text from the input buffer so far. This is useful after
+ C<incr_parse> died, in which case the input buffer and incremental parser
+ state is left unchanged, to skip the text parsed so far and to reset the
+ parse state.
+
+ The difference to C<incr_reset> is that only text until the parse error
+ occurred is removed.
+
+ =item $json->incr_reset
+
+ This completely resets the incremental parser, that is, after this call,
+ it will be as if the parser had never parsed anything.
+
+ This is useful if you want to repeatedly parse JSON objects and want to
+ ignore any trailing data, which means you have to reset the parser after
+ each successful decode.
+
+ =back
+
+ =head2 LIMITATIONS
+
+ All options that affect decoding are supported, except
+ C<allow_nonref>. The reason for this is that it cannot be made to work
+ sensibly: JSON objects and arrays are self-delimited, i.e. you can
+ concatenate them back to back and still decode them perfectly. This does
+ not hold true for JSON numbers, however.
+
+ For example, is the string C<1> a single JSON number, or is it simply the
+ start of C<12>? Or is C<12> a single JSON number, or the concatenation
+ of C<1> and C<2>? In neither case you can tell, and this is why JSON::XS
+ takes the conservative route and disallows this case.
+
+ =head2 EXAMPLES
+
+ Some examples will make all this clearer. First, a simple example that
+ works similarly to C<decode_prefix>: We want to decode the JSON object at
+ the start of a string and identify the portion after the JSON object:
+
+ my $text = "[1,2,3] hello";
+
+ my $json = new JSON::XS;
+
+ my $obj = $json->incr_parse ($text)
+ or die "expected JSON object or array at beginning of string";
+
+ my $tail = $json->incr_text;
+ # $tail now contains " hello"
+
+ Easy, isn't it?
+
+ Now for a more complicated example: Imagine a hypothetical protocol where
+ you read some requests from a TCP stream, and each request is a JSON
+ array, without any separation between them (in fact, it is often useful to
+ use newlines as "separators", as these get interpreted as whitespace at
+ the start of the JSON text, which makes it possible to test said protocol
+ with C<telnet>...).
+
+ Here is how you'd do it (it is trivial to write this in an event-based
+ manner):
+
+ my $json = new JSON::XS;
+
+ # read some data from the socket
+ while (sysread $socket, my $buf, 4096) {
+
+ # split and decode as many requests as possible
+ for my $request ($json->incr_parse ($buf)) {
+ # act on the $request
+ }
+ }
+
+ Another complicated example: Assume you have a string with JSON objects
+ or arrays, all separated by (optional) comma characters (e.g. C<[1],[2],
+ [3]>). To parse them, we have to skip the commas between the JSON texts,
+ and here is where the lvalue-ness of C<incr_text> comes in useful:
+
+ my $text = "[1],[2], [3]";
+ my $json = new JSON::XS;
+
+ # void context, so no parsing done
+ $json->incr_parse ($text);
+
+ # now extract as many objects as possible. note the
+ # use of scalar context so incr_text can be called.
+ while (my $obj = $json->incr_parse) {
+ # do something with $obj
+
+ # now skip the optional comma
+ $json->incr_text =~ s/^ \s* , //x;
+ }
+
+ Now lets go for a very complex example: Assume that you have a gigantic
+ JSON array-of-objects, many gigabytes in size, and you want to parse it,
+ but you cannot load it into memory fully (this has actually happened in
+ the real world :).
+
+ Well, you lost, you have to implement your own JSON parser. But JSON::XS
+ can still help you: You implement a (very simple) array parser and let
+ JSON decode the array elements, which are all full JSON objects on their
+ own (this wouldn't work if the array elements could be JSON numbers, for
+ example):
+
+ my $json = new JSON::XS;
+
+ # open the monster
+ open my $fh, "<bigfile.json"
+ or die "bigfile: $!";
+
+ # first parse the initial "["
+ for (;;) {
+ sysread $fh, my $buf, 65536
+ or die "read error: $!";
+ $json->incr_parse ($buf); # void context, so no parsing
+
+ # Exit the loop once we found and removed(!) the initial "[".
+ # In essence, we are (ab-)using the $json object as a simple scalar
+ # we append data to.
+ last if $json->incr_text =~ s/^ \s* \[ //x;
+ }
+
+ # now we have the skipped the initial "[", so continue
+ # parsing all the elements.
+ for (;;) {
+ # in this loop we read data until we got a single JSON object
+ for (;;) {
+ if (my $obj = $json->incr_parse) {
+ # do something with $obj
+ last;
+ }
+
+ # add more data
+ sysread $fh, my $buf, 65536
+ or die "read error: $!";
+ $json->incr_parse ($buf); # void context, so no parsing
+ }
+
+ # in this loop we read data until we either found and parsed the
+ # separating "," between elements, or the final "]"
+ for (;;) {
+ # first skip whitespace
+ $json->incr_text =~ s/^\s*//;
+
+ # if we find "]", we are done
+ if ($json->incr_text =~ s/^\]//) {
+ print "finished.\n";
+ exit;
+ }
+
+ # if we find ",", we can continue with the next element
+ if ($json->incr_text =~ s/^,//) {
+ last;
+ }
+
+ # if we find anything else, we have a parse error!
+ if (length $json->incr_text) {
+ die "parse error near ", $json->incr_text;
+ }
+
+ # else add more data
+ sysread $fh, my $buf, 65536
+ or die "read error: $!";
+ $json->incr_parse ($buf); # void context, so no parsing
+ }
+
+ This is a complex example, but most of the complexity comes from the fact
+ that we are trying to be correct (bear with me if I am wrong, I never ran
+ the above example :).
+
+
+
+ =head1 MAPPING
+
+ This section describes how JSON::XS maps Perl values to JSON values and
+ vice versa. These mappings are designed to "do the right thing" in most
+ circumstances automatically, preserving round-tripping characteristics
+ (what you put in comes out as something equivalent).
+
+ For the more enlightened: note that in the following descriptions,
+ lowercase I<perl> refers to the Perl interpreter, while uppercase I<Perl>
+ refers to the abstract Perl language itself.
+
+
+ =head2 JSON -> PERL
+
+ =over 4
+
+ =item object
+
+ A JSON object becomes a reference to a hash in Perl. No ordering of object
+ keys is preserved (JSON does not preserve object key ordering itself).
+
+ =item array
+
+ A JSON array becomes a reference to an array in Perl.
+
+ =item string
+
+ A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
+ are represented by the same codepoints in the Perl string, so no manual
+ decoding is necessary.
+
+ =item number
+
+ A JSON number becomes either an integer, numeric (floating point) or
+ string scalar in perl, depending on its range and any fractional parts. On
+ the Perl level, there is no difference between those as Perl handles all
+ the conversion details, but an integer may take slightly less memory and
+ might represent more values exactly than floating point numbers.
+
+ If the number consists of digits only, JSON::XS will try to represent
+ it as an integer value. If that fails, it will try to represent it as
+ a numeric (floating point) value if that is possible without loss of
+ precision. Otherwise it will preserve the number as a string value (in
+ which case you lose roundtripping ability, as the JSON number will be
+ re-encoded to a JSON string).
+
+ Numbers containing a fractional or exponential part will always be
+ represented as numeric (floating point) values, possibly at a loss of
+ precision (in which case you might lose perfect roundtripping ability, but
+ the JSON number will still be re-encoded as a JSON number).
+
+ Note that precision is not accuracy - binary floating point values cannot
+ represent most decimal fractions exactly, and when converting from and to
+ floating point, JSON::XS only guarantees precision up to but not including
+ the least significant bit.
+
+ =item true, false
+
+ These JSON atoms become C<Types::Serialiser::true> and
+ C<Types::Serialiser::false>, respectively. They are overloaded to act
+ almost exactly like the numbers C<1> and C<0>. You can check whether
+ a scalar is a JSON boolean by using the C<Types::Serialiser::is_bool>
+ function (after C<use Types::Serialier>, of course).
+
+ =item null
+
+ A JSON null atom becomes C<undef> in Perl.
+
+ =item shell-style comments (C<< # I<text> >>)
+
+ As a nonstandard extension to the JSON syntax that is enabled by the
+ C<relaxed> setting, shell-style comments are allowed. They can start
+ anywhere outside strings and go till the end of the line.
+
+ =item tagged values (C<< (I<tag>)I<value> >>).
+
+ Another nonstandard extension to the JSON syntax, enabled with the
+ C<allow_tags> setting, are tagged values. In this implementation, the
+ I<tag> must be a perl package/class name encoded as a JSON string, and the
+ I<value> must be a JSON array encoding optional constructor arguments.
+
+ See L<OBJECT SERIALISATION>, below, for details.
+
+ =back
+
+
+ =head2 PERL -> JSON
+
+ The mapping from Perl to JSON is slightly more difficult, as Perl is a
+ truly typeless language, so we can only guess which JSON type is meant by
+ a Perl value.
+
+ =over 4
+
+ =item hash references
+
+ Perl hash references become JSON objects. As there is no inherent
+ ordering in hash keys (or JSON objects), they will usually be encoded
+ in a pseudo-random order. JSON::XS can optionally sort the hash keys
+ (determined by the I<canonical> flag), so the same datastructure will
+ serialise to the same JSON text (given same settings and version of
+ JSON::XS), but this incurs a runtime overhead and is only rarely useful,
+ e.g. when you want to compare some JSON text against another for equality.
+
+ =item array references
+
+ Perl array references become JSON arrays.
+
+ =item other references
+
+ Other unblessed references are generally not allowed and will cause an
+ exception to be thrown, except for references to the integers C<0> and
+ C<1>, which get turned into C<false> and C<true> atoms in JSON.
+
+ Since C<JSON::XS> uses the boolean model from L<Types::Serialiser>, you
+ can also C<use Types::Serialiser> and then use C<Types::Serialiser::false>
+ and C<Types::Serialiser::true> to improve readability.
+
+ use Types::Serialiser;
+ encode_json [\0, Types::Serialiser::true] # yields [false,true]
+
+ =item Types::Serialiser::true, Types::Serialiser::false
+
+ These special values from the L<Types::Serialiser> module become JSON true
+ and JSON false values, respectively. You can also use C<\1> and C<\0>
+ directly if you want.
+
+ =item blessed objects
+
+ Blessed objects are not directly representable in JSON, but C<JSON::XS>
+ allows various ways of handling objects. See L<OBJECT SERIALISATION>,
+ below, for details.
+
+ =item simple scalars
+
+ Simple Perl scalars (any scalar that is not a reference) are the most
+ difficult objects to encode: JSON::XS will encode undefined scalars as
+ JSON C<null> values, scalars that have last been used in a string context
+ before encoding as JSON strings, and anything else as number value:
+
+ # dump as number
+ encode_json [2] # yields [2]
+ encode_json [-3.0e17] # yields [-3e+17]
+ my $value = 5; encode_json [$value] # yields [5]
+
+ # used as string, so dump as string
+ print $value;
+ encode_json [$value] # yields ["5"]
+
+ # undef becomes null
+ encode_json [undef] # yields [null]
+
+ You can force the type to be a JSON string by stringifying it:
+
+ my $x = 3.1; # some variable containing a number
+ "$x"; # stringified
+ $x .= ""; # another, more awkward way to stringify
+ print $x; # perl does it for you, too, quite often
+
+ You can force the type to be a JSON number by numifying it:
+
+ my $x = "3"; # some variable containing a string
+ $x += 0; # numify it, ensuring it will be dumped as a number
+ $x *= 1; # same thing, the choice is yours.
+
+ You can not currently force the type in other, less obscure, ways. Tell me
+ if you need this capability (but don't forget to explain why it's needed
+ :).
+
+ Note that numerical precision has the same meaning as under Perl (so
+ binary to decimal conversion follows the same rules as in Perl, which
+ can differ to other languages). Also, your perl interpreter might expose
+ extensions to the floating point numbers of your platform, such as
+ infinities or NaN's - these cannot be represented in JSON, and it is an
+ error to pass those in.
+
+ =back
+
+ =head2 OBJECT SERIALISATION
+
+ As JSON cannot directly represent Perl objects, you have to choose between
+ a pure JSON representation (without the ability to deserialise the object
+ automatically again), and a nonstandard extension to the JSON syntax,
+ tagged values.
+
+ =head3 SERIALISATION
+
+ What happens when C<JSON::XS> encounters a Perl object depends on the
+ C<allow_blessed>, C<convert_blessed> and C<allow_tags> settings, which are
+ used in this order:
+
+ =over 4
+
+ =item 1. C<allow_tags> is enabled and the object has a C<FREEZE> method.
+
+ In this case, C<JSON::XS> uses the L<Types::Serialiser> object
+ serialisation protocol to create a tagged JSON value, using a nonstandard
+ extension to the JSON syntax.
+
+ This works by invoking the C<FREEZE> method on the object, with the first
+ argument being the object to serialise, and the second argument being the
+ constant string C<JSON> to distinguish it from other serialisers.
+
+ The C<FREEZE> method can return any number of values (i.e. zero or
+ more). These values and the paclkage/classname of the object will then be
+ encoded as a tagged JSON value in the following format:
+
+ ("classname")[FREEZE return values...]
+
+ e.g.:
+
+ ("URI")["http://www.google.com/"]
+ ("MyDate")[2013,10,29]
+ ("ImageData::JPEG")["Z3...VlCg=="]
+
+ For example, the hypothetical C<My::Object> C<FREEZE> method might use the
+ objects C<type> and C<id> members to encode the object:
+
+ sub My::Object::FREEZE {
+ my ($self, $serialiser) = @_;
+
+ ($self->{type}, $self->{id})
+ }
+
+ =item 2. C<convert_blessed> is enabled and the object has a C<TO_JSON> method.
+
+ In this case, the C<TO_JSON> method of the object is invoked in scalar
+ context. It must return a single scalar that can be directly encoded into
+ JSON. This scalar replaces the object in the JSON text.
+
+ For example, the following C<TO_JSON> method will convert all L<URI>
+ objects to JSON strings when serialised. The fatc that these values
+ originally were L<URI> objects is lost.
+
+ sub URI::TO_JSON {
+ my ($uri) = @_;
+ $uri->as_string
+ }
+
+ =item 3. C<allow_blessed> is enabled.
+
+ The object will be serialised as a JSON null value.
+
+ =item 4. none of the above
+
+ If none of the settings are enabled or the respective methods are missing,
+ C<JSON::XS> throws an exception.
+
+ =back
+
+ =head3 DESERIALISATION
+
+ For deserialisation there are only two cases to consider: either
+ nonstandard tagging was used, in which case C<allow_tags> decides,
+ or objects cannot be automatically be deserialised, in which
+ case you can use postprocessing or the C<filter_json_object> or
+ C<filter_json_single_key_object> callbacks to get some real objects our of
+ your JSON.
+
+ This section only considers the tagged value case: I a tagged JSON object
+ is encountered during decoding and C<allow_tags> is disabled, a parse
+ error will result (as if tagged values were not part of the grammar).
+
+ If C<allow_tags> is enabled, C<JSON::XS> will look up the C<THAW> method
+ of the package/classname used during serialisation (it will not attempt
+ to load the package as a Perl module). If there is no such method, the
+ decoding will fail with an error.
+
+ Otherwise, the C<THAW> method is invoked with the classname as first
+ argument, the constant string C<JSON> as second argument, and all the
+ values from the JSON array (the values originally returned by the
+ C<FREEZE> method) as remaining arguments.
+
+ The method must then return the object. While technically you can return
+ any Perl scalar, you might have to enable the C<enable_nonref> setting to
+ make that work in all cases, so better return an actual blessed reference.
+
+ As an example, let's implement a C<THAW> function that regenerates the
+ C<My::Object> from the C<FREEZE> example earlier:
+
+ sub My::Object::THAW {
+ my ($class, $serialiser, $type, $id) = @_;
+
+ $class->new (type => $type, id => $id)
+ }
+
+
+ =head1 ENCODING/CODESET FLAG NOTES
+
+ The interested reader might have seen a number of flags that signify
+ encodings or codesets - C<utf8>, C<latin1> and C<ascii>. There seems to be
+ some confusion on what these do, so here is a short comparison:
+
+ C<utf8> controls whether the JSON text created by C<encode> (and expected
+ by C<decode>) is UTF-8 encoded or not, while C<latin1> and C<ascii> only
+ control whether C<encode> escapes character values outside their respective
+ codeset range. Neither of these flags conflict with each other, although
+ some combinations make less sense than others.
+
+ Care has been taken to make all flags symmetrical with respect to
+ C<encode> and C<decode>, that is, texts encoded with any combination of
+ these flag values will be correctly decoded when the same flags are used
+ - in general, if you use different flag settings while encoding vs. when
+ decoding you likely have a bug somewhere.
+
+ Below comes a verbose discussion of these flags. Note that a "codeset" is
+ simply an abstract set of character-codepoint pairs, while an encoding
+ takes those codepoint numbers and I<encodes> them, in our case into
+ octets. Unicode is (among other things) a codeset, UTF-8 is an encoding,
+ and ISO-8859-1 (= latin 1) and ASCII are both codesets I<and> encodings at
+ the same time, which can be confusing.
+
+ =over 4
+
+ =item C<utf8> flag disabled
+
+ When C<utf8> is disabled (the default), then C<encode>/C<decode> generate
+ and expect Unicode strings, that is, characters with high ordinal Unicode
+ values (> 255) will be encoded as such characters, and likewise such
+ characters are decoded as-is, no changes to them will be done, except
+ "(re-)interpreting" them as Unicode codepoints or Unicode characters,
+ respectively (to Perl, these are the same thing in strings unless you do
+ funny/weird/dumb stuff).
+
+ This is useful when you want to do the encoding yourself (e.g. when you
+ want to have UTF-16 encoded JSON texts) or when some other layer does
+ the encoding for you (for example, when printing to a terminal using a
+ filehandle that transparently encodes to UTF-8 you certainly do NOT want
+ to UTF-8 encode your data first and have Perl encode it another time).
+
+ =item C<utf8> flag enabled
+
+ If the C<utf8>-flag is enabled, C<encode>/C<decode> will encode all
+ characters using the corresponding UTF-8 multi-byte sequence, and will
+ expect your input strings to be encoded as UTF-8, that is, no "character"
+ of the input string must have any value > 255, as UTF-8 does not allow
+ that.
+
+ The C<utf8> flag therefore switches between two modes: disabled means you
+ will get a Unicode string in Perl, enabled means you get an UTF-8 encoded
+ octet/binary string in Perl.
+
+ =item C<latin1> or C<ascii> flags enabled
+
+ With C<latin1> (or C<ascii>) enabled, C<encode> will escape characters
+ with ordinal values > 255 (> 127 with C<ascii>) and encode the remaining
+ characters as specified by the C<utf8> flag.
+
+ If C<utf8> is disabled, then the result is also correctly encoded in those
+ character sets (as both are proper subsets of Unicode, meaning that a
+ Unicode string with all character values < 256 is the same thing as a
+ ISO-8859-1 string, and a Unicode string with all character values < 128 is
+ the same thing as an ASCII string in Perl).
+
+ If C<utf8> is enabled, you still get a correct UTF-8-encoded string,
+ regardless of these flags, just some more characters will be escaped using
+ C<\uXXXX> then before.
+
+ Note that ISO-8859-1-I<encoded> strings are not compatible with UTF-8
+ encoding, while ASCII-encoded strings are. That is because the ISO-8859-1
+ encoding is NOT a subset of UTF-8 (despite the ISO-8859-1 I<codeset> being
+ a subset of Unicode), while ASCII is.
+
+ Surprisingly, C<decode> will ignore these flags and so treat all input
+ values as governed by the C<utf8> flag. If it is disabled, this allows you
+ to decode ISO-8859-1- and ASCII-encoded strings, as both strict subsets of
+ Unicode. If it is enabled, you can correctly decode UTF-8 encoded strings.
+
+ So neither C<latin1> nor C<ascii> are incompatible with the C<utf8> flag -
+ they only govern when the JSON output engine escapes a character or not.
+
+ The main use for C<latin1> is to relatively efficiently store binary data
+ as JSON, at the expense of breaking compatibility with most JSON decoders.
+
+ The main use for C<ascii> is to force the output to not contain characters
+ with values > 127, which means you can interpret the resulting string
+ as UTF-8, ISO-8859-1, ASCII, KOI8-R or most about any character set and
+ 8-bit-encoding, and still get the same data structure back. This is useful
+ when your channel for JSON transfer is not 8-bit clean or the encoding
+ might be mangled in between (e.g. in mail), and works because ASCII is a
+ proper subset of most 8-bit and multibyte encodings in use in the world.
+
+ =back
+
+
+ =head2 JSON and ECMAscript
+
+ JSON syntax is based on how literals are represented in javascript (the
+ not-standardised predecessor of ECMAscript) which is presumably why it is
+ called "JavaScript Object Notation".
+
+ However, JSON is not a subset (and also not a superset of course) of
+ ECMAscript (the standard) or javascript (whatever browsers actually
+ implement).
+
+ If you want to use javascript's C<eval> function to "parse" JSON, you
+ might run into parse errors for valid JSON texts, or the resulting data
+ structure might not be queryable:
+
+ One of the problems is that U+2028 and U+2029 are valid characters inside
+ JSON strings, but are not allowed in ECMAscript string literals, so the
+ following Perl fragment will not output something that can be guaranteed
+ to be parsable by javascript's C<eval>:
+
+ use JSON::XS;
+
+ print encode_json [chr 0x2028];
+
+ The right fix for this is to use a proper JSON parser in your javascript
+ programs, and not rely on C<eval> (see for example Douglas Crockford's
+ F<json2.js> parser).
+
+ If this is not an option, you can, as a stop-gap measure, simply encode to
+ ASCII-only JSON:
+
+ use JSON::XS;
+
+ print JSON::XS->new->ascii->encode ([chr 0x2028]);
+
+ Note that this will enlarge the resulting JSON text quite a bit if you
+ have many non-ASCII characters. You might be tempted to run some regexes
+ to only escape U+2028 and U+2029, e.g.:
+
+ # DO NOT USE THIS!
+ my $json = JSON::XS->new->utf8->encode ([chr 0x2028]);
+ $json =~ s/\xe2\x80\xa8/\\u2028/g; # escape U+2028
+ $json =~ s/\xe2\x80\xa9/\\u2029/g; # escape U+2029
+ print $json;
+
+ Note that I<this is a bad idea>: the above only works for U+2028 and
+ U+2029 and thus only for fully ECMAscript-compliant parsers. Many existing
+ javascript implementations, however, have issues with other characters as
+ well - using C<eval> naively simply I<will> cause problems.
+
+ Another problem is that some javascript implementations reserve
+ some property names for their own purposes (which probably makes
+ them non-ECMAscript-compliant). For example, Iceweasel reserves the
+ C<__proto__> property name for its own purposes.
+
+ If that is a problem, you could parse try to filter the resulting JSON
+ output for these property strings, e.g.:
+
+ $json =~ s/"__proto__"\s*:/"__proto__renamed":/g;
+
+ This works because C<__proto__> is not valid outside of strings, so every
+ occurrence of C<"__proto__"\s*:> must be a string used as property name.
+
+ If you know of other incompatibilities, please let me know.
+
+
+ =head2 JSON and YAML
+
+ You often hear that JSON is a subset of YAML. This is, however, a mass
+ hysteria(*) and very far from the truth (as of the time of this writing),
+ so let me state it clearly: I<in general, there is no way to configure
+ JSON::XS to output a data structure as valid YAML> that works in all
+ cases.
+
+ If you really must use JSON::XS to generate YAML, you should use this
+ algorithm (subject to change in future versions):
+
+ my $to_yaml = JSON::XS->new->utf8->space_after (1);
+ my $yaml = $to_yaml->encode ($ref) . "\n";
+
+ This will I<usually> generate JSON texts that also parse as valid
+ YAML. Please note that YAML has hardcoded limits on (simple) object key
+ lengths that JSON doesn't have and also has different and incompatible
+ unicode character escape syntax, so you should make sure that your hash
+ keys are noticeably shorter than the 1024 "stream characters" YAML allows
+ and that you do not have characters with codepoint values outside the
+ Unicode BMP (basic multilingual page). YAML also does not allow C<\/>
+ sequences in strings (which JSON::XS does not I<currently> generate, but
+ other JSON generators might).
+
+ There might be other incompatibilities that I am not aware of (or the YAML
+ specification has been changed yet again - it does so quite often). In
+ general you should not try to generate YAML with a JSON generator or vice
+ versa, or try to parse JSON with a YAML parser or vice versa: chances are
+ high that you will run into severe interoperability problems when you
+ least expect it.
+
+ =over 4
+
+ =item (*)
+
+ I have been pressured multiple times by Brian Ingerson (one of the
+ authors of the YAML specification) to remove this paragraph, despite him
+ acknowledging that the actual incompatibilities exist. As I was personally
+ bitten by this "JSON is YAML" lie, I refused and said I will continue to
+ educate people about these issues, so others do not run into the same
+ problem again and again. After this, Brian called me a (quote)I<complete
+ and worthless idiot>(unquote).
+
+ In my opinion, instead of pressuring and insulting people who actually
+ clarify issues with YAML and the wrong statements of some of its
+ proponents, I would kindly suggest reading the JSON spec (which is not
+ that difficult or long) and finally make YAML compatible to it, and
+ educating users about the changes, instead of spreading lies about the
+ real compatibility for many I<years> and trying to silence people who
+ point out that it isn't true.
+
+ Addendum/2009: the YAML 1.2 spec is still incompatible with JSON, even
+ though the incompatibilities have been documented (and are known to Brian)
+ for many years and the spec makes explicit claims that YAML is a superset
+ of JSON. It would be so easy to fix, but apparently, bullying people and
+ corrupting userdata is so much easier.
+
+ =back
+
+
+ =head2 SPEED
+
+ It seems that JSON::XS is surprisingly fast, as shown in the following
+ tables. They have been generated with the help of the C<eg/bench> program
+ in the JSON::XS distribution, to make it easy to compare on your own
+ system.
+
+ First comes a comparison between various modules using
+ a very short single-line JSON string (also available at
+ L<http://dist.schmorp.de/misc/json/short.json>).
+
+ {"method": "handleMessage", "params": ["user1",
+ "we were just talking"], "id": null, "array":[1,11,234,-5,1e5,1e7,
+ 1, 0]}
+
+ It shows the number of encodes/decodes per second (JSON::XS uses
+ the functional interface, while JSON::XS/2 uses the OO interface
+ with pretty-printing and hashkey sorting enabled, JSON::XS/3 enables
+ shrink. JSON::DWIW/DS uses the deserialise function, while JSON::DWIW::FJ
+ uses the from_json method). Higher is better:
+
+ module | encode | decode |
+ --------------|------------|------------|
+ JSON::DWIW/DS | 86302.551 | 102300.098 |
+ JSON::DWIW/FJ | 86302.551 | 75983.768 |
+ JSON::PP | 15827.562 | 6638.658 |
+ JSON::Syck | 63358.066 | 47662.545 |
+ JSON::XS | 511500.488 | 511500.488 |
+ JSON::XS/2 | 291271.111 | 388361.481 |
+ JSON::XS/3 | 361577.931 | 361577.931 |
+ Storable | 66788.280 | 265462.278 |
+ --------------+------------+------------+
+
+ That is, JSON::XS is almost six times faster than JSON::DWIW on encoding,
+ about five times faster on decoding, and over thirty to seventy times
+ faster than JSON's pure perl implementation. It also compares favourably
+ to Storable for small amounts of data.
+
+ Using a longer test string (roughly 18KB, generated from Yahoo! Locals
+ search API (L<http://dist.schmorp.de/misc/json/long.json>).
+
+ module | encode | decode |
+ --------------|------------|------------|
+ JSON::DWIW/DS | 1647.927 | 2673.916 |
+ JSON::DWIW/FJ | 1630.249 | 2596.128 |
+ JSON::PP | 400.640 | 62.311 |
+ JSON::Syck | 1481.040 | 1524.869 |
+ JSON::XS | 20661.596 | 9541.183 |
+ JSON::XS/2 | 10683.403 | 9416.938 |
+ JSON::XS/3 | 20661.596 | 9400.054 |
+ Storable | 19765.806 | 10000.725 |
+ --------------+------------+------------+
+
+ Again, JSON::XS leads by far (except for Storable which non-surprisingly
+ decodes a bit faster).
+
+ On large strings containing lots of high Unicode characters, some modules
+ (such as JSON::PC) seem to decode faster than JSON::XS, but the result
+ will be broken due to missing (or wrong) Unicode handling. Others refuse
+ to decode or encode properly, so it was impossible to prepare a fair
+ comparison table for that case.
+
+
+ =head1 SECURITY CONSIDERATIONS
+
+ When you are using JSON in a protocol, talking to untrusted potentially
+ hostile creatures requires relatively few measures.
+
+ First of all, your JSON decoder should be secure, that is, should not have
+ any buffer overflows. Obviously, this module should ensure that and I am
+ trying hard on making that true, but you never know.
+
+ Second, you need to avoid resource-starving attacks. That means you should
+ limit the size of JSON texts you accept, or make sure then when your
+ resources run out, that's just fine (e.g. by using a separate process that
+ can crash safely). The size of a JSON text in octets or characters is
+ usually a good indication of the size of the resources required to decode
+ it into a Perl structure. While JSON::XS can check the size of the JSON
+ text, it might be too late when you already have it in memory, so you
+ might want to check the size before you accept the string.
+
+ Third, JSON::XS recurses using the C stack when decoding objects and
+ arrays. The C stack is a limited resource: for instance, on my amd64
+ machine with 8MB of stack size I can decode around 180k nested arrays but
+ only 14k nested JSON objects (due to perl itself recursing deeply on croak
+ to free the temporary). If that is exceeded, the program crashes. To be
+ conservative, the default nesting limit is set to 512. If your process
+ has a smaller stack, you should adjust this setting accordingly with the
+ C<max_depth> method.
+
+ Something else could bomb you, too, that I forgot to think of. In that
+ case, you get to keep the pieces. I am always open for hints, though...
+
+ Also keep in mind that JSON::XS might leak contents of your Perl data
+ structures in its error messages, so when you serialise sensitive
+ information you might want to make sure that exceptions thrown by JSON::XS
+ will not end up in front of untrusted eyes.
+
+ If you are using JSON::XS to return packets to consumption
+ by JavaScript scripts in a browser you should have a look at
+ L<http://blog.archive.jpsykes.com/47/practical-csrf-and-json-security/> to
+ see whether you are vulnerable to some common attack vectors (which really
+ are browser design bugs, but it is still you who will have to deal with
+ it, as major browser developers care only for features, not about getting
+ security right).
+
+
+ =head1 INTEROPERABILITY WITH OTHER MODULES
+
+ C<JSON::XS> uses the L<Types::Serialiser> module to provide boolean
+ constants. That means that the JSON true and false values will be
+ comaptible to true and false values of iother modules that do the same,
+ such as L<JSON::PP> and L<CBOR::XS>.
+
+
+ =head1 THREADS
+
+ This module is I<not> guaranteed to be thread safe and there are no
+ plans to change this until Perl gets thread support (as opposed to the
+ horribly slow so-called "threads" which are simply slow and bloated
+ process simulations - use fork, it's I<much> faster, cheaper, better).
+
+ (It might actually work, but you have been warned).
+
+
+ =head1 THE PERILS OF SETLOCALE
+
+ Sometimes people avoid the Perl locale support and directly call the
+ system's setlocale function with C<LC_ALL>.
+
+ This breaks both perl and modules such as JSON::XS, as stringification of
+ numbers no longer works correctly (e.g. C<$x = 0.1; print "$x"+1> might
+ print C<1>, and JSON::XS might output illegal JSON as JSON::XS relies on
+ perl to stringify numbers).
+
+ The solution is simple: don't call C<setlocale>, or use it for only those
+ categories you need, such as C<LC_MESSAGES> or C<LC_CTYPE>.
+
+ If you need C<LC_NUMERIC>, you should enable it only around the code that
+ actually needs it (avoiding stringification of numbers), and restore it
+ afterwards.
+
+
+ =head1 BUGS
+
+ While the goal of this module is to be correct, that unfortunately does
+ not mean it's bug-free, only that I think its design is bug-free. If you
+ keep reporting bugs they will be fixed swiftly, though.
+
+ Please refrain from using rt.cpan.org or any other bug reporting
+ service. I put the contact address into my modules for a reason.
+
+ =cut
+
+ BEGIN {
+ *true = \$Types::Serialiser::true;
+ *true = \&Types::Serialiser::true;
+ *false = \$Types::Serialiser::false;
+ *false = \&Types::Serialiser::false;
+ *is_bool = \&Types::Serialiser::is_bool;
+
+ *JSON::XS::Boolean:: = *Types::Serialiser::Boolean::;
+ }
+
+ XSLoader::load "JSON::XS", $VERSION;
+
+ =head1 SEE ALSO
+
+ The F<json_xs> command line utility for quick experiments.
+
+ =head1 AUTHOR
+
+ Marc Lehmann <schmorp@schmorp.de>
+ http://home.schmorp.de/
+
+ =cut
+
+ 1
+
+X86_64-LINUX-GNU-THREAD-MULTI_JSON_XS
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/JSON/XS/Boolean.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_JSON_XS_BOOLEAN';
+ =head1 NAME
+
+ JSON::XS::Boolean - dummy module providing JSON::XS::Boolean
+
+ =head1 SYNOPSIS
+
+ # do not "use" yourself
+
+ =head1 DESCRIPTION
+
+ This module exists only to provide overload resolution for Storable and
+ similar modules. It's only needed for compatibility with data serialised
+ (by other modules such as Storable) that was decoded by JSON::XS versions
+ before 3.0.
+
+ Since 3.0, JSON::PP::Boolean has replaced it. Support for
+ JSON::XS::Boolean will be removed in a future release.
+
+ =cut
+
+ use JSON::XS ();
+
+ 1;
+
+ =head1 AUTHOR
+
+ Marc Lehmann <schmorp@schmorp.de>
+ http://home.schmorp.de/
+
+ =cut
+
+X86_64-LINUX-GNU-THREAD-MULTI_JSON_XS_BOOLEAN
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/Sub/Name.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_SUB_NAME';
+ package Sub::Name; # git description: v0.13-7-g79187d2
+ # ABSTRACT: (re)name a sub
+
+ #pod =pod
+ #pod
+ #pod =head1 SYNOPSIS
+ #pod
+ #pod use Sub::Name;
+ #pod
+ #pod subname $name, $subref;
+ #pod
+ #pod $subref = subname foo => sub { ... };
+ #pod
+ #pod =head1 DESCRIPTION
+ #pod
+ #pod This module has only one function, which is also exported by default:
+ #pod
+ #pod =for stopwords subname
+ #pod
+ #pod =head2 subname NAME, CODEREF
+ #pod
+ #pod Assigns a new name to referenced sub. If package specification is omitted in
+ #pod the name, then the current package is used. The return value is the sub.
+ #pod
+ #pod The name is only used for informative routines (caller, Carp, etc). You won't
+ #pod be able to actually invoke the sub by the given name. To allow that, you need
+ #pod to do glob-assignment yourself.
+ #pod
+ #pod Note that for anonymous closures (subs that reference lexicals declared outside
+ #pod the sub itself) you can name each instance of the closure differently, which
+ #pod can be very useful for debugging.
+ #pod
+ #pod =head1 SEE ALSO
+ #pod
+ #pod =for :list
+ #pod * L<Sub::Identify> - for getting information about subs
+ #pod * L<Sub::Util> - set_subname is another implementation of C<subname>
+ #pod
+ #pod =for stopwords cPanel
+ #pod
+ #pod =head1 COPYRIGHT AND LICENSE
+ #pod
+ #pod This software is copyright (c) 2004, 2008 by Matthijs van Duin, all rights reserved;
+ #pod copyright (c) 2014 cPanel Inc., all rights reserved.
+ #pod
+ #pod This program is free software; you can redistribute it and/or modify
+ #pod it under the same terms as Perl itself.
+ #pod
+ #pod =cut
+
+ use 5.006;
+
+ use strict;
+ use warnings;
+
+ our $VERSION = '0.14';
+
+ use Exporter 5.57 'import';
+
+ our @EXPORT = qw(subname);
+ our @EXPORT_OK = @EXPORT;
+
+ use XSLoader;
+ XSLoader::load(
+ __PACKAGE__,
+ $VERSION,
+ );
+
+ 1;
+
+ __END__
+
+ =pod
+
+ =encoding UTF-8
+
+ =head1 NAME
+
+ Sub::Name - (re)name a sub
+
+ =head1 VERSION
+
+ version 0.14
+
+ =head1 SYNOPSIS
+
+ use Sub::Name;
+
+ subname $name, $subref;
+
+ $subref = subname foo => sub { ... };
+
+ =head1 DESCRIPTION
+
+ This module has only one function, which is also exported by default:
+
+ =for stopwords subname
+
+ =head2 subname NAME, CODEREF
+
+ Assigns a new name to referenced sub. If package specification is omitted in
+ the name, then the current package is used. The return value is the sub.
+
+ The name is only used for informative routines (caller, Carp, etc). You won't
+ be able to actually invoke the sub by the given name. To allow that, you need
+ to do glob-assignment yourself.
+
+ Note that for anonymous closures (subs that reference lexicals declared outside
+ the sub itself) you can name each instance of the closure differently, which
+ can be very useful for debugging.
+
+ =head1 SEE ALSO
+
+ =over 4
+
+ =item *
+
+ L<Sub::Identify> - for getting information about subs
+
+ =item *
+
+ L<Sub::Util> - set_subname is another implementation of C<subname>
+
+ =back
+
+ =for stopwords cPanel
+
+ =head1 AUTHOR
+
+ Matthijs van Duin <xmath@cpan.org>
+
+ =head1 CONTRIBUTORS
+
+ =for stopwords Karen Etheridge Florian Ragwitz Matthijs van Duin Reini Urban Dagfinn Ilmari Mannsåker gfx J.R. Mash
+
+ =over 4
+
+ =item *
+
+ Karen Etheridge <ether@cpan.org>
+
+ =item *
+
+ Florian Ragwitz <rafl@debian.org>
+
+ =item *
+
+ Matthijs van Duin <xmath-no-spam@nospam.cpan.org>
+
+ =item *
+
+ Reini Urban <rurban@cpanel.net>
+
+ =item *
+
+ Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
+
+ =item *
+
+ gfx <gfuji@cpan.org>
+
+ =item *
+
+ J.R. Mash <jmash.code@gmail.com>
+
+ =back
+
+ =head1 COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2004, 2008 by Matthijs van Duin, all rights reserved;
+ copyright (c) 2014 cPanel Inc., all rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the same terms as Perl itself.
+
+ =cut
+X86_64-LINUX-GNU-THREAD-MULTI_SUB_NAME
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/common/sense.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_COMMON_SENSE';
+ package common::sense;
+
+ our $VERSION = 3.74;
+
+ # overload should be included
+
+ sub import {
+ local $^W; # work around perl 5.16 spewing out warnings for next statement
+ # use warnings
+ ${^WARNING_BITS} ^= ${^WARNING_BITS} ^ "\x0c\x3f\x33\x00\x0f\xf0\x0f\xc0\xf0\xfc\x33\x00";
+ # use strict, use utf8; use feature;
+ $^H |= 0x820700;
+ @^H{qw(feature_say feature_state feature_switch)} = (1) x 3;
+ }
+
+ 1
+X86_64-LINUX-GNU-THREAD-MULTI_COMMON_SENSE
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/version.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_VERSION';
+ #!perl -w
+ package version;
+
+ use 5.006002;
+ use strict;
+ use warnings::register;
+ if ($] >= 5.015) {
+ warnings::register_categories(qw/version/);
+ }
+
+ use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);
+
+ $VERSION = 0.9912;
+ $CLASS = 'version';
+
+ # !!!!Delete this next block completely when adding to Perl core!!!!
+ {
+ local $SIG{'__DIE__'};
+ eval "use version::vxs $VERSION";
+ if ( $@ ) { # don't have the XS version installed
+ eval "use version::vpp $VERSION"; # don't tempt fate
+ die "$@" if ( $@ );
+ push @ISA, "version::vpp";
+ local $^W;
+ *version::qv = \&version::vpp::qv;
+ *version::declare = \&version::vpp::declare;
+ *version::_VERSION = \&version::vpp::_VERSION;
+ *version::vcmp = \&version::vpp::vcmp;
+ *version::new = \&version::vpp::new;
+ *version::numify = \&version::vpp::numify;
+ *version::normal = \&version::vpp::normal;
+ if ($] >= 5.009000) {
+ no strict 'refs';
+ *version::stringify = \&version::vpp::stringify;
+ *{'version::(""'} = \&version::vpp::stringify;
+ *{'version::(<=>'} = \&version::vpp::vcmp;
+ *version::parse = \&version::vpp::parse;
+ }
+ }
+ else { # use XS module
+ push @ISA, "version::vxs";
+ local $^W;
+ *version::declare = \&version::vxs::declare;
+ *version::qv = \&version::vxs::qv;
+ *version::_VERSION = \&version::vxs::_VERSION;
+ *version::vcmp = \&version::vxs::VCMP;
+ *version::new = \&version::vxs::new;
+ *version::numify = \&version::vxs::numify;
+ *version::normal = \&version::vxs::normal;
+ if ($] >= 5.009000) {
+ no strict 'refs';
+ *version::stringify = \&version::vxs::stringify;
+ *{'version::(""'} = \&version::vxs::stringify;
+ *{'version::(<=>'} = \&version::vxs::VCMP;
+ *version::parse = \&version::vxs::parse;
+ }
+ }
+ }
+
+ # avoid using Exporter
+ require version::regex;
+ *version::is_lax = \&version::regex::is_lax;
+ *version::is_strict = \&version::regex::is_strict;
+ *LAX = \$version::regex::LAX;
+ *STRICT = \$version::regex::STRICT;
+
+ sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq $CLASS) {
+ local $^W;
+ *{$class.'::declare'} = \&{$CLASS.'::declare'};
+ *{$class.'::qv'} = \&{$CLASS.'::qv'};
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg.'::declare'} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg.'::qv'} =
+ sub {return $class->qv(shift) }
+ unless defined(&{$callpkg.'::qv'});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ local $^W;
+ *UNIVERSAL::VERSION
+ = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg.'::VERSION'} = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'is_strict'})) {
+ *{$callpkg.'::is_strict'} = \&{$CLASS.'::is_strict'}
+ unless defined(&{$callpkg.'::is_strict'});
+ }
+
+ if (exists($args{'is_lax'})) {
+ *{$callpkg.'::is_lax'} = \&{$CLASS.'::is_lax'}
+ unless defined(&{$callpkg.'::is_lax'});
+ }
+ }
+
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_VERSION
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/version/regex.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_VERSION_REGEX';
+ package version::regex;
+
+ use strict;
+
+ use vars qw($VERSION $CLASS $STRICT $LAX);
+
+ $VERSION = 0.9912;
+
+ #--------------------------------------------------------------------------#
+ # Version regexp components
+ #--------------------------------------------------------------------------#
+
+ # Fraction part of a decimal version number. This is a common part of
+ # both strict and lax decimal versions
+
+ my $FRACTION_PART = qr/\.[0-9]+/;
+
+ # First part of either decimal or dotted-decimal strict version number.
+ # Unsigned integer with no leading zeroes (except for zero itself) to
+ # avoid confusion with octal.
+
+ my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/;
+
+ # First part of either decimal or dotted-decimal lax version number.
+ # Unsigned integer, but allowing leading zeros. Always interpreted
+ # as decimal. However, some forms of the resulting syntax give odd
+ # results if used as ordinary Perl expressions, due to how perl treats
+ # octals. E.g.
+ # version->new("010" ) == 10
+ # version->new( 010 ) == 8
+ # version->new( 010.2) == 82 # "8" . "2"
+
+ my $LAX_INTEGER_PART = qr/[0-9]+/;
+
+ # Second and subsequent part of a strict dotted-decimal version number.
+ # Leading zeroes are permitted, and the number is always decimal.
+ # Limited to three digits to avoid overflow when converting to decimal
+ # form and also avoid problematic style with excessive leading zeroes.
+
+ my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/;
+
+ # Second and subsequent part of a lax dotted-decimal version number.
+ # Leading zeroes are permitted, and the number is always decimal. No
+ # limit on the numerical value or number of digits, so there is the
+ # possibility of overflow when converting to decimal form.
+
+ my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/;
+
+ # Alpha suffix part of lax version number syntax. Acts like a
+ # dotted-decimal part.
+
+ my $LAX_ALPHA_PART = qr/_[0-9]+/;
+
+ #--------------------------------------------------------------------------#
+ # Strict version regexp definitions
+ #--------------------------------------------------------------------------#
+
+ # Strict decimal version number.
+
+ my $STRICT_DECIMAL_VERSION =
+ qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x;
+
+ # Strict dotted-decimal version number. Must have both leading "v" and
+ # at least three parts, to avoid confusion with decimal syntax.
+
+ my $STRICT_DOTTED_DECIMAL_VERSION =
+ qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x;
+
+ # Complete strict version number syntax -- should generally be used
+ # anchored: qr/ \A $STRICT \z /x
+
+ $STRICT =
+ qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x;
+
+ #--------------------------------------------------------------------------#
+ # Lax version regexp definitions
+ #--------------------------------------------------------------------------#
+
+ # Lax decimal version number. Just like the strict one except for
+ # allowing an alpha suffix or allowing a leading or trailing
+ # decimal-point
+
+ my $LAX_DECIMAL_VERSION =
+ qr/ $LAX_INTEGER_PART (?: \. | $FRACTION_PART $LAX_ALPHA_PART? )?
+ |
+ $FRACTION_PART $LAX_ALPHA_PART?
+ /x;
+
+ # Lax dotted-decimal version number. Distinguished by having either
+ # leading "v" or at least three non-alpha parts. Alpha part is only
+ # permitted if there are at least two non-alpha parts. Strangely
+ # enough, without the leading "v", Perl takes .1.2 to mean v0.1.2,
+ # so when there is no "v", the leading part is optional
+
+ my $LAX_DOTTED_DECIMAL_VERSION =
+ qr/
+ v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )?
+ |
+ $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART?
+ /x;
+
+ # Complete lax version number syntax -- should generally be used
+ # anchored: qr/ \A $LAX \z /x
+ #
+ # The string 'undef' is a special case to make for easier handling
+ # of return values from ExtUtils::MM->parse_version
+
+ $LAX =
+ qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x;
+
+ #--------------------------------------------------------------------------#
+
+ # Preloaded methods go here.
+ sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x }
+ sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x }
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_VERSION_REGEX
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/version/vpp.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_VERSION_VPP';
+ package charstar;
+ # a little helper class to emulate C char* semantics in Perl
+ # so that prescan_version can use the same code as in C
+
+ use overload (
+ '""' => \&thischar,
+ '0+' => \&thischar,
+ '++' => \&increment,
+ '--' => \&decrement,
+ '+' => \&plus,
+ '-' => \&minus,
+ '*' => \&multiply,
+ 'cmp' => \&cmp,
+ '<=>' => \&spaceship,
+ 'bool' => \&thischar,
+ '=' => \&clone,
+ );
+
+ sub new {
+ my ($self, $string) = @_;
+ my $class = ref($self) || $self;
+
+ my $obj = {
+ string => [split(//,$string)],
+ current => 0,
+ };
+ return bless $obj, $class;
+ }
+
+ sub thischar {
+ my ($self) = @_;
+ my $last = $#{$self->{string}};
+ my $curr = $self->{current};
+ if ($curr >= 0 && $curr <= $last) {
+ return $self->{string}->[$curr];
+ }
+ else {
+ return '';
+ }
+ }
+
+ sub increment {
+ my ($self) = @_;
+ $self->{current}++;
+ }
+
+ sub decrement {
+ my ($self) = @_;
+ $self->{current}--;
+ }
+
+ sub plus {
+ my ($self, $offset) = @_;
+ my $rself = $self->clone;
+ $rself->{current} += $offset;
+ return $rself;
+ }
+
+ sub minus {
+ my ($self, $offset) = @_;
+ my $rself = $self->clone;
+ $rself->{current} -= $offset;
+ return $rself;
+ }
+
+ sub multiply {
+ my ($left, $right, $swapped) = @_;
+ my $char = $left->thischar();
+ return $char * $right;
+ }
+
+ sub spaceship {
+ my ($left, $right, $swapped) = @_;
+ unless (ref($right)) { # not an object already
+ $right = $left->new($right);
+ }
+ return $left->{current} <=> $right->{current};
+ }
+
+ sub cmp {
+ my ($left, $right, $swapped) = @_;
+ unless (ref($right)) { # not an object already
+ if (length($right) == 1) { # comparing single character only
+ return $left->thischar cmp $right;
+ }
+ $right = $left->new($right);
+ }
+ return $left->currstr cmp $right->currstr;
+ }
+
+ sub bool {
+ my ($self) = @_;
+ my $char = $self->thischar;
+ return ($char ne '');
+ }
+
+ sub clone {
+ my ($left, $right, $swapped) = @_;
+ $right = {
+ string => [@{$left->{string}}],
+ current => $left->{current},
+ };
+ return bless $right, ref($left);
+ }
+
+ sub currstr {
+ my ($self, $s) = @_;
+ my $curr = $self->{current};
+ my $last = $#{$self->{string}};
+ if (defined($s) && $s->{current} < $last) {
+ $last = $s->{current};
+ }
+
+ my $string = join('', @{$self->{string}}[$curr..$last]);
+ return $string;
+ }
+
+ package version::vpp;
+
+ use 5.006002;
+ use strict;
+ use warnings::register;
+
+ use Config;
+ use vars qw($VERSION $CLASS @ISA $LAX $STRICT $WARN_CATEGORY);
+ $VERSION = 0.9912;
+ $CLASS = 'version::vpp';
+ if ($] > 5.015) {
+ warnings::register_categories(qw/version/);
+ $WARN_CATEGORY = 'version';
+ } else {
+ $WARN_CATEGORY = 'numeric';
+ }
+
+ require version::regex;
+ *version::vpp::is_strict = \&version::regex::is_strict;
+ *version::vpp::is_lax = \&version::regex::is_lax;
+ *LAX = \$version::regex::LAX;
+ *STRICT = \$version::regex::STRICT;
+
+ use overload (
+ '""' => \&stringify,
+ '0+' => \&numify,
+ 'cmp' => \&vcmp,
+ '<=>' => \&vcmp,
+ 'bool' => \&vbool,
+ '+' => \&vnoop,
+ '-' => \&vnoop,
+ '*' => \&vnoop,
+ '/' => \&vnoop,
+ '+=' => \&vnoop,
+ '-=' => \&vnoop,
+ '*=' => \&vnoop,
+ '/=' => \&vnoop,
+ 'abs' => \&vnoop,
+ );
+
+ sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq $CLASS) {
+ local $^W;
+ *{$class.'::declare'} = \&{$CLASS.'::declare'};
+ *{$class.'::qv'} = \&{$CLASS.'::qv'};
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg.'::declare'} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg.'::qv'} =
+ sub {return $class->qv(shift) }
+ unless defined(&{$callpkg.'::qv'});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ no warnings qw/redefine/;
+ *UNIVERSAL::VERSION
+ = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg.'::VERSION'} = \&{$CLASS.'::_VERSION'};
+ }
+
+ if (exists($args{'is_strict'})) {
+ *{$callpkg.'::is_strict'} = \&{$CLASS.'::is_strict'}
+ unless defined(&{$callpkg.'::is_strict'});
+ }
+
+ if (exists($args{'is_lax'})) {
+ *{$callpkg.'::is_lax'} = \&{$CLASS.'::is_lax'}
+ unless defined(&{$callpkg.'::is_lax'});
+ }
+ }
+
+ my $VERSION_MAX = 0x7FFFFFFF;
+
+ # implement prescan_version as closely to the C version as possible
+ use constant TRUE => 1;
+ use constant FALSE => 0;
+
+ sub isDIGIT {
+ my ($char) = shift->thischar();
+ return ($char =~ /\d/);
+ }
+
+ sub isALPHA {
+ my ($char) = shift->thischar();
+ return ($char =~ /[a-zA-Z]/);
+ }
+
+ sub isSPACE {
+ my ($char) = shift->thischar();
+ return ($char =~ /\s/);
+ }
+
+ sub BADVERSION {
+ my ($s, $errstr, $error) = @_;
+ if ($errstr) {
+ $$errstr = $error;
+ }
+ return $s;
+ }
+
+ sub prescan_version {
+ my ($s, $strict, $errstr, $sqv, $ssaw_decimal, $swidth, $salpha) = @_;
+ my $qv = defined $sqv ? $$sqv : FALSE;
+ my $saw_decimal = defined $ssaw_decimal ? $$ssaw_decimal : 0;
+ my $width = defined $swidth ? $$swidth : 3;
+ my $alpha = defined $salpha ? $$salpha : FALSE;
+
+ my $d = $s;
+
+ if ($qv && isDIGIT($d)) {
+ goto dotted_decimal_version;
+ }
+
+ if ($d eq 'v') { # explicit v-string
+ $d++;
+ if (isDIGIT($d)) {
+ $qv = TRUE;
+ }
+ else { # degenerate v-string
+ # requires v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+
+ dotted_decimal_version:
+ if ($strict && $d eq '0' && isDIGIT($d+1)) {
+ # no leading zeros allowed
+ return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)");
+ }
+
+ while (isDIGIT($d)) { # integer part
+ $d++;
+ }
+
+ if ($d eq '.')
+ {
+ $saw_decimal++;
+ $d++; # decimal point
+ }
+ else
+ {
+ if ($strict) {
+ # require v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+ else {
+ goto version_prescan_finish;
+ }
+ }
+
+ {
+ my $i = 0;
+ my $j = 0;
+ while (isDIGIT($d)) { # just keep reading
+ $i++;
+ while (isDIGIT($d)) {
+ $d++; $j++;
+ # maximum 3 digits between decimal
+ if ($strict && $j > 3) {
+ return BADVERSION($s,$errstr,"Invalid version format (maximum 3 digits between decimals)");
+ }
+ }
+ if ($d eq '_') {
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ if ( $alpha ) {
+ return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)");
+ }
+ $d++;
+ $alpha = TRUE;
+ }
+ elsif ($d eq '.') {
+ if ($alpha) {
+ return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)");
+ }
+ $saw_decimal++;
+ $d++;
+ }
+ elsif (!isDIGIT($d)) {
+ last;
+ }
+ $j = 0;
+ }
+
+ if ($strict && $i < 2) {
+ # requires v1.2.3
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
+ }
+ }
+ } # end if dotted-decimal
+ else
+ { # decimal versions
+ my $j = 0;
+ # special $strict case for leading '.' or '0'
+ if ($strict) {
+ if ($d eq '.') {
+ return BADVERSION($s,$errstr,"Invalid version format (0 before decimal required)");
+ }
+ if ($d eq '0' && isDIGIT($d+1)) {
+ return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)");
+ }
+ }
+
+ # and we never support negative version numbers
+ if ($d eq '-') {
+ return BADVERSION($s,$errstr,"Invalid version format (negative version number)");
+ }
+
+ # consume all of the integer part
+ while (isDIGIT($d)) {
+ $d++;
+ }
+
+ # look for a fractional part
+ if ($d eq '.') {
+ # we found it, so consume it
+ $saw_decimal++;
+ $d++;
+ }
+ elsif (!$d || $d eq ';' || isSPACE($d) || $d eq '}') {
+ if ( $d == $s ) {
+ # found nothing
+ return BADVERSION($s,$errstr,"Invalid version format (version required)");
+ }
+ # found just an integer
+ goto version_prescan_finish;
+ }
+ elsif ( $d == $s ) {
+ # didn't find either integer or period
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+ elsif ($d eq '_') {
+ # underscore can't come after integer part
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ elsif (isDIGIT($d+1)) {
+ return BADVERSION($s,$errstr,"Invalid version format (alpha without decimal)");
+ }
+ else {
+ return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)");
+ }
+ }
+ elsif ($d) {
+ # anything else after integer part is just invalid data
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+
+ # scan the fractional part after the decimal point
+ if ($d && !isDIGIT($d) && ($strict || ! ($d eq ';' || isSPACE($d) || $d eq '}') )) {
+ # $strict or lax-but-not-the-end
+ return BADVERSION($s,$errstr,"Invalid version format (fractional part required)");
+ }
+
+ while (isDIGIT($d)) {
+ $d++; $j++;
+ if ($d eq '.' && isDIGIT($d-1)) {
+ if ($alpha) {
+ return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)");
+ }
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions must begin with 'v')");
+ }
+ $d = $s; # start all over again
+ $qv = TRUE;
+ goto dotted_decimal_version;
+ }
+ if ($d eq '_') {
+ if ($strict) {
+ return BADVERSION($s,$errstr,"Invalid version format (no underscores)");
+ }
+ if ( $alpha ) {
+ return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)");
+ }
+ if ( ! isDIGIT($d+1) ) {
+ return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)");
+ }
+ $width = $j;
+ $d++;
+ $alpha = TRUE;
+ }
+ }
+ }
+
+ version_prescan_finish:
+ while (isSPACE($d)) {
+ $d++;
+ }
+
+ if ($d && !isDIGIT($d) && (! ($d eq ';' || $d eq '}') )) {
+ # trailing non-numeric data
+ return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)");
+ }
+ if ($saw_decimal > 1 && ($d-1) eq '.') {
+ # no trailing period allowed
+ return BADVERSION($s,$errstr,"Invalid version format (trailing decimal)");
+ }
+
+ if (defined $sqv) {
+ $$sqv = $qv;
+ }
+ if (defined $swidth) {
+ $$swidth = $width;
+ }
+ if (defined $ssaw_decimal) {
+ $$ssaw_decimal = $saw_decimal;
+ }
+ if (defined $salpha) {
+ $$salpha = $alpha;
+ }
+ return $d;
+ }
+
+ sub scan_version {
+ my ($s, $rv, $qv) = @_;
+ my $start;
+ my $pos;
+ my $last;
+ my $errstr;
+ my $saw_decimal = 0;
+ my $width = 3;
+ my $alpha = FALSE;
+ my $vinf = FALSE;
+ my @av;
+
+ $s = new charstar $s;
+
+ while (isSPACE($s)) { # leading whitespace is OK
+ $s++;
+ }
+
+ $last = prescan_version($s, FALSE, \$errstr, \$qv, \$saw_decimal,
+ \$width, \$alpha);
+
+ if ($errstr) {
+ # 'undef' is a special case and not an error
+ if ( $s ne 'undef') {
+ require Carp;
+ Carp::croak($errstr);
+ }
+ }
+
+ $start = $s;
+ if ($s eq 'v') {
+ $s++;
+ }
+ $pos = $s;
+
+ if ( $qv ) {
+ $$rv->{qv} = $qv;
+ }
+ if ( $alpha ) {
+ $$rv->{alpha} = $alpha;
+ }
+ if ( !$qv && $width < 3 ) {
+ $$rv->{width} = $width;
+ }
+
+ while (isDIGIT($pos)) {
+ $pos++;
+ }
+ if (!isALPHA($pos)) {
+ my $rev;
+
+ for (;;) {
+ $rev = 0;
+ {
+ # this is atoi() that delimits on underscores
+ my $end = $pos;
+ my $mult = 1;
+ my $orev;
+
+ # the following if() will only be true after the decimal
+ # point of a version originally created with a bare
+ # floating point number, i.e. not quoted in any way
+ #
+ if ( !$qv && $s > $start && $saw_decimal == 1 ) {
+ $mult *= 100;
+ while ( $s < $end ) {
+ $orev = $rev;
+ $rev += $s * $mult;
+ $mult /= 10;
+ if ( (abs($orev) > abs($rev))
+ || (abs($rev) > $VERSION_MAX )) {
+ warn("Integer overflow in version %d",
+ $VERSION_MAX);
+ $s = $end - 1;
+ $rev = $VERSION_MAX;
+ $vinf = 1;
+ }
+ $s++;
+ if ( $s eq '_' ) {
+ $s++;
+ }
+ }
+ }
+ else {
+ while (--$end >= $s) {
+ $orev = $rev;
+ $rev += $end * $mult;
+ $mult *= 10;
+ if ( (abs($orev) > abs($rev))
+ || (abs($rev) > $VERSION_MAX )) {
+ warn("Integer overflow in version");
+ $end = $s - 1;
+ $rev = $VERSION_MAX;
+ $vinf = 1;
+ }
+ }
+ }
+ }
+
+ # Append revision
+ push @av, $rev;
+ if ( $vinf ) {
+ $s = $last;
+ last;
+ }
+ elsif ( $pos eq '.' ) {
+ $pos++;
+ if ($qv) {
+ # skip leading zeros
+ while ($pos eq '0') {
+ $pos++;
+ }
+ }
+ $s = $pos;
+ }
+ elsif ( $pos eq '_' && isDIGIT($pos+1) ) {
+ $s = ++$pos;
+ }
+ elsif ( $pos eq ',' && isDIGIT($pos+1) ) {
+ $s = ++$pos;
+ }
+ elsif ( isDIGIT($pos) ) {
+ $s = $pos;
+ }
+ else {
+ $s = $pos;
+ last;
+ }
+ if ( $qv ) {
+ while ( isDIGIT($pos) ) {
+ $pos++;
+ }
+ }
+ else {
+ my $digits = 0;
+ while ( ( isDIGIT($pos) || $pos eq '_' ) && $digits < 3 ) {
+ if ( $pos ne '_' ) {
+ $digits++;
+ }
+ $pos++;
+ }
+ }
+ }
+ }
+ if ( $qv ) { # quoted versions always get at least three terms
+ my $len = $#av;
+ # This for loop appears to trigger a compiler bug on OS X, as it
+ # loops infinitely. Yes, len is negative. No, it makes no sense.
+ # Compiler in question is:
+ # gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
+ # for ( len = 2 - len; len > 0; len-- )
+ # av_push(MUTABLE_AV(sv), newSViv(0));
+ #
+ $len = 2 - $len;
+ while ($len-- > 0) {
+ push @av, 0;
+ }
+ }
+
+ # need to save off the current version string for later
+ if ( $vinf ) {
+ $$rv->{original} = "v.Inf";
+ $$rv->{vinf} = 1;
+ }
+ elsif ( $s > $start ) {
+ $$rv->{original} = $start->currstr($s);
+ if ( $qv && $saw_decimal == 1 && $start ne 'v' ) {
+ # need to insert a v to be consistent
+ $$rv->{original} = 'v' . $$rv->{original};
+ }
+ }
+ else {
+ $$rv->{original} = '0';
+ push(@av, 0);
+ }
+
+ # And finally, store the AV in the hash
+ $$rv->{version} = \@av;
+
+ # fix RT#19517 - special case 'undef' as string
+ if ($s eq 'undef') {
+ $s += 5;
+ }
+
+ return $s;
+ }
+
+ sub new {
+ my $class = shift;
+ unless (defined $class or $#_ > 1) {
+ require Carp;
+ Carp::croak('Usage: version::new(class, version)');
+ }
+
+ my $self = bless ({}, ref ($class) || $class);
+ my $qv = FALSE;
+
+ if ( $#_ == 1 ) { # must be CVS-style
+ $qv = TRUE;
+ }
+ my $value = pop; # always going to be the last element
+
+ if ( ref($value) && eval('$value->isa("version")') ) {
+ # Can copy the elements directly
+ $self->{version} = [ @{$value->{version} } ];
+ $self->{qv} = 1 if $value->{qv};
+ $self->{alpha} = 1 if $value->{alpha};
+ $self->{original} = ''.$value->{original};
+ return $self;
+ }
+
+ if ( not defined $value or $value =~ /^undef$/ ) {
+ # RT #19517 - special case for undef comparison
+ # or someone forgot to pass a value
+ push @{$self->{version}}, 0;
+ $self->{original} = "0";
+ return ($self);
+ }
+
+
+ if (ref($value) =~ m/ARRAY|HASH/) {
+ require Carp;
+ Carp::croak("Invalid version format (non-numeric data)");
+ }
+
+ $value = _un_vstring($value);
+
+ if ($Config{d_setlocale}) {
+ use POSIX qw/locale_h/;
+ use if $Config{d_setlocale}, 'locale';
+ my $currlocale = setlocale(LC_ALL);
+
+ # if the current locale uses commas for decimal points, we
+ # just replace commas with decimal places, rather than changing
+ # locales
+ if ( localeconv()->{decimal_point} eq ',' ) {
+ $value =~ tr/,/./;
+ }
+ }
+
+ # exponential notation
+ if ( $value =~ /\d+.?\d*e[-+]?\d+/ ) {
+ $value = sprintf("%.9f",$value);
+ $value =~ s/(0+)$//; # trim trailing zeros
+ }
+
+ my $s = scan_version($value, \$self, $qv);
+
+ if ($s) { # must be something left over
+ warn("Version string '%s' contains invalid data; "
+ ."ignoring: '%s'", $value, $s);
+ }
+
+ return ($self);
+ }
+
+ *parse = \&new;
+
+ sub numify {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $width = $self->{width} || 3;
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("%d.", $digit );
+
+ if ($alpha and warnings::enabled()) {
+ warnings::warn($WARN_CATEGORY, 'alpha->numify() is lossy');
+ }
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ if ( $width < 3 ) {
+ my $denom = 10**(3-$width);
+ my $quot = int($digit/$denom);
+ my $rem = $digit - ($quot * $denom);
+ $string .= sprintf("%0".$width."d_%d", $quot, $rem);
+ }
+ else {
+ $string .= sprintf("%03d", $digit);
+ }
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha && $width == 3 ) {
+ $string .= "_";
+ }
+ $string .= sprintf("%0".$width."d", $digit);
+ }
+ else # $len = 0
+ {
+ $string .= sprintf("000");
+ }
+
+ return $string;
+ }
+
+ sub normal {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $alpha = $self->{alpha} || "";
+ my $qv = $self->{qv} || "";
+
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("v%d", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ $string .= sprintf(".%d", $digit);
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha ) {
+ $string .= sprintf("_%0d", $digit);
+ }
+ else {
+ $string .= sprintf(".%0d", $digit);
+ }
+ }
+
+ if ( $len <= 2 ) {
+ for ( $len = 2 - $len; $len != 0; $len-- ) {
+ $string .= sprintf(".%0d", 0);
+ }
+ }
+
+ return $string;
+ }
+
+ sub stringify {
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ return exists $self->{original}
+ ? $self->{original}
+ : exists $self->{qv}
+ ? $self->normal
+ : $self->numify;
+ }
+
+ sub vcmp {
+ require UNIVERSAL;
+ my ($left,$right,$swap) = @_;
+ my $class = ref($left);
+ unless ( UNIVERSAL::isa($right, $class) ) {
+ $right = $class->new($right);
+ }
+
+ if ( $swap ) {
+ ($left, $right) = ($right, $left);
+ }
+ unless (_verify($left)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ unless (_verify($right)) {
+ require Carp;
+ Carp::croak("Invalid version format");
+ }
+ my $l = $#{$left->{version}};
+ my $r = $#{$right->{version}};
+ my $m = $l < $r ? $l : $r;
+ my $lalpha = $left->is_alpha;
+ my $ralpha = $right->is_alpha;
+ my $retval = 0;
+ my $i = 0;
+ while ( $i <= $m && $retval == 0 ) {
+ $retval = $left->{version}[$i] <=> $right->{version}[$i];
+ $i++;
+ }
+
+ # tiebreaker for alpha with identical terms
+ if ( $retval == 0
+ && $l == $r
+ && $left->{version}[$m] == $right->{version}[$m]
+ && ( $lalpha || $ralpha ) ) {
+
+ if ( $lalpha && !$ralpha ) {
+ $retval = -1;
+ }
+ elsif ( $ralpha && !$lalpha) {
+ $retval = +1;
+ }
+ }
+
+ # possible match except for trailing 0's
+ if ( $retval == 0 && $l != $r ) {
+ if ( $l < $r ) {
+ while ( $i <= $r && $retval == 0 ) {
+ if ( $right->{version}[$i] != 0 ) {
+ $retval = -1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ else {
+ while ( $i <= $l && $retval == 0 ) {
+ if ( $left->{version}[$i] != 0 ) {
+ $retval = +1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $retval;
+ }
+
+ sub vbool {
+ my ($self) = @_;
+ return vcmp($self,$self->new("0"),1);
+ }
+
+ sub vnoop {
+ require Carp;
+ Carp::croak("operation not supported with version object");
+ }
+
+ sub is_alpha {
+ my ($self) = @_;
+ return (exists $self->{alpha});
+ }
+
+ sub qv {
+ my $value = shift;
+ my $class = $CLASS;
+ if (@_) {
+ $class = ref($value) || $value;
+ $value = shift;
+ }
+
+ $value = _un_vstring($value);
+ $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/;
+ my $obj = $CLASS->new($value);
+ return bless $obj, $class;
+ }
+
+ *declare = \&qv;
+
+ sub is_qv {
+ my ($self) = @_;
+ return (exists $self->{qv});
+ }
+
+
+ sub _verify {
+ my ($self) = @_;
+ if ( ref($self)
+ && eval { exists $self->{version} }
+ && ref($self->{version}) eq 'ARRAY'
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ sub _is_non_alphanumeric {
+ my $s = shift;
+ $s = new charstar $s;
+ while ($s) {
+ return 0 if isSPACE($s); # early out
+ return 1 unless (isALPHA($s) || isDIGIT($s) || $s =~ /[.-]/);
+ $s++;
+ }
+ return 0;
+ }
+
+ sub _un_vstring {
+ my $value = shift;
+ # may be a v-string
+ if ( length($value) >= 1 && $value !~ /[,._]/
+ && _is_non_alphanumeric($value)) {
+ my $tvalue;
+ if ( $] >= 5.008_001 ) {
+ $tvalue = _find_magic_vstring($value);
+ $value = $tvalue if length $tvalue;
+ }
+ elsif ( $] >= 5.006_000 ) {
+ $tvalue = sprintf("v%vd",$value);
+ if ( $tvalue =~ /^v\d+(\.\d+)*$/ ) {
+ # must be a v-string
+ $value = $tvalue;
+ }
+ }
+ }
+ return $value;
+ }
+
+ sub _find_magic_vstring {
+ my $value = shift;
+ my $tvalue = '';
+ require B;
+ my $sv = B::svref_2object(\$value);
+ my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
+ while ( $magic ) {
+ if ( $magic->TYPE eq 'V' ) {
+ $tvalue = $magic->PTR;
+ $tvalue =~ s/^v?(.+)$/v$1/;
+ last;
+ }
+ else {
+ $magic = $magic->MOREMAGIC;
+ }
+ }
+ return $tvalue;
+ }
+
+ sub _VERSION {
+ my ($obj, $req) = @_;
+ my $class = ref($obj) || $obj;
+
+ no strict 'refs';
+ if ( exists $INC{"$class.pm"} and not %{"$class\::"} and $] >= 5.008) {
+ # file but no package
+ require Carp;
+ Carp::croak( "$class defines neither package nor VERSION"
+ ."--version check failed");
+ }
+
+ my $version = eval "\$$class\::VERSION";
+ if ( defined $version ) {
+ local $^W if $] <= 5.008;
+ $version = version::vpp->new($version);
+ }
+
+ if ( defined $req ) {
+ unless ( defined $version ) {
+ require Carp;
+ my $msg = $] < 5.006
+ ? "$class version $req required--this is only version "
+ : "$class does not define \$$class\::VERSION"
+ ."--version check failed";
+
+ if ( $ENV{VERSION_DEBUG} ) {
+ Carp::confess($msg);
+ }
+ else {
+ Carp::croak($msg);
+ }
+ }
+
+ $req = version::vpp->new($req);
+
+ if ( $req > $version ) {
+ require Carp;
+ if ( $req->is_qv ) {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->normal, $version->normal)
+ );
+ }
+ else {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->stringify, $version->stringify)
+ );
+ }
+ }
+ }
+
+ return defined $version ? $version->stringify : undef;
+ }
+
+ 1; #this line is important and will help the module return a true value
+X86_64-LINUX-GNU-THREAD-MULTI_VERSION_VPP
+
+$fatpacked{"x86_64-linux-gnu-thread-multi/version/vxs.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'X86_64-LINUX-GNU-THREAD-MULTI_VERSION_VXS';
+ #!perl -w
+ package version::vxs;
+
+ use v5.10;
+ use strict;
+
+ use vars qw(@ISA $VERSION $CLASS );
+ $VERSION = 0.9912;
+ $CLASS = 'version::vxs';
+
+ eval {
+ require XSLoader;
+ local $^W; # shut up the 'redefined' warning for UNIVERSAL::VERSION
+ XSLoader::load('version::vxs', $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ local $^W; # shut up the 'redefined' warning for UNIVERSAL::VERSION
+ bootstrap version::vxs $VERSION;
+ };
+
+ # Preloaded methods go here.
+
+ 1;
+X86_64-LINUX-GNU-THREAD-MULTI_VERSION_VXS
+
+s/^ //mg for values %fatpacked;
+
+my $class = 'FatPacked::'.(0+\%fatpacked);
+no strict 'refs';
+*{"${class}::files"} = sub { keys %{$_[0]} };
+
+if ($] < 5.008) {
+ *{"${class}::INC"} = sub {
+ if (my $fat = $_[0]{$_[1]}) {
+ return sub {
+ return 0 unless length $fat;
+ $fat =~ s/^([^\n]*\n?)//;
+ $_ = $1;
+ return 1;
+ };
+ }
+ return;
+ };
+}
+
+else {
+ *{"${class}::INC"} = sub {
+ if (my $fat = $_[0]{$_[1]}) {
+ open my $fh, '<', \$fat
+ or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
+ return $fh;
+ }
+ return;
+ };
+}
+
+unshift @INC, bless \%fatpacked, $class;
+ } # END OF FATPACK CODE
+
+use strict;
+use 5.008001;
+use Carton::CLI;
+$Carton::Fatpacked = 1;
+exit Carton::CLI->new->run(@ARGV);
diff --git a/web/cobrands/barnet/_colours.scss b/web/cobrands/barnet/_colours.scss
index 2a00dab90..c92249eed 100644
--- a/web/cobrands/barnet/_colours.scss
+++ b/web/cobrands/barnet/_colours.scss
@@ -1,5 +1,7 @@
/* COLOURS */
+$menu-image: 'menu-black';
+
$primary: #E9E9EA;
$primary_b: #000000;
$primary_text: #3E3D44;
diff --git a/web/cobrands/barnet/base.scss b/web/cobrands/barnet/base.scss
index aff4a1e6c..73d5708c7 100644
--- a/web/cobrands/barnet/base.scss
+++ b/web/cobrands/barnet/base.scss
@@ -23,10 +23,6 @@
top: 0.6em;
left: 0.5em;
}
-#nav-link {
- background-image: url(/cobrands/fixmystreet/images/menu-black.png);
- background-image: url(/cobrands/fixmystreet/images/menu-black.svg), none;
-}
#front-main #postcodeForm div input#sub,
.green-btn,
diff --git a/web/cobrands/barnet/layout.scss b/web/cobrands/barnet/layout.scss
index a80a1958e..d9f7bf4e6 100644
--- a/web/cobrands/barnet/layout.scss
+++ b/web/cobrands/barnet/layout.scss
@@ -97,7 +97,7 @@ body.twothirdswidthpage {
.frontpage .content {
margin: 0;
}
-.ie6, .ie7, .ie8 {
+.iel8 {
.frontpage .content {
border: none;
}
diff --git a/web/cobrands/bromley/_colours.scss b/web/cobrands/bromley/_colours.scss
index 5627929a0..e4686b97c 100644
--- a/web/cobrands/bromley/_colours.scss
+++ b/web/cobrands/bromley/_colours.scss
@@ -1,16 +1,19 @@
/* COLOURS */
+$menu-image: 'menu-black';
+
$bromley_blue: rgb(91,120,147);
+$bromley_green: #235e1c;
+$bromley_dark_green: #505050;
$primary: $bromley_blue;
-$primary_b: #000000;
-$primary_text: #ffffff;
+$primary_b: #ffffff;
+$primary_text: #000000;
-$base_bg: #9b9b9b url('https://www.bromley.gov.uk/site/styles/css_img/repeater.gif') repeat-x;
+$base_bg: #f4f4f4;
$base_fg: #1a1a1a;
-/* Unused here */
-$map_nav_bg: #222;
+$map_nav_bg: #f4f4f4;
$nav_fg: #fff;
$nav_fg_hover: #444;
diff --git a/web/cobrands/bromley/_fonts.scss b/web/cobrands/bromley/_fonts.scss
new file mode 100644
index 000000000..ca0b89983
--- /dev/null
+++ b/web/cobrands/bromley/_fonts.scss
@@ -0,0 +1,10 @@
+@font-face {
+ font-family: 'FontAwesome';
+ src: url("fonts/fontawesome-webfont.eot?v=4.0.3");
+ src: url("fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"), url("fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"), url("fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"), url("fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+$body-font: Arial,'Helvetica Neue',Helvetica,sans-serif;
+$meta-font: $body-font;
+$heading-font: 'Gill Sans condensed', 'Gill Sans','Trebuchet MS',Calibri,sans-serif; \ No newline at end of file
diff --git a/web/cobrands/bromley/a-z-nav.js b/web/cobrands/bromley/a-z-nav.js
new file mode 100644
index 000000000..75d984efa
--- /dev/null
+++ b/web/cobrands/bromley/a-z-nav.js
@@ -0,0 +1,22 @@
+(function($){
+ $(function(){
+ // TOGGLE MENU
+ // Hides the items by default.
+ $('.custom-side-nav > ul > li > ul').hide();
+
+ // Stops the toggle links going off to their actual link. Make the links actual links though for non js users.
+ $('.custom-side-nav > ul > li > a').click(function(e) {
+ e.preventDefault();
+ // When an item is clicked this checks to see if any other items are down and strips the class of active and toggles them up.
+ if( !$(this).hasClass('active') ) {
+ $('.custom-side-nav > ul > li > a.active').removeClass('active')
+ .next('ul')
+ .slideUp(300);
+ }
+ // This toggles a class of 'active' on the item in question and toggles the unordered list below it when it is clicked.
+ $(this).toggleClass('active')
+ .next('ul')
+ .slideToggle(300);
+ });
+ });
+})(window.jQuery); \ No newline at end of file
diff --git a/web/cobrands/bromley/base.scss b/web/cobrands/bromley/base.scss
index 9b1e787df..418958ab1 100644
--- a/web/cobrands/bromley/base.scss
+++ b/web/cobrands/bromley/base.scss
@@ -1,60 +1,491 @@
@import "../sass/h5bp";
@import "./_colours";
+@import "./_fonts";
@import "../sass/mixins";
@import "compass";
@import "../sass/base";
-a, a:visited {
- color: #369;
- &:hover, &:active {
- color: #369;
- }
+// Override the site logo
+#site-logo{
+ display: block;
+ width: 80px;
+ height: 44px;
+ top: 0.4em;
+ left: 0.5em;
+ background: url('/cobrands/bromley/bromley-logo.s.png') 0 0 no-repeat;
+ text-indent: -999999px;
+ position: absolute;
+ z-index:2;
}
-
-h1.main {
- color: $primary;
- text-align: center;
- margin: 0.5em 0;
+// Override in IE too
+.ie6 #site-logo {
+ background: url('/cobrands/bromley/bromley-logo.s.png') 0 0 no-repeat;
}
-// Want a white header, and logo is slightly bigger
+// Change the colour and size of the site header to suit
#site-header {
- @include background(linear-gradient(#ddd, #fff 10%, #fff));
- height: 4em;
+ background: $base_bg;
+}
+// We don't want a fixed height header on any page except the map page because
+// it includes lots of other stuff there, including a dynamic drop-down menu
+// that changes height
+body.fullwidthpage,
+body.twothirdswidthpage {
+ #site-header {
+ height: auto;
+ }
}
-// Colour tab to match colour scheme
-#nav-link {
- height: 4em; // to match #site-header
- background-image: url(/cobrands/fixmystreet/images/menu-black.png);
- background-image: url(/cobrands/fixmystreet/images/menu-black.svg), none;
+// On the map page, we need slightly more space for our logo
+body.mappage {
+ #site-header {
+ height: 3.5em;
+ }
}
-// Change logo to logo of council
-#site-logo {
+// Reset form placeholders so that they match Bromley's
+// input placeholders, these need to be on separate lines as if the browser
+// can't understand a selector it will invalidate the whole line.
+::-webkit-input-placeholder {
+ color: #999;
+ font: {
+ style:normal;
+ size:0.9375em;
+ }
+}
+:-moz-placeholder {
+ color: #999;
+ font: {
+ style:normal;
+ size:0.9375em;
+ }
+}
+:-ms-placeholder {
+ color: #999;
+ font: {
+ style:normal;
+ size:0.9375em;
+ }
+}
+//this only gets used when the browser doesn't support @placeholder
+.placeholder {
+ color: #999;
+ font: {
+ style:normal;
+ size:0.9375em;
+ }
+}
+
+// Reset body line height on front page
+body.frontpage.fullwidthpage {
+ line-height: normal;
+}
+
+.bromley-header {
+ // These are from Bromley's styles, applied here because it's the closest
+ // analog to their site header.
+ padding: 0 10px;
+ padding-top: 1em;
+}
+
+// Add a border to this to approximate Bromley's border between the breadcrumb
+// and A-Z menu
+.main-menu-container {
+ border-top: 1px solid #e2e2e2;
+}
+
+// Override the links to match Bromley's
+a {
+ text-decoration:none;
+ color: $bromley_green;
+ opacity: 1;
+}
+a:hover {
+ opacity: 0.8;
+ text-decoration:underline;
+}
+a:visited,
+a:active {
+ color: $bromley_dark_green;
+}
+
+// The map page header looks a bit high for some reason
+.big-green-banner {
+ top: 0;
+}
+
+// Override some of FMS's button styling so that Bromley's styles don't break
+// form submit buttons
+.form-txt-submit-box input[type=submit] {
+ height:2.4em;
+ padding-top:0.15em;
+ margin-top:0;
+}
+
+// Darken the "key tools" links because we've darkened our background and as a
+// result they have very little contrast
+.shadow-wrap ul#key-tools li a,
+.shadow-wrap ul#key-tools li input[type=submit] {
+ background-color: darken(#f5f5f5, 10%);
+}
+
+.item-list--reports__item a {
+ line-height: 2;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Bromley's Mobile-First styles
+//////////////////////////////////////////////////////////////////////////////
+
+body {
+ font-size: 15px;
+ font-weight: 300;
+}
+
+h1,h2,h3,h4,h5 {
+ font-family:$heading-font;
+}
+
+// Bromley's styles for the .top-links nav
+.top-links {
+ margin-top: 44px; // Needed to push it below FMS' mobile menu bar
display: block;
- width: 80px;
- height: 44px;
- top: 0.9em;
- background: url('/cobrands/bromley/bromley-logo.s.jpg') 0 0 no-repeat;
+ width: 100%;
+ text-align: center;
+ margin-bottom:13px;
+ li {
+ display: inline-block;
+ padding: 0 10px;
+ font-size: 0.9em;
+ list-style-type: none;
+ a {
+ font-family: "Helvetica", sans-serif;
+ color: #235e1c;
+ opacity: 1;
+ transition: opacity .25s ease-in-out;
+ -moz-transition: opacity .25s ease-in-out;
+ -webkit-transition: opacity .25s ease-in-out;
+ }
+ }
+ .fa {
+ color: #235e1c;
+ opacity: 0.5;
+ }
}
-#problems-nav {
- border-bottom:0.25em solid $primary;
- ul li a {
- text-transform: none;
- &.active {
- background: $primary;
- color: #fff;
- }
+// Bromley's icons
+.fa {
+ padding-right: 5px;
+ display: inline-block;
+ font-family: FontAwesome;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+.fa-user:before {
+ content: "\f007";
+}
+.fa-home:before {
+ content: "\f015";
+}
+
+// Bromley's site search
+.main-search {
+ margin: 1em 0;
+ text-align: center;
+ .main-search-input {
+ border-radius: 5px 0 0 5px;
+ border-right: 0px;
+ padding: 7px 2%;
+ font-size: 0.9em;
+ font-weight: 300;
+ width: 74%;
+ text-align: left;
+
+ // Undo some FMS' specific styling that breaks Bromley's look and feel
+ display: inline-block;
+ box-sizing: content-box;
+
+ }
+ .button__primary {
+ height: 42px;
+ line-height: 0;
+ padding: 1.3em 1em;
+ border: 1px solid #647890;
+ width: 20%;
+ opacity: 1;
+ transition: opacity .25s ease-in-out;
+ -moz-transition: opacity .25s ease-in-out;
+ -webkit-transition: opacity .25s ease-in-out;
+ background: #647890 url("search-icon.png") no-repeat center center !important;
+ text-indent: -10000px;
+ border-radius: 0 5px 5px 0;
+ margin-left: -3px;
+ }
+}
+
+// Bromley's field definitions, with extra tag-level selectors to override
+// FMS' input[type=text]
+input.field, input.text,
+.field, .text, .xfields {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #e7e7e7;
+ padding: 0 6px;
+ line-height: 2em;
+ height: 2em;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ color: #000;
+ width: 100%;
+ max-width: 100%;
+ font-family: Arial,'Helvetica Neue',Helvetica,sans-serif;
+}
+
+// Bromley's button definitions
+.button__primary, .button, input[type=submit], .doc-main-content .byEditor .basketitem a.button {
+ background: #647890;
+ color: white;
+ border: none;
+}
+.button, input[type=submit] {
+ border-style: solid;
+ border-width: 1px;
+ display: inline-block;
+ text-decoration: none;
+ font-weight: 400;
+ cursor: pointer;
+ font-size: 1em;
+ line-height: 2em;
+ height: 2em;
+ padding: 0 1em;
+ margin: 0.5em 0;
+ opacity: 1;
+ transition: opacity .25s ease-in-out;
+ -moz-transition: opacity .25s ease-in-out;
+ -webkit-transition: opacity .25s ease-in-out;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+
+// Bromley's silly A-Z menu
+.a-z-container {
+ margin-bottom: 15px;
+ padding: 0 10px;
+}
+.main-a-z {
+ padding: 10px 5px;
+ margin: 0 auto;
+ width: 100%;
+ max-width: 1200px;
+ clear: both;
+ min-height: 10px;
+ overflow: hidden;
+ background: #647890;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+
+ ul {
+ padding-left: 0px;
+ text-align: center;
+ margin: 0;
+
+ li {
+ display: inline-block;
+ padding: 0 15px;
+ color: #e0e9f3;
+ text-align: center;
+ margin: 4px 0;
+
+ a {
+ color: #FFF;
+ opacity: 1;
+ text-transform: uppercase;
+ transition: opacity .25s ease-in-out;
+ -moz-transition: opacity .25s ease-in-out;
+ -webkit-transition: opacity .25s ease-in-out;
+ }
}
+ }
+
+ .nav-hover-item {
+ margin: 0;
+ overflow: auto;
+ float: left;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+}
+.main-a-z ul > li > a {
+ text-transform: capitalize;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ .main-a-z ul li {
+ padding: 0 14px;
+ }
+}
+.drop-down-nav {
+ list-style-type: none;
+}
+.drop-down-nav > li {
+ margin-left: 0!important;
+ border-bottom: none!important;
}
-.big-green-banner {
- text-transform: none;
+// Fix the A-Z menu in IE 6/7
+.ie6, .ie7 {
+ .main-a-z ul li {
+ display:block;
+ float:left;
+ }
+}
+
+// Bromley's breadcrumb
+.breadcrumb {
+ width: 100%;
+ margin-bottom: 15px;
+
+ // Approximate Bromley's top border despite this being in a different
+ // location than on their site
+ border-top: 1px solid #fff;
+ padding-top: 15px;
+
+ ul {
+ list-style: none;
+ padding: 10px;
+ margin-top: 0;
+ background: #cccccc;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ font-size: 0.8em;
+
+ // Override FMS' default list styles
+ margin-left: 0;
+ margin-bottom: 1em;
+
+ li {
+ list-style: none;
+ display: inline;
+ &:before {
+ content: '|';
+ padding: 0 5px;
+ }
+ &:first-child:before {
+ display: none;
+ }
+ }
+ .current {
+ font-weight: 700;
+ color: #235E1C;
+ }
+ }
+}
+
+// Hide things in the header on the map page, because the header is small
+body.mappage {
+ .main-search,
+ .breadcrumb,
+ .a-z-container,
+ .linear-links {
+ display: none;
+ }
}
-#form_sign_in {
- margin-top: 1em;
+// Bromley's footer
+.site-footer {
+ width: 100%;
+ clear: both;
+ margin: 0;
+ min-height: 210px;
+ overflow: hidden;
+ // Add more margin to push this down from FMS's footer
+ margin-top: 2em;
+ .footer-container {
+ width: 100%;
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 10px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ .column {
+ width: 100% !important;
+ margin-right: 0;
+ margin-left: 0 !important;
+ float: none;
+ clear: both;
+ &:last-child {
+ margin-right:0;
+ }
+
+ }
+ }
+ .additional-links {
+ h5 {
+ background-color: #cecab7;
+ padding: 0.5em 1em;
+ margin: 0;
+ font-size: 1em;
+ font-weight: 400;
+ color: #505050;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ }
+ ul {
+ padding-left: 0px;
+ // Undo FMS' left margin for uls
+ margin-left: 0;
+ // Override top/bottom margins to match Bromley's default ul styling
+ margin-top: 1em;
+ margin-bottom: 1em;
+ li {
+ padding-left: 1em;
+ width: 80%;
+ display: inline-block;
+ // Remove the bottom margin FMS puts on
+ margin-bottom: 0;
+ a {
+ font-size: 0.9em;
+ }
+ }
+ }
+ }
+ .copyright {
+ font-size: 0.8em;
+ background: #dad7c9;
+ color: #505050;
+ padding: 0.3em 1em;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .social {
+ ul {
+ li {
+ width: auto;
+ padding: 0 0 0 1em;
+ img {
+ max-width: 36px;
+ }
+ }
+ }
+ }
}
diff --git a/web/cobrands/bromley/bromley-logo.jpg b/web/cobrands/bromley/bromley-logo.jpg
deleted file mode 100644
index 28da8b7ea..000000000
--- a/web/cobrands/bromley/bromley-logo.jpg
+++ /dev/null
Binary files differ
diff --git a/web/cobrands/bromley/bromley-logo.png b/web/cobrands/bromley/bromley-logo.png
new file mode 100644
index 000000000..8010930d0
--- /dev/null
+++ b/web/cobrands/bromley/bromley-logo.png
Binary files differ
diff --git a/web/cobrands/bromley/bromley-logo.s.jpg b/web/cobrands/bromley/bromley-logo.s.jpg
deleted file mode 100644
index 16f632848..000000000
--- a/web/cobrands/bromley/bromley-logo.s.jpg
+++ /dev/null
Binary files differ
diff --git a/web/cobrands/bromley/bromley-logo.s.png b/web/cobrands/bromley/bromley-logo.s.png
new file mode 100644
index 000000000..7e27c6a02
--- /dev/null
+++ b/web/cobrands/bromley/bromley-logo.s.png
Binary files differ
diff --git a/web/cobrands/bromley/bromley.scss b/web/cobrands/bromley/bromley.scss
deleted file mode 100644
index eee4359de..000000000
--- a/web/cobrands/bromley/bromley.scss
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Parts of Bromley's main CSS needed for its header/footer and adjusted (see
- * bottom) to not be affected by main FixMyStreet CSS. Not very sustainable;
- * perhaps we should wrap all council CSS within a SCSS #council ID? Hmm.
- */
-
-@import "compass";
-
-// Bits of Bromley's forms.css, adjusted
-input[type=text],
-input[type=password],
-input[type=email],
-input[type=file],
-textarea,
-select { background: #fff; border: 1px solid #768b9a; border-color: #768b9a #d1dee8 #d1dee8 #768b9a; color: #333; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; padding: 8px;
-@include border-radius(0); }
-
-.green-btn, button.green-btn, input.green-btn {
- background: #5b7189 url("https://www.bromley.gov.uk/site/styles/css_img/button.gif") repeat-x 0 -1px; border: 1px solid #8e9eb0; color: #fff; font-family: 'Gill Sans', 'Trebuchet MS', Calibri, sans-serif; font-weight: normal; margin: 0; min-height: 23px; outline: 1px solid #405062; padding: 4px 8px; text-transform: uppercase; }
-.green-btn:hover, button.green-btn:hover, input.green-btn:hover { background: #5b7189; border: 1px solid #8e9eb0; }
-.form-txt-submit-box input[type=submit] {
- padding-top: 0; padding-bottom: 0; width: auto;
-}
-
-
-h1, h2, h3, h4, h5, h6, legend { font-family: 'Gill Sans', 'Trebuchet MS', Calibri, sans-serif; }
-body { color: #333; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; line-height: 1.4; }
-
-// #header renamed to #bromley-header
-#bromley-header { padding: 0 18px 0 25px; }
-
-.header-nav {float:right; background:url('https://www.bromley.gov.uk/site/styles/css_img/header-nav.gif') no-repeat; overflow:hidden; width:651px; height:34px; line-height:34px; padding:0 20px;}
-.header-nav li {float:left; width:130px; text-align:center; background:url('https://www.bromley.gov.uk/site/styles/css_img/header-nav-divider.gif') top right no-repeat;}
-.header-nav li:last-child {background:none;}
-.header-nav a:link, .header-nav a:visited {color:#fff; text-decoration:none;}
-.header-nav a:hover, .header-nav a:active {text-decoration:underline;}
-
-/* -------- For Google translate select box only */
-.header-nav div#google_translate_element .goog-te-gadget { font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; }
-.header-nav div#google_translate_element .goog-te-gadget .goog-te-combo { margin:5px 0 0 5px; padding:0 0 0 2px; background: #9b9b9b; color: #fff; border: 1px solid #606060; font-size: 12px; width: 138px;}
-.header-nav div#google_translate_element .goog-te-gadget .goog-te-combo option { background:#fff; color: #666; padding: 1px 0; margin: 0; }
-/* --- */
-
-.logo {padding:10px 0;}
-
-.sign-in {float:right; margin-top:-87px; width: 650px; text-align: right;}
-.sign-in a:link, .sign-in a:visited {color:#333; font-weight:bold; text-decoration:none;}
-.sign-in a:hover, .sign-in a:active {text-decoration:underline;}
-
-.main-menu {background:url('https://www.bromley.gov.uk/site/styles/css_img/main-menu.gif') no-repeat; width:689px; height:45px; margin-top:-60px; float:right; clear:right;}
-.main-menu li {float:left; width:126px; padding-right:2px; text-align:center; font:150%/45px 'Gill Sans', 'Trebuchet MS', Calibri, sans-serif;}
-.main-menu li a:link, .main-menu li a:visited {color:#fff; display:block; text-decoration:none;}
-.main-menu li a:hover, .main-menu li a:active {background:url('https://www.bromley.gov.uk/site/styles/css_img/main-menu-hover.gif') repeat-x;}
-.main-menu li.home a:hover, .main-menu li.home a:active {background:url('https://www.bromley.gov.uk/site/styles/css_img/main-menu-hover-home.gif') repeat-x;}
-
-//#search { float: right; padding: 10px 17px; width: 270px; }
-//#search label {display:none;}
-//#search input { background: #ececec; border: 1px solid #768b9a; border-color: #768b9a #d1dee8 #d1dee8 #768b9a; line-height: 9px; padding: 6px 5px 4px; width: 184px; }
-//#search input.button { background: #fff; border: 1px solid #8596a8; color: #333; font-family: 'Gill Sans', 'Trebuchet MS', Calibri, sans-serif; font-size:133%; height: 27px; line-height: 27px; padding: 0; vertical-align: top; width: 70px; }
-
-// #footer renamed to #bromley-footer, fixed font size.
-#bromley-footer { background: #666 url('https://www.bromley.gov.uk/site/styles/css_img/footer.gif') top center no-repeat; clear: both; width:100%; padding:30px 15px 50px; margin-left:-15px; color:#fff; font-size:92%;}
-#bromley-footer a:link,
-#bromley-footer a:visited { color: #fff; text-decoration: none; }
-#bromley-footer a:hover,
-#bromley-footer a:active { text-decoration: underline;}
-#bromley-footer img { float: right; margin-top: -18px; }
-#bromley-footer .footer-nav { float: right; height:35px; margin-top: -15px; }
-#bromley-footer .footer-nav li { border-right:1px solid #fff; float: left; line-height: 1; padding: 0 20px; }
-#bromley-footer .footer-nav li:last-child { border: none; }
-
-// Bromley IE specific CSS
-.ie6 {
- div { zoom: 1; }
- #bromley-wrapper { padding: 0; }
- #bromley-footer { margin: 0; }
- //#search input { padding: 8px 5px 2px; }
- //#search input.button { padding: 0; width: 68px; line-height: 24px; }
- input.button { overflow: visible; width: 1%; }
-}
-.ie7 {
- div { zoom: 1; }
- //#search input { padding: 8px 5px 2px; }
- //#search input.button { padding: 0; width: 68px; line-height: 24px; }
- input.button { overflow: visible; }
-}
-.ie8 {
- //#search input { padding: 8px 5px 2px; }
- //#search input.button { padding: 0; line-height: 24px; }
-}
-
-// mySociety additions
-#bromley-header { font-size: 12px; }
-.header-nav ul { margin: 0; }
-.header-nav li { list-style-type: none; }
-// Width is actually 637, but that causes wrap-around, need to ask for fixes and corner image
-.main-menu { background: url('/cobrands/bromley/main-menu1.gif') no-repeat; width: 638px; }
-.main-menu ul { margin: 0; }
-.main-menu li { list-style-type: none; color: #ccf; }
-.main-menu li.last { padding-right: 0; }
-.main-menu li.last a:hover, .main-menu li.last a:active {background:url('/cobrands/bromley/main-menu-hover-home-right.gif') repeat-x;}
-//#search input { display: inline; margin: 0; @include border-radius(0em); }
-//#search input.button { font-weight: normal; text-transform: none; }
-#bromley-footer { padding-bottom: 60px; }
-#bromley-footer .footer-nav li { list-style-type: none; }
-#bromley-footer p { margin: 0; }
-
-#bromley-powered-by {
- clear: both;
-}
-
-.issue-list-a li .text small {
- display: inline;
-}
diff --git a/web/cobrands/bromley/facebook.png b/web/cobrands/bromley/facebook.png
new file mode 100644
index 000000000..8e26138ea
--- /dev/null
+++ b/web/cobrands/bromley/facebook.png
Binary files differ
diff --git a/web/cobrands/bromley/flickr.png b/web/cobrands/bromley/flickr.png
new file mode 100644
index 000000000..c95704738
--- /dev/null
+++ b/web/cobrands/bromley/flickr.png
Binary files differ
diff --git a/web/cobrands/bromley/fonts/fontawesome-webfont.eot b/web/cobrands/bromley/fonts/fontawesome-webfont.eot
new file mode 100644
index 000000000..7c79c6a6b
--- /dev/null
+++ b/web/cobrands/bromley/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/web/cobrands/bromley/fonts/fontawesome-webfont.svg b/web/cobrands/bromley/fonts/fontawesome-webfont.svg
new file mode 100644
index 000000000..cfe75c3f7
--- /dev/null
+++ b/web/cobrands/bromley/fonts/fontawesome-webfont.svg
@@ -0,0 +1,414 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
+<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="1792" />
+<glyph unicode="&#xf198;" horiz-adv-x="1792" />
+<glyph unicode="&#xf199;" horiz-adv-x="1792" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" />
+<glyph unicode="&#xf19c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf19d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf19e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/web/cobrands/bromley/fonts/fontawesome-webfont.ttf b/web/cobrands/bromley/fonts/fontawesome-webfont.ttf
new file mode 100644
index 000000000..e89738de5
--- /dev/null
+++ b/web/cobrands/bromley/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/web/cobrands/bromley/fonts/fontawesome-webfont.woff b/web/cobrands/bromley/fonts/fontawesome-webfont.woff
new file mode 100644
index 000000000..8c1748aab
--- /dev/null
+++ b/web/cobrands/bromley/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/web/cobrands/bromley/layout.scss b/web/cobrands/bromley/layout.scss
index 8343cd040..0297f08c3 100644
--- a/web/cobrands/bromley/layout.scss
+++ b/web/cobrands/bromley/layout.scss
@@ -1,135 +1,248 @@
@import "_colours";
@import "../sass/layout";
+@import "../sass/report_list_pins";
-#bromley-wrapper { background: #fff url('https://www.bromley.gov.uk/site/styles/css_img/header-corners.gif') center 110px no-repeat; margin: 1px auto 0; padding: 0 15px; width: 955px;}
-.offline #bromley-wrapper { padding: 0 15px 20px; }
-
-// So that map appears underneath the header
-.wrapper {
- position: relative;
-}
-.ie6, .ie7 {
- .wrapper {
- padding-top: 1em;
- }
-}
-
-// To prevent font size larger interfering with the fixed Bromley layout
-.container { width: auto; }
-.full-width { width: 464px; }
-.shadow-wrap { width: 464px; }
-#map_box { width: 464px; }
-.content { width: 432px; }
-body.fullwidthpage .content { width: auto; }
-body.twothirdswidthpage .content {
- width: 640px;
- aside {
- left: 672px;
- width: 208px;
- padding: 16px;
+// Alter the logo and the header on every page *but* the map page. On the map
+// page it stays small like in base.css
+body.fullwidthpage,
+body.twothirdswidthpage {
+ #site-header {
+ // Increase the height of the site-header to suit the taller logo image
+ height: auto;
+ }
+ // Override the logo
+ #site-logo {
+ width: 159px;
+ height: 114px;
+ background: url(/cobrands/bromley/bromley-logo.png) 0 0 no-repeat;
+ }
+}
+
+// On the map page, we want the header to be much smaller, otherwise it pushes
+// the sidebar down too much
+body.mappage {
+ #site-header {
+ height: 5em;
+ }
+}
+
+// We have to specify this again for IE, since FMS overrides it
+.iel8 {
+ body.fullwidthpage,
+ body.twothirdswidthpage {
+ #site-header {
+ // Increase the height of the site-header to suit the taller logo image
+ height: auto;
}
- .sticky-sidebar {
- left: 672px;
- aside {
- top:7em;
- }
+ #site-logo {
+ width: 159px;
+ height: 114px;
}
+ }
}
-.ie6, .ie7 {
- body.mappage .container {
- width: 464px;
- margin-left: 0;
- }
+.ie6 body.frontpage #site-logo {
+ background:url(/cobrands/bromley/bromley-logo.png) 0 0 no-repeat;
}
-#front-main {
- @include border-radius(1em 1em 0 0);
- margin: 2em 1em 0;
- padding-top: 0;
+// Override the container width to match Bromley' site, which is wider
+.container {
+ width: 100%;
+ max-width: 1200px;
}
-// Don't want gap that normal site has
-body.frontpage {
- .table-cell {
- .content {
- margin-top: 0;
- }
- }
+// Override the FMS main menu to give it a background colour
+.nav-menu--main {
+ background-color: $bromley_blue;
}
-
-// Don't want FixMyStreet logo on desktop, and we have a skip to content in
-// Bromley header
-#site-header {
- display: none;
+.nav-menu--main span {
+ color: $nav_fg;
+ background-color: $nav_fg_hover;
}
-#user-meta {
- display: none;
+// Fix bad margin on local alerts form
+body.alertindex form.full-width {
+ margin-left: 0;
}
-// Currently hiding, but do want some internal navigation somewhere at the end
-.nav-wrapper {
- display: none;
+// Override the little banner you get when you're logged in on the map page
+// because FMS makes it a different colour and moves it over to the left.
+body.mappage #user-meta p {
+ background-color: $bromley_blue;
+ border-bottom: 1px solid #444;
}
-// White background, so no shadow or margin needed.
-.content {
- margin: 0;
- @include box-shadow(none);
+// And also override the banner on other pages so that it lines up properly
+#user-meta, body.mappage #user-meta {
+ max-width: 1200px;
}
-.ie6, .ie7, .ie8 {
- .content {
- margin: 0;
- border: none;
- }
+#user-meta p,
+body.frontpage #user-meta p {
+ top: 0;
+ right: auto;
+ background-color: $bromley_blue;
+ color: #fff;
+ box-shadow: none;
}
-// As map can scroll and isn't at the top, give it an edge
-#map_box {
- border: solid 1px #999;
- top: 1em;
- right: 0em;
- margin: 0;
-}
-
-// Perhaps fix map location (should be in central?)
-.ie6 #map_box, .ie7 #map_box {
- right: -480px;
-}
-
-.ie7 .big-green-banner {
- right: 0;
+// Because we've moved the user-meta, we also have to move the #front-main div
+// down a bit so that it shows the #user-meta
+#front-main {
+ margin-top:3em
}
-// OpenLayers navigation always top right
-#fms_pan_zoom {
- top: 0.5em !important;
+// The page h1 needs to be white on desktop, because it's in a blue box
+h1.main {
+ color: #fff;
}
-
-// Fix location of aside sidebar
-body.twothirdswidthpage {
- .content {
- aside {
- @include box-shadow(none);
- }
- .sticky-sidebar {
- top: 1em;
- aside {
- position: absolute;
- top: 0;
- }
- }
+
+// We have slightly different content in our lists of issues to what
+// reports_list.scss expects, so we need to add back some padding it removes.
+// This stops the pin icon being underneath the text.
+.item-list__item--with-pin a {
+ padding: 0;
+ padding-left: 3em;
+}
+
+// Because we've changed the page background, the footer looks a bit rubbish
+footer,
+body.twothirdswidthpage .container .content footer .tablewrapper,
+body.fullwidthpage .container .content footer .tablewrapper {
+ background-color: $bromley_blue;
+}
+
+// This is our custom wrapper for Bromley's header elements
+.bromley-header {
+ // Bromley's logo has a bottom margin to space it out from the A-Z nav, we
+ // can't do that because they're in separate divs, so add a margin here
+ // instead.
+ margin-bottom: 20px;
+}
+
+// Center the mobile app buttons
+#footer-mobileapps p,
+#footer-help p {
+ text-align: center;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Bromley desktop styles
+//////////////////////////////////////////////////////////////////////////////
+
+// Bromley's logo is bigger on big screens so that it appears to have some
+// left padding
+#site-logo,
+body.frontpage #site-logo {
+ float: left;
+ width: 239px;
+ clear: left;
+ margin-bottom: 20px;
+ // Bromley uses an image element inside a link, so it can be centered using
+ // text-align. We use a background image, so this approximates that.
+ background-position: 50% 0%;
+}
+
+// Bromley's .top-links section floats to the right on bigger screens
+.top-links {
+ float: right;
+ width: auto;
+}
+
+// Bromley's search form floats to the right too
+.main-search {
+ width: 35%;
+ margin: 10px 0 0 0;
+ float: right;
+ min-width: 287px;
+ clear: right;
+}
+
+// Bromley's A-Z nav gets the background coloured in on bigger screens to
+// appear full-screen
+.a-z-container {
+ background: #647890;
+ padding: 0;
+}
+
+// The link to open the A-Z nav gets hidden on big screens
+.drop-down-nav > li > a {
+ display: none;
+}
+
+// And the rest of the A-Z nav gets show with a horrible !important
+.main-a-z ul li ul {
+ display: block!important;
+}
+
+// Bromley's footer
+.site-footer {
+ // Undo our footer background styling above
+ background-color: #d5d2c3;
+ padding-top: 1em;
+
+ .column {
+ margin-right: 1.66667%;
+ display: block;
+ float: left;
+ .additional-links {
+ float: left;
+ width: 24%;
+ margin-left: 2%;
+ margin-right: 2%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ &:first-child,
+ &:last-child {
+ margin-left: 0%;
+ margin-right: 0%;
+ }
+ li {
+ padding: 0 1em;
+ }
}
-}
-
-// So as not to interfere with the Bromley footer, make the fixed nav static.
-.shadow-wrap {
- position: static;
- padding-top: 0;
- margin-bottom: 1em;
- ul#key-tools {
- border-top: none;
- border-bottom: 1px solid $primary;
+ .footer-list2 {
+ width: 48%;
+ ul {
+ overflow: auto;
+ }
+ }
+ .footer-list2 ul li,
+ .footer-list1 ul li {
+ width: 41%;
+ margin-right: 2%;
+ padding-left: 1em;
+ }
+ .social ul li {
+ padding: 0 0 0 1em;
+ }
+ }
+}
+
+// Fix the footer in Old IE because it doesn't like last-child selectors
+.iel8 {
+ .site-footer {
+ .column {
+ // Old IE won't float the social media links unless we force the width to be
+ // smaller and take a more traditional display/float tack.
+ .social ul li {
+ display: block;
+ width: 36px;
+ float: left;
+ }
+ .additional-links {
+ margin-left: 0%;
+ margin-right: 0%;
+ }
+ .footer-list2 {
+ margin-left: 2%;
+ margin-right: 2%;
+ }
+ .footer-list2 ul li,
+ .footer-list1 ul li {
+ // Old IE needs to know to float these for some reason
+ float: left;
+ }
}
+ }
}
diff --git a/web/cobrands/bromley/main-menu-hover-home-right.gif b/web/cobrands/bromley/main-menu-hover-home-right.gif
deleted file mode 100644
index 80c11c782..000000000
--- a/web/cobrands/bromley/main-menu-hover-home-right.gif
+++ /dev/null
Binary files differ
diff --git a/web/cobrands/bromley/main-menu1.gif b/web/cobrands/bromley/main-menu1.gif
deleted file mode 100644
index 21ab45668..000000000
--- a/web/cobrands/bromley/main-menu1.gif
+++ /dev/null
Binary files differ
diff --git a/web/cobrands/bromley/position_map.js b/web/cobrands/bromley/position_map.js
deleted file mode 100644
index dddef3def..000000000
--- a/web/cobrands/bromley/position_map.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function position_map_box() {
- var $html = $('html');
- var bromley_right;
- if ($html.hasClass('ie6') || $html.hasClass('ie7')) {
- bromley_right = '-480px';
- } else {
- bromley_right = '0em';
- }
- // Do the same as CSS (in case resized from mobile).
- $('#map_box').prependTo('.content').css({
- zIndex: 1, position: 'absolute',
- top: '1em', left: '', right: bromley_right, bottom: '',
- width: '464px', height: '464px',
- margin: 0
- });
-}
-
-function map_fix() {}
-var slide_wards_down = 1;
diff --git a/web/cobrands/bromley/rss.png b/web/cobrands/bromley/rss.png
new file mode 100644
index 000000000..2930386a5
--- /dev/null
+++ b/web/cobrands/bromley/rss.png
Binary files differ
diff --git a/web/cobrands/bromley/search-icon.png b/web/cobrands/bromley/search-icon.png
new file mode 100644
index 000000000..7333ff9b0
--- /dev/null
+++ b/web/cobrands/bromley/search-icon.png
Binary files differ
diff --git a/web/cobrands/bromley/tab-blue.png b/web/cobrands/bromley/tab-blue.png
deleted file mode 100644
index 62e6285b7..000000000
--- a/web/cobrands/bromley/tab-blue.png
+++ /dev/null
Binary files differ
diff --git a/web/cobrands/bromley/twitter.png b/web/cobrands/bromley/twitter.png
new file mode 100644
index 000000000..4a43613b3
--- /dev/null
+++ b/web/cobrands/bromley/twitter.png
Binary files differ
diff --git a/web/cobrands/bromley/youtube.png b/web/cobrands/bromley/youtube.png
new file mode 100644
index 000000000..08c99736b
--- /dev/null
+++ b/web/cobrands/bromley/youtube.png
Binary files differ
diff --git a/web/cobrands/default/_colours.scss b/web/cobrands/default/_colours.scss
index e8c12f98e..5ac6cf8e7 100644
--- a/web/cobrands/default/_colours.scss
+++ b/web/cobrands/default/_colours.scss
@@ -1,3 +1,8 @@
+/* LAYOUT */
+
+// If you are wanting a right-to-left layout, uncomment the following line.
+// $direction: right;
+
/* COLOURS */
$orange: #ff9900;
diff --git a/web/cobrands/eastsussex/base.scss b/web/cobrands/eastsussex/base.scss
index 5a6b5295f..1394d397f 100644
--- a/web/cobrands/eastsussex/base.scss
+++ b/web/cobrands/eastsussex/base.scss
@@ -26,12 +26,10 @@ a, a:visited {
}
}
-.issue-list-a {
- li {
- color:#666;
- a {
- color:#666;
- }
+.item-list--reports__item {
+ color: #666;
+ a {
+ color: #666;
}
}
@@ -49,8 +47,6 @@ h1.main {
position: relative;
background: $primary;
height: 76px;
- border-top-width: 4px;
- margin-top: -4px;
}
#site-header .eastsussex .header {
margin: 0 0 2px;
@@ -59,7 +55,9 @@ h1.main {
margin: 0 0 9px;
}
-.mappage .application-nav, .twothirdswidthpage .application-nav {
+// Make the navigation bar thinner on the map page so that it takes up less
+// room and doesn't push the map too far down.
+.mappage .application-nav {
padding: 4.5px 9px;
}
@@ -120,6 +118,10 @@ h1.main {
#front-main {
margin: 0;
+ // Add some margin to the top of this so that the FMS menu doesn't overlap
+ // it, because we show a menu at the top on East Sussex as well as at the
+ // bottom.
+ margin-top: 5em;
padding: 1em;
#front-main-container {
@@ -182,6 +184,20 @@ body > p {
}
}
+// Add some margin to the top of this so that the FMS menu doesn't overlap
+// it, because we show a menu at the top on East Sussex as well as at the
+// bottom.
+.content {
+ margin-top: 5em;
+}
+// Undo that top margin on the map pages, because we don't show the menu there
+// and on the front page, because we've already accounted for it with our
+// margin on #front-main above.
+.mappage .content,
+.frontpage .content {
+ margin-top: 0em;
+}
+
footer {
display: none;
}
@@ -201,7 +217,8 @@ button, input[type=submit], .btn {
/* as per email from Matt Tooke, we are using ESCC's .button-nav
styling, but this doesn't dtrt with span, so adding ourselves */
-.button-nav span {
+.button-nav span,
+.main-menu ul.button-nav li span {
float: left;
display: block;
margin: 5px 2px 5px 0;
@@ -253,3 +270,9 @@ styling, but this doesn't dtrt with span, so adding ourselves */
padding: 2px;
cursor: default;
}
+
+// Stop the big green banner (it's not even green) at the top of map pages
+// overriding the header in the z-index
+.big-green-banner {
+ z-index: auto;
+}
diff --git a/web/cobrands/eastsussex/layout.scss b/web/cobrands/eastsussex/layout.scss
index 9e818f0a5..d90a617f1 100644
--- a/web/cobrands/eastsussex/layout.scss
+++ b/web/cobrands/eastsussex/layout.scss
@@ -9,6 +9,8 @@
.clearfix { *zoom: 1; }
#front-main {
+ // Undo the top margin added in base.scss
+ margin-top: 0;
padding: 0
}
#front-main-container {
@@ -70,12 +72,12 @@ body.mappage {
}
#fms_pan_zoom {
- top: 16em!important;
+ top: 18em!important;
}
#mysociety {
margin-top: 0;
- padding-top: 0;
+ padding-top: 16em;
padding-bottom: 0;
width: auto;
background: transparent;
@@ -101,6 +103,13 @@ body.mappage {
#report-a-problem-sidebar {
top: 1em;
}
+
+ // Keep the headers fixed at the top on the map page
+ #site-header {
+ position: fixed;
+ width: 100%;
+ z-index: 2;
+ }
}
.general-notes, #report-a-problem-sidebar p, #report-a-problem-sidebar .sidebar-notes .plain-list li {
@@ -202,42 +211,6 @@ body.twothirdswidthpage .content aside {
margin-top: 3em; /* required to push "Your Reports" visible on Safari/IE */
}
-#main-nav {
- margin-top: 106px;
- ul {
- margin-left: 157px;
- float: none;
- }
-}
-
-#main-nav ul li {
- text-align: center;
- text-transform: uppercase;
- padding: 0 15px;
- font-size: 16px;
- border-right: solid 1px white;
- line-height: 1.5em;
-}
-
-#main-nav ul li a {
- padding: 0;
- font-size: inherit;
-}
-
-#main-nav ul li:last-child {
- border-right: none;
-}
-
-#main-nav ul li a:link, #main-nav ul li a:visited {
- color: #fff;
-}
-
-#main-nav ul li:hover, #main-nav ul li:hover a, {
- background-color: white;
- color: black;
- text-decoration: none;
-}
-
.main-menu-wrapper {
display: none;
}
@@ -245,11 +218,6 @@ body.twothirdswidthpage .content aside {
@media only screen and (max-width: 61em) {
- #main-nav {
- padding-left: 0px;
- float:none;
- }
-
#site-header {
height: auto;
}
diff --git a/web/cobrands/fixamingata/_colours.scss b/web/cobrands/fixamingata/_colours.scss
index 45138e5a1..a35e3147f 100644
--- a/web/cobrands/fixamingata/_colours.scss
+++ b/web/cobrands/fixamingata/_colours.scss
@@ -1,5 +1,7 @@
/* COLOURS */
+$menu-image: 'menu-black';
+
$primary: #00b1da;
$primary_b: #0087a6;
$primary_text: #222;
diff --git a/web/cobrands/fixamingata/base.scss b/web/cobrands/fixamingata/base.scss
index 01aa46c71..6b8add5d7 100644
--- a/web/cobrands/fixamingata/base.scss
+++ b/web/cobrands/fixamingata/base.scss
@@ -23,10 +23,6 @@ $image-sprite: '/cobrands/fixamingata/images/sprite.png';
margin-left: 10px;
background: url('/cobrands/fixamingata/images/fms-logo.png') no-repeat;
}
-#nav-link {
- background-image: url(/cobrands/fixmystreet/images/menu-black.png);
- background-image: url(/cobrands/fixmystreet/images/menu-black.svg), none;
-}
#report-cta {
font-size: 0.8em;
diff --git a/web/cobrands/fixmindelo/base.scss b/web/cobrands/fixmindelo/base.scss
index 486c66672..9a8ca9021 100644
--- a/web/cobrands/fixmindelo/base.scss
+++ b/web/cobrands/fixmindelo/base.scss
@@ -57,7 +57,7 @@ $image-sprite: 'images/sprite.png';
}
}
-#main-nav ul#mysoc-menu li a#mysoc-logo {
+#mysoc-logo {
background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAAASCAYAAADBnymNAAADAElEQVR42t2XvarWQBCGcwl7CVspFgfTiO0WdjbptdjeJrXV3kFKC4tFRAubra2CvZA7MKVwQALaKAjrG5jF4SU5CR+JyDfw4Mnfmu/J7Mxu9S8j5+xBD3T0wFUnxO3tbQAZDNW1BuR1eT38SWJ7kIX6gneuQQD2f5VqQYkBNMDJvwmYk8TWIjdc8M4BlHCX/ucOWDluQAC1uscCD1pg+dmZhXGdUIvEEk21I74/emhAmtn54bzIaIBV593MjmcMZWoEJVrgynhCTeMZdc3q6RLBALIiitCJznuRF9W5hoRnIZLYBMwOsS3IMz+e3jS/3t4LoFn4MT3gGDnrFrKRYyqy1JgcAYzlgD5Gq0ubEiuIXGICAx0bFshNQ3AiYNI/HAQSzGIt6EH6+ep+B6kZsKCBxuzlXGSBKwISyRpVPxipfPUlw7k30MeYgGGxbZnGJNEuCZNzY7mvklAfYaTpNS1kyWb9mzNVxA60wpCASI51sRM/I+9WormjxnK/SH9nDr2LFks1Mgs91U0W2+pyAIw67njqUoaUCO9cNCCBRUm/vz0wIAlcAswOsSwwgqAoEbaal2R6CQMauvcQsYZrsjq2FcXKlJwgtAVZcAtiPciCU2Ili3eJdXkztsWSSA+iLiWHiKUmNoG4d1GuOy9kWjCCHpiTMtZxxi7g9iy31KxL6u/uaLFckzPwvBRZKAuj/uEvn7wxYAQTsJXE689NAybQr2w4uh1iuRamS9axfJ36hj1ULDWxguGpIyITiFRnOxHrQJ558Sw1Nx+/JhAhNIA8Q01kos4dZOzujuYV+RkhUkNztOLoQL3UxKgkHSqWm1jcWjeurWshtQPx8YcvAVLzzPNP71tITSDQuF7kcgwrYnnty7G+nNtuYp7FehBm6HwQPO3AgmDp/o725Yv7bmJ1/w6hFgwgAcPXSVTL46qsC7yk42tCC+qNse2K+LE6IThbU3WdwcIjZevhUkfekV25VN7o9NXRwbssUFfXHdy0emDOEutBe+2Zys14a/r/AWrug1ElrRIFAAAAAElFTkSuQmCC');
background-position: 20px center;
}
diff --git a/web/cobrands/fixmindelo/layout.scss b/web/cobrands/fixmindelo/layout.scss
index 8dfea7acd..70e65d362 100644
--- a/web/cobrands/fixmindelo/layout.scss
+++ b/web/cobrands/fixmindelo/layout.scss
@@ -15,16 +15,8 @@ body {
}
}
-#main-nav {
- ul {
- &#main-menu {
- li {
- a.report-a-problem-btn {
- color: #fff;
- }
- }
- }
- }
+.nav-menu--main a.report-a-problem-btn {
+ color: #fff;
}
body.frontpage {
@@ -64,7 +56,7 @@ body.admin {
}
}
-#main-nav ul#mysoc-menu li a#mysoc-logo {
+#mysoc-logo {
background-position: 6px 10px;
}
diff --git a/web/cobrands/fixmybarangay/base.scss b/web/cobrands/fixmybarangay/base.scss
index 81cf4785d..2f3fddaf3 100644
--- a/web/cobrands/fixmybarangay/base.scss
+++ b/web/cobrands/fixmybarangay/base.scss
@@ -26,7 +26,7 @@ input.yellow-btn{
}
}
-#main-nav ul#main-menu li a.report-a-problem-btn:hover {
+.nav-menu--main a.report-a-problem-btn:hover {
background: #fff;
}
diff --git a/web/cobrands/fixmybarangay/layout.scss b/web/cobrands/fixmybarangay/layout.scss
index 4a662754d..defe1afd0 100644
--- a/web/cobrands/fixmybarangay/layout.scss
+++ b/web/cobrands/fixmybarangay/layout.scss
@@ -44,7 +44,7 @@ body.mappage .nav-wrapper div.nav-wrapper-2 {
border-bottom: 2px solid #333;
}
-#main-nav ul#mysoc-menu li a#mysoc-logo {
+#mysoc-logo {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIkAAAAyCAMAAABf9whNAAAA0lBMVEUAAABAQEBAQEBAQEBNTU1NTU1AQEBNTU1AQEBAQEBAQEBAQEBAQEBAQEBAQEBNTU1NTU1AQEBNTU1AQEBNTU1AQEBAQEBNTU2Mxj9NTU33kx5NTU1NTU1NTU3tHCRmLZEpq+JNTU2TJ4/tHCSTJ4/87iEpq+L3kx5NTU387iH87iHtHCSTJ4/3kx51K5CTJ49mLZGMxj/tHCSx0zVmLZH6wSBmLZFmLZFDdb/zYCFbuZGMxj/3kx5AQEBNTU0pq+LtHCSMxj/3kx787iFmLZGTJ49ns3BGAAAAPXRSTlMAQL+AQIAQECBwMGBQj98gn5/Pr+/vzzC/r79wYI9wv69QcK+vcICfv68QQBAwj0AwMBBggIBQr3BwgEBgSmaQCwAAAflJREFUeF7t1Ndy2zAQhtGfAAX2IpFUseSSOLGd3nt27bT3f6UsQHusRFcKmVxkcGa4wvCG34AQ8V/wPM/zPM8zSaOaxGBHtFpF+IfikqwYO0LmELfiHH/XlLokSBrsiurtPdGkMJJFWFWTSQUZC0RhWMFNRQWuvTw9RS/VOolNEBgAudYpkE5pHqRpEACIZQ4x4RkztxMWd6KWa2DDvFDUBeg9urr6cPAZMIqEDogCmDmJKdwtlbjXOCc1sIRnhyxj0vIMNbeQMUNun5DBOTo6/3oASMhUF6krka3IM1lkikqdGaICMVE2sKSNICkR1sxYyMag5TWQd7bFPH4G8eT8zcOUKIGwJUYuSE7hzoldlZAwM7Dkwg4GQjtmXMtvBZHNiZJ7P+5C3P/2oH9SXyKXo1yJq0sbmmLMkg23h7xCryR1W5L8WqKsmz1BSbqjfNSSiMUGMEB/Bp8ePwdeLF/ZAn1TEssFR1MJIZmyGLUENXNrI8pCK6IMx99fn50tvyyBcuvEKuqKXDcuocgAQ/I7conMGgA5BfD23fvLy4/LT0Ba/v4vphRxR9dnlmIMU4ULO0IgsgPr/rya3H7F4JycoCf3sq0vW5ICiLXO3YtsMC4JqbG3uCFKMSb3nYuwNyLKMK6Q6wj7a7oMY4vwJwwG8TzP8zzP834CEcRJKkEhVogAAAAASUVORK5CYII=");
}
#front-main {
@@ -65,21 +65,17 @@ body.mappage .nav-wrapper div.nav-wrapper-2 {
}
}
-#main-nav {
- ul {
- &#mysoc-menu {
- padding: 1px 0.5em;
- }
- &#main-menu{
- padding: 3px 0;
- }
-
- }
+.nav-menu--mysoc {
+ padding: 1px 0.5em;
+}
+.nav-menu--main {
+ padding: 3px 0;
}
-body.mappage #main-nav ul#main-menu li a,
-body.mappage #main-nav ul#main-menu li span,
-body #main-nav ul#main-menu li a,
-body #main-nav ul#main-menu li span
+
+body.mappage .nav-menu--main a,
+body.mappage .nav-menu--main span,
+.nav-menu--main a,
+.nav-menu--main span
{
color: #fff;
padding: 0.7em;
@@ -88,7 +84,7 @@ body #main-nav ul#main-menu li span
@include box_round(0.35em);
margin-left: 3px;
- &.report-a-problem-btn{
+ &.report-a-problem-btn {
color: #fff;
padding: 0.7em;
background-color: rgba(0,0,0,0);
@@ -99,13 +95,11 @@ body #main-nav ul#main-menu li span
&.fmb-bgy-btn {
color: #fcc921;
}
-
- &:hover{
+ &:hover {
background-color: rgba(0,0,0,0.75);
background-image: none;
}
-
}
diff --git a/web/cobrands/fixmystreet.com/base.scss b/web/cobrands/fixmystreet.com/base.scss
index 485f0ffc2..ecd729364 100644
--- a/web/cobrands/fixmystreet.com/base.scss
+++ b/web/cobrands/fixmystreet.com/base.scss
@@ -6,7 +6,6 @@
@import "../sass/h5bp";
@import "_colours";
-@import "../sass/mixins";
@import "compass";
@import "../sass/base";
@@ -16,9 +15,17 @@
#country_banner {
display: none;
- color: $primary_text; background: $primary;
- p#international_message { margin: auto; padding: 0.5em 2em; max-width: 40em; text-align: center; }
- #message_close { float: right; }
+ color: $primary_text;
+ background: $primary;
+ p#international_message {
+ margin: auto;
+ padding: 0.5em 2em;
+ max-width: 40em;
+ text-align: center;
+ }
+ #message_close {
+ float: $right;
+ }
}
#site-logo {
@@ -56,11 +63,11 @@
padding-top: 0.4em; // extra padding between buttons and previous paragraph
a {
- float: left;
- margin: 1em 0.6em 0 0;
+ float: $left;
+ margin: flip(1em 0.6em 0 0, 1em 0 0 0.6em);
&:last-child {
- margin-right: 0;
+ margin-#{$right}: 0;
}
}
@@ -79,9 +86,9 @@
@include pie-clearfix;
.goodies-preview {
- float: right;
- margin-left: 1em;
- margin-right: -0.5em;
+ float: $right;
+ margin-#{$left}: 1em;
+ margin-#{$right}: -0.5em;
}
}
diff --git a/web/cobrands/fixmystreet.com/layout.scss b/web/cobrands/fixmystreet.com/layout.scss
index 23f3c575d..9e8bb5baf 100644
--- a/web/cobrands/fixmystreet.com/layout.scss
+++ b/web/cobrands/fixmystreet.com/layout.scss
@@ -70,15 +70,13 @@ h3, h4 {
#front-main {
background: $primary url(images/tile-y.jpg);
}
-#main-nav {
- ul#main-menu {
- li {
- a:hover {
- @include background(linear-gradient(#000, #444 10%, #444 95%, #111));
- }
- }
+
+.nav-menu--main {
+ a:hover {
+ @include background(linear-gradient(#000, #444 10%, #444 95%, #111));
}
}
+
.nav-wrapper {
.nav-wrapper-2 {
border-image-source: url(images/tile-y-border.jpg);
@@ -94,16 +92,9 @@ body.mappage {
}
}
-#main-nav {
- ul#mysoc-menu {
- background: #515151;
- margin-top: -4px;
- li a {
- &#mysoc-logo {
- background-position: 0px 15px;
- }
- }
- }
+.nav-menu--mysoc {
+ background: #515151;
+ margin-top: -4px;
}
body.twothirdswidthpage,
@@ -147,13 +138,14 @@ body.fullwidthpage {
}
a#geolocate_link {
font-family: MuseoSans,Helmet,Freesans,sans-serif;
- background: url(images/locate-me.png) no-repeat;
+ background: url(images/locate-me.png) $left 0 no-repeat;
height: 34px;
- padding-left: 24px;
+ padding-#{$left}: 24px;
margin-top: 0.25em;
@media only screen and (min-resolution: 320dpi),
only screen and (-webkit-min-device-pixel-ratio: 2) {
- background: url(images/locate-me@2.png) no-repeat;
+ background-image: url(images/locate-me@2.png);
+ background-size: 22px 34px;
}
}
}
@@ -219,18 +211,12 @@ body.twothirdswidthpage {
margin: 0 auto;
background: $base_bg;
ul {
- list-style: none;
- padding: 0px;
- margin: 0px;
- float:left;
+ @include list-reset-soft;
+ float: $left;
li {
- list-style: none;
display: inline;
- margin: 0px;
- padding: 0px;
- float:left;
- a,
- span {
+ float: $left;
+ a, span {
display: block;
color: $nav_fg;
background: none;
@@ -244,7 +230,7 @@ body.twothirdswidthpage {
display: block;
}
#footer-help-nav {
- float: right;
+ float: $right;
}
}
}
@@ -256,13 +242,13 @@ body.twothirdswidthpage {
.next-steps__step {
font-family: MuseoSans,Helmet,Freesans,sans-serif;
- float: left;
+ float: $left;
width: 33%;
padding: 1.8em;
& + .next-steps__step {
border-top: none;
- border-left: 1px solid #ede8c9;
+ border-#{$left}: 1px solid #ede8c9;
}
h2 {
@@ -316,9 +302,9 @@ body.unresponsive-council {
.unresponsive-council-cta {
margin: 1.5em 0;
max-width: 20em;
- padding-right: 6em;
+ padding-#{$right}: 6em;
background-image: url(images/unresponsive-council-cta-arrow.png);
- background-position: right center;
+ background-position: $right center;
background-repeat: no-repeat;
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
diff --git a/web/cobrands/fixmystreet.com/posters.scss b/web/cobrands/fixmystreet.com/posters.scss
index 8c4f0c1ed..ee8da9d32 100644
--- a/web/cobrands/fixmystreet.com/posters.scss
+++ b/web/cobrands/fixmystreet.com/posters.scss
@@ -1,4 +1,5 @@
@import "_colours";
+@import "../sass/mixins";
body.goodies {
.content {
@@ -23,14 +24,14 @@ body.goodies {
}
.pack-preview {
- float: right;
- margin: 0 0 1em 1em;
+ float: $right;
+ margin: flip(0 0 1em 1em, 0 1em 1em 0);
max-width: 33%;
}
.download-button {
display: inline-block;
- padding: 0.7em 1.2em 0.5em 1.2em;
+ padding: 0.7em 1.2em 0.5em;
font-weight: bold;
line-height: 1em;
background-color: $primary;
@@ -43,19 +44,19 @@ body.goodies {
width: 16px;
height: 16px;
background: transparent url(images/arrow-down-16px-16px.png) 0 0 no-repeat;
- margin-right: 0.5em;
+ margin-#{$right}: 0.5em;
vertical-align: -0.1em;
}
}
.badge-preview {
- float: right;
+ float: $right;
margin-top: -3em;
- margin-left: 1em;
+ margin-#{$left}: 1em;
}
.downloads {
- margin-left: 0;
+ margin-#{$left}: 0;
li {
list-style: none;
@@ -89,7 +90,7 @@ body.goodies {
overflow: auto;
li {
- float: left;
+ float: $left;
width: 50%;
}
@@ -100,7 +101,7 @@ body.goodies {
li:nth-child(even) {
width: 48%;
- float: right;
+ float: $right;
}
}
}
@@ -111,7 +112,7 @@ body.goodies {
.container .content {
// overloaded selector to match default .content styling
width: auto;
- padding: 1.5em 2em 1.5em 16em;
+ padding: flip(1.5em 2em 1.5em 16em, 1.5em 16em 1.5em 2em);
& > :last-child {
margin-bottom: 0;
@@ -120,7 +121,7 @@ body.goodies {
.content {
.sticky-sidebar {
- left: 0;
+ #{$left}: 0;
top: 0;
bottom: 0;
z-index: 1;
diff --git a/web/cobrands/fixmystreet/dashboard.scss b/web/cobrands/fixmystreet/dashboard.scss
index ca862aaa4..fb4fd7a8a 100644
--- a/web/cobrands/fixmystreet/dashboard.scss
+++ b/web/cobrands/fixmystreet/dashboard.scss
@@ -1,3 +1,5 @@
+@import "../sass/_mixins";
+
select {
width: auto;
}
@@ -15,17 +17,18 @@
}
th {
- text-align:left;
+ text-align: $left;
&[scope=col] {
- border-left:1px solid #ccc;
- padding:10px 0 10px 10px;
- font-weight:bold;
+ border-#{$left}: 1px solid #ccc;
+ padding: flip(10px 0 10px 10px, 10px 10px 10px 0);
+ font-weight: bold;
}
&[scope=row] {
- font-weight: normal;text-align:left;
- border-top:1px solid #ddd;
- padding-left:10px;
+ font-weight: normal;
+ text-align: $left;
+ border-top: 1px solid #ddd;
+ padding-#{$left}: 10px;
}
abbr[title] {
@@ -35,9 +38,9 @@
td {
width:10%;
- border-left:1px solid #ccc;
- border-top:1px solid #ddd;
- padding-left:10px;
+ border-#{$left}: 1px solid #ccc;
+ border-top: 1px solid #ddd;
+ padding-#{$left}: 10px;
}
tr.subtotal {
@@ -54,7 +57,7 @@
#reports{
th {
- padding-left: 20px;
+ padding-#{$left}: 20px;
border-bottom: none;
}
date {
@@ -70,7 +73,7 @@
padding:0 1em;
p {
- float:left;
+ float: $left;
padding:0 1em;
width:25%;
font-size:0.75em;
diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js
index f5e6a8926..122488646 100644
--- a/web/cobrands/fixmystreet/fixmystreet.js
+++ b/web/cobrands/fixmystreet/fixmystreet.js
@@ -4,6 +4,13 @@
*/
/*
+ * Find directionality of content
+ */
+function isR2L() {
+ return !!$('html[dir=rtl]').length;
+}
+
+/*
* general height fixing function
*
* elem1: element to check against
@@ -43,29 +50,40 @@ function tabs(elem, indirect) {
$('.tab-nav .active').removeClass('active');
elem.addClass('active');
- //hide / show the right tab
+ //hide / show the correct tab
$('.tab.open').hide().removeClass('open');
$(target).show().addClass('open');
}
}
+/* Geographic functions for faking map centre, as it appears to be offset from
+ where it actually is */
+
+function midpoint_box_excluding_column(col_offset, col_width, box_offset, box_width) {
+ var r2l = isR2L(),
+ diff = r2l ? box_width : (box_offset.left - col_width),
+ q = (col_offset.left - diff) / 2;
+ if ((r2l && q > 0) || (!r2l && q < 0)) {
+ return 0;
+ }
+ return q;
+}
+
+function fixmystreet_midpoint() {
+ var $content = $('.content'), mb = $('#map_box');
+ return midpoint_box_excluding_column($content.offset(), $content.width(), mb.offset(), mb.width());
+}
+
$(function(){
var $html = $('html');
var cobrand = $('meta[name="cobrand"]').attr('content');
- var is_small_map = false;
- if (cobrand === 'bromley') {
- is_small_map = true;
- }
// Deal with switching between mobile and desktop versions on resize
var last_type;
$(window).resize(function(){
- var type = $('#site-header').css('borderTopWidth');
- if (type == '4px') { type = 'mobile'; }
- else if (type == '0px') { type = 'desktop'; }
- else { return; }
+ var type = Modernizr.mq('(min-width: 48em)') || $('html.iel8').length ? 'desktop' : 'mobile';
if (last_type == type) { return; }
if (type == 'mobile') {
$html.addClass('mobile');
@@ -80,9 +98,7 @@ $(function(){
}
if (typeof fixmystreet !== 'undefined' && fixmystreet.page == 'around') {
// Immediately go full screen map if on around page
- if (cobrand != 'bromley') {
- $('#site-header').hide();
- }
+ $('#site-header').hide();
$('#map_box').prependTo('.wrapper').css({
position: 'absolute',
top: 0, left: 0, right: 0, bottom: 0,
@@ -107,19 +123,12 @@ $(function(){
$html.removeClass('mobile');
position_map_box();
if (typeof fixmystreet !== 'undefined') {
- if (is_small_map) {
- //$('#bromley-footer').hide();
- } else {
- fixmystreet.state_map = 'full';
- }
+ fixmystreet.state_map = 'full';
}
if (typeof fixmystreet !== 'undefined' && fixmystreet.page == 'around') {
// Remove full-screen-ness
var banner_text = translation_strings.report_problem_heading;
- if (cobrand == 'bromley') {
- banner_text += '<span>Yellow pins show existing reports</span>';
- }
- if (! is_small_map && cobrand !== 'oxfordshire') {
+ if (cobrand !== 'oxfordshire') {
$('#site-header').show();
banner_text = translation_strings.report_problem_heading;
}
@@ -143,7 +152,7 @@ $(function(){
}
//show/hide notes on mobile
- $('.mobile #report-a-problem-sidebar').after('<a href="#" class="rap-notes-trigger button-right">' + translation_strings.how_to_send + '</a>').hide();
+ $('.mobile #report-a-problem-sidebar').after('<a href="#" class="rap-notes-trigger button-fwd">' + translation_strings.how_to_send + '</a>').hide();
$('.rap-notes-trigger').click(function(e){
e.preventDefault();
//check if we've already moved the notes
@@ -154,7 +163,7 @@ $(function(){
}else{
//if not, move them and show, hiding .content
$('.content').after('<div class="content rap-notes"></div>').hide();
- $('#report-a-problem-sidebar').appendTo('.rap-notes').show().after('<a href="#" class="rap-notes-close button-left">' + translation_strings.back + '</a>');
+ $('#report-a-problem-sidebar').appendTo('.rap-notes').show().after('<a href="#" class="rap-notes-close button-back">' + translation_strings.back + '</a>');
}
$('html, body').scrollTop($('#report-a-problem-sidebar').offset().top);
location.hash = 'rap-notes';
@@ -169,8 +178,7 @@ $(function(){
});
//move 'skip this step' link on mobile
- $('.mobile #skip-this-step').hide();
- $('.mobile #skip-this-step a').addClass('chevron').wrap('<li>').appendTo('#key-tools');
+ $('.mobile #skip-this-step').addClass('chevron').wrap('<li>').parent().appendTo('#key-tools');
/*
* Tabs
@@ -199,6 +207,7 @@ $(function(){
e.preventDefault();
var offset = $('#main-nav').offset().top;
$('html, body').animate({scrollTop:offset}, 1000);
+ window.location.hash = 'main-nav';
});
@@ -301,21 +310,24 @@ $.fn.drawer = function(id, ajax) {
// if ajax, load it with a spinner
if (ajax) {
var href = $this.attr('href') + ';ajax=1';
- $this.prepend(' <img class="spinner" src="/cobrands/fixmystreet/images/spinner-black-333.gif" style="margin-right:2em;">');
+ var margin = isR2L() ? 'margin-left' : 'margin-right';
+ $this.prepend(' <img class="spinner" src="/cobrands/fixmystreet/images/spinner-black-333.gif" style="' + margin + ':2em;">');
innerDiv.load(href, function(){
$('.spinner').remove();
});
}
// Tall drawer - put after .content for scrolling to work okay.
- // position over the top of the main .content in precisely the right location
- d.insertAfter($content).addClass('content').css({
+ // position over the top of the main .content in precisely the correct location
+ var drawer_css = {
position: 'absolute',
zIndex: '1100',
marginTop: $('html.ie6, html.ie7').length ? '-3em' : 0, // IE6/7 otherwise include the 3em padding and stay too low
- left: 0,
top: $(window).height() - $content.offset().top
- }).removeClass('hidden-js').find('h2').css({ marginTop: 0 });
+ };
+ drawer_css[isR2L() ? 'right' : 'left'] = 0;
+ d.insertAfter($content).addClass('content').css(drawer_css)
+ .removeClass('hidden-js').find('h2').css({ marginTop: 0 });
$this.data('setup', true);
}
@@ -356,12 +368,12 @@ $.fn.drawer = function(id, ajax) {
// Go directly to RSS feed if RSS button clicked on alert page
// (due to not wanting around form to submit, though good thing anyway)
- $('.container').on('click', '#alert_rss_button', function(e){
+ $('body').on('click', '#alert_rss_button', function(e){
e.preventDefault();
var feed = $('input[name=feed][type=radio]:checked').nextAll('a').attr('href');
window.location.href = feed;
});
- $('.container').on('click', '#alert_email_button', function(e){
+ $('body').on('click', '#alert_email_button', function(e){
e.preventDefault();
var form = $('<form/>').attr({ method:'post', action:"/alert/subscribe" });
form.append($('<input name="alert" value="Subscribe me to an email alert" type="hidden" />'));
@@ -389,15 +401,16 @@ $.fn.drawer = function(id, ajax) {
//set up map_links_toggle click event
$('#map_links_toggle').on('click', function(){
- var maplinks_width = $('#sub_map_links').width();
-
- if($(this).hasClass('closed')){
+ var sub_map_links_css = {},
+ left_right = isR2L() ? 'left' : 'right';
+ if ($(this).hasClass('closed')) {
$(this).removeClass('closed');
- $('#sub_map_links').animate({'right':'0'}, 1200);
- }else{
+ sub_map_links_css[left_right] = '0';
+ } else {
$(this).addClass('closed');
- $('#sub_map_links').animate({'right':-maplinks_width}, 1200);
+ sub_map_links_css[left_right] = -$('#sub_map_links').width();
}
+ $('#sub_map_links').animate(sub_map_links_css, 1200);
});
@@ -459,9 +472,6 @@ $.fn.drawer = function(id, ajax) {
if (!$('html.mobile').length) {
if (!($('body').hasClass('fullwidthpage'))){
var offset = -15 * 16;
- if (cobrand == 'bromley') {
- offset = -110;
- }
if (cobrand == 'oxfordshire') {
// Oxfordshire uses box-sizing:border-box and padding to work out height
offset = 0;
@@ -473,16 +483,3 @@ $.fn.drawer = function(id, ajax) {
}
});
-
-/*
-XXX Disabled because jerky on Android and makes map URL bar height too small on iPhone.
-// Hide URL bar
-$(window).load(function(){
- window.setTimeout(function(){
- var s = window.pageYOffset || document.compatMode === "CSS1Compat" && document.documentElement.scrollTop || document.body.scrollTop || 0;
- if (s < 20 && !location.hash) {
- window.scrollTo(0, 1);
- }
- }, 0);
-});
-*/
diff --git a/web/cobrands/fixmystreet/fms-og_image.png b/web/cobrands/fixmystreet/fms-og_image.png
deleted file mode 100644
index 5bda935f8..000000000
--- a/web/cobrands/fixmystreet/fms-og_image.png
+++ /dev/null
Binary files differ
diff --git a/web/cobrands/fixmystreet/images/chevron-grey-left.svg b/web/cobrands/fixmystreet/images/chevron-grey-left.svg
new file mode 100644
index 000000000..650eeac26
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/chevron-grey-left.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27" height="33">
+ <polygon points="26,0 13,0 0,16 13,32 26,32 13,16" fill="#d1d1d1"/>
+</svg>
diff --git a/web/cobrands/fixmystreet/images/chevron-grey-right.svg b/web/cobrands/fixmystreet/images/chevron-grey-right.svg
new file mode 100644
index 000000000..18432eb3b
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/chevron-grey-right.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27" height="33">
+ <polygon points="0,0 13,0 26,16 13,32 0,32 13,16" fill="#d1d1d1"/>
+</svg>
diff --git a/web/cobrands/fixmystreet/images/chevron-white-left-on-green.gif b/web/cobrands/fixmystreet/images/chevron-white-left-on-green.gif
new file mode 100644
index 000000000..e8e6f79d8
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/chevron-white-left-on-green.gif
Binary files differ
diff --git a/web/cobrands/fixmystreet/images/chevron-white-left.svg b/web/cobrands/fixmystreet/images/chevron-white-left.svg
new file mode 100644
index 000000000..95f9fd8a8
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/chevron-white-left.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27" height="33">
+ <polygon points="26,0 13,0 0,16 13,32 26,32 13,16" fill="#ffffff"/>
+</svg>
diff --git a/web/cobrands/fixmystreet/images/ie_green_chevron.gif b/web/cobrands/fixmystreet/images/chevron-white-right-on-green.gif
index 341ac1eeb..341ac1eeb 100644
--- a/web/cobrands/fixmystreet/images/ie_green_chevron.gif
+++ b/web/cobrands/fixmystreet/images/chevron-white-right-on-green.gif
Binary files differ
diff --git a/web/cobrands/fixmystreet/images/chevron-white-right.svg b/web/cobrands/fixmystreet/images/chevron-white-right.svg
new file mode 100644
index 000000000..43f321782
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/chevron-white-right.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27" height="33">
+ <polygon points="0,0 13,0 26,16 13,32 0,32 13,16" fill="#ffffff"/>
+</svg>
diff --git a/web/cobrands/fixmystreet/images/fms-og_image.jpg b/web/cobrands/fixmystreet/images/fms-og_image.jpg
new file mode 100644
index 000000000..4659a8aca
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/fms-og_image.jpg
Binary files differ
diff --git a/web/cobrands/fixmystreet/images/inbox-in-circle-100px.png b/web/cobrands/fixmystreet/images/inbox-in-circle-100px.png
new file mode 100644
index 000000000..d06685489
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/inbox-in-circle-100px.png
Binary files differ
diff --git a/web/cobrands/fixmystreet/images/triangle-grey-left.svg b/web/cobrands/fixmystreet/images/triangle-grey-left.svg
new file mode 100644
index 000000000..26ea59a23
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/triangle-grey-left.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="4" height="7">
+ <polygon points="3,0 0,3 3,6" fill="#f1f1f1"/>
+</svg>
diff --git a/web/cobrands/fixmystreet/images/triangle-grey-right.svg b/web/cobrands/fixmystreet/images/triangle-grey-right.svg
new file mode 100644
index 000000000..8ea307b21
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/triangle-grey-right.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="4" height="7">
+ <polygon points="0,0 3,3 0,6" fill="#f1f1f1"/>
+</svg>
diff --git a/web/cobrands/greenwich/base.scss b/web/cobrands/greenwich/base.scss
index e4561e338..af9df60c7 100644
--- a/web/cobrands/greenwich/base.scss
+++ b/web/cobrands/greenwich/base.scss
@@ -29,13 +29,8 @@ body.frontpage #site-logo,
background-size: cover;
}
-
-#mysoc-menu {
- display: none;
-}
-
-.issue-list-a li, .list-a li, #user-meta p, #front-main #postcodeForm {
- background: $greenwich_light_grey;
+.item-list--reports__item, #user-meta p, #front-main #postcodeForm {
+ background-color: $greenwich_light_grey;
}
label[for=pc] {
diff --git a/web/cobrands/greenwich/layout.scss b/web/cobrands/greenwich/layout.scss
index bde0eded5..eff3f854e 100644
--- a/web/cobrands/greenwich/layout.scss
+++ b/web/cobrands/greenwich/layout.scss
@@ -1,7 +1,7 @@
@import "_colours";
@import "_fonts";
@import "../sass/layout";
-@import "../sass/report_list";
+@import "../sass/report_list_pins";
$fixed_page_width: 990px;
@@ -16,8 +16,6 @@ $fixed_page_width: 990px;
.ie6 #site-logo,
body.frontpage #site-logo,
.ie6 body.frontpage #site-logo,
-body.authpage #site-logo,
-.ie6 body.authpage #site-logo,
body.twothirdswidthpage #site-logo,
.ie6 body.twothirdswidthpage #site-logo
{
@@ -74,7 +72,7 @@ body.frontpage {
top: -9em;
}
- .issue-list-a li {
+ .item-list--reports__item {
border-left: solid 4px $primary;
}
@@ -94,7 +92,7 @@ body.twothirdswidthpage #user-meta p {
border-top: none;
}
-#main-menu {
+.nav-menu--main {
display: none;
}
@@ -180,7 +178,7 @@ body.mappage {
display: none;
}
- #main-menu {
+ .nav-menu--main {
display: block;
}
@@ -200,20 +198,15 @@ body.mappage {
border-bottom: solid 4px $primary;
}
- #main-nav {
- ul#main-menu {
- li a.report-a-problem-btn {
- color: $nav_fg;
- }
+ .nav-menu--main a.report-a-problem-btn {
+ color: $nav_fg;
+ }
+ .nav-menu {
+ a, span {
+ color: $primary_text;
}
-
- ul li {
- a, span {
- color: $primary_text;
- }
- a:hover {
- text-decoration: underline;
- }
+ a:hover {
+ text-decoration: underline;
}
}
}
@@ -288,9 +281,3 @@ body.fullwidthpage, body.twothirdswidthpage {
}
}
}
-
-// Override the default issue (report) list styling on the /my page, so that
-// reports don't pop out the side of the sidebar
-.issue-list-a.full-width {
- margin-left: -1em;
-}
diff --git a/web/cobrands/harrogate/_colours.scss b/web/cobrands/harrogate/_colours.scss
index a79b7acfb..11bf383f7 100644
--- a/web/cobrands/harrogate/_colours.scss
+++ b/web/cobrands/harrogate/_colours.scss
@@ -1,5 +1,7 @@
/* COLOURS */
+$menu-image: 'menu-black';
+
$harrogate_primary: #7EB7D8;
$primary: $harrogate_primary;
diff --git a/web/cobrands/harrogate/base.scss b/web/cobrands/harrogate/base.scss
index f0bb1daa1..b546ae060 100644
--- a/web/cobrands/harrogate/base.scss
+++ b/web/cobrands/harrogate/base.scss
@@ -19,11 +19,6 @@ body.frontpage #site-logo,
height: 37px;
}
-#nav-link {
- background-image: url(/cobrands/fixmystreet/images/menu-black.png);
- background-image: url(/cobrands/fixmystreet/images/menu-black.svg), none;
-}
-
#report-cta {
border-color: #ddd;
color: #000;
@@ -33,33 +28,17 @@ body.frontpage #site-logo,
}
}
-#main-nav ul#main-menu li {
-
+.nav-menu--main {
// blue button background, darker if selected
- background: #ededed;
- &.menu-item-selected {
- background: $primary;
- span {
- color: #fff;
- }
+ a {
+ background: #ededed;
}
-
span {
- color: $nav_fg;
+ color: #fff;
+ background: $primary;
}
}
-#main-nav ul#main-menu li,
-body.mappage #main-nav ul#main-menu li,
-{
- padding-left: 0.25em;
- padding-right: 0.25em;
- padding-top: 0;
- padding-bottom: 0;
-
- a { padding: 0 }
-}
-
label[for=form_INFO_TEXT] {
background: yellow;
border: solid 1px black;
diff --git a/web/cobrands/harrogate/layout.scss b/web/cobrands/harrogate/layout.scss
index 480a07f5d..417eff539 100644
--- a/web/cobrands/harrogate/layout.scss
+++ b/web/cobrands/harrogate/layout.scss
@@ -8,9 +8,6 @@
body.frontpage #site-logo,
.ie6 body.frontpage #site-logo,
- body.authpage #site-logo,
- .ie6 body.authpage #site-logo,
-
body.twothirdswidthpage #site-logo,
.ie6 body.twothirdswidthpage #site-logo
{
@@ -29,9 +26,6 @@
body.twothirdswidthpage #site-header,
.ie6 body.twothirdswidthpage #site-header,
- body.authpage #site-header,
- .ie6 body.authpage #site-header,
-
body.mappage #site-header,
.ie6 body.mappage #site-header,
body.mappage .nav-wrapper-2,
@@ -58,11 +52,7 @@
}
}
-body.fullwidthpage #main-nav,
-body.frontpage #main-nav,
-body.twothirdswidthpage #main-nav,
-body.authpage #main-nav
-{
+#main-nav {
margin-top: 3.2em;
}
@@ -95,38 +85,23 @@ body.twothirdswidthpage form.full-width {
margin: 0;
}
-body.mappage #main-nav {
- ul#main-menu {
- padding: 1em 0;
- }
-}
-body.mappage #main-nav ul#main-menu li a, body.mappage #main-nav ul#main-menu li span {
- padding: 0.75em;
+.nav-menu--main {
+ background: #ededed;
}
-body.mappage #main-nav ul#main-menu li a.report-a-problem-btn,
-#main-nav ul#main-menu li a.report-a-problem-btn {
- margin: 0;
- padding: 0.75em;
+.nav-menu--main span {
+ color: #fff;
+ background: $primary;
}
-#main-nav ul#main-menu li a.report-a-problem-btn {
- &:hover {
- background: #444;
- color: #fff;
- @include border-radius(0em);
- }
+
+.nav-menu--main a, .nav-menu--main span,
+body.mappage .nav-menu--main a, body.mappage .nav-menu--main span {
+ padding: 0.75em 1.02em;
}
-#main-nav {
- ul#main-menu {
- li {
- a.report-a-problem-btn {
- color: #000;
- background: #ededed;
- }
- }
- }
+body.mappage .nav-menu--main {
+ margin-top: 1em;
}
body.mappage .nav-wrapper .nav-wrapper-2 {
diff --git a/web/cobrands/hart/base.scss b/web/cobrands/hart/base.scss
index edc692130..306098056 100644
--- a/web/cobrands/hart/base.scss
+++ b/web/cobrands/hart/base.scss
@@ -12,12 +12,10 @@ a, a:visited {
}
}
-.issue-list-a {
- li {
- color:#666;
- a {
- color:#666;
- }
+.item-list--reports__item {
+ color: #666;
+ a {
+ color: #666;
}
}
diff --git a/web/cobrands/hart/hart.scss b/web/cobrands/hart/hart.scss
index 0823a4bc5..2f535e398 100644
--- a/web/cobrands/hart/hart.scss
+++ b/web/cobrands/hart/hart.scss
@@ -76,14 +76,13 @@ body.frontpage .nav-wrapper-2 {
#main-nav {
margin-top: 106px;
-
- ul {
- margin-left: 157px;
- float: none;
- }
+ }
+ .nav-menu {
+ margin-left: 157px;
+ float: none;
}
- #main-nav ul li {
+ .nav-menu li {
text-align: center;
text-transform: uppercase;
padding: 0 15px;
@@ -91,21 +90,16 @@ body.frontpage .nav-wrapper-2 {
border-right: solid 1px white;
line-height: 1.5em;
}
-
- #main-nav ul li a {
- padding: 0;
- font-size: inherit;
- }
-
- #main-nav ul li:last-child {
+ .nav-menu li:last-child {
border-right: none;
}
- #main-nav ul li a:link, #main-nav ul li a:visited {
- color: #fff;
+ .nav-menu a {
+ padding: 0;
+ font-size: inherit;
}
- #main-nav ul li:hover, #main-nav ul li:hover a, {
+ .nav-menu li:hover, .nav-menu li:hover a, {
background-color: white;
color: black;
text-decoration: none;
@@ -456,7 +450,7 @@ body.mappage .hart-footer-wrapper {
}
}
-.issue-list-a li .text small {
+.item-list--reports__item small {
display: inline;
}
diff --git a/web/cobrands/oxfordshire/base.scss b/web/cobrands/oxfordshire/base.scss
index 2f297582c..8f28905e2 100644
--- a/web/cobrands/oxfordshire/base.scss
+++ b/web/cobrands/oxfordshire/base.scss
@@ -25,7 +25,7 @@
height: 60px; // to match #site-header
}
-#main-nav ul#mysoc-menu li a#mysoc-logo {
+#mysoc-logo {
background-image: none;
text-indent: 0;
img {
diff --git a/web/cobrands/oxfordshire/layout.scss b/web/cobrands/oxfordshire/layout.scss
index 195c5342f..d6c009019 100644
--- a/web/cobrands/oxfordshire/layout.scss
+++ b/web/cobrands/oxfordshire/layout.scss
@@ -1,6 +1,6 @@
@import "_colours";
@import "../sass/layout";
-@import "../sass/report_list";
+@import "../sass/report_list_pins";
body, body a {
font-family:"Trebuchet MS",Arial, Helvetica, sans-serif;
@@ -39,7 +39,7 @@ body, body a {
margin: 0;
@include box-shadow(none);
}
-.ie6, .ie7, .ie8 {
+.iel8 {
.content {
margin: 0;
border: none;
@@ -266,7 +266,7 @@ body.mappage {
}
}
-.report-list, .issue-list-a {
+.item-list--reports {
li:after {
background-color: $oxfordshire_mid_grey_green;
}
@@ -278,21 +278,21 @@ body.mappage {
h4.static-with-rule {
margin-top: 1em; // down from default 2em, avoid extra space between heading and .council_info_box
- margin-bottom: 0; // no space between this and the .issue-list items
+ margin-bottom: 0; // no space between this and the .item-list items
background: transparent; // rather than light grey
padding: 0.75em 1em * (1/0.875); // compensate for 0.875 font-size
}
-.issue-list li {
+.item-list--updates li {
background: transparent;
margin-top: 0; // no space between list items
- // Replicate .report-list styling, a bit
+ // Replicate .item-list--reports styling, a bit
border-top: 1px solid $oxfordshire_mid_grey_green;
padding: 1em 1em 1em 0;
margin-left: 1em;
- .update-wrap .update-text > :last-child {
+ .item-list__update-text > :last-child {
margin-bottom: 0;
}
diff --git a/web/cobrands/sass/_admin.scss b/web/cobrands/sass/_admin.scss
index a668712ae..b7c208773 100644
--- a/web/cobrands/sass/_admin.scss
+++ b/web/cobrands/sass/_admin.scss
@@ -23,8 +23,8 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
color: white;
background-color: $table_heading_bg_col;
border-bottom: 2px solid $table_heading_underline_col;
- border-left: 1px solid $table_heading_border_col;
- border-right: 1px solid $table_heading_border_col;
+ border-#{$left}: 1px solid $table_heading_border_col;
+ border-#{$right}: 1px solid $table_heading_border_col;
a:link, a:visited {
color: white;
}
@@ -35,10 +35,10 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
}
tr.filter-row td {
display: none; /* TODO: reveal when filtering is implemented */
- padding: 4px 4px 4px 40px;
+ padding: flip(4px 4px 4px 40px, 4px 40px 4px 4px);
background-color: $button_bg_col;
background-image: url('search-icon-white.png');
- background-position: 14px center;
+ background-position: flip(14px, right) center;
background-repeat: no-repeat;
border-bottom: 2px solid $table_border_color;
}
@@ -57,7 +57,7 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
}
}
.no-bullets {
- margin-left: 0;
+ margin-#{$left}: 0;
> li {
list-style: none;
}
@@ -78,7 +78,7 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
font-size: 90%;
border-style: solid;
border-width: 1px;
- border-left-width: 1em;
+ border-#{$left}-width: 1em;
margin-bottom: 1em;
}
.fms-admin-warning {
@@ -98,10 +98,10 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
font-size: 80%; // little question marks are small
cursor: pointer;
display: block;
- float:left;
+ float: $left;
overflow: hidden;
padding: 0.2em;
- margin-right: 0.666em;
+ margin-#{$right}: 0.666em;
text-align: center;
color: #fff;
font-weight: bold;
@@ -115,7 +115,7 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
&:before { content: "?" }
&.admin-hint-show {
font-size: 90%;
- text-align: left;
+ text-align: $left;
display: block;
float:none;
margin:1em 0;
@@ -128,7 +128,7 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
color: #000;
border-style: solid;
border-width: 1px;
- border-left-width: 1em;
+ border-#{$left}-width: 1em;
border-color: #f93;
padding:1em;
margin: 0;
@@ -136,9 +136,9 @@ $button_bg_col: #a1a1a1; // also search bar (tables)
}
}
.admin-offsite-link {
- padding-right: 12px;
+ padding-#{$right}: 12px;
background-image: url(../../i/external-link.png);
- background-position: right top;
+ background-position: $right top;
background-repeat: no-repeat;
}
}
diff --git a/web/cobrands/sass/_base.scss b/web/cobrands/sass/_base.scss
index 8f6efe51e..0788a99ed 100644
--- a/web/cobrands/sass/_base.scss
+++ b/web/cobrands/sass/_base.scss
@@ -4,6 +4,10 @@ $body-font: MuseoSans, Helmet, Freesans, sans-serif !default;
$meta-font: Helmet, Freesans, sans-serif !default;
$heading-font: 'Museo300-display', MuseoSans, Helmet, Freesans, sans-serif !default;
$image-sprite: '/cobrands/fixmystreet/images/sprite.png' !default;
+$menu-image: 'menu-white' !default;
+
+@import "_mixins";
+@import "_report_list";
body {
font-family: $body-font;
@@ -18,7 +22,7 @@ body {
p {
font-size: 1em;
font-weight: normal;
- margin:0 0 1em 0;
+ margin: 0 0 1em;
}
small{
@@ -71,7 +75,7 @@ h4 {
ul, ol {
font-size: 1em;
margin-bottom: 2em;
- margin-left: 2em;
+ margin-#{$left}: 2em;
padding:0;
}
@@ -96,13 +100,13 @@ ol.big-numbers {
> li {
position: relative;
list-style: none;
- padding:0 0 0 2.5em;
+ padding: flip(0 0 0 2.5em, 0 2.5em 0 0);
margin-bottom:2em;
&:before {
content: counter(li); // set the content to be whatever the 'li' var is
counter-increment: li; // add to the counter var
position: absolute;
- left: 0;
+ #{$left}: 0;
top:-0.2em;
color:#ccc;
line-height:1;
@@ -126,7 +130,7 @@ dl {
dd {
font-weight: 1em;
line-height: 1.5em;
- margin:0 0 1em 0;
+ margin: 0 0 1em;
}
}
@@ -295,14 +299,14 @@ label{
font-weight: bold;
&.inline{
display: inline;
- padding: 0 2em 0 1em;
+ padding: flip(0 2em 0 1em, 0 1em 0 2em);
font-weight: normal;
}
}
// grey background, full width box
.form-box {
- margin: 0 -1em 0.25em -1em;
+ margin: 0 -1em 0.25em;
background: #eee;
padding: 1em;
> input[type=text], input[type=email] {
@@ -320,7 +324,7 @@ label{
}
strong {
font-size:2em;
- margin-right:0.25em;
+ margin-#{$right}: 0.25em;
}
}
}
@@ -328,21 +332,22 @@ label{
// the password box falls off screen for some reason. Just have boring margins,
// it looks okay.
.ie6 .form-box {
- margin: 0 0 0.25em 0;
+ margin: 0 0 0.25em;
padding: 1em;
}
// Prevent grey displaying oddly by giving it a width, and stop odd left margin issue
.ie7 .form-box {
width: 100%;
> input[type=text], input[type=email] {
- margin-left: 2em;
+ margin-#{$left}: 2em;
}
}
.change_location {
color: #666;
- padding-left: 24px;
- background: transparent url(/cobrands/fixmystreet/images/wrong-location.png) 4px 50% no-repeat;
+ padding-#{$left}: 20px;
+ background: transparent url(/cobrands/fixmystreet/images/wrong-location.png) $left 50% no-repeat;
+ border-#{$left}: solid 4px #fff;
margin-top: -0.5em;
}
@@ -352,12 +357,12 @@ label{
input[type=text],
input[type=email] {
width: 65%;
- float:left;
+ float: $left;
}
input[type=submit] {
- float:right;
+ float: $right;
width:28%;
- margin-right:0.25em;
+ margin-#{$right}: 0.25em;
padding-top:0.7em;
padding-bottom:0.6em;
}
@@ -442,7 +447,7 @@ p.label-valid {
width: 175px;
height: 40px;
top: 0.4em;
- left: 0.5em;
+ #{$left}: 0.5em;
background: url($image-sprite) -3px -3px no-repeat;
text-indent: -999999px;
position: absolute;
@@ -456,13 +461,13 @@ p.label-valid {
#nav-link {
width: 3em;
height: 3em; // same height as #site-header
- background: transparent url(/cobrands/fixmystreet/images/menu-white.png) center center no-repeat;
- background-image: url(/cobrands/fixmystreet/images/menu-white.svg), none;
+ background: transparent url(/cobrands/fixmystreet/images/#{$menu-image}.png) center center no-repeat;
+ background-image: inline-image("../fixmystreet/images/#{$menu-image}.svg"), none;
background-size: 22px 18px;
display: block;
text-indent: -999999px;
position: absolute;
- right: 0;
+ #{$right}: 0;
top: 0.25em; // same as border-top on #site-header
}
@@ -471,7 +476,7 @@ p.label-valid {
display: block;
position: absolute;
top: (3em / 2); // half the height of #site-header
- right: 3.5em;
+ #{$right}: 3.5em;
margin-top: -0.5em;
font-size: 0.9em;
@@ -488,47 +493,42 @@ p.label-valid {
}
-#main-nav{
- ul{
- @include list-reset-soft;
- li{
- a, span {
- display: block;
- padding: 0.5em 1em;
- background:#f6f6f6;
- color:#333;
- font-size: 1.25em;
- border-bottom: 0.25em solid #333;
- }
- a:hover, span.hover {
- background: #333;
- color:#fff;
- text-decoration: none;
- }
- span {
- background-color: #ccc;
- }
- }
- &#mysoc-menu{
- li {
- a {
- color: $primary_text;
- background: $primary;
- &#mysoc-logo {
- background-position: 20px 13px;
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAYCAYAAAArrNkGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABBtJREFUaN7tmT2u1DAQx/cIPgBCQUJCICH5BuQIPkIq6hzBB0AyiAP4ABQ5ghtEm54mEtVrICUNkpmsJjBvdvyR1S7hPa2lv1aJs5PEP894xjkc/tMWY+xADhRQA8iC9I7PtD6PP9xa9aC1oCnmm9lpgtHW3WiVB03HuqYeA9DlPZbJuXj8o5wgGM5os+ixLb74MeTt+Hz+kiGXva99jEDjJV7w+5Pn3aIHNoEvB/Tu7s6iejzuQAEUQRPIgxT2KTwesX+5rkvYs7yP2KDXLN7XXCKkAUgHiii3MaQuideI9x/x2GB/gxFjVZMIoY6AmtBGJ+QJluUKgdheI1LpfveuoQMciTw7XrUAbEFzot8Re4GcnwWghv23Ezx0PiejBYiBAA0/Pz7VoOV3AKnEup1LwhyBQFsr2Jkzdjy51hZyBIuwaOuFZ6fPPaaA5jQX+hvi4fS8YUC9BBzXqJOB4INXAGpAM8oAxBEUUbYSQiCD1ZWACnZGhDJIUacGaBbY34ghAxfAdHheCxBHAs6yvp7YpP/zDOgk9WHIGhMvOZ5TrjCgfUUSptigqQqg1M7A7kHhTVvWUAF8Q/r6ZObPQy4bfMf62wycoeSFOEmoPS2sQ74mdFUC1RhuHQ25QonkKurjE6CCpzTC+9CmNwBNeiHz/oGvabnweG+9E9ZDul6GDDiD53tybsoMYIMJhhQSjy/28YVzoAgKoGRt+uvHMwUaQRHkS7N/I1AjhGuuGs+2ifsOPOwKk6TLAeUe2J4DFPtG7vnsnK3MQPngTwg0ErUZoC3CPEqyWbmDJQG1cVvbCpRPmIadm6Wy5VpAeXKkpCRqQ1F/DwBAnAlQnQHaEKDzlYGGgvQWoEJy1LOx8P8SqOLJEU2uNhbhvQC0AVn76n3/9vWHpIe++/Km/fxVL17aL3ATSYU5E2h77rbkBqA2kYFHsbS7FlAhOTrJpIXwkirYRynMAEgDiignwHSgiGozCceUg5EBqs5N2hhQX8gnpDaldoquCVQn6lmV2foLbJdkSmWkANESoNPLT98UyKMUgbnIFsqWGRMxQ0JbW1G2eCHsdmQferWlMwlPxHuLnwiFa9NefU2gQiJ0UholBixm6lGV8lAEGVFDykMr6l5e5OeA1tg5ASB8wcmVMEa4rtkLqM3VnqQuDJnBmHnhT6A2oKPNBSIFuq6hoCbzCatY91Zs/ZXspED5Ws+rDu0IbZUSEps//YmQuvbrCg8NFd8I1zBl8bd66w8galBA6Q3rmWKb3YZlpIqE0Da13pLrVjtd6flxMtP7qorvse1hjyYkRfs8yMP/8E83WMIeII2wdrobnk0gG6HOnUu7WteAqRKf39QN0yagTlhf9/lwz9fNG8yzgBrmmWa3h8Ftv0HaQLi1TYlaSGX3UvsNzdBKw+waoEEAAAAASUVORK5CYII=');
- background-repeat:no-repeat;
- text-indent:-999999px;
- }
- }
- }
- }
+.nav-menu {
+ @include list-reset-soft;
+ a, span {
+ display: block;
+ padding: 0.5em 1em;
+ background: #f6f6f6;
+ color: #333;
+ font-size: 1.25em;
+ border-bottom: 0.25em solid #333;
+ }
+ a:hover, span.hover {
+ background: #333;
+ color: #fff;
+ text-decoration: none;
+ }
+ span {
+ background: #ccc;
+ }
+}
+.nav-menu--mysoc {
+ a {
+ color: $primary_text;
+ background: $primary;
}
}
-.ie6 #main-nav ul#mysoc-menu li a#mysoc-logo {
+#mysoc-logo {
+ background-origin: content-box;
+ background-position: $left 3px;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAYCAYAAAArrNkGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABBtJREFUaN7tmT2u1DAQx/cIPgBCQUJCICH5BuQIPkIq6hzBB0AyiAP4ABQ5ghtEm54mEtVrICUNkpmsJjBvdvyR1S7hPa2lv1aJs5PEP894xjkc/tMWY+xADhRQA8iC9I7PtD6PP9xa9aC1oCnmm9lpgtHW3WiVB03HuqYeA9DlPZbJuXj8o5wgGM5os+ixLb74MeTt+Hz+kiGXva99jEDjJV7w+5Pn3aIHNoEvB/Tu7s6iejzuQAEUQRPIgxT2KTwesX+5rkvYs7yP2KDXLN7XXCKkAUgHiii3MaQuideI9x/x2GB/gxFjVZMIoY6AmtBGJ+QJluUKgdheI1LpfveuoQMciTw7XrUAbEFzot8Re4GcnwWghv23Ezx0PiejBYiBAA0/Pz7VoOV3AKnEup1LwhyBQFsr2Jkzdjy51hZyBIuwaOuFZ6fPPaaA5jQX+hvi4fS8YUC9BBzXqJOB4INXAGpAM8oAxBEUUbYSQiCD1ZWACnZGhDJIUacGaBbY34ghAxfAdHheCxBHAs6yvp7YpP/zDOgk9WHIGhMvOZ5TrjCgfUUSptigqQqg1M7A7kHhTVvWUAF8Q/r6ZObPQy4bfMf62wycoeSFOEmoPS2sQ74mdFUC1RhuHQ25QonkKurjE6CCpzTC+9CmNwBNeiHz/oGvabnweG+9E9ZDul6GDDiD53tybsoMYIMJhhQSjy/28YVzoAgKoGRt+uvHMwUaQRHkS7N/I1AjhGuuGs+2ifsOPOwKk6TLAeUe2J4DFPtG7vnsnK3MQPngTwg0ErUZoC3CPEqyWbmDJQG1cVvbCpRPmIadm6Wy5VpAeXKkpCRqQ1F/DwBAnAlQnQHaEKDzlYGGgvQWoEJy1LOx8P8SqOLJEU2uNhbhvQC0AVn76n3/9vWHpIe++/Km/fxVL17aL3ATSYU5E2h77rbkBqA2kYFHsbS7FlAhOTrJpIXwkirYRynMAEgDiignwHSgiGozCceUg5EBqs5N2hhQX8gnpDaldoquCVQn6lmV2foLbJdkSmWkANESoNPLT98UyKMUgbnIFsqWGRMxQ0JbW1G2eCHsdmQferWlMwlPxHuLnwiFa9NefU2gQiJ0UholBixm6lGV8lAEGVFDykMr6l5e5OeA1tg5ASB8wcmVMEa4rtkLqM3VnqQuDJnBmHnhT6A2oKPNBSIFuq6hoCbzCatY91Zs/ZXspED5Ws+rDu0IbZUSEps//YmQuvbrCg8NFd8I1zBl8bd66w8galBA6Q3rmWKb3YZlpIqE0Da13pLrVjtd6flxMtP7qorvse1hjyYkRfs8yMP/8E83WMIeII2wdrobnk0gG6HOnUu7WteAqRKf39QN0yagTlhf9/lwz9fNG8yzgBrmmWa3h8Ftv0HaQLi1TYlaSGX3UvsNzdBKw+waoEEAAAAASUVORK5CYII=');
+ background-repeat: no-repeat;
+ text-indent: -999999px;
+}
+.ie6 #mysoc-logo {
background: url('/cobrands/fixmystreet/images/ie_mysoc_logo.gif') center no-repeat;
}
-.ie7 #main-nav ul#mysoc-menu li a#mysoc-logo {
+.ie7 #mysoc-logo {
background: url($image-sprite) -240px -38px no-repeat;
}
@@ -544,10 +544,10 @@ p.label-valid {
position: relative;
color: $primary_text;
background: $primary;
- padding:1em 6em 1em 1em;
+ padding: flip(1em 6em 1em 1em, 1em 1em 1em 6em);
a {
position: absolute;
- right:1em;
+ #{$right}: 1em;
@include inline-block;
text-transform:uppercase;
font-size:0.75em;
@@ -572,9 +572,9 @@ p.label-valid {
display: table-cell;
vertical-align: bottom;
text-align: center;
- border-right:0.25em solid #fff;
+ border-#{$right}: 0.25em solid #fff;
&:last-child {
- border-right:none;
+ border-#{$right}: none;
}
input[type=submit] {
width: 100%;
@@ -585,7 +585,7 @@ p.label-valid {
background-color: #f5f5f5;
background-repeat: no-repeat;
color:#333;
- padding:4em 2em 1em 2em;
+ padding:4em 2em 1em;
text-transform:uppercase;
font: {
size:0.6875em;
@@ -609,8 +609,9 @@ p.label-valid {
background-position: center 25%;
}
&.chevron {
- background-image:url($image-sprite);
- background-position:center -2716px;
+ background-image: inline-image("../fixmystreet/images/chevron-grey-#{$right}.svg");
+ background-position: center 25%;
+ background-size: 20px 25px;
}
&.hover {
background-image:url($image-sprite);
@@ -627,10 +628,10 @@ p.label-valid {
ul#key-tools{
background:#f5f5f5;
li{
- float:left;
+ float: $left;
a {
- padding-left:1.5em;
- padding-right:3em;
+ padding-#{$left}: 1.5em;
+ padding-#{$right}: 3em;
}
}
}
@@ -639,23 +640,25 @@ p.label-valid {
.ie6 .shadow-wrap ul#key-tools li a {
&.abuse {
background-image:url('/cobrands/fixmystreet/images/ie_key_tools_sprite.gif');
- background-position: right 0px;
+ background-position: $right 0px;
}
&.feed {
background-image:url('/cobrands/fixmystreet/images/ie_key_tools_sprite.gif');
- background-position: right -58px;
- }
- &.chevron {
- background-image:url('/cobrands/fixmystreet/images/ie_key_tools_sprite.gif');
- background-position: right -116px;
+ background-position: $right -58px;
}
&:hover {
background-image:url('/cobrands/fixmystreet/images/ie_key_tools_sprite_dark.gif');
}
}
+.iel8 {
+ .shadow-wrap ul#key-tools li a.chevron {
+ background-image:url('/cobrands/fixmystreet/images/ie_key_tools_sprite.gif');
+ background-position: $right -116px;
+ }
+}
#report-updates-data img {
- float: right;
+ float: $right;
}
#report-share iframe {
@@ -669,7 +672,7 @@ footer {
#footer-mobileapps {
@extend .full-width;
- padding:1em 1em 0 1em;
+ padding: 1em 1em 0;
h4 {
margin:0;
}
@@ -689,7 +692,7 @@ footer {
border-bottom:none;
}
h4 {
- margin:0.75em 0 0.25em 0;
+ margin:0.75em 0 0.25em;
}
p {
font-size:0.75em;
@@ -722,14 +725,20 @@ input.red-btn{
.final-submit,
input.final-submit {
- margin:1em 0.5em;
- float:right;
+ margin: 1em 0.5em;
+ float: $right;
}
-.button-right,
-.button-left,
-a.button-right,
-a.button-left {
+.button-fwd {
+ padding: flip(1em 3em 1em 1em, 1em 1em 1em 3em);
+ background: inline-image("../fixmystreet/images/chevron-grey-#{$right}.svg") $right 50% no-repeat;
+}
+.button-back {
+ padding: flip(1em 1em 1em 3em, 1em 3em 1em 1em);
+ background: inline-image("../fixmystreet/images/chevron-grey-#{$left}.svg") $left 50% no-repeat;
+}
+.button-fwd,
+.button-back {
@include inline-block;
cursor:pointer;
font-size: 1em;
@@ -737,33 +746,27 @@ a.button-left {
margin:0;
border:1px solid #999;
color:#333;
- background: #eee;
+ background-color: #eee;
+ background-size: 20px+16px 25px;
@include border-radius(4px);
&:hover{
color:#fff;
- background:#777;
+ background-color: #777;
text-decoration: none;
border:1px solid #666;
}
}
-.button-right,
-a.button-right,
-:hover.button-right,
-a:hover.button-right {
- padding:1em 3em 1em 1em;
- background-image: url($image-sprite);
- background-repeat:no-repeat;
- background-position:right -686px;
-}
-
-.button-left,
-a.button-left,
-:hover.button-left,
-a:hover.button-left {
- padding:1em 1em 1em 3em;
- background-image: url($image-sprite);
- background-repeat:no-repeat;
- background-position:-18px -802px;
+.iel8 {
+ .button-fwd, .button-back {
+ background-image: url($image-sprite);
+ background-repeat: no-repeat;
+ }
+ .button-fwd {
+ background-position: right -686px;
+ }
+ .button-back {
+ background-position: -18px -802px;
+ }
}
.big-green-banner {
@@ -779,12 +782,12 @@ a:hover.button-left {
font-size:0.875em;
&:before {
content: "";
- left:-0.5em;
+ #{$left}: -0.5em;
top:0;
position: absolute;
width: 0;
height: 0;
- border-left: 0.5em solid transparent;
+ border-#{$left}: 0.5em solid transparent;
border-bottom: 0.5em solid $col_click_map_dark;
}
}
@@ -794,7 +797,7 @@ a:hover.button-left {
p {
position: absolute;
top:-1.95em;
- right:0;
+ #{$right}: 0;
@include inline-block;
font-size:0.6875em;//11px
line-height:1em;
@@ -808,12 +811,12 @@ a:hover.button-left {
}
&:before {
content: "";
- left:-0.5em;
+ #{$left}: -0.5em;
top:0;
position: absolute;
width: 0;
height: 0;
- border-left: 0.5em solid transparent;
+ border-#{$left}: 0.5em solid transparent;
border-bottom: 0.5em solid #888;
}
&#fixed {
@@ -835,126 +838,98 @@ a:hover.button-left {
}
}
-.issue-list{
- margin: 0 0 1em 0;
+.item-list {
+ margin: 0 0 1em;
padding: 0;
border-bottom: 0.25em solid $primary;
- li{
- list-style: none;
- background: #f6f6f6;
- margin: 0.25em 0 0 0;
- padding: 0.5em 1em;
- display:block;
- .update-wrap {
- @include clearfix;
- }
- .update-text p {
- margin-bottom: 0.5em;
- }
- .update-img {
- float: right;
- margin: 0.5em 0 0.5em 1em; // gutter between text and floated image
- }
+ .update-img {
+ float: $right;
+ margin: flip(0.5em 0 0.5em 1em, 0.5em 1em 0.5em 0); // gutter between text and floated image
}
}
-.issue-list-a {
- margin: 0 0 1em 0;
+.item-list__item {
+ list-style: none;
+ background-color: #f6f6f6;
+ margin: 0.25em 0 0;
+ padding: 0.5em 1em;
+ display: block;
+}
+
+.item-list__update-wrap {
+ @include clearfix;
+}
+
+.item-list__update-text p {
+ margin-bottom: 0.5em;
+}
+
+.item-list__item--link {
padding: 0;
- border-bottom: 0.25em solid $primary;
- li {
- list-style: none;
- margin:0;
- padding:0;
- margin: 0.25em 0 0 0;
- /* see note below about this */
- display:table;
- background: #f6f6f6;
- color:#222222;
- width:100%;
- &:hover {
- text-decoration:none;
- color:#222222;
- background:#e6e6e6;
- }
- a {
- color:#222222;
- }
- a:hover {
- color:#222222;
- background:#e6e6e6;
- text-decoration: none;
- }
- .text {
- /* this is and the display:table above are required otherwise
- on iphone the rows end up being slightly wider than the screen */
- display: table-cell;
- width: 100%;
- vertical-align:top;
- padding: 0px 0px 0px 1em;
- .img {
- width: 90px;
- float: right;
- height:auto;
- }
- h4 {
- padding-right: 1em;
- padding-top: 0.25em;
- margin:0;
- }
- small {
- color:#666;
- display: block;
- padding-right: 1em;
- padding-top: 0.25em;
- padding-bottom: 0.25em;
- }
- }
- >p {
- margin: 0.25em 0 0 0;
- padding: 0.5em 1em;
- background: #f6f6f6;
- }
+ a {
+ color: #222222;
+ display: block;
+ padding: 0.5em 1em;
}
+ a:hover, a:focus {
+ background-color: #e6e6e6;
+ text-decoration: none;
+ }
+}
+
+.item-list--wards__item {
+ @extend .item-list__item--link;
}
-.list-a {
- @extend .issue-list-a;
+
+.item-list--reports__item {
+ @extend .item-list__item--link;
a {
- padding:0.5em 1em;
- font-weight:bold;
+ @include clearfix;
+ padding: flip(0 0 0 1em, 0 1em 0 0);
}
-}
-//display:table fixes
-.ie6, .ie7 {
- .issue-list-a {
- overflow:hidden;
- li {
- clear:both;
- width:100%;
- display:block;
- overflow:hidden;
- .text {
- float:left;
- }
- }
+ .img {
+ width: 90px;
+ float: $right;
+ height: auto;
+ margin-#{$left}: 1em;
+ }
+ h4 {
+ padding-top: 0.25em;
+ margin: 0;
+ }
+ small {
+ color: #666;
+ display: block;
+ padding: 0.25em 0;
}
}
-.ie6 .issue-list-a li a {
- height:5.5em;
+
+.item-list__item--empty p {
+ margin: 0;
+}
+
+.item-list--front-page {
+ border-bottom: none;
+}
+
+.ie6 .item-list--reports__item {
+ a {
+ height: 5.5em;
+ }
.img {
- height:60px;
+ height: 60px;
}
}
// fancybox gallery images have a magnifying glass in the corner
.update-img {
a {
- @include inline-block;
- position:relative;
+ display: block;
+ position: relative;
span {
position:absolute;
top:0;
- right:0;
+ #{$right}: 0;
display:block;
width:20px;
height:20px;
@@ -974,8 +949,8 @@ a:hover.button-left {
margin-bottom:1em;
}
.problem-header .update-img {
- float: right;
- margin-left: 0.5em;
+ float: $right;
+ margin-#{$left}: 0.5em;
margin-bottom: 0.5em;
}
@@ -1007,16 +982,23 @@ a:hover.button-left {
}
}
+// The map's static image fallback is visible by default.
+// Hide it if javascript has loaded. (We show it again when
+// the page is printed.)
+html.js #map .noscript {
+ display: none;
+}
+
// OpenLayers fix for navigation being top right
// Left and right so that zoom can be left, pan right.
#fms_pan_zoom {
- right: 0.5em !important;
top: 0.5em;
- left: 0.5em !important;
+ #{$left}: 0.5em !important;
+ #{$right}: 0.5em !important;
}
// The left and right of the above causes the navigation to move off-screen left in IE6.
.ie6 #fms_pan_zoom {
- left: auto !important;
+ #{$left}: auto !important;
}
// Openlayers map controls (overrides)
@@ -1028,7 +1010,7 @@ a:hover.button-left {
#fms_pan_zoom_zoomout {
width:36px !important;
height:36px !important;
- text-indent:-999999px;
+ text-indent: flip(-999999px, 999999px); // text-align from OL style makes this necessary
background:url($image-sprite) no-repeat;
filter: none !important; // Override OpenLayers PNG handling of the navigation
}
@@ -1040,48 +1022,48 @@ a:hover.button-left {
#fms_pan_zoom_panup {
background-position:-42px -222px;
- right:30px !important;
- left: auto !important;
+ #{$right}: 30px !important;
+ #{$left}: auto !important;
top:0 !important;
}
#fms_pan_zoom_pandown {
background-position:-42px -282px;
- right:30px !important;
- left: auto !important;
+ #{$right}: 30px !important;
+ #{$left}: auto !important;
top:72px !important;
}
#fms_pan_zoom_panleft {
background-position:-12px -252px;
width:48px !important;
- right:48px !important;
- left: auto !important;
+ #{$right}: flip(48px, 0) !important;
+ #{$left}: auto !important;
top:36px !important;
}
#fms_pan_zoom_panright {
background-position:-60px -252px;
width:48px !important;
- right:0 !important;
- left: auto !important;
+ #{$right}: flip(0, 48px) !important;
+ #{$left}: auto !important;
top:36px !important;
}
#fms_pan_zoom_zoomin {
background-position:-152px -223px;
height:44px !important;
- left:0 !important;
+ #{$left}: 0 !important;
top:0 !important;
}
#fms_pan_zoom_zoomout {
background-position:-152px -259px;
height:44px !important;
- left:0 !important;
+ #{$left}: 0 !important;
top:44px !important;
}
//hide pins, show old reports etc
#sub_map_links {
position: absolute;
- left: 0;
- right:0;
+ #{$left}: 0;
+ #{$right}: 0;
bottom: 0;
background:#333;
background:rgba(0, 0, 0, 0.7);
@@ -1090,23 +1072,23 @@ a:hover.button-left {
@include inline-block;
font-size:0.6875em;
color:#fff;
- padding:0.6em 3em 0.5em 1em;
+ padding: flip(0.6em 3em 0.5em 1em, 0.6em 1em 0.5em 3em);
background-repeat:no-repeat;
&#hide_pins_link {
background-image:url($image-sprite);
- background-position: right -3976px;
+ background-position: flip(right, -341px) -3976px;
}
&#all_pins_link {
background-image:url($image-sprite);
- background-position: right -4022px;
+ background-position: flip(right, -337px) -4022px;
}
&#map_permalink {
background-image:url($image-sprite);
- background-position: right -4070px;
+ background-position: flip(right, -341px) -4070px;
}
&.feed {
background-image:url($image-sprite);
- background-position: right -3936px;
+ background-position: flip(right, -341px) -3936px;
}
&:hover {
background-color:#000;
@@ -1118,15 +1100,15 @@ a:hover.button-left {
.ie6 #sub_map_links a {
&#hide_pins_link {
background-image:url('/cobrands/fixmystreet/images/ie_sub_map_links_sprite.gif');
- background-position: right 1px;
+ background-position: $right 1px;
}
&#all_pins_link {
background-image:url('/cobrands/fixmystreet/images/ie_sub_map_links_sprite.gif');
- background-position: right -45px;
+ background-position: $right -45px;
}
&#map_permalink {
background-image:url('/cobrands/fixmystreet/images/ie_sub_map_links_sprite.gif');
- background-position: right -93px;
+ background-position: $right -93px;
}
}
@@ -1157,7 +1139,7 @@ a:hover.button-left {
a#try_again {
position: absolute;
display: block;
- left: 25%;
+ left: 25%; // along with width of 50%, centres it
bottom: 0;
margin-bottom: 6em;
background: rgba(0, 0, 0, 0.8);
@@ -1166,7 +1148,7 @@ a:hover.button-left {
a#mob_ok {
position: absolute;
display: block;
- right: 1em;
+ #{$right}: 1em;
bottom: 0;
height: 20px;
padding-top: 30px;
@@ -1181,8 +1163,8 @@ a:hover.button-left {
margin:0;
position: absolute;
top:0;
- left:0;
- right:0;
+ #{$left}: 0;
+ #{$right}: 0;
font-size:0.75em;
background:rgba(0, 0, 0, 0.7);
padding:0.75em 30px;
@@ -1195,15 +1177,15 @@ a:hover.button-left {
line-height:1;
padding:0.5em 0.75em;
position:absolute;
- left:0.3em;
+ #{$left}: 0.3em;
top:0.3em;
}
}
.olControlAttribution {
bottom: 3.25em !important;
- right: 0.25em !important;
- left: 0.25em !important;
+ #{$right}: 0.25em !important;
+ #{$left}: 0.25em !important;
color: #222222;
font-size:0.75em !important;
}
@@ -1212,7 +1194,7 @@ a:hover.button-left {
}
.olControlPermalink {
bottom: 3px !important;
- right: 3px;
+ #{$right}: 3px;
}
/* Drag is only present in noscript form. XXX Copy from core. */
@@ -1244,8 +1226,8 @@ a.rap-notes-trigger,
a:hover.rap-notes-trigger {
display:block;
width:90%;
- padding-left:5%;
- padding-right:5%;
+ padding-#{$left}: 5%;
+ padding-#{$right}: 5%;
}
.rap-notes {
margin:1em 0;
@@ -1262,9 +1244,9 @@ a:hover.rap-notes-trigger {
width:100%;
li {
display:table-cell;
- border-right:0.25em solid #fff;
+ border-#{$right}: 0.25em solid #fff;
&:last-child {
- border-right:none;
+ border-#{$right}: none;
}
a {
display:block;
@@ -1295,7 +1277,7 @@ a:hover.rap-notes-trigger {
margin:0;
padding:0;
ul li {
- float:left;
+ float: $left;
}
}
}
@@ -1318,16 +1300,17 @@ label .muted {
ul {
width: 49%;
margin: 0;
- float: left;
+ float: $left;
font-size: 14px;
line-height: 20px;
}
li {
margin-bottom: 0;
- padding-left: 20px;
+ padding-#{$left}: 16px;
list-style: none;
- background: transparent url(/cobrands/fixmystreet/images/tick-10px-8px.png) 4px 5px no-repeat;
+ background: transparent url(/cobrands/fixmystreet/images/tick-10px-8px.png) $left 5px no-repeat;
+ border-#{$left}: solid 4px #fff;
}
.do {
@@ -1335,12 +1318,14 @@ label .muted {
}
.dont {
- float: right;
+ float: $right;
color: #881111;
li {
background-image: url(/cobrands/fixmystreet/images/cross-7px-7px.png);
- background-position: 6px 6px;
+ background-position: $left 6px;
+ padding-#{$left}: 14px;
+ border-#{$left}: solid 6px #fff;
}
}
}
@@ -1381,7 +1366,7 @@ table.nicetable {
}
}
.title {
- text-align:left;
+ text-align: $left;
}
.data {
width:12%;
@@ -1399,7 +1384,7 @@ table.nicetable {
.close-promo {
position:absolute;
top:0.5em;
- right:0.5em;
+ #{$right}: 0.5em;
display:block;
width:16px;
height:16px;
@@ -1430,18 +1415,18 @@ table.nicetable {
position:relative;
.prev {
position:absolute;
- left:0.5em;
+ #{$left}: 0.5em;
}
.next {
position:absolute;
- right:0.5em;
+ #{$right}: 0.5em;
}
a {
@include inline-block;
color: $primary_text;
background: $primary;
- padding-left:0.5em;
- padding-right:0.5em;
+ padding-#{$left}: 0.5em;
+ padding-#{$right}: 0.5em;
&:hover {
text-decoration:none;
background:$primary/1.1;
@@ -1565,12 +1550,6 @@ table.nicetable {
}
}
-#front-recently {
- .issue-list-a {
- border-bottom:none;
- }
-}
-
#alerts {
ul {
margin-bottom: 1em;
@@ -1583,7 +1562,7 @@ table.nicetable {
background: #f6f6f6;
}
img[width="16"] {
- float: right;
+ float: $right;
}
}
@@ -1592,10 +1571,15 @@ table.nicetable {
text-align: center;
background: transparent url(/cobrands/fixmystreet/images/tick-in-circle-100px.png) center 1em no-repeat;
+
&.confirmation-header--failure {
background-image: url(/cobrands/fixmystreet/images/sad-face-in-circle-100px.png);
}
+ &.confirmation-header--inbox {
+ background-image: url(/cobrands/fixmystreet/images/inbox-in-circle-100px.png);
+ }
+
h1, h2 {
margin: 0;
line-height: 1.2em;
@@ -1630,5 +1614,144 @@ table.nicetable {
}
}
+/* Questionnaire page */
+
+.questionnaire-report-header {
+ font-family: inherit;
+ font-size: 1.2em;
+ font-weight: 600;
+}
+
+.questionnaire-report-reminder {
+ @include clearfix(); // clear the floated image, in case there is no update-header to do it
+ background: #f3f3f3;
+ border-radius: 3px;
+ padding: 1em 1em 1px 1em; // basically no padding-bottom, as children have their own margin-bottom instead
+ margin-bottom: 2em;
+
+ .update-img {
+ width: 120px;
+ float: left;
+ margin: 0.1em 1em 1em 0;
+ }
+}
+
+.questionnaire-report-reminder__report-title {
+ margin: 0 0 0.3em 0;
+}
+
+.questionnaire-report-reminder__report-meta {
+ color: #666;
+ line-height: 1.4em;
+}
+
+.questionnaire-report-reminder__last-update-header {
+ border-top: 1px solid #ddd;
+ margin: 0;
+ padding: 0.8em 0 0.5em 0;
+ clear: left; // clear the floated image above
+
+ a {
+ float: right;
+ }
+}
+
+.questionnaire-errors {
+ margin-left: 0;
+}
+
+.radio-segmented-control {
+ overflow: auto; // clear floats (if browser doesn't support flexbox)
+ display: flex; // fancy full-width buttons for browsers that support flexbox
+
+ input {
+ display: none;
+ }
+
+ label {
+ display: block;
+ margin: 0;
+ padding: 0.75em 1.5em;
+ text-align: center;
+ background: #fff linear-gradient(to bottom, #fff 0%, #eee 100%) 0 0 no-repeat;
+ border: 1px solid #ddd;
+ border-right-width: 0; // avoid double border between items
+ font-weight: bold;
+ float: left; // float fallback for browsers that don't support flexbox
+ flex: 1 0 auto;
+
+ &:hover, &:focus {
+ background: #f3f3f3 linear-gradient(to bottom, #f9f9f9 0%, #e9e9e9 100%) 0 0 no-repeat;
+ }
+ }
+
+ input:checked + label {
+ color: $primary_text;
+ background: $primary;
+ border-color: darken($primary, 5%);
+ background-image: none; // remove gradient
+ box-shadow: inset 0 0.1em 0.2em rgba(0,0,0,0.2);
+ border-right-width: 1px; // add a realistic coloured border to all sides
+ }
+
+ input:checked + label + input + label {
+ border-left-width: none; // in favour of the realistic coloured border on the selected item
+ }
+
+ input:first-child + label {
+ border-radius: 0.25em 0 0 0.25em;
+ }
+
+ label:last-child {
+ border-radius: 0 0.25em 0.25em 0;
+ border-right-width: 1px; // reinstate border on last item
+ }
+}
+
+
+@media screen {
+ .print-only {
+ display: none !important;
+ }
+}
+
+@media print {
+ @page {
+ margin: 3em;
+ }
+
+ #main-nav,
+ #nav-link,
+ .admin-nav,
+ .olControlAttribution,
+ .olControlPanZoom,
+ #sub_map_links,
+ #fms_pan_zoom,
+ .screen-only,
+ .olMapViewport {
+ display: none !important;
+ }
+
+ #map_box {
+ position: static !important;
+ height: 256px !important;
+ width: auto !important;
+ background: #f1eee9 !important; // cream colour to match OSM image
+ }
+
+ #map {
+ -webkit-transform: scale(0.5);
+ -ms-transform: scale(0.5);
+ transform: scale(0.5);
+ -webkit-transform-origin: 0 0;
+ -ms-transform-origin: 0 0;
+ transform-origin: 0 0;
+ }
+
+ html.js #map .noscript {
+ display: block;
+ }
+}
+
@import "_admin";
@import "_fixedthead";
diff --git a/web/cobrands/sass/_layout.scss b/web/cobrands/sass/_layout.scss
index 67756ca5b..c9cc3610d 100644
--- a/web/cobrands/sass/_layout.scss
+++ b/web/cobrands/sass/_layout.scss
@@ -78,7 +78,7 @@ h1 {
.nav-wrapper {
position: absolute;
top:0;
- left:0;
+ #{$left}: 0;
width:100%;
.nav-wrapper-2 {
// position static as well so we fix lots of the z-index issues
@@ -100,7 +100,7 @@ h1 {
}
#site-logo {
top: 0.9em;
- left: auto;
+ #{$left}: auto;
position: absolute;
z-index: 3;
}
@@ -118,95 +118,90 @@ h1 {
top:-3.25em;
}
}
-#nav-link,
+
+#nav-link {
+ #{$right}: auto;
+ #{$left}: -999999px;
+}
+
#report-cta {
- right: auto;
- left: -999999px;
+ display: none;
}
-#main-nav{
+
+#main-nav {
margin: 0 auto;
- padding: 0em;
+ padding: 0;
width: 60em;
- ul{
- list-style: none;
- padding: 0px;
- margin: 0px;
- float:right;
- li{
- list-style: none;
- display: inline;
- margin: 0px;
- padding: 0px;
- float:left;
- a,
- span {
- display: block;
- color: $nav_fg;
- background: none;
- border-bottom: none;
- }
- &#top-nav-privacy {
- display: none;
- }
- }
- &#main-menu{
- li{
- a, span{
- padding: 0.75em;
- font-size: 0.9em;
- }
- a:hover{
- background: $nav_fg_hover;
- }
- a.report-a-problem-btn {
- color: $primary_text;
- background: $primary;
- padding:0.25em;
- margin:0.5em;
- @include border-radius(0.25em);
- &:hover {
- background:$primary/1.1;
- }
- }
- span {
- color:$primary;
- }
- }
+}
+.nav-menu {
+ float: $right;
+ li {
+ display: inline;
+ float: $left;
+ }
+ li.nav-menu__item--privacy {
+ display: none;
+ }
+ a, span {
+ display: block;
+ color: $nav_fg;
+ background: none;
+ border-bottom: none;
+ }
+}
+.nav-menu--main {
+ a, span {
+ padding: 0.75em;
+ font-size: 0.9em;
+ }
+ a:hover {
+ background: $nav_fg_hover;
+ }
+ a.report-a-problem-btn {
+ color: $primary_text;
+ background: $primary;
+ padding:0.25em;
+ margin:0.5em;
+ @include border-radius(0.25em);
+ &:hover {
+ background:$primary/1.1;
}
- &#mysoc-menu{
- padding: 0em 0.5em;
- margin-left: 0.25em;
- background: $primary;
- @include border-radius(0 0 0.375em 0.375em);
- li{
- a{
- background:none;
- color: $primary_text;
- text-transform: uppercase;
- font-size: 0.6875em;
- padding: 1.3em 0.7em 1em 0.7em;
- &#mysoc-logo {
- width:84px;
- height:16px;
- background-size: 100px auto;
- background-position: 0px 10px;
- opacity: 0.8;
- &:hover {
- opacity: 1;
- }
- }
- &:hover{
- color:#fff;
- }
- }
- }
+ }
+ span {
+ color:$primary;
+ }
+}
+.nav-menu--mysoc {
+ padding: 0em 0.5em;
+ margin-#{$left}: 0.25em;
+ background: $primary;
+ @include border-radius(0 0 0.375em 0.375em);
+ a {
+ background:none;
+ color: $primary_text;
+ text-transform: uppercase;
+ font-size: 0.6875em;
+ padding: 1.3em 0.7em 1em;
+ &:hover {
+ color: #fff;
+ background: none;
}
}
}
-.ie8 #main-nav ul#mysoc-menu li a#mysoc-logo {
+#mysoc-logo {
+ width:84px;
+ height:16px;
+ background-size: 100px auto;
+ background-position: -8px 0px;
+ opacity: 0.8;
+ &:hover {
+ opacity: 1;
+ }
+}
+.ie8 #mysoc-logo {
width: 100px;
}
-.ie7 #main-nav ul#mysoc-menu li a#mysoc-logo {
+.ie7 #mysoc-logo {
background-position: -260px -43px;
}
@@ -221,7 +216,7 @@ h1 {
color: #222;
@include box-shadow(0 0 10px rgba(0,0,0,0.5));
}
-.ie6, .ie7, .ie8 {
+.iel8 {
.content {
// If no box-shadow, just want a boring black border to stand it out from the map.
border: 1px solid #666;
@@ -237,28 +232,27 @@ body.mappage {
}
.content {
- float:left;
+ float: $left;
padding: 1em 1em 10em;
margin: 0;
}
#site-logo {
- left: 12px;
+ #{$left}: 12px;
}
#main-nav {
width: auto;
- margin-right: 1em;
+ margin-#{$right}: 1em;
}
- #main-nav ul#main-menu li a,
- #main-nav ul#main-menu li span {
- padding: 1.4em 0.75em 1.35em 0.75em;
+ .nav-menu--main a, .nav-menu--main span {
+ padding: 1.4em 0.75em 1.35em;
}
- #main-nav ul#main-menu li a.report-a-problem-btn {
+ .nav-menu--main a.report-a-problem-btn {
padding: 0.5em;
- margin:0.9em 0.25em 0.85em 0.25em;
+ margin: 0.9em 0.25em 0.85em;
}
.nav-wrapper{
@@ -278,9 +272,9 @@ body.mappage {
display: block;
height: auto;
width: 22.2em; // 27em (.content width) - 2em (.content padding) - 6em - 0.8em
- padding: 0.5em 6em 0.5em 0.8em;
+ padding: flip(0.5em 6em 0.5em 0.8em, 0.5em 0.8em 0.5em 6em);
top: 0;
- left: 0;
+ #{$left}: 0;
z-index: 1;
box-shadow: none;
background: #FCEA9A;
@@ -289,7 +283,7 @@ body.mappage {
a {
// move the "Sign out" link in and down a bit, because of extra padding on parent
top: 0.8em;
- right: 0.8em;
+ #{$right}: 0.8em;
}
}
@@ -309,9 +303,9 @@ body.mappage {
body.mappage {
// The below is *mandatory* to allow pins/zoom to be clickable in IE6/7. Do NOT remove.
.container {
- float: left;
+ float: $left;
width: 27em;
- margin-left: 0.7em;
+ margin-#{$left}: 0.7em;
}
.nav-wrapper{
z-index:1;
@@ -323,7 +317,7 @@ body.mappage {
position: absolute;
}
#user-meta {
- margin-left: 2em;
+ margin-#{$left}: 2em;
}
}
}
@@ -407,7 +401,7 @@ body.fullwidthpage {
}
#footer-mobileapps {
a {
- padding-left: 0.5em;
+ padding-#{$left}: 0.5em;
}
}
h4 {
@@ -426,27 +420,25 @@ body.fullwidthpage {
text-indent: -1000%;
height: 1.7em;
width: 16em;
- padding-right: 0.25em;
+ padding-#{$right}: 0.25em;
}
}
}
}
}
-.ie6, .ie7, .ie8 {
+.iel8 {
body.twothirdswidthpage,
body.fullwidthpage {
.content {
border: 0px;
}
- }
-}
-.ie8 {
- body.twothirdswidthpage,
- body.fullwidthpage {
+
.container .content footer a.platform-logo {
+ color: #ffffff;
background: none;
text-indent: 0px;
+ height: auto;
}
}
}
@@ -465,7 +457,7 @@ body.twothirdswidthpage {
aside {
background:#eee;
position:absolute;
- left:42em;
+ #{$left}: 42em;
top:0;
z-index: -1;
width:13em;
@@ -480,12 +472,12 @@ body.twothirdswidthpage {
}
.sticky-sidebar {
position: absolute;
- left:42em;
+ #{$left}: 42em;
z-index: -1;
aside {
position: fixed;
top:7em;
- left:auto;
+ #{$left}: auto;
}
}
}
@@ -495,18 +487,30 @@ body.twothirdswidthpage {
position:static;
aside {
position:absolute;
- left:42em;
+ #{$left}: 42em;
top:0;
}
}
+// Centre the login and password change pages,
+// but keep them narrow to match the report sidebar
+body.authpage {
+ .content {
+ margin-#{$left}: auto;
+ margin-#{$right}: auto;
+ margin-bottom: 0;
+ box-shadow: none;
+ padding: 1em; // same as .twothirdswidthpage .content
+ }
+}
+
// table wrapper - this enables anything to become a
// table with div children as table cells
.tablewrapper {
display:table;
width:100%;
- padding:0 0 1em 0;
+ padding: 0 0 1em;
>div {
display:table-cell;
width:50%;
@@ -524,7 +528,7 @@ body.twothirdswidthpage {
div {//ie6 doesn't support '>div', so we'll go with the somewhat risker 'div'
width:48%;
display:block;
- float: left;
+ float: $left;
border:none !important;
}
}
@@ -540,7 +544,7 @@ body.twothirdswidthpage {
//footer blocks
#footer-mobileapps {
- border-right:1em solid transparent;
+ border-#{$right}: 1em solid transparent;
background:none;
padding:0;
@include box-shadow(inset rgba(0, 0, 0, 0) 0 0 0);
@@ -555,31 +559,31 @@ body.twothirdswidthpage {
.ie6, .ie7 {
#footer-mobileapps {
margin:0 0.5em;
- margin-right:2%;
+ margin-#{$right}: 2%;
}
}
#footer-help {
- border-left:1em solid transparent;
+ border-#{$left}: 1em solid transparent;
ul {
display:table;
li {
display:table-cell;
border-bottom:none;
&:last-child {
- border-left:1.25em solid transparent;
+ border-#{$left}: 1.25em solid transparent;
}
}
}
}
.ie6, .ie7 {
#footer-help {
- margin-left:2%;
+ margin-#{$left}: 2%;
ul {
width:100%;
li {
- float:left;
- width:45%
+ float: $left;
+ width: 45%;
}
}
}
@@ -591,7 +595,7 @@ body.twothirdswidthpage {
position: absolute;
height: 29em;
width: 29em;
- right: 1em;
+ #{$right}: 1em;
top: 3em;
z-index:1;
}
@@ -611,50 +615,49 @@ body.twothirdswidthpage {
// push zoom back over to right
#fms_pan_zoom_zoomin {
- left:auto !important;
- right:30px;
+ #{$left}: auto !important;
+ #{$right}: 30px !important;
top:130px !important;
}
#fms_pan_zoom_zoomout {
- left:auto !important;
- right:30px;
+ #{$left}: auto !important;
+ #{$right}: 30px !important;
top:174px !important;
}
.olControlAttribution {
bottom:0.5em !important;
- left: auto !important;
+ #{$left}: auto !important;
}
#sub_map_links {
- left:auto;
- bottom:auto;
- bottom:2em;
+ #{$left}: auto;
+ bottom: 2em;
#map_links_toggle {
display:block;
cursor: pointer;
position:absolute;
- left: -0.97em; /* 1em leaves a tiny gap, font issue */
+ #{$left}: -0.97em; /* 1em leaves a tiny gap, font issue */
width: 1em;
height:100%;
- background:#000 url($image-sprite) right -4119px no-repeat;
- @include border-radius(0.25em 0 0 0.25em);
+ background:#000 inline-image("../fixmystreet/images/triangle-grey-#{$right}.svg") 50% 50% no-repeat;
+ @include border-radius(flip(0.25em 0 0 0.25em, 0 0.25em 0.25em 0));
&:hover {
- left:-1.5em;
+ #{$left}: -1.5em;
//use border so we don't have to redefine the background-position
- border-right:0.5em solid #000;
+ border-#{$right}: 0.5em solid #000;
}
&.closed {
- background-position: right -4159px;
+ background-image: inline-image("../fixmystreet/images/triangle-grey-#{$left}.svg");
}
}
}
-.ie6 #sub_map_links #map_links_toggle {
- height:1.75em;
- background:#000 url('images/ie_sub_map_links_sprite.gif') center -143px no-repeat;
- &.closed {
- background-position: center -183px;
- }
+.iel8 #sub_map_links #map_links_toggle {
+ height: 1.75em;
+ background: #000 url('images/ie_sub_map_links_sprite.gif') center -143px no-repeat;
+ &.closed {
+ background-position: center -183px;
+ }
}
// log in bit, pokes above the .content div
@@ -667,13 +670,13 @@ body.twothirdswidthpage {
@include inline-block;
position: absolute;
top: 1em;
- left: 1em;
+ #{$left}: 1em;
height:2em;
- padding:0.25em 6em 0.5em 0.5em;
+ padding: flip(0.25em 6em 0.5em 0.5em, 0.25em 0.5em 0.5em 6em);
@include box-shadow(rgba(0, 0, 0, 0.6) 0px 0px 4px 1px);
a {
top:0.5em;
- right:0.5em;
+ #{$right}: 0.5em;
font-size:0.6875em;
padding:0.5em 0.75em;
line-height:1em;
@@ -714,42 +717,44 @@ body.twothirdswidthpage {
a, input[type=submit] {
font-size: 0.75em;
color:#666;
- padding: 0.5em 1.5em 0.5em 0;
+ padding: flip(0.5em 1.5em 0.5em 0, 0.5em 0 0.5em 1.5em);
text-transform:none;
&.abuse {
background-image:url($image-sprite);
- background-position:right -2935px;
+ background-position: flip(right, -337px) -2935px;
}
&.feed {
background-image:url($image-sprite);
- background-position:right -3074px;
+ background-position: flip(right, -337px) -3074px;
}
&.share {
min-width: 5em;
background-image: url(/cobrands/fixmystreet/images/share.png);
- background-position: 90% 50%;
+ background-position: flip(80%, 20%) 50%;
}
&.chevron {
- background-image:url($image-sprite);
- background-position:right -3225px;
+ border-#{$right}: solid 1em transparent;
+ padding-#{$right}: 0.5em;
+ background-position: $right 50%;
+ background-size: 12px 15px;
}
&.hover {
background-image:url($image-sprite);
- background-position:right -1876px;
+ background-position: flip(right, -337px) -1876px;
}
}
}
&.singleton {
li {
- text-align:right;
+ text-align: $right;
a {
- padding-right:3em;
+ padding-#{$right}: 3em;
}
}
}
}
&.static {
- padding:0 0 1em 0;
+ padding: 0 0 1em;
position: static;
}
}
@@ -769,19 +774,20 @@ body.twothirdswidthpage {
// pokes over the RHS with a little triangle
.big-green-banner {
- top:auto;
- right:-1.25em;
- margin-left:-2em;
- font-size:1.375em;
- padding:1em 3em 1em 1em;
- background: $col_click_map url($image-sprite) right -2188px no-repeat;
+ top: auto;
+ #{$right}: -1.25em;
+ margin-#{$left}: -2em;
+ font-size: 1.375em;
+ padding: flip(1em 3em 1em 1em, 1em 1em 1em 3em);
+ background: $col_click_map inline-image("../fixmystreet/images/chevron-white-#{$right}.svg") $right center no-repeat;
+ background-size: 27px+36px 33px;
&:before {
- right:0;
- left:auto;
- top:-0.5em;
+ left: flip(auto, 0);
+ right: flip(0, auto);
+ top: -0.5em;
position: absolute;
border-top: 0.5em solid transparent;
- border-left: 0.5em solid $col_click_map_dark;
+ border-#{$left}: 0.5em solid $col_click_map_dark;
border-bottom:none;
}
span {
@@ -790,8 +796,10 @@ body.twothirdswidthpage {
padding-top: 0.5em;
}
}
-.ie6 .big-green-banner {
- background: $col_click_map url(/cobrands/fixmystreet/images/ie_green_chevron.gif) right center no-repeat;
+.iel8 {
+ .big-green-banner {
+ background-image: url(/cobrands/fixmystreet/images/chevron-white-#{$right}-on-green.gif);
+ }
}
.banner {
@@ -800,8 +808,8 @@ body.twothirdswidthpage {
top:-2.25em;
padding:1em;
&:before {
- left:-0.75em;
- border-left: 0.75em solid transparent;
+ #{$left}: -0.75em;
+ border-#{$left}: 0.75em solid transparent;
border-bottom: 0.75em solid #888;
}
&#fixed {
@@ -836,7 +844,7 @@ body.twothirdswidthpage {
// for pulling elements fullwidth regardless
// of .contents' padding
.full-width{
- margin: 0 0 0em -1em;
+ margin: flip(0 0 0em -1em, 0 -1em 0 0);
width: 29em;
}
@@ -861,7 +869,7 @@ textarea.form-error {
#report-a-problem-sidebar {
position: absolute;
- left: 29em;
+ #{$left}: 29em;
width: 15em;
@include box-shadow(rgba(0, 0, 0, 0.6) 0px 0px 4px 1px);
}
@@ -881,7 +889,7 @@ textarea.form-error {
}
.ie6, .ie7 {
#report-a-problem-sidebar {
- left: 28.5em; // 0.5em left margin gone on .content in IE6/7, so reduce this accordingly.
+ #{$left}: 28.5em; // 0.5em left margin gone on .content in IE6/7, so reduce this accordingly.
z-index: 1;
}
}
@@ -925,8 +933,8 @@ body.frontpage {
z-index:10;
p {
top: -4em;
- left: auto;
- right: 0;
+ #{$left}: auto;
+ #{$right}: 0;
color:$primary;
background:none;
@include box-shadow(rgba(0, 0, 0, 0) 0 0 0);
@@ -941,7 +949,7 @@ body.frontpage {
}
}
//logo fix
-.ie6, .ie7, .ie8 {
+.iel8 {
body.frontpage {
#site-logo {
position:relative;
@@ -984,7 +992,7 @@ body.frontpage {
background:none;
overflow:hidden;
padding-bottom: 0;
- margin-right:0.5em;
+ margin-#{$right}: 0.5em;
label {
margin:0.5em 0;
}
@@ -995,14 +1003,14 @@ body.frontpage {
overflow:hidden;
input#pc {
display:block;
- float:left;
+ float: $left;
padding:0.25em 0.5em;
height:2em;
width:17em;
}
input#sub {
display:block;
- float:right;
+ float: $right;
width:3em;
height:2.3em;
padding-top:0.2em;
@@ -1039,7 +1047,7 @@ body.frontpage {
}
#front-howto {
- border-right:1em solid transparent;
+ border-#{$right}: 1em solid transparent;
#front_stats {
background:none;
color: #222;
@@ -1057,13 +1065,13 @@ body.frontpage {
#front_stats {
div {
width:8em;
- float:left;
+ float: $left;
}
}
}
#front-recently {
- border-left:1em solid transparent;
+ border-#{$left}: 1em solid transparent;
}
#front-howto h2,
@@ -1075,10 +1083,10 @@ body.frontpage {
.ie6, .ie7 {
.tablewrapper {
#front-howto {
- margin-right:2%;
+ margin-#{$right}: 2%;
}
#front-recently {
- margin-left:2%;
+ margin-#{$left}: 2%;
}
}
}
@@ -1086,15 +1094,15 @@ body.frontpage {
.confirmation-header {
width: 25em;
margin: 0 auto 1em;
- text-align: left;
- padding: 3em 0 3em 132px; // for tick icon
- background-position: 0 2em;
+ text-align: $left;
+ padding: flip(3em 0 3em 132px, 3em 132px 3em 0); // for tick icon
+ background-position: $left 2em;
}
/* Admin interface */
.fms-admin-floated {
- float: right;
+ float: $right;
width: 25%;
}
@@ -1108,13 +1116,13 @@ body.frontpage {
// Left padding is to ensure no overlap of the site-logo
// Background styling replicates header styling
- #main-nav{
+ #main-nav {
width: auto;
- float:right;
- padding-left: 180px;
+ float: $right;
+ padding-#{$left}: 180px;
}
- html #main-nav ul#mysoc-menu li a#mysoc-logo {
+ #mysoc-logo {
width: 16px;
// Just the mySociety circle logo
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABJ9JREFUeNqsVXlMHFUYf/Pe7O7M7E2Xw6UFWg5LQ1GTosa0IT00wYbGaKoltWnaRGNrjIptiUalXqlJU9RU0fSPHtqCR20pliBpQpAmxQgoLDeLQIEuh2WBndmDnZn3fMvRsqEGVv0mv3lzvPd97/u97wBgmXLUbHvOFZ/cJK1KbTtmiX4F/J+ySzBuDiakeSdWphA3RSAhTX3NaN2znLVwyQkMA/YbzAcwAAIFIBSYELjPYH6Zpf9CwrEMeGS1zhalh2zEBkIq2NCdkDvfyOxCRqHfnnpIWN9caK+5URDX2VJob8zfZsqJyIBKlVzweU7pIMIC3TFHIUAISkSx2GKE2uK8qNK0ODZbVsgKuwllnthp/S4rUZs0vx4th0dHcLp3FCv1VogEL8G9Jz2THx4Tx79+Yh23/oVs4zuBwKx3CuWQ5aHO5VYba7oDDjDj/TJEpSgWJytD0FAP5Dm6PD4ySZmSIUM0+C6DoGdUdkXkwULBC56HJtRJuxFpsu7nsll60CwHQY3D/8PRq1NFQZXg+TP8TwKphhc3GXPS4zWP9tySm07XSZe9MgkLEpCuX5uZZdqQBwEM1nsaStq87V3/xtjGTVzKB29bj0RZkK2s3PvTJ59PnWG2Rm3esTP2mW80gDUByq+CFffJoS+2tkrtTZEoz80R1pVfjrsBEGMGCvWAQ+DsV5MFcLstp0jFqsmH/cCn+qjLMGqLdcvrcOkIDpO9eYY9QMuYVRED1U8A8Sjg6Vz9AahH+mi84OhCzwISbAwT8fFoFr6EjlgvMAh2eDtP85AP7XwGHORAi9R6USVqRNrPlUqlIEgCSM8ApGMAtCBw/nvpLGqR2qoFxIMYbUwCJvh2tbv6oyt/lX8Z6fa7e+Thdsd0bdpa7QqvF49UlPmKXz0y/vEdHqyshaeDH2lNNoPGmhlUfQMuydmzHOX2VENMTKKQ0OMQu6Qxv8hqaLDMhWoY0VlxuXkPx24vZhhooa/elts1hddvfXsCE/yPyrftTdj15ME1n3J6FOsTlbFrZwbeqDrVdz4sD0Ji41fan019q1MF2Ego/wy9NIjDl5zHM1xeZ8e9lMenGuIPl2zoIIAxqjIGiO4cIeg/vrs+fbBDvBlWi3RISKF5YCQYz5XkGRchx+rT6djBpzyYaM3Zl0ftaqd++fGSt7m2NTqBT9dwyOgXldmaRWnRcgyflGnKWGTAr0hOTFQPjSQTHWciihCCJd9IM/fAxuTV712shTreHppreXz3of739+dMDFW1E0wUBjIsHQGt4gDT8BtsF52L+oE74BquH7l6kFIzoYE6agBJv49V5o/JI39G5750mNFydlWaAiHQOca45/Pfvdk17bp2ur+AM6CAYGKBlkdyQ+Xom4OdYve83rBy3Tj284U+T/N1njUmBVTf0Lh/qBdABDQ2+31Elu8mkaoAyAsxgHbIK5/1FnX9NlmVmGFa0/vHVL+zYaJloc5F/cAdGB4AIIT51FaBWFdRps94bIciB2ZaJ+T1wNf2azmYS8bOOndbCPcKhGX1g0BfqwPpzUS3Ki0ZanVeT13FuZHiQ4UkOK0stfZvAQYA/wr53nPx8cUAAAAASUVORK5CYII=);
@@ -1124,14 +1132,14 @@ body.frontpage {
//Map becomes percentage width
#map_box{
- left: 32em;
+ #{$left}: 32em;
width:auto;
}
//Revert to mobile use of the .full-width class
.full-width{
width: auto;
- margin: 0em -1em 0 -1em;
+ margin: 0em -1em;
}
//make twothirdswidthpage nearly as small as main
@@ -1140,7 +1148,7 @@ body.frontpage {
.content {
width:30em;
.sticky-sidebar {
- left:32em;
+ #{$left}: 32em;
}
}
}
diff --git a/web/cobrands/sass/_mixins.scss b/web/cobrands/sass/_mixins.scss
index 4c7bc5af8..be274e9bb 100644
--- a/web/cobrands/sass/_mixins.scss
+++ b/web/cobrands/sass/_mixins.scss
@@ -1,3 +1,5 @@
+$direction: 'left' !default;
+
// Button reset
@mixin button-reset($c1: #eee, $c2: #ccc, $c3: #999, $c4: #333, $c5: #777, $c6: #999, $c7: #666, $c8: #fff){
cursor:pointer;
@@ -8,7 +10,7 @@
}
text-transform:uppercase;
line-height: 1.375em;
- padding:0.7em 0.5em 0.5em 0.5em;
+ padding: 0.7em 0.5em 0.5em;
margin:0;
width: auto;
height: auto;
@@ -26,22 +28,7 @@
}
}
-
-
-// list resets
-@mixin list-reset-copy {
- padding-left:30px;
- margin-bottom:20px;
- li {
- font-size:14px;
- line-height:20px;
- list-style:disc;
- margin-bottom:10px;
- background:none;
- padding:0;
- }
-}
-
+// list reset
@mixin list-reset-soft {
list-style-type:none;
padding: 0;
@@ -54,19 +41,21 @@
}
}
-@mixin list-reset {
- list-style-type:none;
- padding: 0;
- margin: 0;
- li{
- list-style-type:none;
- padding: 0;
- margin: 0;
- border: 0;
- float:left;
- a {
- float:left;
- display:block;
+// LTR / RTL
+$left: left;
+@if $direction == right {
+ $left: right;
+}
+
+$right: right;
+@if $direction == right {
+ $right: left;
+}
+
+@function flip($ltr, $rtl) {
+ @if $direction == left {
+ @return $ltr;
+ } @else {
+ @return $rtl;
}
- }
}
diff --git a/web/cobrands/sass/_report_list.scss b/web/cobrands/sass/_report_list.scss
index b4e150d03..8d34bfd77 100644
--- a/web/cobrands/sass/_report_list.scss
+++ b/web/cobrands/sass/_report_list.scss
@@ -1,8 +1,5 @@
-// You should @import this file in a cobrand's layout.scss if it's using
-// the new-style combined report list with category/status filters.
-
.report-list-filters {
- padding: 1em 1em 0 1em;
+ padding: 1em 1em 0;
margin-bottom: 0.5em;
color: #666;
font-size: 0.85em;
@@ -17,7 +14,7 @@
margin: 0;
& + label {
- margin-left: 0.2em;
+ margin-#{$left}: 0.2em;
}
}
@@ -29,127 +26,7 @@
border: 1px solid #ced7c4;
box-shadow: 0 1px 0 #fff;
height: 2em;
- margin-left: 0.2em;
+ margin-#{$left}: 0.2em;
max-width: 13em;
}
}
-
-.report-list, .issue-list-a {
- margin-left: 0;
-
- li {
- list-style: none;
- position: relative;
- margin: 0;
- background: none;
-
- a {
- display: block;
- padding: 1em;
- padding-left: 4em;
- background: transparent url(/i/pin-yellow-small.png) no-repeat 1em center;
-
- &:hover, &:focus {
- background-color: #fff;
- background-repeat: no-repeat;
- background-position: 1em center;
- background: transparent url(/i/pin-yellow-small.png) no-repeat 1em center;
- text-decoration: none;
- }
- }
-
- &.yellow a {
- background-image: url(/i/pin-yellow-small.png);
- }
- &.green a {
- background-image: url(/i/pin-green-small.png);
- }
- &.red a {
- background-image: url(/i/pin-red-small.png);
- }
- &.grey a {
- background-image: url(/i/pin-grey-small.png);
- }
-
- &.empty p {
- display: block;
- padding: 1em;
- font-size: 1em;
- text-align: center;
- }
-
- &:after {
- content: "";
- display: block;
- height: 1px;
- position: absolute;
- left: 4em;
- right: 0;
- bottom: 0;
- background-color: #e5e5e5;
- }
-
- &.empty:after {
- left: 0;
- }
- }
-
- h3, p {
- margin: 0;
- }
-
- h3 {
- color: $primary;
- margin-bottom: 0.2em;
- }
-
- p {
- font-size: 0.8em;
- color: #777;
- }
-}
-
-.big-green-banner {
- display: none; // hide the empty banner by default
-
- &.mobile-map-banner {
- display: block; // show it again once the mobile javascript adds this class
- }
-}
-
-.click-the-map {
- color: #000;
- margin: -10px -1em 0 -1em; // overlap padding on parents
- padding: 18px;
- border-bottom: 1px solid #e5e5e5;
- background: #fff url('/i/click-map-chevron-big.gif') 90% 12px no-repeat;
-
- h2 {
- font-family: inherit;
- margin: 0 0 5px 0;
- }
-
- p {
- margin: 0;
- font-size: 18px;
- line-height: 20px;
- color: $primary;
- padding-right: 20px;
- background: transparent url('/i/click-map-chevron-small.gif') 100% center no-repeat;
- display: inline-block;
- }
-
- img {
- // the little chevron icon
- vertical-align: -1px;
- margin-left: 0.2em;
- }
-}
-
-body.frontpage {
- .issue-list-a, .list-a {
- li .text {
- padding-left: 3em;
- }
- }
-}
diff --git a/web/cobrands/sass/_report_list_pins.scss b/web/cobrands/sass/_report_list_pins.scss
new file mode 100644
index 000000000..3432e2bbf
--- /dev/null
+++ b/web/cobrands/sass/_report_list_pins.scss
@@ -0,0 +1,109 @@
+.item-list__item--with-pin {
+ position: relative;
+ margin: 0;
+ padding: 0;
+ background: none;
+
+ a {
+ display: block;
+ padding: 1em;
+ padding-#{$left}: 4em;
+ border-#{$left}: solid 1em transparent;
+ background: transparent url(/i/pin-yellow-small.png) no-repeat $left center;
+ }
+
+ &.yellow a {
+ background-image: url(/i/pin-yellow-small.png);
+ }
+ &.green a {
+ background-image: url(/i/pin-green-small.png);
+ }
+ &.red a {
+ background-image: url(/i/pin-red-small.png);
+ }
+ &.grey a {
+ background-image: url(/i/pin-grey-small.png);
+ }
+
+ &:after {
+ content: "";
+ display: block;
+ height: 1px;
+ position: absolute;
+ #{$left}: 4em;
+ #{$right}: 0;
+ bottom: 0;
+ background-color: #e5e5e5;
+ }
+
+ h3, p {
+ margin: 0;
+ }
+
+ h3 {
+ color: $primary;
+ margin-bottom: 0.2em;
+ }
+
+ p {
+ font-size: 0.8em;
+ color: #777;
+ }
+}
+
+.item-list__item--empty {
+ background: none;
+ color: #777;
+ p {
+ padding: 1em;
+ text-align: center;
+ }
+}
+
+/* The front page is using the parent _item.html template */
+body.frontpage {
+ .item-list__item--with-pin a {
+ padding: 0;
+ padding-#{$left}: 3em;
+ }
+}
+
+
+.big-green-banner {
+ display: none; // hide the empty banner by default
+
+ &.mobile-map-banner {
+ display: block; // show it again once the mobile javascript adds this class
+ }
+}
+
+.click-the-map {
+ color: #000;
+ margin: -10px -1em 0; // overlap padding on parents
+ padding: 18px;
+ border-bottom: 1px solid #e5e5e5;
+ // TODO This is not right-to-left enabled yet
+ background: #fff url('/i/click-map-chevron-big.gif') 90% 12px no-repeat;
+
+ h2 {
+ font-family: inherit;
+ margin: 0 0 5px;
+ }
+
+ p {
+ margin: 0;
+ font-size: 18px;
+ line-height: 20px;
+ color: $primary;
+ padding-#{$right}: 20px;
+ // TODO This is not right-to-left enabled yet, image wise
+ background: transparent url('/i/click-map-chevron-small.gif') $right center no-repeat;
+ display: inline-block;
+ }
+
+ img {
+ // the little chevron icon
+ vertical-align: -1px;
+ margin-#{$left}: 0.2em;
+ }
+}
diff --git a/web/cobrands/stevenage/layout.scss b/web/cobrands/stevenage/layout.scss
index b6f154298..17ef6a4c3 100644
--- a/web/cobrands/stevenage/layout.scss
+++ b/web/cobrands/stevenage/layout.scss
@@ -37,42 +37,36 @@
}
// d523b431
-#main-nav {
- ul {
- float: none;
- li {
- a, span {
- margin: 0;
- margin-right: 2px;
- font-family: 'PTSansRegular', "PT Sans", Verdana, Arial, sans-serif;
- }
- }
- &#main-menu {
- li {
- a, span {
- padding: 0.5em 0.75em;
- font-size: 0.8em;
- margin: 0;
- @include border-radius(0.25em);
- }
- a.report-a-problem-btn {
- padding:0.5em 0.75em;
- margin:0;
- margin-left: 0.25em;
- color:#fff;
- }
- span {
- color: #fff;
- background-color: #066539;
- }
- }
- }
+.nav-menu {
+ float: none;
+}
+.nav-menu a, .nav-menu span {
+ margin: 0;
+ margin-right: 2px;
+ font-family: 'PTSansRegular', "PT Sans", Verdana, Arial, sans-serif;
+}
+.nav-menu--main {
+ a, span {
+ padding: 0.5em 0.75em;
+ font-size: 0.8em;
+ margin: 0;
+ @include border-radius(0.25em);
+ }
+ a.report-a-problem-btn {
+ padding:0.5em 0.75em;
+ margin:0;
+ margin-left: 0.25em;
+ color:#fff;
+ }
+ span {
+ color: #fff;
+ background-color: #066539;
}
}
// 452ce6a0 - "Added IE6/7 position change to front page header too" -
// turned off border for ie6-8 .content - why, as box-shadow still on?
-.ie6, .ie7, .ie8 {
+.iel8 {
.content {
border: none;
}
@@ -88,10 +82,10 @@ body.mappage {
margin-top: 9em;
}
// 15591af7 - Stevenage Map page changes
- #main-nav ul#main-menu li a, #main-nav ul#main-menu li span {
+ .nav-menu--main a, .nav-menu--main span {
padding: 0.5em 0.75em;
}
- #main-nav ul#main-menu li a.report-a-problem-btn {
+ .nav-menu--main a.report-a-problem-btn {
padding: 0.5em 0.75em;
margin: 0 0 0 0.25em;
}
@@ -228,7 +222,9 @@ body.frontpage {
// d523b431
#main-nav {
float: left;
+ padding-left: 0;
}
+
.nav-wrapper {
.nav-wrapper-2 {
@include background(linear-gradient(#222, #555 30%, #555 60%, #222));
diff --git a/web/cobrands/trinidadtobago/_colours.scss b/web/cobrands/trinidadtobago/_colours.scss
index 03936ff10..f5d0e2b90 100644
--- a/web/cobrands/trinidadtobago/_colours.scss
+++ b/web/cobrands/trinidadtobago/_colours.scss
@@ -1,5 +1,7 @@
/* COLOURS */
+$menu-image: 'menu-black';
+
$trinidad_primary: #A90004;
$trinidad_secondary: white;
diff --git a/web/cobrands/trinidadtobago/base.scss b/web/cobrands/trinidadtobago/base.scss
index c8cb3c80e..c171e8333 100644
--- a/web/cobrands/trinidadtobago/base.scss
+++ b/web/cobrands/trinidadtobago/base.scss
@@ -9,7 +9,6 @@
background: #fff;
}
-
#site-logo {
display: block;
width: 175px;
@@ -20,8 +19,3 @@
position: absolute;
z-index: 2
}
-
-#nav-link {
- background-image: url(/cobrands/fixmystreet/images/menu-black.png);
- background-image: url(/cobrands/fixmystreet/images/menu-black.svg), none;
-}
diff --git a/web/cobrands/warwickshire/base.scss b/web/cobrands/warwickshire/base.scss
index ab755a7af..682738a5e 100644
--- a/web/cobrands/warwickshire/base.scss
+++ b/web/cobrands/warwickshire/base.scss
@@ -42,7 +42,6 @@ body {
#site-header {
height: auto;
background: white;
- border-top-width: 4px;
nav ul li, ul.nav li {
list-style: none;
@@ -58,6 +57,10 @@ body.mappage > div.container {
padding-top: 0;
}
+.footer-container {
+ font-size: 16px;
+}
+
@media (max-width: 767px) {
body {
padding-left: 0;
diff --git a/web/cobrands/zerotb/layout.scss b/web/cobrands/zerotb/layout.scss
index ea8102ded..c8afa3abc 100644
--- a/web/cobrands/zerotb/layout.scss
+++ b/web/cobrands/zerotb/layout.scss
@@ -31,16 +31,10 @@ body {
}
}
&.mappage {
- #main-nav {
- ul#main-menu {
- li {
- a,
- a.report-a-problem-btn,
- span {
- padding: 0.25em;
- margin: 0.5em;
- }
- }
+ .nav-menu--main {
+ a, a.report-a-problem-btn, span {
+ padding: 0.25em;
+ margin: 0.5em;
}
}
.nav-wrapper-2 {
@@ -56,21 +50,11 @@ body {
}
}
-#main-nav {
- ul#mysoc-menu {
- li {
- a {
- color: $primary_text;
- }
- }
- }
- ul#main-menu {
- li {
- span {
- color: $primary_text;
- }
- }
- }
+.nav-menu--mysoc a {
+ color: $primary_text;
+}
+.nav-menu--main span {
+ color: $primary_text;
}
#site-header {
diff --git a/web/cobrands/zurich/admin-faux-columns.gif b/web/cobrands/zurich/admin-faux-columns.gif
new file mode 100644
index 000000000..077fea2e5
--- /dev/null
+++ b/web/cobrands/zurich/admin-faux-columns.gif
Binary files differ
diff --git a/web/cobrands/zurich/base.scss b/web/cobrands/zurich/base.scss
index 559d97a27..e607f80a3 100644
--- a/web/cobrands/zurich/base.scss
+++ b/web/cobrands/zurich/base.scss
@@ -42,11 +42,11 @@
}
&#closed {
color: #1a1a1a;
- background: #e25436;
+ background: #e25436; // red
}
&#progress {
color: #1a1a1a;
- background: #f3d74b;
+ background: #f3d74b; //purple
}
}
}
@@ -98,24 +98,18 @@ h4.static-with-rule {
padding-right: 0;
border-top: 0.25em solid #e5e5e5;
}
-.issue-list {
+.item-list {
border-bottom: none;
- li {
- padding-left: 0;
- padding-right: 0;
- background: none;
- }
+}
+.item-list__item {
+ padding-left: 0;
+ padding-right: 0;
+ background: none;
}
-.issue-list-a {
- border-bottom: none;
- li {
- background: none;
- .text {
- .img {
- padding-right: 1em;
- }
- }
+.item-list--reports__item {
+ .img {
+ padding-right: 1em;
}
}
@@ -178,3 +172,180 @@ h4.static-with-rule {
}
}
}
+
+.admin-note__text {
+ background-color: #eee;
+ padding: 0.5em 1em;
+ border-radius: 4px;
+ position: relative;
+ margin-bottom: 0.5em;
+
+ // add a little speech bubble triangle to the bottom left corner
+ &:after {
+ content: "";
+ display: block;
+ position: absolute;
+ bottom: -10px;
+ left: 10px;
+ border-top: 10px solid #eee;
+ border-left: 10px solid transparent;
+ }
+
+ .admininternal & {
+ background-color: #eef;
+
+ &:after {
+ border-top-color: #eef;
+ }
+ }
+}
+
+.admin-note__creator {
+ padding-left: 30px;
+}
+
+.admin-official-answer, .admin-external-message {
+ background-color: #1F52A3; // official Zurich blue colour
+ color: #fff;
+ padding: 0.8em 1em;
+ border-radius: 4px;
+
+ p {
+ margin-bottom: 0.5em;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+}
+
+.admin {
+ label.inline {
+ padding: 0;
+ }
+
+ input[type="checkbox"] + label.inline {
+ margin-right: 0.2em;
+ }
+}
+
+.admin-label--inline {
+ display: inline; // rather than block
+ margin-right: 0.333em; // bit of space between this and the following input
+}
+
+.ui-spinner input {
+ // stop jQuery UI spinner inputs from inheriting FMS input styles
+ padding: 1px;
+ border: none;
+ border-radius: 0;
+}
+
+.square-map__outer {
+ width: 100%;
+ height: 0;
+ padding-bottom: 100%; // 100% of parent WIDTH!! Makes a square element.
+ position: relative;
+}
+
+.square-map__inner {
+ position: absolute; // Parent must keep its 0 height, so we need to create a new container for tiles.
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+
+ #drag .square-map__tile {
+ position: static; // override position:absolute
+ }
+}
+
+#map_box {
+ top: 0em; // the default, 3em, overlaps the content below
+}
+
+@media screen {
+ dd.screen-no-space-after {
+ margin-bottom: 0;
+ }
+
+ .admin-report-edit--interact dl.with-message {
+ margin-top: 1.5em;
+ }
+}
+
+@media print {
+ #site-header .container {
+ position: relative;
+ }
+ #site-logo {
+ top: 0;
+ }
+
+ .mappage.admin {
+ .container {
+ padding: 0;
+ position: relative;
+ }
+
+ .content {
+ overflow: auto;
+ font-size: 0.8em;
+ background: transparent url(/cobrands/zurich/admin-print-columns.gif) top center repeat-y;
+ min-height: 0 !important; // override hard-coded inline min-height style
+
+ form {
+ @include clearfix; // because .admin-report-edit children are floated
+ }
+ }
+
+ #map_box {
+ display: none; // Zurich has its own clone of the map, inside admin-report-edit--interact
+ }
+ }
+
+ .admin-report-edit {
+ margin-top: 1em;
+ width: 47%;
+
+ input[type=text],
+ textarea {
+ border: none;
+ padding: 0;
+ }
+
+ dd {
+ padding-left: 1em;
+ }
+
+ h2 {
+ font-family: inherit;
+ font-size: inherit;
+ font-weight: bold;
+ }
+ }
+
+ .admin-report-edit--details {
+ float: left;
+ border-right: 1px solid #ddd;
+ padding-right: 3%;
+ }
+
+ .admin-report-edit--interact {
+ float: right;
+ }
+
+ .map_clone {
+ -webkit-transform: none;
+ -ms-transform: none;
+ transform: none;
+ }
+
+ dd.print-no-space-after {
+ margin-bottom: 0;
+ }
+
+ #print_report_map {
+ page-break-before: always;
+ }
+}
diff --git a/web/cobrands/zurich/layout.scss b/web/cobrands/zurich/layout.scss
index 39bbb20b4..3a20d05c5 100644
--- a/web/cobrands/zurich/layout.scss
+++ b/web/cobrands/zurich/layout.scss
@@ -9,7 +9,7 @@
color: #3c3c3c;
@include box-shadow(none);
}
-.ie6, .ie7, .ie8 {
+.iel8 {
.content {
border: none;
}
@@ -18,7 +18,7 @@
body.mappage .content, body.frontpage .content {
@include box-shadow(0 0 6px 1px #000);
}
-.ie6, .ie7, .ie8 {
+.iel8 {
body.mappage .content, body.frontpage .content {
border: 1px solid #666;
}
@@ -111,9 +111,6 @@ body.mappage {
padding-top: 18px;
background: #fff url(logo_portal.x.jpg) top left repeat-x;
}
- #site-logo {
- margin-left: 10px;
- }
.content {
margin-top: 1em;
}
@@ -187,13 +184,6 @@ body.mappage {
}
body.mappage {
- #main-nav {
- width: auto;
- }
- #main-nav ul#main-menu li a,
- #main-nav ul#main-menu li span {
- padding: 0.75em;
- }
#zurich-footer {
display: none;
}
@@ -249,10 +239,52 @@ body.fullwidthpage.admin .content {
width: 100%;
}
-body.mappage.admin .content {
- margin-top: 6em;
- margin-left: 0.5em;
+body.mappage.admin {
+ .content {
+ margin-top: 5em;
+ margin-left: 0;
+ padding: 0px;
+ width: 40em;
+ background: #fff url(/cobrands/zurich/admin-faux-columns.gif) top center repeat-y;
+ @include box-shadow(0 0 5px rgba(0,0,0,0.5));
+ }
+}
+
+.admin-report-edit {
+ padding: 1em;
+ width: 50%;
+ float: right;
+ font-size: 0.8em;
+ box-sizing: border-box;
+
+ button, input[type="submit"], .btn {
+ padding: 0.5em 0.5em 0.3em 0.5em;
+ text-transform: none;
+ }
+
+ h2 {
+ font-family: inherit;
+ font-size: inherit;
+ font-weight: bold;
+ }
+}
+
+.admin-report-edit--details {
+ label[for="title"],
+ label[for="detail"] {
+ display: none;
+ }
+
+ #title {
+ margin-top: 1em;
+ font-weight: bold;
+ }
+
+ #detail {
+ margin-bottom: 1em;
+ }
}
+
.admin {
.content {
margin: 2em 0 1em;
@@ -270,22 +302,48 @@ body.mappage.admin .content {
font-weight: bold;
padding-right: 0.333em;
}
+ :first-child > label {
+ // avoid empty space above first label in a container
+ margin-top: 0;
+ }
+ textarea {
+ min-height: 0;
+ }
+ }
+
+ button, input[type=submit], .btn {
+ &.delete {
+ font-size: 0.75em;
+ color: #933;
+ margin: 2em 0;
+
+ &:hover {
+ @include background(linear-gradient(#fcc, #daa 50%));
+ };
+ }
}
#zurich-footer {
margin: 2em auto 3em auto;
}
+
+ .message-updated {
+ color: #060;
+ font-weight: bold;
+ position: absolute;
+ }
}
.admin-nav-wrapper {
background-color: white;
padding: 1.5em 0 1em;
}
+
body.mappage .admin-nav-wrapper {
box-sizing: border-box;
padding-left: 10px;
padding-right: 10px;
position: fixed;
width: 100%;
- @include box-shadow(0 0 6px 1px #000);
+ @include box-shadow(0 0 5px rgba(0,0,0,0.5));
}
diff --git a/web/down.default.html b/web/down.default.html
index c109ece36..d3403d76c 100644
--- a/web/down.default.html
+++ b/web/down.default.html
@@ -1,34 +1,103 @@
<!doctype html>
-<!--[if lt IE 7]><html class="ie6 oldie" lang="en-gb"><![endif]-->
-<!--[if IE 7]> <html class="ie7 oldie" lang="en-gb"><![endif]-->
-<!--[if IE 8]> <html class="ie8 oldie" lang="en-gb"><![endif]-->
-<!--[if gt IE 8]><!--><html lang="en-gb"><!--<![endif]-->
+<!--[if lt IE 7]><html class="no-js ie6 iel8" lang="en-gb"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 iel8" lang="en-gb"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 iel8" lang="en-gb"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9" lang="en-gb"><![endif]-->
+<!--[if gt IE 9]><!--><html class="no-js" lang="en-gb"><!--<![endif]-->
<head>
- <title>FixMyStreet</title>
- <link rel="stylesheet" type="text/css" href="/css/core.css">
- <link rel="stylesheet" type="text/css" href="/css/main.css">
+ <meta name="viewport" content="initial-scale=1.0">
+
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+ <meta name="HandHeldFriendly" content="true">
+ <meta name="mobileoptimized" content="0">
+
+ <meta property="og:url" content="https://www.fixmystreet.com/">
+ <meta property="og:title" content="FixMyStreet">
+ <meta property="og:site_name" content="FixMyStreet">
+ <meta property="og:description" content="Report, view, and discuss local street-related problems.">
+ <meta property="og:type" content="website">
+ <meta property="og:image" content="https://www.fixmystreet.com/cobrands/fixmystreet/fms-og_image.png">
+ <meta property="og:image:type" content="image/png">
+ <meta property="og:image:width" content="500">
+ <meta property="og:image:height" content="500">
+
+ <link rel="stylesheet" href="https://www.fixmystreet.com/cobrands/fixmystreet.com/base.css?1442505663">
+ <link rel="stylesheet" href="https://www.fixmystreet.com/cobrands/fixmystreet.com/layout.css?1442576262" media="(min-width:48em)">
+
+ <!--[if (lt IE 9) & (!IEMobile)]>
+ <link rel="stylesheet" href="https://www.fixmystreet.com/cobrands/fixmystreet.com/layout.css?1442576262">
+ <![endif]-->
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
+ <meta name="cobrand" content="fixmystreet">
+ <title>Down for maintenance :: FixMyStreet</title>
+ <link rel="Shortcut Icon" type="image/x-icon" href="https://www.fixmystreet.com/cobrands/fixmystreet.com/favicon.ico">
</head>
- <body>
-<h1 id="header">Fix<span id="my">My</span>Street</h1>
-<div id="wrapper"><div id="mysociety">
+ <body class="fullwidthpage">
+
+ <div class="wrapper">
+ <div class="table-cell">
+ <header id="site-header" role="banner">
+ <div class="container">
+ <a href="/" id="site-logo">FixMyStreet</a>
+ </div>
+ </header>
+
+ <div class="container">
+ <div class="content" role="main">
+
+<div class="tablewrapper">
+ <h1>FixMyStreet is currently down for maintenance.</h1>
+ <p>Please come back later.</p>
+</div>
+
+
+ <footer role="contentinfo">
+ <div class="tablewrapper bordered">
+ <div id="footer-mobileapps">
+ <h4>The FixMyStreet App</h4>
+ <p>
+ <a href="https://itunes.apple.com/gb/app/fixmystreet/id297456545">
+ <img alt="FixMyStreet app on the App Store" src="https://www.fixmystreet.com/cobrands/fixmystreet/images/itunes_store_logo.png" />
+ </a>
+ <a href="https://play.google.com/store/apps/details?id=org.mysociety.FixMyStreet">
+ <img alt="FixMyStreet Android app on Google Play" src="https://www.fixmystreet.com/cobrands/fixmystreet/images/google_play_logo.png" />
+ </a>
+ </p>
+ </div>
-<p id="expl"><strong>FixMyStreet is currently down for maintenance.</strong>
-<br><small>Please come back later.</small></p>
+ <div id="footer-help">
+ <p>
+ Powered by <a class="platform-logo" href="http://fixmystreet.org/">FixMyStreet Platform</a>
+ </p>
+ <ul>
+ <li>
+ <h4>Are you a developer?</h4>
+ <p>Would you like to contribute to FixMyStreet? Our code is open source and <a href="http://fixmystreet.org">available at fixmystreet.org</a>.</p>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </footer>
-</div></div>
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
-<h2 class="v">Navigation</h2>
-<ul id="navigation">
-<li>team&#64;fixmystreet.com</li>
-</ul>
+ </div><!-- .table-cell -->
-<a href="http://www.mysociety.org/"><img id="logo" width="133" height="26" src="/i/mysociety-dark.png" alt="View mySociety.org"><span id="logoie"></span></a>
+ <div class="nav-wrapper">
+ <div class="nav-wrapper-2">
+ <div id="main-nav" role="navigation">
+ <ul class="nav-menu nav-menu--mysoc">
+ <li><a id="mysoc-logo" href="https://www.mysociety.org/">mySociety</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
-<p id="footer">Built by <a href="http://www.mysociety.org/">mySociety</a>
- | <a href="http://github.com/mysociety/fixmystreet">Source code</a>
-</p>
+ </div> <!-- .wrapper -->
</body>
</html>
diff --git a/web/js/fixmystreet.js b/web/js/fixmystreet.js
index 78372d68c..51fa01559 100644
--- a/web/js/fixmystreet.js
+++ b/web/js/fixmystreet.js
@@ -31,16 +31,16 @@ $(function(){
// Questionnaire hide/showings
if (!$('#been_fixed_no').prop('checked') && !$('#been_fixed_unknown').prop('checked')) {
- $('#another_qn').hide();
+ $('.js-another-questionnaire').hide();
}
- $('#been_fixed_no').click(function() {
- $('#another_qn').show('fast');
+ $('#been_fixed_no').on('click', function() {
+ $('.js-another-questionnaire').show('fast');
});
- $('#been_fixed_unknown').click(function() {
- $('#another_qn').show('fast');
+ $('#been_fixed_unknown').on('click', function() {
+ $('.js-another-questionnaire').show('fast');
});
- $('#been_fixed_yes').click(function() {
- $('#another_qn').hide('fast');
+ $('#been_fixed_yes').on('click', function() {
+ $('.js-another-questionnaire').hide('fast');
});
// Form validation
@@ -177,13 +177,8 @@ $(function(){
category: $(this).val()
};
- if ( typeof fixmystreet !== 'undefined' ) {
- args.latitude = fixmystreet.latitude;
- args.longitude = fixmystreet.longitude;
- } else {
- args.latitude = $('input[name="latitude"]').val();
- args.longitude = $('input[name="longitude"]').val();
- }
+ args.latitude = $('input[name="latitude"]').val();
+ args.longitude = $('input[name="longitude"]').val();
$.getJSON('/report/new/category_extras', args, function(data) {
var $category_meta = $('#category_meta');
diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js
index 7b7bee7e8..3cd54bc23 100644
--- a/web/js/map-OpenLayers.js
+++ b/web/js/map-OpenLayers.js
@@ -59,14 +59,6 @@ function fixmystreet_activate_drag() {
fixmystreet.drag.activate();
}
-// Need to try and fake the 'centre' being 75% from the left
-function fixmystreet_midpoint() {
- var $content = $('.content'), mb = $('#map_box'),
- q = ( $content.offset().left - mb.offset().left + $content.width() ) / 2,
- mid_point = q < 0 ? 0 : q;
- return mid_point;
-}
-
function fixmystreet_zoomToBounds(bounds) {
if (!bounds) { return; }
var center = bounds.getCenterLonLat();
@@ -560,13 +552,10 @@ OpenLayers.Format.FixMyStreet = OpenLayers.Class(OpenLayers.Format.JSON, {
} else {
obj = json;
}
- var current, current_near;
+ var current;
if (typeof(obj.current) != 'undefined' && (current = document.getElementById('current'))) {
current.innerHTML = obj.current;
}
- if (typeof(obj.current_near) != 'undefined' && (current_near = document.getElementById('current_near'))) {
- current_near.innerHTML = obj.current_near;
- }
return fms_markers_list( obj.pins, false );
},
CLASS_NAME: "OpenLayers.Format.FixMyStreet"
@@ -659,7 +648,7 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
fixmystreet.map.getProjectionObject()
);
var p = fixmystreet.map.getViewPortPxFromLonLat(lonlat);
- p.x -= ( o.left - bo.left + w ) / 2;
+ p.x -= midpoint_box_excluding_column(o, w, bo, $map_boxx.width());
lonlat = fixmystreet.map.getLonLatFromViewPortPx(p);
fixmystreet.map.panTo(lonlat);
}
diff --git a/web/js/map-google-ol.js b/web/js/map-google-ol.js
index a0e58cdc2..5a1aa3c57 100644
--- a/web/js/map-google-ol.js
+++ b/web/js/map-google-ol.js
@@ -1,11 +1,18 @@
$(function(){
- $('#map_layer_toggle').toggle(function(){
- $(this).text(translation_strings.map_satellite);
- fixmystreet.map.setBaseLayer(fixmystreet.map.layers[1]);
- }, function(){
- $(this).text(translation_strings.map_map);
- fixmystreet.map.setBaseLayer(fixmystreet.map.layers[0]);
+ $('#map_layer_toggle').on('click', function(e){
+ e.preventDefault();
+ var $t = $(this), text = $t.text();
+ if (text == translation_strings.map_map) {
+ $t.text(translation_strings.map_satellite);
+ fixmystreet.map.setBaseLayer(fixmystreet.map.layers[0]);
+ } else {
+ $t.text(translation_strings.map_map);
+ fixmystreet.map.setBaseLayer(fixmystreet.map.layers[1]);
+ }
});
+ if (typeof fixmystreet_google_default !== 'undefined' && fixmystreet_google_default == 'satellite') {
+ $('#map_layer_toggle').click();
+ }
});
function set_map_config(perm) {
@@ -25,9 +32,10 @@ function set_map_config(perm) {
fixmystreet.map_options = {
zoomDuration: 10
};
+
fixmystreet.layer_options = [
- { type: google.maps.MapTypeId.HYBRID },
- {}
+ {},
+ { type: google.maps.MapTypeId.HYBRID }
];
}
diff --git a/web/js/map-google.js b/web/js/map-google.js
index 8364b40df..0e7cd824e 100644
--- a/web/js/map-google.js
+++ b/web/js/map-google.js
@@ -192,10 +192,8 @@ function fms_map_initialize() {
if (fixmystreet.state_map && fixmystreet.state_map == 'full') {
// TODO Work better with window resizing, this is pretty 'set up' only at present
- var $content = $('.content'), mb = $('#map_box'),
- q = ( $content.offset().left - mb.offset().left + $content.width() ) / 2;
- if (q < 0) { q = 0; }
- // Need to try and fake the 'centre' being 75% from the left
+ var q = fixmystreet_midpoint();
+ // Need to try and fake the 'centre' being 75% from the edge
fixmystreet.map.panBy(-q, -25);
}
diff --git a/web/js/map-wmts-zurich.js b/web/js/map-wmts-zurich.js
index 54b932168..dc81c967f 100644
--- a/web/js/map-wmts-zurich.js
+++ b/web/js/map-wmts-zurich.js
@@ -81,37 +81,170 @@ $(function(){
OpenLayers.DOTS_PER_INCH = 96;
fixmystreet.map_options = {
- maxExtent: new OpenLayers.Bounds(676000, 241000, 690000, 255000),
+ maxExtent: new OpenLayers.Bounds(676000, 241402, 689896, 254596),
units: 'm',
- scales: [ '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500' ]
+ scales: [ '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500', '250' ]
};
var layer_options = {
projection: new OpenLayers.Projection("EPSG:21781"),
- name: "Hybrid",
- layer: "Hybrid",
- matrixSet: "nativeTileMatrixSet",
+ name: "tiled_LuftbildHybrid",
+ layer: "tiled_LuftbildHybrid",
+ matrixSet: "default028mm",
requestEncoding: "REST",
- url: "/maps/Hybrid/",
+ url: "http://www.gis.stadt-zuerich.ch/maps/rest/services/tiled/LuftbildHybrid/MapServer/WMTS/tile/",
style: "default",
matrixIds: [
- //{ identifier: "0", matrixHeight: 2, matrixWidth: 2, scaleDenominator: 250000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- //{ identifier: "1", matrixHeight: 3, matrixWidth: 3, scaleDenominator: 125000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "2", matrixHeight: 4, matrixWidth: 5, scaleDenominator: 64000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "3", matrixHeight: 7, matrixWidth: 8, scaleDenominator: 32000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "4", matrixHeight: 14, matrixWidth: 14, scaleDenominator: 16000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "5", matrixHeight: 27, matrixWidth: 27, scaleDenominator: 8000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "6", matrixHeight: 52, matrixWidth: 53, scaleDenominator: 4000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "7", matrixHeight: 104, matrixWidth: 105, scaleDenominator: 2000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "8", matrixHeight: 208, matrixWidth: 208, scaleDenominator: 1000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
- { identifier: "9", matrixHeight: 415, matrixWidth: 414, scaleDenominator: 500, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } }
+ // {
+ // "identifier": "0",
+ // "matrixHeight": 903,
+ // "matrixWidth": 889,
+ // "scaleDenominator": 236235.59151877242,
+ // "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ // "tileHeight": 512,
+ // "tileWidth": 512,
+ // "topLeftCorner": {
+ // "lat": 30814423,
+ // "lon": -29386322
+ // }
+ // },
+ // {
+ // "identifier": "1",
+ // "matrixHeight": 1806,
+ // "matrixWidth": 1777,
+ // "scaleDenominator": 118117.79575938621,
+ // "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ // "tileHeight": 512,
+ // "tileWidth": 512,
+ // "topLeftCorner": {
+ // "lat": 30814423,
+ // "lon": -29386322
+ // }
+ // },
+ {
+ "identifier": "2",
+ "matrixHeight": 3527,
+ "matrixWidth": 3470,
+ "scaleDenominator": 60476.31142880573,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "3",
+ "matrixHeight": 7053,
+ "matrixWidth": 6939,
+ "scaleDenominator": 30238.155714402867,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "4",
+ "matrixHeight": 14106,
+ "matrixWidth": 13877,
+ "scaleDenominator": 15119.077857201433,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "5",
+ "matrixHeight": 28211,
+ "matrixWidth": 27753,
+ "scaleDenominator": 7559.538928600717,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "6",
+ "matrixHeight": 56422,
+ "matrixWidth": 55505,
+ "scaleDenominator": 3779.7694643003583,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "7",
+ "matrixHeight": 112844,
+ "matrixWidth": 111010,
+ "scaleDenominator": 1889.8847321501792,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "8",
+ "matrixHeight": 225687,
+ "matrixWidth": 222020,
+ "scaleDenominator": 944.9423660750896,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "9",
+ "matrixHeight": 451374,
+ "matrixWidth": 444039,
+ "scaleDenominator": 472.4711830375448,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ },
+ {
+ "identifier": "10",
+ "matrixHeight": 902748,
+ "matrixWidth": 888078,
+ "scaleDenominator": 236.2355915187724,
+ "supportedCRS": "urn:ogc:def:crs:EPSG::21781",
+ "tileHeight": 512,
+ "tileWidth": 512,
+ "topLeftCorner": {
+ "lat": 30814423,
+ "lon": -29386322
+ }
+ }
]
};
fixmystreet.layer_options = [
layer_options, OpenLayers.Util.applyDefaults({
- name: "Stadtplan",
- layer: "Stadtplan",
- url: "/maps/Stadtplan/"
+ name: "Stadtplan3D",
+ layer: "Stadtplan3D",
+ url: "http://www.gis.stadt-zuerich.ch/maps/rest/services/tiled/Stadtplan3D/MapServer/WMTS/tile/"
}, layer_options)
];
diff --git a/web/js/moderate.js b/web/js/moderate.js
index 075766d0b..0be3cca8d 100644
--- a/web/js/moderate.js
+++ b/web/js/moderate.js
@@ -1,12 +1,7 @@
-$(function () {
- setup_moderation( $('.problem-header'), 'problem' );
- setup_moderation( $('.issue-list .issue'), 'update' );
-});
-
function setup_moderation (elem, word) {
elem.each( function () {
- var $elem = $(this)
+ var $elem = $(this);
$elem.find('.moderate').click( function () {
$elem.find('.moderate-display').hide();
$elem.find('.moderate-edit').show();
@@ -40,3 +35,8 @@ function setup_moderation (elem, word) {
});
});
}
+
+$(function () {
+ setup_moderation( $('.problem-header'), 'problem' );
+ setup_moderation( $('.item-list__item--updates'), 'update' );
+});
diff --git a/web/js/modernizr.custom.js b/web/js/modernizr.custom.js
index 026c0efad..7e94bcfe8 100644
--- a/web/js/modernizr.custom.js
+++ b/web/js/modernizr.custom.js
@@ -1,4 +1,4 @@
-/* Modernizr 2.6.1 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-sessionstorage-shiv-load
- */
-;window.Modernizr=function(a,b,c){function t(a){i.cssText=a}function u(a,b){return t(prefixes.join(a+";")+(b||""))}function v(a,b){return typeof a===b}function w(a,b){return!!~(""+a).indexOf(b)}function x(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:v(f,"function")?f.bind(d||b):f}return!1}var d="2.6.1",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l={},m={},n={},o=[],p=o.slice,q,r={}.hasOwnProperty,s;!v(r,"undefined")&&!v(r.call,"undefined")?s=function(a,b){return r.call(a,b)}:s=function(a,b){return b in a&&v(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=p.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(p.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(p.call(arguments)))};return e}),l.sessionstorage=function(){try{return sessionStorage.setItem(g,g),sessionStorage.removeItem(g),!0}catch(a){return!1}};for(var y in l)s(l,y)&&(q=y.toLowerCase(),e[q]=l[y](),o.push((e[q]?"":"no-")+q));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)s(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},t(""),h=j=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; \ No newline at end of file
+/* Modernizr 2.8.3 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-shiv-mq-teststyles-load
+ */
+window.Modernizr=function(e,t,n){function r(e){p.cssText=e}function o(e,t){return typeof e===t}var a,i,c,l="2.8.3",s={},u=t.documentElement,d="modernizr",f=t.createElement(d),p=f.style,m=({}.toString,{}),h=[],y=h.slice,v=function(e,n,r,o){var a,i,c,l,s=t.createElement("div"),f=t.body,p=f||t.createElement("body");if(parseInt(r,10))for(;r--;)c=t.createElement("div"),c.id=o?o[r]:d+(r+1),s.appendChild(c);return a=["&#173;",'<style id="s',d,'">',e,"</style>"].join(""),s.id=d,(f?s:p).innerHTML+=a,p.appendChild(s),f||(p.style.background="",p.style.overflow="hidden",l=u.style.overflow,u.style.overflow="hidden",u.appendChild(p)),i=n(s,e),f?s.parentNode.removeChild(s):(p.parentNode.removeChild(p),u.style.overflow=l),!!i},g=function(t){var n=e.matchMedia||e.msMatchMedia;if(n)return n(t)&&n(t).matches||!1;var r;return v("@media "+t+" { #"+d+" { position: absolute; } }",function(t){r="absolute"==(e.getComputedStyle?getComputedStyle(t,null):t.currentStyle).position}),r},b={}.hasOwnProperty;c=o(b,"undefined")||o(b.call,"undefined")?function(e,t){return t in e&&o(e.constructor.prototype[t],"undefined")}:function(e,t){return b.call(e,t)};for(var E in m)c(m,E)&&(i=E.toLowerCase(),s[i]=m[E](),h.push((s[i]?"":"no-")+i));return s.addTest=function(e,t){if("object"==typeof e)for(var r in e)c(e,r)&&s.addTest(r,e[r]);else{if(e=e.toLowerCase(),s[e]!==n)return s;t="function"==typeof t?t():t,"undefined"!=typeof enableClasses&&enableClasses&&(u.className+=" "+(t?"":"no-")+e),s[e]=t}return s},r(""),f=a=null,function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=g.elements;return"string"==typeof e?e.split(" "):e}function o(e){var t=v[e[h]];return t||(t={},y++,e[h]=y,v[y]=t),t}function a(e,n,r){if(n||(n=t),u)return n.createElement(e);r||(r=o(n));var a;return a=r.cache[e]?r.cache[e].cloneNode():m.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!a.canHaveChildren||p.test(e)||a.tagUrn?a:r.frag.appendChild(a)}function i(e,n){if(e||(e=t),u)return e.createDocumentFragment();n=n||o(e);for(var a=n.frag.cloneNode(),i=0,c=r(),l=c.length;l>i;i++)a.createElement(c[i]);return a}function c(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return g.shivMethods?a(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(g,t.frag)}function l(e){e||(e=t);var r=o(e);return!g.shivCSS||s||r.hasCSS||(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),u||c(e,r),e}var s,u,d="3.7.0",f=e.html5||{},p=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,m=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,h="_html5shiv",y=0,v={};!function(){try{var e=t.createElement("a");e.innerHTML="<xyz></xyz>",s="hidden"in e,u=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){s=!0,u=!0}}();var g={elements:f.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:d,shivCSS:f.shivCSS!==!1,supportsUnknownElements:u,shivMethods:f.shivMethods!==!1,type:"default",shivDocument:l,createElement:a,createDocumentFragment:i};e.html5=g,l(t)}(this,t),s._version=l,s.mq=g,s.testStyles=v,s}(this,this.document),function(e,t,n){function r(e){return"[object Function]"==y.call(e)}function o(e){return"string"==typeof e}function a(){}function i(e){return!e||"loaded"==e||"complete"==e||"uninitialized"==e}function c(){var e=v.shift();g=1,e?e.t?m(function(){("c"==e.t?f.injectCss:f.injectJs)(e.s,0,e.a,e.x,e.e,1)},0):(e(),c()):g=0}function l(e,n,r,o,a,l,s){function u(t){if(!p&&i(d.readyState)&&(b.r=p=1,!g&&c(),d.onload=d.onreadystatechange=null,t)){"img"!=e&&m(function(){C.removeChild(d)},50);for(var r in M[n])M[n].hasOwnProperty(r)&&M[n][r].onload()}}var s=s||f.errorTimeout,d=t.createElement(e),p=0,y=0,b={t:r,s:n,e:a,a:l,x:s};1===M[n]&&(y=1,M[n]=[]),"object"==e?d.data=n:(d.src=n,d.type=e),d.width=d.height="0",d.onerror=d.onload=d.onreadystatechange=function(){u.call(this,y)},v.splice(o,0,b),"img"!=e&&(y||2===M[n]?(C.insertBefore(d,E?null:h),m(u,s)):M[n].push(d))}function s(e,t,n,r,a){return g=0,t=t||"j",o(e)?l("c"==t?w:S,e,t,this.i++,n,r,a):(v.splice(this.i++,0,e),1==v.length&&c()),this}function u(){var e=f;return e.loader={load:s,i:0},e}var d,f,p=t.documentElement,m=e.setTimeout,h=t.getElementsByTagName("script")[0],y={}.toString,v=[],g=0,b="MozAppearance"in p.style,E=b&&!!t.createRange().compareNode,C=E?p:h.parentNode,p=e.opera&&"[object Opera]"==y.call(e.opera),p=!!t.attachEvent&&!p,S=b?"object":p?"script":"img",w=p?"script":S,j=Array.isArray||function(e){return"[object Array]"==y.call(e)},F=[],M={},N={timeout:function(e,t){return t.length&&(e.timeout=t[0]),e}};f=function(e){function t(e){var t,n,r,e=e.split("!"),o=F.length,a=e.pop(),i=e.length,a={url:a,origUrl:a,prefixes:e};for(n=0;i>n;n++)r=e[n].split("="),(t=N[r.shift()])&&(a=t(a,r));for(n=0;o>n;n++)a=F[n](a);return a}function i(e,o,a,i,c){var l=t(e),s=l.autoCallback;l.url.split(".").pop().split("?").shift(),l.bypass||(o&&(o=r(o)?o:o[e]||o[i]||o[e.split("/").pop().split("?")[0]]),l.instead?l.instead(e,o,a,i,c):(M[l.url]?l.noexec=!0:M[l.url]=1,a.load(l.url,l.forceCSS||!l.forceJS&&"css"==l.url.split(".").pop().split("?").shift()?"c":n,l.noexec,l.attrs,l.timeout),(r(o)||r(s))&&a.load(function(){u(),o&&o(l.origUrl,c,i),s&&s(l.origUrl,c,i),M[l.url]=2})))}function c(e,t){function n(e,n){if(e){if(o(e))n||(d=function(){var e=[].slice.call(arguments);f.apply(this,e),p()}),i(e,d,t,0,s);else if(Object(e)===e)for(l in c=function(){var t,n=0;for(t in e)e.hasOwnProperty(t)&&n++;return n}(),e)e.hasOwnProperty(l)&&(!n&&!--c&&(r(d)?d=function(){var e=[].slice.call(arguments);f.apply(this,e),p()}:d[l]=function(e){return function(){var t=[].slice.call(arguments);e&&e.apply(this,t),p()}}(f[l])),i(e[l],d,t,l,s))}else!n&&p()}var c,l,s=!!e.test,u=e.load||e.both,d=e.callback||a,f=d,p=e.complete||a;n(s?e.yep:e.nope,!!u),u&&n(u)}var l,s,d=this.yepnope.loader;if(o(e))i(e,0,d,0);else if(j(e))for(l=0;l<e.length;l++)s=e[l],o(s)?i(s,0,d,0):j(s)?f(s):Object(s)===s&&c(s,d);else Object(e)===e&&c(e,d)},f.addPrefix=function(e,t){N[e]=t},f.addFilter=function(e){F.push(e)},f.errorTimeout=1e4,null==t.readyState&&t.addEventListener&&(t.readyState="loading",t.addEventListener("DOMContentLoaded",d=function(){t.removeEventListener("DOMContentLoaded",d,0),t.readyState="complete"},0)),e.yepnope=u(),e.yepnope.executeStack=c,e.yepnope.injectJs=function(e,n,r,o,l,s){var u,d,p=t.createElement("script"),o=o||f.errorTimeout;p.src=e;for(d in r)p.setAttribute(d,r[d]);n=s?c:n||a,p.onreadystatechange=p.onload=function(){!u&&i(p.readyState)&&(u=1,n(),p.onload=p.onreadystatechange=null)},m(function(){u||(u=1,n(1))},o),l?p.onload():h.parentNode.insertBefore(p,h)},e.yepnope.injectCss=function(e,n,r,o,i,l){var s,o=t.createElement("link"),n=l?c:n||a;o.href=e,o.rel="stylesheet",o.type="text/css";for(s in r)o.setAttribute(s,r[s]);i||(h.parentNode.insertBefore(o,h),m(n,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
diff --git a/web/pngfix.js b/web/pngfix.js
deleted file mode 100644
index 6552a4b47..000000000
--- a/web/pngfix.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-
- Correctly handle PNG transparency in Win IE 5.5 & 6.
- http://homepage.ntlworld.com/bobosola. Updated 18-Jan-2006.
-
- Use in <HEAD> with DEFER keyword wrapped in conditional comments:
- <!--[if lt IE 7]>
- <script defer type="text/javascript" src="pngfix.js"></script>
- <![endif]-->
-
- */
-
-var arVersion = navigator.appVersion.split("MSIE")
-var version = parseFloat(arVersion[1])
-
-if ((version >= 5.5) && (document.body.filters)) {
- for(var i=0; i<document.images.length; i++) {
- var img = document.images[i]
- var imgName = img.src.toUpperCase()
- if (imgName.substring(imgName.length-3, imgName.length) == "PNG") {
- var imgID = (img.id) ? "id='" + img.id + "' " : ""
- var imgClass = (img.className) ? "class='" + img.className + "' " : ""
- var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
- var imgStyle = "display:inline-block;" + img.style.cssText
- if (img.align == "left") imgStyle = "float:left;" + imgStyle
- if (img.align == "right") imgStyle = "float:right;" + imgStyle
- if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
- var strNewHTML = "<span " + imgID + imgClass + imgTitle
- + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
- + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
- + "(src=\'" + img.src + "\', sizingMethod='image');\"></span>"
- img.outerHTML = strNewHTML
- i = i-1
- }
- }
-}
-